summaryrefslogtreecommitdiffstats
path: root/lib/private
diff options
context:
space:
mode:
authorMorris Jobke <hey@morrisjobke.de>2016-10-17 09:30:47 +0200
committerGitHub <noreply@github.com>2016-10-17 09:30:47 +0200
commit96f8f209b9e899207a338eaa69b439e55f749ed5 (patch)
tree85d18ea0e4bed793c037a498aa684adca0441798 /lib/private
parent5b74b3ceafd17490ea7bef74051c70090f51b17e (diff)
parent70c7781aa8a1737b4c7ca8e935796b1ebc3d9f34 (diff)
downloadnextcloud-server-96f8f209b9e899207a338eaa69b439e55f749ed5.tar.gz
nextcloud-server-96f8f209b9e899207a338eaa69b439e55f749ed5.zip
Merge pull request #1449 from nextcloud/comments-user-mention
Notifications for simple @-mentioning in comments
Diffstat (limited to 'lib/private')
-rw-r--r--lib/private/AppFramework/DependencyInjection/DIContainer.php4
-rw-r--r--lib/private/Comments/Manager.php85
2 files changed, 68 insertions, 21 deletions
diff --git a/lib/private/AppFramework/DependencyInjection/DIContainer.php b/lib/private/AppFramework/DependencyInjection/DIContainer.php
index 5fc200a1bce..21d5eaa9503 100644
--- a/lib/private/AppFramework/DependencyInjection/DIContainer.php
+++ b/lib/private/AppFramework/DependencyInjection/DIContainer.php
@@ -161,6 +161,10 @@ class DIContainer extends SimpleContainer implements IAppContainer {
return $this->getServer()->getRootFolder();
});
+ $this->registerService('OCP\\Files\\Folder', function() {
+ return $this->getServer()->getUserFolder();
+ });
+
$this->registerService('OCP\\Http\\Client\\IClientService', function($c) {
return $this->getServer()->getHTTPClientService();
});
diff --git a/lib/private/Comments/Manager.php b/lib/private/Comments/Manager.php
index 59678775d88..b3ecab731e1 100644
--- a/lib/private/Comments/Manager.php
+++ b/lib/private/Comments/Manager.php
@@ -26,6 +26,7 @@ namespace OC\Comments;
use Doctrine\DBAL\Exception\DriverException;
use OCP\Comments\CommentsEvent;
use OCP\Comments\IComment;
+use OCP\Comments\ICommentsEventHandler;
use OCP\Comments\ICommentsManager;
use OCP\Comments\NotFoundException;
use OCP\DB\QueryBuilder\IQueryBuilder;
@@ -33,7 +34,6 @@ use OCP\IDBConnection;
use OCP\IConfig;
use OCP\ILogger;
use OCP\IUser;
-use Symfony\Component\EventDispatcher\EventDispatcherInterface;
class Manager implements ICommentsManager {
@@ -46,30 +46,30 @@ class Manager implements ICommentsManager {
/** @var IConfig */
protected $config;
- /** @var EventDispatcherInterface */
- protected $dispatcher;
-
/** @var IComment[] */
protected $commentsCache = [];
+ /** @var \Closure[] */
+ protected $eventHandlerClosures = [];
+
+ /** @var ICommentsEventHandler[] */
+ protected $eventHandlers = [];
+
/**
* Manager constructor.
*
* @param IDBConnection $dbConn
* @param ILogger $logger
* @param IConfig $config
- * @param EventDispatcherInterface $dispatcher
*/
public function __construct(
IDBConnection $dbConn,
ILogger $logger,
- IConfig $config,
- EventDispatcherInterface $dispatcher
+ IConfig $config
) {
$this->dbConn = $dbConn;
$this->logger = $logger;
$this->config = $config;
- $this->dispatcher = $dispatcher;
}
/**
@@ -455,10 +455,7 @@ class Manager implements ICommentsManager {
}
if ($affectedRows > 0 && $comment instanceof IComment) {
- $this->dispatcher->dispatch(CommentsEvent::EVENT_DELETE, new CommentsEvent(
- CommentsEvent::EVENT_DELETE,
- $comment
- ));
+ $this->sendEvent(CommentsEvent::EVENT_DELETE, $comment);
}
return ($affectedRows > 0);
@@ -525,13 +522,9 @@ class Manager implements ICommentsManager {
if ($affectedRows > 0) {
$comment->setId(strval($qb->getLastInsertId()));
+ $this->sendEvent(CommentsEvent::EVENT_ADD, $comment);
}
- $this->dispatcher->dispatch(CommentsEvent::EVENT_ADD, new CommentsEvent(
- CommentsEvent::EVENT_ADD,
- $comment
- ));
-
return $affectedRows > 0;
}
@@ -543,6 +536,12 @@ class Manager implements ICommentsManager {
* @throws NotFoundException
*/
protected function update(IComment $comment) {
+ // for properly working preUpdate Events we need the old comments as is
+ // in the DB and overcome caching. Also avoid that outdated information stays.
+ $this->uncache($comment->getId());
+ $this->sendEvent(CommentsEvent::EVENT_PRE_UPDATE, $this->get($comment->getId()));
+ $this->uncache($comment->getId());
+
$qb = $this->dbConn->getQueryBuilder();
$affectedRows = $qb
->update('comments')
@@ -565,10 +564,7 @@ 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
- ));
+ $this->sendEvent(CommentsEvent::EVENT_UPDATE, $comment);
return $affectedRows > 0;
}
@@ -751,4 +747,51 @@ class Manager implements ICommentsManager {
}
return ($affectedRows > 0);
}
+
+ /**
+ * registers an Entity to the manager, so event notifications can be send
+ * to consumers of the comments infrastructure
+ *
+ * @param \Closure $closure
+ */
+ public function registerEventHandler(\Closure $closure) {
+ $this->eventHandlerClosures[] = $closure;
+ $this->eventHandlers = [];
+ }
+
+ /**
+ * returns valid, registered entities
+ *
+ * @return \OCP\Comments\ICommentsEventHandler[]
+ */
+ private function getEventHandlers() {
+ if(!empty($this->eventHandlers)) {
+ return $this->eventHandlers;
+ }
+
+ $this->eventHandlers = [];
+ foreach ($this->eventHandlerClosures as $name => $closure) {
+ $entity = $closure();
+ if (!($entity instanceof ICommentsEventHandler)) {
+ throw new \InvalidArgumentException('The given entity does not implement the ICommentsEntity interface');
+ }
+ $this->eventHandlers[$name] = $entity;
+ }
+
+ return $this->eventHandlers;
+ }
+
+ /**
+ * sends notifications to the registered entities
+ *
+ * @param $eventType
+ * @param IComment $comment
+ */
+ private function sendEvent($eventType, IComment $comment) {
+ $entities = $this->getEventHandlers();
+ $event = new CommentsEvent($eventType, $comment);
+ foreach ($entities as $entity) {
+ $entity->handle($event);
+ }
+ }
}