From e404ce7096b9e4666f91cdca2e837d8ecd802357 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julius=20H=C3=A4rtl?= Date: Tue, 29 Jan 2019 12:23:14 +0100 Subject: [PATCH] Implement search and rename in backend MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Julius Härtl --- .../CollaborationResourcesController.php | 44 ++++++++++++++++++- core/routes.php | 3 ++ .../Collaboration/Resources/Manager.php | 44 +++++++++++++++++++ .../Collaboration/Resources/IManager.php | 8 ++++ 4 files changed, 98 insertions(+), 1 deletion(-) diff --git a/core/Controller/CollaborationResourcesController.php b/core/Controller/CollaborationResourcesController.php index a15904a4c2..3c9937aade 100644 --- a/core/Controller/CollaborationResourcesController.php +++ b/core/Controller/CollaborationResourcesController.php @@ -84,6 +84,22 @@ class CollaborationResourcesController extends OCSController { return new DataResponse($this->prepareCollection($collection)); } + /** + * @NoAdminRequired + * + * @param int $collectionId + * @return DataResponse + */ + public function searchCollections(string $filter): DataResponse { + try { + $collections = $this->manager->searchCollections($this->userSession->getUser(), $filter); + } catch (CollectionException $e) { + return new DataResponse([], Http::STATUS_NOT_FOUND); + } + + return new DataResponse(array_map([$this, 'prepareCollection'], $collections)); + } + /** * @NoAdminRequired * @@ -189,6 +205,31 @@ class CollaborationResourcesController extends OCSController { return new DataResponse($this->prepareCollection($collection)); } + /** + * @NoAdminRequired + * + * @param int $collectionId + * @param string $collectionName + * @return DataResponse + */ + public function renameCollection(int $collectionId, string $collectionName): DataResponse { + try { + $collection = $this->manager->getCollection($collectionId); + if (!$collection->canAccess($this->userSession->getUser())) { + throw new CollectionException('Not found'); + } + } catch (CollectionException $exception) { + return new DataResponse([], Http::STATUS_NOT_FOUND); + } + + try { + $collection = $this->manager->renameCollection($collectionId, $collectionName); + } catch (CollectionException $e) { + return new DataResponse([], Http::STATUS_NOT_FOUND); + } + return new DataResponse($this->prepareCollection($collection)); + } + protected function prepareCollection(ICollection $collection): array { return [ 'id' => $collection->getId(), @@ -206,7 +247,8 @@ class CollaborationResourcesController extends OCSController { 'type' => $resource->getType(), 'id' => $resource->getId(), 'name' => $resource->getName(), - 'iconClass' => $resource->getIconClass() + 'iconClass' => $resource->getIconClass(), + 'link' => $resource->getLink(), ]; } } diff --git a/core/routes.php b/core/routes.php index 079f99d265..974d644000 100644 --- a/core/routes.php +++ b/core/routes.php @@ -91,8 +91,11 @@ $application->registerRoutes($this, [ ['root' => '/core', 'name' => 'WhatsNew#dismiss', 'url' => '/whatsnew', 'verb' => 'POST'], ['root' => '/core', 'name' => 'AppPassword#getAppPassword', 'url' => '/getapppassword', 'verb' => 'GET'], + ['root' => '/collaboration', 'name' => 'CollaborationResources#searchCollections', 'url' => '/resources/collections/search/{filter}', 'verb' => 'GET'], ['root' => '/collaboration', 'name' => 'CollaborationResources#listCollection', 'url' => '/resources/collections/{collectionId}', 'verb' => 'GET'], + ['root' => '/collaboration', 'name' => 'CollaborationResources#renameCollection', 'url' => '/resources/collections/{collectionId}', 'verb' => 'PUT'], ['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 c11382c2f1..9f083b3c67 100644 --- a/lib/private/Collaboration/Resources/Manager.php +++ b/lib/private/Collaboration/Resources/Manager.php @@ -67,6 +67,35 @@ class Manager implements IManager { return new Collection($this, $this->connection, (int) $row['id'], (string) $row['name']); } + /** + * @param int $id + * @return ICollection + * @throws CollectionException when the collection could not be found + * @since 15.0.0 + */ + public function searchCollections(IUser $user, string $filter, int $limit = 50, int $start = 0): array { + $query = $this->connection->getQueryBuilder(); + $query->select('*') + ->from('collres_collections') + ->where($query->expr()->iLike('name', $query->createNamedParameter($filter, IQueryBuilder::PARAM_STR))) + ->setMaxResults($limit) + ->setFirstResult($start); + $result = $query->execute(); + $collections = []; + /** TODO: this is a huge performance bottleneck */ + while ($row = $result->fetch()) { + $collection = new Collection($this, $this->connection, (int)$row['id'], (string)$row['name']); + if ($collection->canAccess($user)) { + $collections[] = $collection; + } + } + $result->closeCursor(); + + // TODO: call with increased first result if no matches found + + return $collections; + } + /** * @param string $name * @return ICollection @@ -199,4 +228,19 @@ class Manager implements IManager { return ''; } + + /** + * @param string $name + * @return ICollection + * @since 15.0.0 + */ + public function renameCollection(int $id, string $name): ICollection { + $query = $this->connection->getQueryBuilder(); + $query->update('collres_collections') + ->set('name', $query->createNamedParameter($name)) + ->where($query->expr()->eq('id', $query->createNamedParameter($id, IQueryBuilder::PARAM_INT))); + $query->execute(); + + return new Collection($this, $this->connection, $id, $name); + } } diff --git a/lib/public/Collaboration/Resources/IManager.php b/lib/public/Collaboration/Resources/IManager.php index eab101ff8e..cac13812fe 100644 --- a/lib/public/Collaboration/Resources/IManager.php +++ b/lib/public/Collaboration/Resources/IManager.php @@ -42,6 +42,14 @@ interface IManager extends IProvider { */ public function newCollection(string $name): ICollection; + + /** + * @param string $name + * @return ICollection + * @since 15.0.0 + */ + public function renameCollection(int $id, string $name): ICollection; + /** * @param string $type * @param string $id