* @author Morris Jobke * @author Thomas Müller * @author Vincent Petry * * @copyright Copyright (c) 2016, ownCloud, Inc. * @license AGPL-3.0 * * This code is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License, version 3, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License, version 3, * along with this program. If not, see * */ namespace OCA\Files\Service; use OC\Files\FileInfo; use OCP\Files\Node; /** * Service class to manage tags on files. */ class TagService { /** * @var \OCP\IUserSession */ private $userSession; /** * @var \OCP\ITags */ private $tagger; /** * @var \OCP\Files\Folder */ private $homeFolder; public function __construct( \OCP\IUserSession $userSession, \OCP\ITags $tagger, \OCP\Files\Folder $homeFolder ) { $this->userSession = $userSession; $this->tagger = $tagger; $this->homeFolder = $homeFolder; } /** * Updates the tags of the specified file path. * The passed tags are absolute, which means they will * replace the actual tag selection. * * @param string $path path * @param array $tags array of tags * @return array list of tags * @throws \OCP\Files\NotFoundException if the file does not exist */ public function updateFileTags($path, $tags) { $fileId = $this->homeFolder->get($path)->getId(); $currentTags = $this->tagger->getTagsForObjects(array($fileId)); if (!empty($currentTags)) { $currentTags = current($currentTags); } $newTags = array_diff($tags, $currentTags); foreach ($newTags as $tag) { $this->tagger->tagAs($fileId, $tag); } $deletedTags = array_diff($currentTags, $tags); foreach ($deletedTags as $tag) { $this->tagger->unTag($fileId, $tag); } // TODO: re-read from tagger to make sure the // list is up to date, in case of concurrent changes ? return $tags; } /** * Get all files for the given tag * * @param string $tagName tag name to filter by * @return Node[] list of matching files * @throws \Exception if the tag does not exist */ public function getFilesByTag($tagName) { try { $fileIds = $this->tagger->getIdsForTag($tagName); } catch (\Exception $e) { return []; } $allNodes = []; foreach ($fileIds as $fileId) { $allNodes = array_merge($allNodes, $this->homeFolder->getById((int) $fileId)); } return $allNodes; } }