]> source.dussan.org Git - nextcloud-server.git/commitdiff
Dispatch events when adding, updating and deleting comments
authorJoas Schilling <nickvergessen@owncloud.com>
Fri, 5 Feb 2016 09:45:16 +0000 (10:45 +0100)
committerJoas Schilling <nickvergessen@owncloud.com>
Fri, 5 Feb 2016 10:30:53 +0000 (11:30 +0100)
lib/private/comments/manager.php
lib/private/comments/managerfactory.php
lib/public/comments/commentsevent.php [new file with mode: 0644]
lib/public/comments/icommentsmanager.php

index 0cacc1cce711ccdd73c6e14ff09567a9ca83ff59..21baeb6fee39b6c14b86a18d551ab7d31ea46996 100644 (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;
        }
 
index d3f6c44e539e9b52d6530955bd6b47c2209d5518..b8e77c64fae798b621b6bbc310fb9180ca69a235 100644 (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()
                );
        }
 }
diff --git a/lib/public/comments/commentsevent.php b/lib/public/comments/commentsevent.php
new file mode 100644 (file)
index 0000000..1311015
--- /dev/null
@@ -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;
+       }
+}
index 46608ca8165e9aebbb4990b146a20f4b47948fe8..0b37fde24d8392cfa108af32312c1e8bbd2b254c 100644 (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.