]> source.dussan.org Git - nextcloud-server.git/commitdiff
feat: specify media type via url path: systemtags-current/$mediaType
authorArthur Schiwon <blizzz@arthur-schiwon.de>
Thu, 4 May 2023 09:57:07 +0000 (11:57 +0200)
committerArthur Schiwon <blizzz@arthur-schiwon.de>
Tue, 9 May 2023 21:51:51 +0000 (23:51 +0200)
- only the media part of the mime type can be search, but not the full
  mime type. It can be added, should it become necessary.
- thus fixes previously hardcoded selector for image/ types
- also fixes a return type hint
- adds a return type hint

Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
apps/dav/lib/SystemTag/SystemTagsInUseCollection.php
lib/private/Files/Cache/QuerySearchHelper.php
lib/private/Files/Node/Folder.php

index 938b14e1f651e9fae91991ce2c290e321a94f5bd..94a86352a9612a5308082d2d246b670d3c9197c5 100644 (file)
@@ -31,21 +31,34 @@ use OCP\Files\IRootFolder;
 use OCP\IUserSession;
 use OCP\SystemTag\ISystemTagManager;
 use Sabre\DAV\Exception\Forbidden;
+use Sabre\DAV\Exception\NotFound;
 
 class SystemTagsInUseCollection extends \Sabre\DAV\SimpleCollection {
        protected IUserSession $userSession;
        protected IRootFolder $rootFolder;
+       protected string $mediaType;
 
-       public function __construct(IUserSession $userSession, IRootFolder $rootFolder) {
+       public function __construct(IUserSession $userSession, IRootFolder $rootFolder, string $mediaType = '') {
                $this->userSession = $userSession;
                $this->rootFolder = $rootFolder;
+               $this->mediaType = $mediaType;
                $this->name = 'systemtags-current';
+               if ($this->mediaType != '') {
+                       $this->name .= '/' . $this->mediaType;
+               }
        }
 
        public function setName($name): void {
                throw new Forbidden('Permission denied to rename this collection');
        }
 
+       public function getChild($name) {
+               if ($this->mediaType !== '') {
+                       throw new NotFound('Invalid media type');
+               }
+               return new self($this->userSession, $this->rootFolder, $name);
+       }
+
        public function getChildren() {
                $user = $this->userSession->getUser();
                if ($user === null) {
@@ -53,7 +66,7 @@ class SystemTagsInUseCollection extends \Sabre\DAV\SimpleCollection {
                }
 
                $userFolder = $this->rootFolder->getUserFolder($user->getUID());
-               $result = $userFolder->getSystemTags('image');
+               $result = $userFolder->getSystemTags($this->mediaType);
                $children = [];
                foreach ($result as $tagData) {
                        $tag = new SystemTag((string)$tagData['id'], $tagData['name'], (bool)$tagData['visibility'], (bool)$tagData['editable']);
index c2eed5688b5797c2f4cdd89321d0229d3e595b80..af198e9c83217aeb424c066b9e1fbb364ebaaab9 100644 (file)
@@ -97,6 +97,10 @@ class QuerySearchHelper {
                }
        }
 
+
+       /**
+        * @return array<array-key, array{id: int, name: string, visibility: int, editable: int, ref_file_id: int, number_files: int}>
+        */
        public function findUsedTagsInCaches(ISearchQuery $searchQuery, array $caches): array {
                $query = $this->getQueryBuilder();
                $query->selectTagUsage();
index e649e1efc28ac86ebc2bb778ce51176f72c920d3..2890ca6fcf6018f8d1baaec241d1faf5ec7efbee 100644 (file)
@@ -338,10 +338,17 @@ class Folder extends Node implements \OCP\Files\Folder {
        }
 
        /**
-        * @return Node[]
+        *
+        * @return array<array-key, array{id: int, name: string, visibility: int, editable: int, ref_file_id: int, number_files: int}>
         */
        public function getSystemTags(string $mediaType, int $limit = 0, int $offset = 0): array {
-               $query = $this->queryFromOperator(new SearchComparison(ISearchComparison::COMPARE_LIKE, 'mimetype', $mediaType . '/%'), null, $limit, $offset);
+               // Currently query has to have exactly one search condition. If no media type is provided,
+               // we fall back to the presence of a systemtag.
+               if (empty($mediaType)) {
+                       $query = $this->queryFromOperator(new SearchComparison(ISearchComparison::COMPARE_LIKE, 'systemtag', '%'), null, $limit, $offset);
+               } else {
+                       $query = $this->queryFromOperator(new SearchComparison(ISearchComparison::COMPARE_LIKE, 'mimetype', $mediaType . '/%'), null, $limit, $offset);
+               }
                [$caches, ] = $this->getCachesAndMountpointsForSearch();
                /** @var QuerySearchHelper $searchHelper */
                $searchHelper = \OCP\Server::get(QuerySearchHelper::class);