{"action":"created","comment":{"url":"https://api.github.com/repos/ezsystems/EzSystemsRecommendationBundle/pulls/comments/156565905","pull_request_review_id":83062312,"id":156565905,"diff_hunk":"@@ -0,0 +1,338 @@\n+<?php\n+/**\n+ * @copyright Copyright (C) eZ Systems AS. All rights reserved.\n+ * @license For full copyright and license information view LICENSE file distributed with this source code.\n+ */\n+namespace EzSystems\\RecommendationBundle\\Export;\n+\n+use Exception;\n+use eZ\\Publish\\API\\Repository\\LocationService;\n+use EzSystems\\RecommendationBundle\\Authentication\\Authenticator;\n+use EzSystems\\RecommendationBundle\\Rest\\Content\\Content;\n+use LogicException;\n+use eZ\\Publish\\Core\\REST\\Common\\Output\\Generator;\n+use eZ\\Publish\\API\\Repository\\ContentTypeService;\n+use eZ\\Publish\\API\\Repository\\SearchService;\n+use eZ\\Publish\\API\\Repository\\Values\\Content\\Query;\n+use eZ\\Publish\\API\\Repository\\Values\\Content\\Query\\Criterion;\n+use EzSystems\\RecommendationBundle\\Client\\ExportNotifier;\n+use EzSystems\\RecommendationBundle\\Helper\\FileSystem;\n+use EzSystems\\RecommendationBundle\\Helper\\Text;\n+use EzSystems\\RecommendationBundle\\Helper\\SiteAccess;\n+use EzSystems\\RecommendationBundle\\Rest\\ValueObjectVisitor\\ContentListElementGenerator;\n+use EzSystems\\RecommendationBundle\\Rest\\Values\\ContentData;\n+use Psr\\Log\\LoggerInterface;\n+use Symfony\\Component\\HttpFoundation\\ParameterBag;\n+\n+class Exporter\n+{\n+    /** @var \\eZ\\Publish\\Api\\Repository\\SearchService */\n+    private $searchService;\n+\n+    /** @var \\eZ\\Publish\\Api\\Repository\\ContentTypeService */\n+    private $contentTypeService;\n+\n+    /** @var \\eZ\\Publish\\Api\\Repository\\LocationService */\n+    private $locationService;\n+\n+    /** @var \\EzSystems\\RecommendationBundle\\Authentication\\Authenticator */\n+    private $authenticator;\n+\n+    /** @var \\EzSystems\\RecommendationBundle\\Helper\\FileSystem */\n+    private $fileSystemHelper;\n+\n+    /** @var \\EzSystems\\RecommendationBundle\\Helper\\SiteAccess */\n+    private $siteAccessHelper;\n+\n+    /** @var \\EzSystems\\RecommendationBundle\\Client\\ExportNotifier */\n+    private $exportNotifier;\n+\n+    /** @var \\EzSystems\\RecommendationBundle\\Rest\\Content\\Content */\n+    private $content;\n+\n+    /** @var \\EzSystems\\RecommendationBundle\\Rest\\ValueObjectVisitor\\ContentListElementGenerator */\n+    private $contentListElementGenerator;\n+\n+    /** @var \\eZ\\Publish\\Core\\REST\\Common\\Output\\Generator */\n+    private $outputGenerator;\n+\n+    /** @var \\Psr\\Log\\LoggerInterface */\n+    private $logger;\n+\n+    /**\n+     * @param \\eZ\\Publish\\Api\\Repository\\SearchService $searchService\n+     * @param \\eZ\\Publish\\Api\\Repository\\ContentTypeService $contentTypeService\n+     * @param \\eZ\\Publish\\Api\\Repository\\LocationService $locationService\n+     * @param \\EzSystems\\RecommendationBundle\\Authentication\\Authenticator $authenticator\n+     * @param \\EzSystems\\RecommendationBundle\\Helper\\FileSystem $fileSystemHelper\n+     * @param \\EzSystems\\RecommendationBundle\\Helper\\SiteAccess $siteAccessHelper\n+     * @param \\EzSystems\\RecommendationBundle\\Client\\ExportNotifier $exportNotifier\n+     * @param \\EzSystems\\RecommendationBundle\\Rest\\Content\\Content $content\n+     * @param \\EzSystems\\RecommendationBundle\\Rest\\ValueObjectVisitor\\ContentListElementGenerator $contentListElementGenerator\n+     * @param \\eZ\\Publish\\Core\\REST\\Common\\Output\\Generator $outputGenerator\n+     * @param \\Psr\\Log\\LoggerInterface $logger\n+     */\n+    public function __construct(\n+        SearchService $searchService,\n+        ContentTypeService $contentTypeService,\n+        LocationService $locationService,\n+        Authenticator $authenticator,\n+        FileSystem $fileSystemHelper,\n+        SiteAccess $siteAccessHelper,\n+        ExportNotifier $exportNotifier,\n+        Content $content,\n+        ContentListElementGenerator $contentListElementGenerator,\n+        Generator $outputGenerator,\n+        LoggerInterface $logger\n+    ) {\n+        $this->searchService = $searchService;\n+        $this->contentTypeService = $contentTypeService;\n+        $this->locationService = $locationService;\n+        $this->authenticator = $authenticator;\n+        $this->fileSystemHelper = $fileSystemHelper;\n+        $this->siteAccessHelper = $siteAccessHelper;\n+        $this->exportNotifier = $exportNotifier;\n+        $this->content = $content;\n+        $this->contentListElementGenerator = $contentListElementGenerator;\n+        $this->outputGenerator = $outputGenerator;\n+        $this->logger = $logger;\n+    }\n+\n+    /**\n+     * @param array $options\n+     *\n+     * @return \\EzSystems\\RecommendationBundle\\Rest\\Values\\ContentData|void\n+     *\n+     * @throws \\EzSystems\\RecommendationBundle\\Rest\\Exception\\ExportInProgressException\n+     */\n+    public function runExport(array $options)\n+    {\n+        $options = $this->validate($options);\n+\n+        $options['contentTypeIds'] = Text::getIdListFromString($options['contentTypeIdList']);\n+        $chunkDir = $this->fileSystemHelper->createChunkDir();\n+        $languages = $this->siteAccessHelper->getLanguages($options['mandatorId'], $options['siteAccess']);\n+        $options['languages'] = $languages;\n+\n+        try {\n+            $this->fileSystemHelper->lock();\n+            $urls = $this->generateFiles($languages, $chunkDir, $options);\n+            $this->fileSystemHelper->unlock();\n+\n+            $credentials = $this->authenticator->getCredentials();\n+            $securedDirCredentials = $this->fileSystemHelper->secureDir($chunkDir, $credentials);\n+\n+            $response = $this->exportNotifier->sendYCResponse($urls, $options, $securedDirCredentials);\n+            $this->logger->info(sprintf('YC Response: %s', $response));\n+        } catch (Exception $e) {\n+            $this->logger->error(sprintf('Error while generating export: %s', $e->getMessage()));\n+            $this->fileSystemHelper->unlock();\n+        }\n+    }\n+\n+    /**\n+     * Validates required options.\n+     *\n+     * @param array $options\n+     *\n+     * @return array\n+     */\n+    private function validate(array $options)\n+    {\n+        if (empty($options['contentTypeIdList'])) {\n+            throw new LogicException('contentTypeIdList is required');\n+        }\n+\n+        if (empty($options['host'])) {\n+            throw new LogicException('host is required');\n+        }\n+\n+        if (empty($options['host'])) {\n+            throw new LogicException('host is required');\n+        }\n+\n+        if (empty($options['siteAccess'])) {\n+            $options['siteAccess'] = $options['sa'];\n+        }\n+\n+        if (empty($options['transaction'])) {\n+            $options['transaction'] = (new \\DateTime())->format('YmdHisv');\n+        }\n+\n+        if (empty($options['customerId']) || empty($options['licenseKey'])) {\n+            list($options['customerId'], $options['licenseKey']) =\n+                $this->siteAccessHelper->getRecommendationServiceCredentials();\n+        }\n+\n+        return $options;\n+    }\n+\n+    /**\n+     * Generate export files.\n+     *\n+     * @param $languages\n+     * @param $chunkDir\n+     * @param array $options\n+     *\n+     * @return array\n+     */\n+    private function generateFiles($languages, $chunkDir, array $options)\n+    {\n+        $urls = array();\n+\n+        foreach ($options['contentTypeIds'] as $contentTypeId) {\n+            $count = $this->countContentByContentTypeId($contentTypeId, $options);\n+            $contentTypeName = $this->contentTypeService->loadContentType($contentTypeId)->getName();\n+\n+            $this->logger->info(sprintf('fetching %s items of contentTypeId %s', $count, $contentTypeId));\n+\n+            foreach ($languages as $lang) {\n+                $options['lang'] = $lang;\n+\n+                for ($i = 1; $i <= ceil($count / $options['pageSize']); ++$i) {\n+                    $filename = sprintf('%d_%s_%d', $contentTypeId, $lang, $i);\n+                    $chunkPath = $chunkDir . $filename;\n+                    $options['page'] = $i;\n+\n+                    $contentItems = $this->getContentItems($contentTypeId, $options);\n+                    $parameters = new ParameterBag($options);\n+                    $content = $this->content->prepareContent(array($contentTypeId => $contentItems), $parameters);\n+\n+                    $this->generateFile($content, $chunkPath, $options);\n+\n+                    $url = sprintf(\n+                        '%s/api/ezp/v2/ez_recommendation/v1/exportDownload/%s%s',\n+                        $options['host'], $chunkDir, $filename\n+                    );\n+\n+                    $this->logger->info(sprintf('Generating url: %s', $url));\n+\n+                    $urls[$contentTypeId][$lang]['urlList'][] = $url;\n+                    $urls[$contentTypeId][$lang]['contentTypeName'] = $contentTypeName;\n+                }\n+            }\n+        }\n+\n+        return $urls;\n+    }\n+\n+    /**\n+     * Returns paged content based on ContentType ids.\n+     *\n+     * @param int $contentTypeId\n+     * @param array $options\n+     *\n+     * @return int\n+     */\n+    private function countContentByContentTypeId($contentTypeId, array $options)","path":"Export/Exporter.php","position":227,"original_position":227,"commit_id":"bba15637ead4f2384a5b840956051ec871a28c68","original_commit_id":"bba15637ead4f2384a5b840956051ec871a28c68","user":{"login":"SylvainGuittard","id":1157233,"avatar_url":"https://avatars0.githubusercontent.com/u/1157233?v=4","gravatar_id":"","url":"https://api.github.com/users/SylvainGuittard","html_url":"https://github.com/SylvainGuittard","followers_url":"https://api.github.com/users/SylvainGuittard/followers","following_url":"https://api.github.com/users/SylvainGuittard/following{/other_user}","gists_url":"https://api.github.com/users/SylvainGuittard/gists{/gist_id}","starred_url":"https://api.github.com/users/SylvainGuittard/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/SylvainGuittard/subscriptions","organizations_url":"https://api.github.com/users/SylvainGuittard/orgs","repos_url":"https://api.github.com/users/SylvainGuittard/repos","events_url":"https://api.github.com/users/SylvainGuittard/events{/privacy}","received_events_url":"https://api.github.com/users/SylvainGuittard/received_events","type":"User","site_admin":false},"body":"`countContentItemsByContentTypeId` is maybe better","created_at":"2017-12-13T05:15:11Z","updated_at":"2017-12-13T05:38:44Z","html_url":"https://github.com/ezsystems/EzSystemsRecommendationBundle/pull/105#discussion_r156565905","pull_request_url":"https://api.github.com/repos/ezsystems/EzSystemsRecommendationBundle/pulls/105","author_association":"NONE","_links":{"self":{"href":"https://api.github.com/repos/ezsystems/EzSystemsRecommendationBundle/pulls/comments/156565905"},"html":{"href":"https://github.com/ezsystems/EzSystemsRecommendationBundle/pull/105#discussion_r156565905"},"pull_request":{"href":"https://api.github.com/repos/ezsystems/EzSystemsRecommendationBundle/pulls/105"}}},"pull_request":{"url":"https://api.github.com/repos/ezsystems/EzSystemsRecommendationBundle/pulls/105","id":157600381,"html_url":"https://github.com/ezsystems/EzSystemsRecommendationBundle/pull/105","diff_url":"https://github.com/ezsystems/EzSystemsRecommendationBundle/pull/105.diff","patch_url":"https://github.com/ezsystems/EzSystemsRecommendationBundle/pull/105.patch","issue_url":"https://api.github.com/repos/ezsystems/EzSystemsRecommendationBundle/issues/105","number":105,"state":"open","locked":false,"title":"[WIP]Export feature","user":{"login":"damianz5","id":3495796,"avatar_url":"https://avatars1.githubusercontent.com/u/3495796?v=4","gravatar_id":"","url":"https://api.github.com/users/damianz5","html_url":"https://github.com/damianz5","followers_url":"https://api.github.com/users/damianz5/followers","following_url":"https://api.github.com/users/damianz5/following{/other_user}","gists_url":"https://api.github.com/users/damianz5/gists{/gist_id}","starred_url":"https://api.github.com/users/damianz5/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/damianz5/subscriptions","organizations_url":"https://api.github.com/users/damianz5/orgs","repos_url":"https://api.github.com/users/damianz5/repos","events_url":"https://api.github.com/users/damianz5/events{/privacy}","received_events_url":"https://api.github.com/users/damianz5/received_events","type":"User","site_admin":false},"body":"The export feature provides a possibility to run full (or partial, depends on parameters) content export in background, by running command `ezreco:runexport`,\r\nit can be executed as command or url `/ez_recommendation/v1/runExport/{contentTypeIdList}`\r\n\r\ngenerated files can be download by url `/ez_recommendation/v1/exportDownload/{filePath}`\r\n\r\nAll of the routers can use credentials check, depends on `ez_recommendation.export.users_authentication` settings.\r\n\r\nFew of the things has been improved:\r\n- moved authentication logic out of `ContentType`  to `ExportAuthenticator`\r\n- moved siteAccess operation out of `ContentType`/ `Content`  to `SiteAccess` Helper\r\n- moved the operations on files to `FileSystem` Helper\r\n- moved yoochoose notifier call to `ExportNotifier`\r\n- adding parameters filering (there was some security issues)\r\n- added logging to all important operations\r\n- added descriptions for command parameters / options\r\n- added config validation for `export. users_authentication`\r\n- fixed parameters in contentDownload router\r\n- possibility to use `mandatorId` for matching all siteAccesses configured with this `mandatorId`, fetch main language from every siteAccess, SubtreeCriterions (for 'rootLocationId') generated by matched siteAccesses\r\n\r\n**This PR is based on 'content_content_type_cleanup' branch, copy of https://github.com/ezsystems/EzSystemsRecommendationBundle/pull/102. \r\n I will rebase to 2.0 branch when it will be merged.**\r\n\r\nhttps://jira.ez.no/browse/EZEE-1272\r\nhttps://jira.ez.no/browse/EZEE-1785","created_at":"2017-12-11T15:55:05Z","updated_at":"2017-12-13T05:38:44Z","closed_at":null,"merged_at":null,"merge_commit_sha":"e6bcc2335a16851cac56b31d1ff03a933f5ad4f4","assignee":null,"assignees":[],"requested_reviewers":[{"login":"adamwojs","id":211967,"avatar_url":"https://avatars1.githubusercontent.com/u/211967?v=4","gravatar_id":"","url":"https://api.github.com/users/adamwojs","html_url":"https://github.com/adamwojs","followers_url":"https://api.github.com/users/adamwojs/followers","following_url":"https://api.github.com/users/adamwojs/following{/other_user}","gists_url":"https://api.github.com/users/adamwojs/gists{/gist_id}","starred_url":"https://api.github.com/users/adamwojs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/adamwojs/subscriptions","organizations_url":"https://api.github.com/users/adamwojs/orgs","repos_url":"https://api.github.com/users/adamwojs/repos","events_url":"https://api.github.com/users/adamwojs/events{/privacy}","received_events_url":"https://api.github.com/users/adamwojs/received_events","type":"User","site_admin":false},{"login":"bdunogier","id":235928,"avatar_url":"https://avatars2.githubusercontent.com/u/235928?v=4","gravatar_id":"","url":"https://api.github.com/users/bdunogier","html_url":"https://github.com/bdunogier","followers_url":"https://api.github.com/users/bdunogier/followers","following_url":"https://api.github.com/users/bdunogier/following{/other_user}","gists_url":"https://api.github.com/users/bdunogier/gists{/gist_id}","starred_url":"https://api.github.com/users/bdunogier/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bdunogier/subscriptions","organizations_url":"https://api.github.com/users/bdunogier/orgs","repos_url":"https://api.github.com/users/bdunogier/repos","events_url":"https://api.github.com/users/bdunogier/events{/privacy}","received_events_url":"https://api.github.com/users/bdunogier/received_events","type":"User","site_admin":false},{"login":"alongosz","id":7099219,"avatar_url":"https://avatars1.githubusercontent.com/u/7099219?v=4","gravatar_id":"","url":"https://api.github.com/users/alongosz","html_url":"https://github.com/alongosz","followers_url":"https://api.github.com/users/alongosz/followers","following_url":"https://api.github.com/users/alongosz/following{/other_user}","gists_url":"https://api.github.com/users/alongosz/gists{/gist_id}","starred_url":"https://api.github.com/users/alongosz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/alongosz/subscriptions","organizations_url":"https://api.github.com/users/alongosz/orgs","repos_url":"https://api.github.com/users/alongosz/repos","events_url":"https://api.github.com/users/alongosz/events{/privacy}","received_events_url":"https://api.github.com/users/alongosz/received_events","type":"User","site_admin":false}],"milestone":null,"commits_url":"https://api.github.com/repos/ezsystems/EzSystemsRecommendationBundle/pulls/105/commits","review_comments_url":"https://api.github.com/repos/ezsystems/EzSystemsRecommendationBundle/pulls/105/comments","review_comment_url":"https://api.github.com/repos/ezsystems/EzSystemsRecommendationBundle/pulls/comments{/number}","comments_url":"https://api.github.com/repos/ezsystems/EzSystemsRecommendationBundle/issues/105/comments","statuses_url":"https://api.github.com/repos/ezsystems/EzSystemsRecommendationBundle/statuses/bba15637ead4f2384a5b840956051ec871a28c68","head":{"label":"damianz5:export_feature","ref":"export_feature","sha":"bba15637ead4f2384a5b840956051ec871a28c68","user":{"login":"damianz5","id":3495796,"avatar_url":"https://avatars1.githubusercontent.com/u/3495796?v=4","gravatar_id":"","url":"https://api.github.com/users/damianz5","html_url":"https://github.com/damianz5","followers_url":"https://api.github.com/users/damianz5/followers","following_url":"https://api.github.com/users/damianz5/following{/other_user}","gists_url":"https://api.github.com/users/damianz5/gists{/gist_id}","starred_url":"https://api.github.com/users/damianz5/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/damianz5/subscriptions","organizations_url":"https://api.github.com/users/damianz5/orgs","repos_url":"https://api.github.com/users/damianz5/repos","events_url":"https://api.github.com/users/damianz5/events{/privacy}","received_events_url":"https://api.github.com/users/damianz5/received_events","type":"User","site_admin":false},"repo":{"id":103382825,"name":"EzSystemsRecommendationBundle","full_name":"damianz5/EzSystemsRecommendationBundle","owner":{"login":"damianz5","id":3495796,"avatar_url":"https://avatars1.githubusercontent.com/u/3495796?v=4","gravatar_id":"","url":"https://api.github.com/users/damianz5","html_url":"https://github.com/damianz5","followers_url":"https://api.github.com/users/damianz5/followers","following_url":"https://api.github.com/users/damianz5/following{/other_user}","gists_url":"https://api.github.com/users/damianz5/gists{/gist_id}","starred_url":"https://api.github.com/users/damianz5/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/damianz5/subscriptions","organizations_url":"https://api.github.com/users/damianz5/orgs","repos_url":"https://api.github.com/users/damianz5/repos","events_url":"https://api.github.com/users/damianz5/events{/privacy}","received_events_url":"https://api.github.com/users/damianz5/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/damianz5/EzSystemsRecommendationBundle","description":"Integration of YooChoose, a content recommendation solution, into eZ Platform","fork":true,"url":"https://api.github.com/repos/damianz5/EzSystemsRecommendationBundle","forks_url":"https://api.github.com/repos/damianz5/EzSystemsRecommendationBundle/forks","keys_url":"https://api.github.com/repos/damianz5/EzSystemsRecommendationBundle/keys{/key_id}","collaborators_url":"https://api.github.com/repos/damianz5/EzSystemsRecommendationBundle/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/damianz5/EzSystemsRecommendationBundle/teams","hooks_url":"https://api.github.com/repos/damianz5/EzSystemsRecommendationBundle/hooks","issue_events_url":"https://api.github.com/repos/damianz5/EzSystemsRecommendationBundle/issues/events{/number}","events_url":"https://api.github.com/repos/damianz5/EzSystemsRecommendationBundle/events","assignees_url":"https://api.github.com/repos/damianz5/EzSystemsRecommendationBundle/assignees{/user}","branches_url":"https://api.github.com/repos/damianz5/EzSystemsRecommendationBundle/branches{/branch}","tags_url":"https://api.github.com/repos/damianz5/EzSystemsRecommendationBundle/tags","blobs_url":"https://api.github.com/repos/damianz5/EzSystemsRecommendationBundle/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/damianz5/EzSystemsRecommendationBundle/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/damianz5/EzSystemsRecommendationBundle/git/refs{/sha}","trees_url":"https://api.github.com/repos/damianz5/EzSystemsRecommendationBundle/git/trees{/sha}","statuses_url":"https://api.github.com/repos/damianz5/EzSystemsRecommendationBundle/statuses/{sha}","languages_url":"https://api.github.com/repos/damianz5/EzSystemsRecommendationBundle/languages","stargazers_url":"https://api.github.com/repos/damianz5/EzSystemsRecommendationBundle/stargazers","contributors_url":"https://api.github.com/repos/damianz5/EzSystemsRecommendationBundle/contributors","subscribers_url":"https://api.github.com/repos/damianz5/EzSystemsRecommendationBundle/subscribers","subscription_url":"https://api.github.com/repos/damianz5/EzSystemsRecommendationBundle/subscription","commits_url":"https://api.github.com/repos/damianz5/EzSystemsRecommendationBundle/commits{/sha}","git_commits_url":"https://api.github.com/repos/damianz5/EzSystemsRecommendationBundle/git/commits{/sha}","comments_url":"https://api.github.com/repos/damianz5/EzSystemsRecommendationBundle/comments{/number}","issue_comment_url":"https://api.github.com/repos/damianz5/EzSystemsRecommendationBundle/issues/comments{/number}","contents_url":"https://api.github.com/repos/damianz5/EzSystemsRecommendationBundle/contents/{+path}","compare_url":"https://api.github.com/repos/damianz5/EzSystemsRecommendationBundle/compare/{base}...{head}","merges_url":"https://api.github.com/repos/damianz5/EzSystemsRecommendationBundle/merges","archive_url":"https://api.github.com/repos/damianz5/EzSystemsRecommendationBundle/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/damianz5/EzSystemsRecommendationBundle/downloads","issues_url":"https://api.github.com/repos/damianz5/EzSystemsRecommendationBundle/issues{/number}","pulls_url":"https://api.github.com/repos/damianz5/EzSystemsRecommendationBundle/pulls{/number}","milestones_url":"https://api.github.com/repos/damianz5/EzSystemsRecommendationBundle/milestones{/number}","notifications_url":"https://api.github.com/repos/damianz5/EzSystemsRecommendationBundle/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/damianz5/EzSystemsRecommendationBundle/labels{/name}","releases_url":"https://api.github.com/repos/damianz5/EzSystemsRecommendationBundle/releases{/id}","deployments_url":"https://api.github.com/repos/damianz5/EzSystemsRecommendationBundle/deployments","created_at":"2017-09-13T09:51:36Z","updated_at":"2017-09-13T09:51:38Z","pushed_at":"2017-12-11T15:48:42Z","git_url":"git://github.com/damianz5/EzSystemsRecommendationBundle.git","ssh_url":"git@github.com:damianz5/EzSystemsRecommendationBundle.git","clone_url":"https://github.com/damianz5/EzSystemsRecommendationBundle.git","svn_url":"https://github.com/damianz5/EzSystemsRecommendationBundle","homepage":null,"size":312,"stargazers_count":0,"watchers_count":0,"language":"PHP","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":null,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"ezsystems:content_content_type_cleanup","ref":"content_content_type_cleanup","sha":"92484ca3fa1b16962f845467564a9ed9a1ec5540","user":{"login":"ezsystems","id":295311,"avatar_url":"https://avatars1.githubusercontent.com/u/295311?v=4","gravatar_id":"","url":"https://api.github.com/users/ezsystems","html_url":"https://github.com/ezsystems","followers_url":"https://api.github.com/users/ezsystems/followers","following_url":"https://api.github.com/users/ezsystems/following{/other_user}","gists_url":"https://api.github.com/users/ezsystems/gists{/gist_id}","starred_url":"https://api.github.com/users/ezsystems/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ezsystems/subscriptions","organizations_url":"https://api.github.com/users/ezsystems/orgs","repos_url":"https://api.github.com/users/ezsystems/repos","events_url":"https://api.github.com/users/ezsystems/events{/privacy}","received_events_url":"https://api.github.com/users/ezsystems/received_events","type":"Organization","site_admin":false},"repo":{"id":27641523,"name":"EzSystemsRecommendationBundle","full_name":"ezsystems/EzSystemsRecommendationBundle","owner":{"login":"ezsystems","id":295311,"avatar_url":"https://avatars1.githubusercontent.com/u/295311?v=4","gravatar_id":"","url":"https://api.github.com/users/ezsystems","html_url":"https://github.com/ezsystems","followers_url":"https://api.github.com/users/ezsystems/followers","following_url":"https://api.github.com/users/ezsystems/following{/other_user}","gists_url":"https://api.github.com/users/ezsystems/gists{/gist_id}","starred_url":"https://api.github.com/users/ezsystems/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ezsystems/subscriptions","organizations_url":"https://api.github.com/users/ezsystems/orgs","repos_url":"https://api.github.com/users/ezsystems/repos","events_url":"https://api.github.com/users/ezsystems/events{/privacy}","received_events_url":"https://api.github.com/users/ezsystems/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/ezsystems/EzSystemsRecommendationBundle","description":"Integration of YooChoose, a content recommendation solution, into eZ Platform","fork":false,"url":"https://api.github.com/repos/ezsystems/EzSystemsRecommendationBundle","forks_url":"https://api.github.com/repos/ezsystems/EzSystemsRecommendationBundle/forks","keys_url":"https://api.github.com/repos/ezsystems/EzSystemsRecommendationBundle/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ezsystems/EzSystemsRecommendationBundle/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ezsystems/EzSystemsRecommendationBundle/teams","hooks_url":"https://api.github.com/repos/ezsystems/EzSystemsRecommendationBundle/hooks","issue_events_url":"https://api.github.com/repos/ezsystems/EzSystemsRecommendationBundle/issues/events{/number}","events_url":"https://api.github.com/repos/ezsystems/EzSystemsRecommendationBundle/events","assignees_url":"https://api.github.com/repos/ezsystems/EzSystemsRecommendationBundle/assignees{/user}","branches_url":"https://api.github.com/repos/ezsystems/EzSystemsRecommendationBundle/branches{/branch}","tags_url":"https://api.github.com/repos/ezsystems/EzSystemsRecommendationBundle/tags","blobs_url":"https://api.github.com/repos/ezsystems/EzSystemsRecommendationBundle/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ezsystems/EzSystemsRecommendationBundle/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ezsystems/EzSystemsRecommendationBundle/git/refs{/sha}","trees_url":"https://api.github.com/repos/ezsystems/EzSystemsRecommendationBundle/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ezsystems/EzSystemsRecommendationBundle/statuses/{sha}","languages_url":"https://api.github.com/repos/ezsystems/EzSystemsRecommendationBundle/languages","stargazers_url":"https://api.github.com/repos/ezsystems/EzSystemsRecommendationBundle/stargazers","contributors_url":"https://api.github.com/repos/ezsystems/EzSystemsRecommendationBundle/contributors","subscribers_url":"https://api.github.com/repos/ezsystems/EzSystemsRecommendationBundle/subscribers","subscription_url":"https://api.github.com/repos/ezsystems/EzSystemsRecommendationBundle/subscription","commits_url":"https://api.github.com/repos/ezsystems/EzSystemsRecommendationBundle/commits{/sha}","git_commits_url":"https://api.github.com/repos/ezsystems/EzSystemsRecommendationBundle/git/commits{/sha}","comments_url":"https://api.github.com/repos/ezsystems/EzSystemsRecommendationBundle/comments{/number}","issue_comment_url":"https://api.github.com/repos/ezsystems/EzSystemsRecommendationBundle/issues/comments{/number}","contents_url":"https://api.github.com/repos/ezsystems/EzSystemsRecommendationBundle/contents/{+path}","compare_url":"https://api.github.com/repos/ezsystems/EzSystemsRecommendationBundle/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ezsystems/EzSystemsRecommendationBundle/merges","archive_url":"https://api.github.com/repos/ezsystems/EzSystemsRecommendationBundle/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ezsystems/EzSystemsRecommendationBundle/downloads","issues_url":"https://api.github.com/repos/ezsystems/EzSystemsRecommendationBundle/issues{/number}","pulls_url":"https://api.github.com/repos/ezsystems/EzSystemsRecommendationBundle/pulls{/number}","milestones_url":"https://api.github.com/repos/ezsystems/EzSystemsRecommendationBundle/milestones{/number}","notifications_url":"https://api.github.com/repos/ezsystems/EzSystemsRecommendationBundle/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ezsystems/EzSystemsRecommendationBundle/labels{/name}","releases_url":"https://api.github.com/repos/ezsystems/EzSystemsRecommendationBundle/releases{/id}","deployments_url":"https://api.github.com/repos/ezsystems/EzSystemsRecommendationBundle/deployments","created_at":"2014-12-06T16:56:48Z","updated_at":"2017-01-27T16:57:31Z","pushed_at":"2017-12-11T15:55:07Z","git_url":"git://github.com/ezsystems/EzSystemsRecommendationBundle.git","ssh_url":"git@github.com:ezsystems/EzSystemsRecommendationBundle.git","clone_url":"https://github.com/ezsystems/EzSystemsRecommendationBundle.git","svn_url":"https://github.com/ezsystems/EzSystemsRecommendationBundle","homepage":null,"size":259,"stargazers_count":3,"watchers_count":3,"language":"PHP","has_issues":false,"has_projects":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":18,"mirror_url":null,"archived":false,"open_issues_count":4,"license":{"key":"gpl-2.0","name":"GNU General Public License v2.0","spdx_id":"GPL-2.0","url":"https://api.github.com/licenses/gpl-2.0"},"forks":18,"open_issues":4,"watchers":3,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/ezsystems/EzSystemsRecommendationBundle/pulls/105"},"html":{"href":"https://github.com/ezsystems/EzSystemsRecommendationBundle/pull/105"},"issue":{"href":"https://api.github.com/repos/ezsystems/EzSystemsRecommendationBundle/issues/105"},"comments":{"href":"https://api.github.com/repos/ezsystems/EzSystemsRecommendationBundle/issues/105/comments"},"review_comments":{"href":"https://api.github.com/repos/ezsystems/EzSystemsRecommendationBundle/pulls/105/comments"},"review_comment":{"href":"https://api.github.com/repos/ezsystems/EzSystemsRecommendationBundle/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/ezsystems/EzSystemsRecommendationBundle/pulls/105/commits"},"statuses":{"href":"https://api.github.com/repos/ezsystems/EzSystemsRecommendationBundle/statuses/bba15637ead4f2384a5b840956051ec871a28c68"}},"author_association":"MEMBER"}}
{"actor":{"display_login":"SylvainGuittard"}}