summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoas Schilling <coding@schilljs.com>2018-10-18 13:00:25 +0200
committerJulius Härtl <jus@bitgrid.net>2019-03-01 20:56:15 +0100
commit5dfc56e925309d637be6f5a69cc16d0baaf20d03 (patch)
tree6bcee736d8e9369a2c519103bb0c005ca82e3e40
parent136d2c39ac72f837a3ea9a3f698be963fefb69a3 (diff)
downloadnextcloud-server-5dfc56e925309d637be6f5a69cc16d0baaf20d03.tar.gz
nextcloud-server-5dfc56e925309d637be6f5a69cc16d0baaf20d03.zip
Allow to create collections
Signed-off-by: Joas Schilling <coding@schilljs.com>
-rw-r--r--core/Controller/CollaborationResourcesController.php34
-rw-r--r--core/routes.php1
-rw-r--r--lib/private/Collaboration/Resources/Manager.php8
-rw-r--r--lib/public/Collaboration/Resources/ICollection.php6
-rw-r--r--lib/public/Collaboration/Resources/IManager.php6
5 files changed, 54 insertions, 1 deletions
diff --git a/core/Controller/CollaborationResourcesController.php b/core/Controller/CollaborationResourcesController.php
index bd8c8442ae5..453a6405e56 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 7fcd576d322..079f99d265f 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 8302d4a1002..c091f5c5805 100644
--- a/lib/private/Collaboration/Resources/Manager.php
+++ b/lib/private/Collaboration/Resources/Manager.php
@@ -50,6 +50,14 @@ class Manager implements IManager {
}
/**
+ * @return ICollection
+ * @since 15.0.0
+ */
+ public function newCollection(): ICollection {
+ return new Collection($this, $this->connection, 0);
+ }
+
+ /**
* @param string $type
* @param string $id
* @return IResource
diff --git a/lib/public/Collaboration/Resources/ICollection.php b/lib/public/Collaboration/Resources/ICollection.php
index 0859ee3397e..1f503d8083a 100644
--- a/lib/public/Collaboration/Resources/ICollection.php
+++ b/lib/public/Collaboration/Resources/ICollection.php
@@ -30,6 +30,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 9a7fda28bb4..abccfd2eed1 100644
--- a/lib/public/Collaboration/Resources/IManager.php
+++ b/lib/public/Collaboration/Resources/IManager.php
@@ -35,6 +35,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
* @return IResource