Dispatch events when adding, updating and deleting comments

This commit is contained in:
Joas Schilling 2016-02-05 10:45:16 +01:00
parent 0ed2108b7f
commit e86dcdacc8
4 changed files with 116 additions and 7 deletions

View File

@ -21,6 +21,7 @@
namespace OC\Comments;
use Doctrine\DBAL\Exception\DriverException;
use OCP\Comments\CommentsEvent;
use OCP\Comments\IComment;
use OCP\Comments\ICommentsManager;
use OCP\Comments\NotFoundException;
@ -28,6 +29,7 @@ use OCP\IDBConnection;
use OCP\IConfig;
use OCP\ILogger;
use OCP\IUser;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
class Manager implements ICommentsManager {
@ -37,20 +39,33 @@ class Manager implements ICommentsManager {
/** @var ILogger */
protected $logger;
/** @var IComment[] */
protected $commentsCache = [];
/** @var IConfig */
protected $config;
/** @var EventDispatcherInterface */
protected $dispatcher;
/** @var IComment[] */
protected $commentsCache = [];
/**
* Manager constructor.
*
* @param IDBConnection $dbConn
* @param ILogger $logger
* @param IConfig $config
* @param EventDispatcherInterface $dispatcher
*/
public function __construct(
IDBConnection $dbConn,
ILogger $logger,
IConfig $config
IConfig $config,
EventDispatcherInterface $dispatcher
) {
$this->dbConn = $dbConn;
$this->logger = $logger;
$this->config = $config;
$this->dispatcher = $dispatcher;
}
/**
@ -415,6 +430,19 @@ class Manager implements ICommentsManager {
throw new \InvalidArgumentException('Parameter must be string');
}
try {
$comment = $this->get($id);
} catch (\Exception $e) {
// Ignore exceptions, we just don't fire a hook then
$comment = null;
}
if ($comment instanceof IComment) {
$this->dispatcher->dispatch(CommentsEvent::EVENT_DELETE, new CommentsEvent(
CommentsEvent::EVENT_DELETE,
$comment
));
}
$qb = $this->dbConn->getQueryBuilder();
$query = $qb->delete('comments')
->where($qb->expr()->eq('id', $qb->createParameter('id')))
@ -431,7 +459,7 @@ class Manager implements ICommentsManager {
}
/**
* saves the comment permanently and returns it
* saves the comment permanently
*
* if the supplied comment has an empty ID, a new entry comment will be
* saved and the instance updated with the new ID.
@ -493,6 +521,11 @@ class Manager implements ICommentsManager {
$comment->setId(strval($qb->getLastInsertId()));
}
$this->dispatcher->dispatch(CommentsEvent::EVENT_ADD, new CommentsEvent(
CommentsEvent::EVENT_ADD,
$comment
));
return $affectedRows > 0;
}
@ -526,6 +559,11 @@ class Manager implements ICommentsManager {
throw new NotFoundException('Comment to update does ceased to exist');
}
$this->dispatcher->dispatch(CommentsEvent::EVENT_UPDATE, new CommentsEvent(
CommentsEvent::EVENT_UPDATE,
$comment
));
return $affectedRows > 0;
}

View File

@ -52,7 +52,8 @@ class ManagerFactory implements ICommentsManagerFactory {
return new Manager(
$this->serverContainer->getDatabaseConnection(),
$this->serverContainer->getLogger(),
$this->serverContainer->getConfig()
$this->serverContainer->getConfig(),
$this->serverContainer->getEventDispatcher()
);
}
}

View File

@ -0,0 +1,70 @@
<?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\Comments;
use Symfony\Component\EventDispatcher\Event;
/**
* Class CommentsEvent
*
* @package OCP\Comments
* @since 9.0.0
*/
class CommentsEvent extends Event {
const EVENT_ADD = 'OCP\Comments\ICommentsManager::addComment';
const EVENT_UPDATE = 'OCP\Comments\ICommentsManager::updateComment';
const EVENT_DELETE = 'OCP\Comments\ICommentsManager::deleteComment';
/** @var string */
protected $event;
/** @var IComment */
protected $comment;
/**
* DispatcherEvent constructor.
*
* @param string $event
* @param IComment $comment
* @since 9.0.IComment
*/
public function __construct($event, IComment $comment) {
$this->event = $event;
$this->comment = $comment;
}
/**
* @return string
* @since 9.0.0
*/
public function getEvent() {
return $this->event;
}
/**
* @return IComment
* @since 9.0.0
*/
public function getComment() {
return $this->comment;
}
}

View File

@ -149,7 +149,7 @@ interface ICommentsManager {
public function delete($id);
/**
* saves the comment permanently and returns it
* saves the comment permanently
*
* if the supplied comment has an empty ID, a new entry comment will be
* saved and the instance updated with the new ID.