summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorThomas Müller <thomas.mueller@tmit.eu>2016-02-02 13:08:01 +0100
committerThomas Müller <thomas.mueller@tmit.eu>2016-02-02 13:08:01 +0100
commit2d1d89ee29e49412192b051412755610e0538198 (patch)
tree7aa78b5317412f2bacf781f599bc29aee70406ab /lib
parent37d6fff9761817299a71e9183890267f4290d492 (diff)
parent7f563dc3e9a03284d9eff69214b6686cf9eb1916 (diff)
downloadnextcloud-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.php9
-rw-r--r--lib/private/appframework/dependencyinjection/dicontainer.php4
-rw-r--r--lib/private/systemtag/managerfactory.php13
-rw-r--r--lib/private/systemtag/systemtagmanager.php72
-rw-r--r--lib/private/systemtag/systemtagobjectmapper.php35
-rw-r--r--lib/public/systemtag/managerevent.php85
-rw-r--r--lib/public/systemtag/mapperevent.php93
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;
+ }
+}