diff --git a/lib/Alchemy/Phrasea/Controller/Api/V1Controller.php b/lib/Alchemy/Phrasea/Controller/Api/V1Controller.php index a1eede2e2f..7dc59a454e 100644 --- a/lib/Alchemy/Phrasea/Controller/Api/V1Controller.php +++ b/lib/Alchemy/Phrasea/Controller/Api/V1Controller.php @@ -2710,6 +2710,19 @@ class V1Controller extends Controller return Result::create($request, $ret)->createResponse(); } + /** + * Returns all collections available for the user + * @param Request $request + * @return Response + */ + public function getCurrentUserCollectionsAction(Request $request) + { + $ret = [ + "collections" => $this->listUserAuthorizedCollections($this->getAuthenticatedUser()), + ]; + return Result::create($request, $ret)->createResponse(); + } + /** * Returns list of Metadata Fields from the databoxes on which the user has rights * @param User $user @@ -2820,6 +2833,52 @@ class V1Controller extends Controller return $ret; } + /** + * Returns list of collection from the databoxes on which the user has rights + * @param User $user + * @return array + */ + private function listUserAuthorizedCollections(User $user) + { + $acl = $this->getAclForUser($user); + $rights = $acl->get_bas_rights(); + $bases = $acl->get_granted_base(); + + $grants = []; + + $statusMapper = new RestrictedStatusExtractor($acl, $this->getApplicationBox()); + + foreach ($bases as $base) { + $baseGrants = []; + + foreach ($rights as $right) { + if (!$acl->has_right_on_base($base->get_base_id(), $right)) { + continue; + } + + $baseGrants[] = $right; + } + + $grants[] = [ + 'databox_id' => $base->get_sbas_id(), + 'base_id' => $base->get_base_id(), + 'collection_id' => $base->get_coll_id(), + 'name' => $base->get_name(), + 'logo' => $base->get_binary_minilogos() ? base64_encode($base->get_binary_minilogos()) : '', + 'labels' => [ + 'fr' => $base->get_label('fr'), + 'en' => $base->get_label('en'), + 'de' => $base->get_label('de'), + 'nl' => $base->get_label('nl'), + ], + 'rights' => $baseGrants, + 'statuses' => $statusMapper->getRestrictedStatuses($base->get_base_id()) + ]; + } + + return $grants; + } + public function deleteCurrentUserAction(Request $request) { try { diff --git a/lib/Alchemy/Phrasea/ControllerProvider/Api/V1.php b/lib/Alchemy/Phrasea/ControllerProvider/Api/V1.php index 59f4160fb8..a976e774e0 100644 --- a/lib/Alchemy/Phrasea/ControllerProvider/Api/V1.php +++ b/lib/Alchemy/Phrasea/ControllerProvider/Api/V1.php @@ -266,7 +266,7 @@ class V1 extends Api implements ControllerProviderInterface, ServiceProviderInte $controllers->delete('/me/', 'controller.api.v1:deleteCurrentUserAction'); $controllers->get('/me/structures/', 'controller.api.v1:getCurrentUserStructureAction'); $controllers->get('/me/subdefs/', 'controller.api.v1:getCurrentUserSubdefsAction'); - + $controllers->get('/me/collections/', 'controller.api.v1:getCurrentUserCollectionsAction'); $controllers->post('/me/request-collections/', 'controller.api.v1:createCollectionRequests'); $controllers->post('/me/update-account/', 'controller.api.v1:updateCurrentUserAction'); diff --git a/tests/Alchemy/Tests/Phrasea/Controller/Api/ApiTestCase.php b/tests/Alchemy/Tests/Phrasea/Controller/Api/ApiTestCase.php index b68bbbb358..3b10c5266f 100644 --- a/tests/Alchemy/Tests/Phrasea/Controller/Api/ApiTestCase.php +++ b/tests/Alchemy/Tests/Phrasea/Controller/Api/ApiTestCase.php @@ -127,6 +127,16 @@ abstract class ApiTestCase extends \PhraseanetWebTestCase $this->assertArrayHasKey('subdefs', $content['response']); } + public function testRouteMeCollections() + { + $this->setToken($this->userAccessToken); + $route = '/api/v1/me/collections/'; + $this->evaluateMethodNotAllowedRoute($route, [ 'POST', 'PUT' ]); + self::$DI['client']->request('GET', $route, $this->getParameters(), [], ['HTTP_Accept' => $this->getAcceptMimeType()]); + $content = $this->unserialize(self::$DI['client']->getResponse()->getContent()); + $this->assertArrayHasKey('collections', $content['response']); + } + protected function evaluateGoodUserItem($data, User $user) { foreach ([