Dispatch some events when tags are un-/assigned

This commit is contained in:
Joas Schilling 2016-02-01 11:48:46 +01:00
parent 9861a7f6cc
commit 591613fce2
5 changed files with 145 additions and 22 deletions

View file

@ -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
@ -72,7 +71,8 @@ class ManagerFactory implements ISystemTagManagerFactory {
public function getObjectMapper() {
return new SystemTagObjectMapper(
$this->serverContainer->getDatabaseConnection(),
$this->getManager()
$this->getManager(),
$this->serverContainer->getEventDispatcher()
);
}
}

View file

@ -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
));
}
/**

View file

@ -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;
}
}

View file

@ -378,7 +378,7 @@ class SystemTagManagerTest extends TestCase {
$tag1 = $this->tagManager->createTag('one', true, false);
$tag2 = $this->tagManager->createTag('two', true, true);
$tagMapper = new SystemTagObjectMapper($this->connection, $this->tagManager);
$tagMapper = new SystemTagObjectMapper($this->connection, $this->tagManager, $this->dispatcher);
$tagMapper->assignTags(1, 'testtype', $tag1->getId());
$tagMapper->assignTags(1, 'testtype', $tag2->getId());

View file

@ -10,14 +10,15 @@
namespace Test\SystemTag;
use OC\SystemTag\SystemTag;
use OC\SystemTag\SystemTagManager;
use OC\SystemTag\SystemTagObjectMapper;
use \OCP\SystemTag\ISystemTag;
use \OCP\SystemTag\ISystemTagManager;
use \OCP\SystemTag\ISystemTagObjectMapper;
use \OCP\SystemTag\TagNotFoundException;
use \OCP\IDBConnection;
use \OC\SystemTag\SystemTag;
use OCP\IDBConnection;
use OCP\SystemTag\ISystemTag;
use OCP\SystemTag\ISystemTagManager;
use OCP\SystemTag\ISystemTagObjectMapper;
use OCP\SystemTag\TagNotFoundException;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Test\TestCase;
/**
@ -43,6 +44,11 @@ class SystemTagObjectMapperTest extends TestCase {
*/
private $connection;
/**
* @var EventDispatcherInterface
*/
private $dispatcher;
/**
* @var ISystemTag
*/
@ -67,7 +73,14 @@ class SystemTagObjectMapperTest extends TestCase {
$this->tagManager = $this->getMockBuilder('OCP\SystemTag\ISystemTagManager')
->getMock();
$this->tagMapper = new SystemTagObjectMapper($this->connection, $this->tagManager);
$this->dispatcher = $this->getMockBuilder('Symfony\Component\EventDispatcher\EventDispatcherInterface')
->getMock();
$this->tagMapper = new SystemTagObjectMapper(
$this->connection,
$this->tagManager,
$this->dispatcher
);
$this->tag1 = new SystemTag(1, 'testtag1', false, false);
$this->tag2 = new SystemTag(2, 'testtag2', true, false);