diff options
author | Thomas Müller <thomas.mueller@tmit.eu> | 2016-02-02 13:08:01 +0100 |
---|---|---|
committer | Thomas Müller <thomas.mueller@tmit.eu> | 2016-02-02 13:08:01 +0100 |
commit | 2d1d89ee29e49412192b051412755610e0538198 (patch) | |
tree | 7aa78b5317412f2bacf781f599bc29aee70406ab /lib | |
parent | 37d6fff9761817299a71e9183890267f4290d492 (diff) | |
parent | 7f563dc3e9a03284d9eff69214b6686cf9eb1916 (diff) | |
download | nextcloud-server-2d1d89ee29e49412192b051412755610e0538198.tar.gz nextcloud-server-2d1d89ee29e49412192b051412755610e0538198.zip |
Merge pull request #22049 from owncloud/issue-22041-activities-for-systemtags
Issue 22041 activities for systemtags
Diffstat (limited to 'lib')
-rw-r--r-- | lib/private/activitymanager.php | 9 | ||||
-rw-r--r-- | lib/private/appframework/dependencyinjection/dicontainer.php | 4 | ||||
-rw-r--r-- | lib/private/systemtag/managerfactory.php | 13 | ||||
-rw-r--r-- | lib/private/systemtag/systemtagmanager.php | 72 | ||||
-rw-r--r-- | lib/private/systemtag/systemtagobjectmapper.php | 35 | ||||
-rw-r--r-- | lib/public/systemtag/managerevent.php | 85 | ||||
-rw-r--r-- | lib/public/systemtag/mapperevent.php | 93 |
7 files changed, 279 insertions, 32 deletions
diff --git a/lib/private/activitymanager.php b/lib/private/activitymanager.php index e5235cb9bfe..68bb8c13401 100644 --- a/lib/private/activitymanager.php +++ b/lib/private/activitymanager.php @@ -310,20 +310,19 @@ class ActivityManager implements IManager { /** * @param string $type - * @param int $id + * @param string $id */ public function setFormattingObject($type, $id) { $this->formattingObjectType = $type; - $this->formattingObjectId = $id; + $this->formattingObjectId = (string) $id; } /** * @return bool */ public function isFormattingFilteredObject() { - return 'filter' === $this->request->getParam('filter') - && $this->formattingObjectType === $this->request->getParam('objecttype') - && $this->formattingObjectId === $this->request->getParam('objectid'); + return $this->formattingObjectType === $this->request->getParam('object_type') + && $this->formattingObjectId === $this->request->getParam('object_id'); } /** diff --git a/lib/private/appframework/dependencyinjection/dicontainer.php b/lib/private/appframework/dependencyinjection/dicontainer.php index ff9da88cd81..5fc45fdd2e8 100644 --- a/lib/private/appframework/dependencyinjection/dicontainer.php +++ b/lib/private/appframework/dependencyinjection/dicontainer.php @@ -152,6 +152,10 @@ class DIContainer extends SimpleContainer implements IAppContainer { return $this->getServer()->getL10N($c->query('AppName')); }); + $this->registerService('OCP\\L10N\\IFactory', function($c) { + return $this->getServer()->getL10NFactory(); + }); + $this->registerService('OCP\\ILogger', function($c) { return $this->getServer()->getLogger(); }); diff --git a/lib/private/systemtag/managerfactory.php b/lib/private/systemtag/managerfactory.php index 7b7b9558b04..7ad4f922600 100644 --- a/lib/private/systemtag/managerfactory.php +++ b/lib/private/systemtag/managerfactory.php @@ -20,11 +20,10 @@ */ namespace OC\SystemTag; -use OCP\SystemTag\ISystemTagManagerFactory; -use OCP\SystemTag\ISystemTagManager; -use OC\SystemTag\SystemTagManager; -use OC\SystemTag\SystemTagObjectMapper; use OCP\IServerContainer; +use OCP\SystemTag\ISystemTagManager; +use OCP\SystemTag\ISystemTagManagerFactory; +use OCP\SystemTag\ISystemTagObjectMapper; /** * Default factory class for system tag managers @@ -58,7 +57,8 @@ class ManagerFactory implements ISystemTagManagerFactory { */ public function getManager() { return new SystemTagManager( - $this->serverContainer->getDatabaseConnection() + $this->serverContainer->getDatabaseConnection(), + $this->serverContainer->getEventDispatcher() ); } @@ -72,7 +72,8 @@ class ManagerFactory implements ISystemTagManagerFactory { public function getObjectMapper() { return new SystemTagObjectMapper( $this->serverContainer->getDatabaseConnection(), - $this->getManager() + $this->getManager(), + $this->serverContainer->getEventDispatcher() ); } } diff --git a/lib/private/systemtag/systemtagmanager.php b/lib/private/systemtag/systemtagmanager.php index af912a74936..76a60a91328 100644 --- a/lib/private/systemtag/systemtagmanager.php +++ b/lib/private/systemtag/systemtagmanager.php @@ -26,17 +26,20 @@ use Doctrine\DBAL\Exception\UniqueConstraintViolationException; use OCP\DB\QueryBuilder\IQueryBuilder; use OCP\IDBConnection; use OCP\SystemTag\ISystemTagManager; +use OCP\SystemTag\ManagerEvent; use OCP\SystemTag\TagAlreadyExistsException; use OCP\SystemTag\TagNotFoundException; +use Symfony\Component\EventDispatcher\EventDispatcherInterface; class SystemTagManager implements ISystemTagManager { const TAG_TABLE = 'systemtag'; - /** - * @var IDBConnection - */ - private $connection; + /** @var IDBConnection */ + protected $connection; + + /** @var EventDispatcherInterface */ + protected $dispatcher; /** * Prepared query for selecting tags directly @@ -46,12 +49,14 @@ class SystemTagManager implements ISystemTagManager { private $selectTagQuery; /** - * Constructor. - * - * @param IDBConnection $connection database connection - */ - public function __construct(IDBConnection $connection) { + * Constructor. + * + * @param IDBConnection $connection database connection + * @param EventDispatcherInterface $dispatcher + */ + public function __construct(IDBConnection $connection, EventDispatcherInterface $dispatcher) { $this->connection = $connection; + $this->dispatcher = $dispatcher; $query = $this->connection->getQueryBuilder(); $this->selectTagQuery = $query->select('*') @@ -190,14 +195,20 @@ class SystemTagManager implements ISystemTagManager { ); } - $tagId = $this->connection->lastInsertId('*PREFIX*' . self::TAG_TABLE); + $tagId = $query->getLastInsertId(); - return new SystemTag( + $tag = new SystemTag( (int)$tagId, $tagName, (bool)$userVisible, (bool)$userAssignable ); + + $this->dispatcher->dispatch(ManagerEvent::EVENT_CREATE, new ManagerEvent( + ManagerEvent::EVENT_CREATE, $tag + )); + + return $tag; } /** @@ -207,6 +218,22 @@ class SystemTagManager implements ISystemTagManager { $userVisible = (int)$userVisible; $userAssignable = (int)$userAssignable; + try { + $tags = $this->getTagsByIds($tagId); + } catch (TagNotFoundException $e) { + throw new TagNotFoundException( + 'Tag does not exist', 0, null, [$tagId] + ); + } + + $beforeUpdate = array_shift($tags); + $afterUpdate = new SystemTag( + (int) $tagId, + $tagName, + (bool) $userVisible, + (bool) $userAssignable + ); + $query = $this->connection->getQueryBuilder(); $query->update(self::TAG_TABLE) ->set('name', $query->createParameter('name')) @@ -231,6 +258,10 @@ class SystemTagManager implements ISystemTagManager { $e ); } + + $this->dispatcher->dispatch(ManagerEvent::EVENT_UPDATE, new ManagerEvent( + ManagerEvent::EVENT_UPDATE, $afterUpdate, $beforeUpdate + )); } /** @@ -242,10 +273,21 @@ class SystemTagManager implements ISystemTagManager { } $tagNotFoundException = null; + $tags = []; try { - $this->getTagsByIds($tagIds); + $tags = $this->getTagsByIds($tagIds); } catch (TagNotFoundException $e) { $tagNotFoundException = $e; + + // Get existing tag objects for the hooks later + $existingTags = array_diff($tagIds, $tagNotFoundException->getMissingTags()); + if (!empty($existingTags)) { + try { + $tags = $this->getTagsByIds($existingTags); + } catch (TagNotFoundException $e) { + // Ignore further errors... + } + } } // delete relationships first @@ -261,6 +303,12 @@ class SystemTagManager implements ISystemTagManager { ->setParameter('tagids', $tagIds, IQueryBuilder::PARAM_INT_ARRAY) ->execute(); + foreach ($tags as $tag) { + $this->dispatcher->dispatch(ManagerEvent::EVENT_DELETE, new ManagerEvent( + ManagerEvent::EVENT_DELETE, $tag + )); + } + if ($tagNotFoundException !== null) { throw new TagNotFoundException( 'Tag id(s) not found', 0, $tagNotFoundException, $tagNotFoundException->getMissingTags() diff --git a/lib/private/systemtag/systemtagobjectmapper.php b/lib/private/systemtag/systemtagobjectmapper.php index 458b558ad97..1efb4f0f6e0 100644 --- a/lib/private/systemtag/systemtagobjectmapper.php +++ b/lib/private/systemtag/systemtagobjectmapper.php @@ -28,31 +28,34 @@ use OCP\IDBConnection; use OCP\SystemTag\ISystemTag; use OCP\SystemTag\ISystemTagManager; use OCP\SystemTag\ISystemTagObjectMapper; +use OCP\SystemTag\MapperEvent; use OCP\SystemTag\TagNotFoundException; +use Symfony\Component\EventDispatcher\EventDispatcherInterface; class SystemTagObjectMapper implements ISystemTagObjectMapper { const RELATION_TABLE = 'systemtag_object_mapping'; - /** - * @var ISystemTagManager - */ - private $tagManager; + /** @var ISystemTagManager */ + protected $tagManager; - /** - * @var IDBConnection - */ - private $connection; + /** @var IDBConnection */ + protected $connection; + + /** @var EventDispatcherInterface */ + protected $dispatcher; /** * Constructor. * * @param IDBConnection $connection database connection * @param ISystemTagManager $tagManager system tag manager + * @param EventDispatcherInterface $dispatcher */ - public function __construct(IDBConnection $connection, ISystemTagManager $tagManager) { + public function __construct(IDBConnection $connection, ISystemTagManager $tagManager, EventDispatcherInterface $dispatcher) { $this->connection = $connection; $this->tagManager = $tagManager; + $this->dispatcher = $dispatcher; } /** @@ -143,6 +146,13 @@ class SystemTagObjectMapper implements ISystemTagObjectMapper { // ignore existing relations } } + + $this->dispatcher->dispatch(MapperEvent::EVENT_ASSIGN, new MapperEvent( + MapperEvent::EVENT_ASSIGN, + $objectType, + $objId, + $tagIds + )); } /** @@ -164,6 +174,13 @@ class SystemTagObjectMapper implements ISystemTagObjectMapper { ->setParameter('objecttype', $objectType) ->setParameter('tagids', $tagIds, IQueryBuilder::PARAM_INT_ARRAY) ->execute(); + + $this->dispatcher->dispatch(MapperEvent::EVENT_UNASSIGN, new MapperEvent( + MapperEvent::EVENT_UNASSIGN, + $objectType, + $objId, + $tagIds + )); } /** diff --git a/lib/public/systemtag/managerevent.php b/lib/public/systemtag/managerevent.php new file mode 100644 index 00000000000..a0429fc9f67 --- /dev/null +++ b/lib/public/systemtag/managerevent.php @@ -0,0 +1,85 @@ +<?php +/** + * @author Joas Schilling <nickvergessen@owncloud.com> + * + * @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 <http://www.gnu.org/licenses/> + * + */ + +namespace OCP\SystemTag; + +use Symfony\Component\EventDispatcher\Event; + +/** + * Class ManagerEvent + * + * @package OCP\SystemTag + * @since 9.0.0 + */ +class ManagerEvent extends Event { + + const EVENT_CREATE = 'OCP\SystemTag\ISystemTagManager::createTag'; + const EVENT_UPDATE = 'OCP\SystemTag\ISystemTagManager::updateTag'; + const EVENT_DELETE = 'OCP\SystemTag\ISystemTagManager::deleteTag'; + + /** @var string */ + protected $event; + /** @var ISystemTag */ + protected $tag; + /** @var ISystemTag */ + protected $beforeTag; + + /** + * DispatcherEvent constructor. + * + * @param string $event + * @param ISystemTag $tag + * @param ISystemTag $beforeTag + * @since 9.0.0 + */ + public function __construct($event, ISystemTag $tag, ISystemTag $beforeTag = null) { + $this->event = $event; + $this->tag = $tag; + $this->beforeTag = $beforeTag; + } + + /** + * @return string + * @since 9.0.0 + */ + public function getEvent() { + return $this->event; + } + + /** + * @return ISystemTag + * @since 9.0.0 + */ + public function getTag() { + return $this->tag; + } + + /** + * @return ISystemTag + * @since 9.0.0 + */ + public function getTagBefore() { + if ($this->event !== self::EVENT_UPDATE) { + throw new \BadMethodCallException('getTagBefore is only available on the update Event'); + } + return $this->beforeTag; + } +} diff --git a/lib/public/systemtag/mapperevent.php b/lib/public/systemtag/mapperevent.php new file mode 100644 index 00000000000..e05a5ce09c8 --- /dev/null +++ b/lib/public/systemtag/mapperevent.php @@ -0,0 +1,93 @@ +<?php +/** + * @author Joas Schilling <nickvergessen@owncloud.com> + * + * @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 <http://www.gnu.org/licenses/> + * + */ + +namespace OCP\SystemTag; + +use Symfony\Component\EventDispatcher\Event; + +/** + * Class MapperEvent + * + * @package OCP\SystemTag + * @since 9.0.0 + */ +class MapperEvent extends Event { + + const EVENT_ASSIGN = 'OCP\SystemTag\ISystemTagObjectMapper::assignTags'; + const EVENT_UNASSIGN = 'OCP\SystemTag\ISystemTagObjectMapper::unassignTags'; + + /** @var string */ + protected $event; + /** @var string */ + protected $objectType; + /** @var string */ + protected $objectId; + /** @var int[] */ + protected $tags; + + /** + * DispatcherEvent constructor. + * + * @param string $event + * @param string $objectType + * @param string $objectId + * @param int[] $tags + * @since 9.0.0 + */ + public function __construct($event, $objectType, $objectId, array $tags) { + $this->event = $event; + $this->objectType = $objectType; + $this->objectId = $objectId; + $this->tags = $tags; + } + + /** + * @return string + * @since 9.0.0 + */ + public function getEvent() { + return $this->event; + } + + /** + * @return string + * @since 9.0.0 + */ + public function getObjectType() { + return $this->objectType; + } + + /** + * @return string + * @since 9.0.0 + */ + public function getObjectId() { + return $this->objectId; + } + + /** + * @return int[] + * @since 9.0.0 + */ + public function getTags() { + return $this->tags; + } +} |