Implement search and rename in backend

Signed-off-by: Julius Härtl <jus@bitgrid.net>
This commit is contained in:
Julius Härtl 2019-01-29 12:23:14 +01:00
parent 53ac9bdda1
commit e404ce7096
No known key found for this signature in database
GPG key ID: 4C614C6ED2CDE6DF
4 changed files with 98 additions and 1 deletions

View file

@ -84,6 +84,22 @@ class CollaborationResourcesController extends OCSController {
return new DataResponse($this->prepareCollection($collection)); 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 * @NoAdminRequired
* *
@ -189,6 +205,31 @@ class CollaborationResourcesController extends OCSController {
return new DataResponse($this->prepareCollection($collection)); 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 { protected function prepareCollection(ICollection $collection): array {
return [ return [
'id' => $collection->getId(), 'id' => $collection->getId(),
@ -206,7 +247,8 @@ class CollaborationResourcesController extends OCSController {
'type' => $resource->getType(), 'type' => $resource->getType(),
'id' => $resource->getId(), 'id' => $resource->getId(),
'name' => $resource->getName(), 'name' => $resource->getName(),
'iconClass' => $resource->getIconClass() 'iconClass' => $resource->getIconClass(),
'link' => $resource->getLink(),
]; ];
} }
} }

View file

@ -91,8 +91,11 @@ $application->registerRoutes($this, [
['root' => '/core', 'name' => 'WhatsNew#dismiss', 'url' => '/whatsnew', 'verb' => 'POST'], ['root' => '/core', 'name' => 'WhatsNew#dismiss', 'url' => '/whatsnew', 'verb' => 'POST'],
['root' => '/core', 'name' => 'AppPassword#getAppPassword', 'url' => '/getapppassword', 'verb' => 'GET'], ['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#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#addResource', 'url' => '/resources/collections/{collectionId}', 'verb' => 'POST'],
['root' => '/collaboration', 'name' => 'CollaborationResources#removeResource', 'url' => '/resources/collections/{collectionId}', 'verb' => 'DELETE'], ['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#getCollectionsByResource', 'url' => '/resources/{resourceType}/{resourceId}', 'verb' => 'GET'],
['root' => '/collaboration', 'name' => 'CollaborationResources#createCollectionOnResource', 'url' => '/resources/{baseResourceType}/{baseResourceId}', 'verb' => 'POST'], ['root' => '/collaboration', 'name' => 'CollaborationResources#createCollectionOnResource', 'url' => '/resources/{baseResourceType}/{baseResourceId}', 'verb' => 'POST'],

View file

@ -67,6 +67,35 @@ class Manager implements IManager {
return new Collection($this, $this->connection, (int) $row['id'], (string) $row['name']); 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 * @param string $name
* @return ICollection * @return ICollection
@ -199,4 +228,19 @@ class Manager implements IManager {
return ''; 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);
}
} }

View file

@ -42,6 +42,14 @@ interface IManager extends IProvider {
*/ */
public function newCollection(string $name): ICollection; 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 $type
* @param string $id * @param string $id