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; namespace OC\Comments;
use Doctrine\DBAL\Exception\DriverException; use Doctrine\DBAL\Exception\DriverException;
use OCP\Comments\CommentsEvent;
use OCP\Comments\IComment; use OCP\Comments\IComment;
use OCP\Comments\ICommentsManager; use OCP\Comments\ICommentsManager;
use OCP\Comments\NotFoundException; use OCP\Comments\NotFoundException;
@ -28,6 +29,7 @@ use OCP\IDBConnection;
use OCP\IConfig; use OCP\IConfig;
use OCP\ILogger; use OCP\ILogger;
use OCP\IUser; use OCP\IUser;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
class Manager implements ICommentsManager { class Manager implements ICommentsManager {
@ -37,20 +39,33 @@ class Manager implements ICommentsManager {
/** @var ILogger */ /** @var ILogger */
protected $logger; protected $logger;
/** @var IComment[] */
protected $commentsCache = [];
/** @var IConfig */ /** @var IConfig */
protected $config; 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( public function __construct(
IDBConnection $dbConn, IDBConnection $dbConn,
ILogger $logger, ILogger $logger,
IConfig $config IConfig $config,
EventDispatcherInterface $dispatcher
) { ) {
$this->dbConn = $dbConn; $this->dbConn = $dbConn;
$this->logger = $logger; $this->logger = $logger;
$this->config = $config; $this->config = $config;
$this->dispatcher = $dispatcher;
} }
/** /**
@ -415,6 +430,19 @@ class Manager implements ICommentsManager {
throw new \InvalidArgumentException('Parameter must be string'); 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(); $qb = $this->dbConn->getQueryBuilder();
$query = $qb->delete('comments') $query = $qb->delete('comments')
->where($qb->expr()->eq('id', $qb->createParameter('id'))) ->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 * if the supplied comment has an empty ID, a new entry comment will be
* saved and the instance updated with the new ID. * saved and the instance updated with the new ID.
@ -493,6 +521,11 @@ class Manager implements ICommentsManager {
$comment->setId(strval($qb->getLastInsertId())); $comment->setId(strval($qb->getLastInsertId()));
} }
$this->dispatcher->dispatch(CommentsEvent::EVENT_ADD, new CommentsEvent(
CommentsEvent::EVENT_ADD,
$comment
));
return $affectedRows > 0; return $affectedRows > 0;
} }
@ -526,6 +559,11 @@ class Manager implements ICommentsManager {
throw new NotFoundException('Comment to update does ceased to exist'); 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; return $affectedRows > 0;
} }

View File

@ -52,7 +52,8 @@ class ManagerFactory implements ICommentsManagerFactory {
return new Manager( return new Manager(
$this->serverContainer->getDatabaseConnection(), $this->serverContainer->getDatabaseConnection(),
$this->serverContainer->getLogger(), $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); 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 * if the supplied comment has an empty ID, a new entry comment will be
* saved and the instance updated with the new ID. * saved and the instance updated with the new ID.