2014-11-18 20:53:45 +03:00
|
|
|
<?php
|
|
|
|
/**
|
2016-07-21 17:49:16 +03:00
|
|
|
* @copyright Copyright (c) 2016, ownCloud, Inc.
|
|
|
|
*
|
2020-03-31 11:49:10 +03:00
|
|
|
* @author Christoph Wurst <christoph@winzerhof-wurst.at>
|
|
|
|
* @author Daniel Kesselberg <mail@danielkesselberg.de>
|
2016-07-21 17:49:16 +03:00
|
|
|
* @author Joas Schilling <coding@schilljs.com>
|
2015-03-26 13:44:34 +03:00
|
|
|
* @author Morris Jobke <hey@morrisjobke.de>
|
|
|
|
* @author Vincent Petry <pvince81@owncloud.com>
|
|
|
|
*
|
|
|
|
* @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,
|
2019-12-03 21:57:53 +03:00
|
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>
|
2015-03-26 13:44:34 +03:00
|
|
|
*
|
2014-11-18 20:53:45 +03:00
|
|
|
*/
|
2015-02-26 13:37:37 +03:00
|
|
|
|
2014-11-18 20:53:45 +03:00
|
|
|
namespace OCA\Files\Service;
|
|
|
|
|
2016-12-04 14:14:10 +03:00
|
|
|
use OCA\Files\Activity\FavoriteProvider;
|
|
|
|
use OCP\Activity\IManager;
|
|
|
|
use OCP\Files\Folder;
|
|
|
|
use OCP\ITags;
|
|
|
|
use OCP\IUser;
|
|
|
|
use OCP\IUserSession;
|
2018-01-10 13:20:21 +03:00
|
|
|
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
|
|
|
|
use Symfony\Component\EventDispatcher\GenericEvent;
|
2015-01-19 19:05:43 +03:00
|
|
|
|
2014-11-18 20:53:45 +03:00
|
|
|
/**
|
|
|
|
* Service class to manage tags on files.
|
|
|
|
*/
|
|
|
|
class TagService {
|
|
|
|
|
2016-12-04 14:14:10 +03:00
|
|
|
/** @var IUserSession */
|
2014-11-18 20:53:45 +03:00
|
|
|
private $userSession;
|
2016-12-04 14:14:10 +03:00
|
|
|
/** @var IManager */
|
|
|
|
private $activityManager;
|
|
|
|
/** @var ITags */
|
2014-11-18 20:53:45 +03:00
|
|
|
private $tagger;
|
2016-12-04 14:14:10 +03:00
|
|
|
/** @var Folder */
|
|
|
|
private $homeFolder;
|
2018-01-10 13:20:21 +03:00
|
|
|
/** @var EventDispatcherInterface */
|
|
|
|
private $dispatcher;
|
2014-11-18 20:53:45 +03:00
|
|
|
|
|
|
|
/**
|
2016-12-04 14:14:10 +03:00
|
|
|
* @param IUserSession $userSession
|
|
|
|
* @param IManager $activityManager
|
|
|
|
* @param ITags $tagger
|
|
|
|
* @param Folder $homeFolder
|
2018-01-10 13:20:21 +03:00
|
|
|
* @param EventDispatcherInterface $dispatcher
|
2014-11-18 20:53:45 +03:00
|
|
|
*/
|
|
|
|
public function __construct(
|
2016-12-04 14:14:10 +03:00
|
|
|
IUserSession $userSession,
|
|
|
|
IManager $activityManager,
|
|
|
|
ITags $tagger,
|
2018-01-10 13:20:21 +03:00
|
|
|
Folder $homeFolder,
|
|
|
|
EventDispatcherInterface $dispatcher
|
2014-11-18 20:53:45 +03:00
|
|
|
) {
|
|
|
|
$this->userSession = $userSession;
|
2016-12-04 14:14:10 +03:00
|
|
|
$this->activityManager = $activityManager;
|
2014-11-18 20:53:45 +03:00
|
|
|
$this->tagger = $tagger;
|
|
|
|
$this->homeFolder = $homeFolder;
|
2018-01-10 13:20:21 +03:00
|
|
|
$this->dispatcher = $dispatcher;
|
2014-11-18 20:53:45 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 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
|
2015-03-18 17:58:06 +03:00
|
|
|
* @throws \OCP\Files\NotFoundException if the file does not exist
|
2014-11-18 20:53:45 +03:00
|
|
|
*/
|
|
|
|
public function updateFileTags($path, $tags) {
|
|
|
|
$fileId = $this->homeFolder->get($path)->getId();
|
|
|
|
|
2020-03-26 11:30:18 +03:00
|
|
|
$currentTags = $this->tagger->getTagsForObjects([$fileId]);
|
2014-11-18 20:53:45 +03:00
|
|
|
|
|
|
|
if (!empty($currentTags)) {
|
|
|
|
$currentTags = current($currentTags);
|
|
|
|
}
|
|
|
|
|
|
|
|
$newTags = array_diff($tags, $currentTags);
|
|
|
|
foreach ($newTags as $tag) {
|
2020-02-11 23:40:01 +03:00
|
|
|
if ($tag === ITags::TAG_FAVORITE) {
|
2016-12-04 14:14:10 +03:00
|
|
|
$this->addActivity(true, $fileId, $path);
|
|
|
|
}
|
2014-11-18 20:53:45 +03:00
|
|
|
$this->tagger->tagAs($fileId, $tag);
|
|
|
|
}
|
|
|
|
$deletedTags = array_diff($currentTags, $tags);
|
|
|
|
foreach ($deletedTags as $tag) {
|
2020-02-11 23:40:01 +03:00
|
|
|
if ($tag === ITags::TAG_FAVORITE) {
|
2016-12-04 14:14:10 +03:00
|
|
|
$this->addActivity(false, $fileId, $path);
|
|
|
|
}
|
2014-11-18 20:53:45 +03:00
|
|
|
$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;
|
|
|
|
}
|
2016-12-04 14:14:10 +03:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @param bool $addToFavorite
|
|
|
|
* @param int $fileId
|
|
|
|
* @param string $path
|
|
|
|
*/
|
|
|
|
protected function addActivity($addToFavorite, $fileId, $path) {
|
|
|
|
$user = $this->userSession->getUser();
|
|
|
|
if (!$user instanceof IUser) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2018-01-10 13:20:21 +03:00
|
|
|
$eventName = $addToFavorite ? 'addFavorite' : 'removeFavorite';
|
|
|
|
$this->dispatcher->dispatch(self::class . '::' . $eventName, new GenericEvent(null, [
|
|
|
|
'userId' => $user->getUID(),
|
|
|
|
'fileId' => $fileId,
|
|
|
|
'path' => $path,
|
|
|
|
]));
|
|
|
|
|
2016-12-04 14:14:10 +03:00
|
|
|
$event = $this->activityManager->generateEvent();
|
2017-01-20 14:48:46 +03:00
|
|
|
try {
|
|
|
|
$event->setApp('files')
|
|
|
|
->setObject('files', $fileId, $path)
|
|
|
|
->setType('favorite')
|
|
|
|
->setAuthor($user->getUID())
|
|
|
|
->setAffectedUser($user->getUID())
|
|
|
|
->setTimestamp(time())
|
|
|
|
->setSubject(
|
|
|
|
$addToFavorite ? FavoriteProvider::SUBJECT_ADDED : FavoriteProvider::SUBJECT_REMOVED,
|
|
|
|
['id' => $fileId, 'path' => $path]
|
|
|
|
);
|
|
|
|
$this->activityManager->publish($event);
|
|
|
|
} catch (\InvalidArgumentException $e) {
|
|
|
|
} catch (\BadMethodCallException $e) {
|
|
|
|
}
|
2016-12-04 14:14:10 +03:00
|
|
|
}
|
2014-11-18 20:53:45 +03:00
|
|
|
}
|