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) {
}
$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']);
}
}
+
+ /**
+ * @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();
}
/**
- * @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);