From 5dfc56e925309d637be6f5a69cc16d0baaf20d03 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Thu, 18 Oct 2018 13:00:25 +0200 Subject: [PATCH] Allow to create collections Signed-off-by: Joas Schilling --- .../CollaborationResourcesController.php | 34 ++++++++++++++++++- core/routes.php | 1 + .../Collaboration/Resources/Manager.php | 8 +++++ .../Collaboration/Resources/ICollection.php | 6 ++++ .../Collaboration/Resources/IManager.php | 6 ++++ 5 files changed, 54 insertions(+), 1 deletion(-) diff --git a/core/Controller/CollaborationResourcesController.php b/core/Controller/CollaborationResourcesController.php index bd8c8442ae..453a6405e5 100644 --- a/core/Controller/CollaborationResourcesController.php +++ b/core/Controller/CollaborationResourcesController.php @@ -160,8 +160,40 @@ class CollaborationResourcesController extends OCSController { return new DataResponse(array_map([$this, 'prepareCollection'], $resource->getCollections())); } + /** + * @NoAdminRequired + * + * @param string $baseResourceType + * @param string $baseResourceId + * @param string $resourceType + * @param string $resourceId + * @return DataResponse + */ + public function createCollectionOnResource(string $baseResourceType, string $baseResourceId, string $resourceType, string $resourceId): DataResponse { + try { + $baseResource = $this->manager->getResource($baseResourceType, $baseResourceId); + $resource = $this->manager->getResource($resourceType, $resourceId); + } catch (CollectionException $e) { + return new DataResponse([], Http::STATUS_NOT_FOUND); + } + + if (!$baseResource->canAccess($this->userSession->getUser()) || + !$resource->canAccess($this->userSession->getUser())) { + return new DataResponse([], Http::STATUS_NOT_FOUND); + } + + $collection = $this->manager->newCollection(); + $collection->addResource($baseResource); + $collection->addResource($resource); + + return new DataResponse($this->prepareCollection($collection)); + } + protected function prepareCollection(ICollection $collection): array { - return array_map([$this, 'prepareResources'], $collection->getResources()); + return [ + 'id' => $collection->getId(), + 'resources' => array_map([$this, 'prepareResources'], $collection->getResources()), + ]; } protected function prepareResources(IResource $resource): array { diff --git a/core/routes.php b/core/routes.php index 7fcd576d32..079f99d265 100644 --- a/core/routes.php +++ b/core/routes.php @@ -95,6 +95,7 @@ $application->registerRoutes($this, [ ['root' => '/collaboration', 'name' => 'CollaborationResources#addResource', 'url' => '/resources/collections/{collectionId}', 'verb' => 'POST'], ['root' => '/collaboration', 'name' => 'CollaborationResources#removeResource', 'url' => '/resources/collections/{collectionId}', 'verb' => 'DELETE'], ['root' => '/collaboration', 'name' => 'CollaborationResources#getCollectionsByResource', 'url' => '/resources/{resourceType}/{resourceId}', 'verb' => 'GET'], + ['root' => '/collaboration', 'name' => 'CollaborationResources#createCollectionOnResource', 'url' => '/resources/{baseResourceType}/{baseResourceId}', 'verb' => 'POST'], ], ]); diff --git a/lib/private/Collaboration/Resources/Manager.php b/lib/private/Collaboration/Resources/Manager.php index 8302d4a100..c091f5c580 100644 --- a/lib/private/Collaboration/Resources/Manager.php +++ b/lib/private/Collaboration/Resources/Manager.php @@ -49,6 +49,14 @@ class Manager implements IManager { return new Collection($this, $this->connection, $id); } + /** + * @return ICollection + * @since 15.0.0 + */ + public function newCollection(): ICollection { + return new Collection($this, $this->connection, 0); + } + /** * @param string $type * @param string $id diff --git a/lib/public/Collaboration/Resources/ICollection.php b/lib/public/Collaboration/Resources/ICollection.php index 0859ee3397..1f503d8083 100644 --- a/lib/public/Collaboration/Resources/ICollection.php +++ b/lib/public/Collaboration/Resources/ICollection.php @@ -29,6 +29,12 @@ use OCP\IUser; */ interface ICollection { + /** + * @return int + * @since 15.0.0 + */ + public function getId(): int; + /** * @return IResource[] * @since 15.0.0 diff --git a/lib/public/Collaboration/Resources/IManager.php b/lib/public/Collaboration/Resources/IManager.php index 9a7fda28bb..abccfd2eed 100644 --- a/lib/public/Collaboration/Resources/IManager.php +++ b/lib/public/Collaboration/Resources/IManager.php @@ -34,6 +34,12 @@ interface IManager extends IProvider { */ public function getCollection(int $id): ICollection; + /** + * @return ICollection + * @since 15.0.0 + */ + public function newCollection(): ICollection; + /** * @param string $type * @param string $id