]> source.dussan.org Git - nextcloud-server.git/commitdiff
Return isUnread property per comment
authorArthur Schiwon <blizzz@owncloud.com>
Fri, 29 Jan 2016 22:23:16 +0000 (23:23 +0100)
committerArthur Schiwon <blizzz@owncloud.com>
Mon, 1 Feb 2016 15:55:24 +0000 (16:55 +0100)
apps/dav/lib/comments/commentnode.php
apps/dav/lib/comments/entitycollection.php
apps/dav/lib/comments/entitytypecollection.php
apps/dav/lib/comments/rootcollection.php
apps/dav/tests/unit/comments/commentnode.php

index eb26e350a4283064a75227dbe2e5c329196cd0d2..a5d508dd198a75fa2886ef335991a7500aab636f 100644 (file)
@@ -26,12 +26,17 @@ use OCP\Comments\IComment;
 use OCP\Comments\ICommentsManager;
 use OCP\ILogger;
 use OCP\IUserManager;
+use OCP\IUserSession;
 use Sabre\DAV\Exception\MethodNotAllowed;
 use Sabre\DAV\PropPatch;
 
 class CommentNode implements \Sabre\DAV\INode, \Sabre\DAV\IProperties {
        const NS_OWNCLOUD = 'http://owncloud.org/ns';
 
+       const PROPERTY_NAME_UNREAD = '{http://owncloud.org/ns}isUnread';
+       const PROPERTY_NAME_MESSAGE = '{http://owncloud.org/ns}message';
+       const PROPERTY_NAME_ACTOR_DISPLAYNAME = '{http://owncloud.org/ns}actorDisplayName';
+
        /** @var  IComment */
        public $comment;
 
@@ -47,18 +52,23 @@ class CommentNode implements \Sabre\DAV\INode, \Sabre\DAV\IProperties {
        /** @var IUserManager */
        protected $userManager;
 
+       /** @var IUserSession */
+       protected $userSession;
+
        /**
         * CommentNode constructor.
         *
         * @param ICommentsManager $commentsManager
         * @param IComment $comment
         * @param IUserManager $userManager
+        * @param IUserSession $userSession
         * @param ILogger $logger
         */
        public function __construct(
                ICommentsManager $commentsManager,
                IComment $comment,
                IUserManager $userManager,
+               IUserSession $userSession,
                ILogger $logger
        ) {
                $this->commentsManager = $commentsManager;
@@ -74,6 +84,7 @@ class CommentNode implements \Sabre\DAV\INode, \Sabre\DAV\IProperties {
                        $this->properties[$name] = $getter;
                }
                $this->userManager = $userManager;
+               $this->userSession = $userSession;
        }
 
        /**
@@ -87,15 +98,17 @@ class CommentNode implements \Sabre\DAV\INode, \Sabre\DAV\IProperties {
                        '{http://owncloud.org/ns}parentId',
                        '{http://owncloud.org/ns}topmostParentId',
                        '{http://owncloud.org/ns}childrenCount',
-                       '{http://owncloud.org/ns}message',
                        '{http://owncloud.org/ns}verb',
                        '{http://owncloud.org/ns}actorType',
                        '{http://owncloud.org/ns}actorId',
-                       '{http://owncloud.org/ns}actorDisplayName',
                        '{http://owncloud.org/ns}creationDateTime',
                        '{http://owncloud.org/ns}latestChildDateTime',
                        '{http://owncloud.org/ns}objectType',
                        '{http://owncloud.org/ns}objectId',
+                       // re-used property names are defined as constants
+                       self::PROPERTY_NAME_MESSAGE,
+                       self::PROPERTY_NAME_ACTOR_DISPLAYNAME,
+                       self::PROPERTY_NAME_UNREAD
                ];
        }
 
@@ -169,7 +182,7 @@ class CommentNode implements \Sabre\DAV\INode, \Sabre\DAV\IProperties {
         */
        function propPatch(PropPatch $propPatch) {
                // other properties than 'message' are read only
-               $propPatch->handle('{'.self::NS_OWNCLOUD.'}message', [$this, 'updateComment']);
+               $propPatch->handle(self::PROPERTY_NAME_MESSAGE, [$this, 'updateComment']);
        }
 
        /**
@@ -201,8 +214,26 @@ class CommentNode implements \Sabre\DAV\INode, \Sabre\DAV\IProperties {
                if($this->comment->getActorType() === 'users') {
                        $user = $this->userManager->get($this->comment->getActorId());
                        $displayName = is_null($user) ? null : $user->getDisplayName();
-                       $result['{' . self::NS_OWNCLOUD . '}actorDisplayName'] = $displayName;
+                       $result[self::PROPERTY_NAME_ACTOR_DISPLAYNAME] = $displayName;
+               }
+
+               $unread = null;
+               $user =  $this->userSession->getUser();
+               if(!is_null($user)) {
+                       $readUntil = $this->commentsManager->getReadMark(
+                               $this->comment->getObjectType(),
+                               $this->comment->getObjectId(),
+                               $user
+                       );
+                       if(is_null($readUntil)) {
+                               $unread = 'true';
+                       } else {
+                               $unread = $this->comment->getCreationDateTime() > $readUntil;
+                               // re-format for output
+                               $unread = $unread ? 'true' : 'false';
+                       }
                }
+               $result[self::PROPERTY_NAME_UNREAD] = $unread;
 
                return $result;
        }
index a93569f6e4f1f497e48c9cf2c0b7fbda61c01bda..0cc5526c5297065e386f01a48a14c186422e81b1 100644 (file)
@@ -51,6 +51,7 @@ class EntityCollection extends RootCollection {
         * @param ICommentsManager $commentsManager
         * @param Folder $fileRoot
         * @param IUserManager $userManager
+        * @param IUserSession $userSession
         * @param ILogger $logger
         */
        public function __construct(
@@ -59,6 +60,7 @@ class EntityCollection extends RootCollection {
                ICommentsManager $commentsManager,
                Folder $fileRoot,
                IUserManager $userManager,
+               IUserSession $userSession,
                ILogger $logger
        ) {
                foreach(['id', 'name'] as $property) {
@@ -73,6 +75,7 @@ class EntityCollection extends RootCollection {
                $this->fileRoot = $fileRoot;
                $this->logger = $logger;
                $this->userManager = $userManager;
+               $this->userSession = $userSession;
        }
 
        /**
@@ -97,7 +100,13 @@ class EntityCollection extends RootCollection {
        function getChild($name) {
                try {
                        $comment = $this->commentsManager->get($name);
-                       return new CommentNode($this->commentsManager, $comment, $this->userManager, $this->logger);
+                       return new CommentNode(
+                               $this->commentsManager,
+                               $comment,
+                               $this->userManager,
+                               $this->userSession,
+                               $this->logger
+                       );
                } catch (\OCP\Comments\NotFoundException $e) {
                        throw new NotFound();
                }
@@ -125,7 +134,13 @@ class EntityCollection extends RootCollection {
                $comments = $this->commentsManager->getForObject($this->name, $this->id, $limit, $offset, $datetime);
                $result = [];
                foreach($comments as $comment) {
-                       $result[] = new CommentNode($this->commentsManager, $comment, $this->userManager, $this->logger);
+                       $result[] = new CommentNode(
+                               $this->commentsManager,
+                               $comment,
+                               $this->userManager,
+                               $this->userSession,
+                               $this->logger
+                       );
                }
                return $result;
        }
index f49aac747c247903aa6c35a88ce143331371d72a..6bc4248420786a30b9f2e3215e0d378e93f4c740 100644 (file)
@@ -25,6 +25,7 @@ use OCP\Comments\ICommentsManager;
 use OCP\Files\Folder;
 use OCP\ILogger;
 use OCP\IUserManager;
+use OCP\IUserSession;
 use Sabre\DAV\Exception\MethodNotAllowed;
 use Sabre\DAV\Exception\NotFound;
 
@@ -51,6 +52,7 @@ class EntityTypeCollection extends RootCollection {
         * @param ICommentsManager $commentsManager
         * @param Folder $fileRoot
         * @param IUserManager $userManager
+        * @param IUserSession $userSession
         * @param ILogger $logger
         */
        public function __construct(
@@ -58,6 +60,7 @@ class EntityTypeCollection extends RootCollection {
                ICommentsManager $commentsManager,
                Folder $fileRoot,
                IUserManager $userManager,
+               IUserSession $userSession,
                ILogger $logger
        ) {
                $name = trim($name);
@@ -69,6 +72,7 @@ class EntityTypeCollection extends RootCollection {
                $this->fileRoot = $fileRoot;
                $this->logger = $logger;
                $this->userManager = $userManager;
+               $this->userSession = $userSession;
        }
 
        /**
@@ -91,6 +95,7 @@ class EntityTypeCollection extends RootCollection {
                        $this->commentsManager,
                        $this->fileRoot,
                        $this->userManager,
+                       $this->userSession,
                        $this->logger
                );
        }
index aec8e6556674ec9053029f2eeba69122422ffd8b..cda666f7162222ef31c91c6cd04bea295b7b27a4 100644 (file)
@@ -98,6 +98,7 @@ class RootCollection implements ICollection {
                        $this->commentsManager,
                        $userFolder,
                        $this->userManager,
+                       $this->userSession,
                        $this->logger
                );
        }
index aa75e35d665be253f547e073dc9d9b33f9dca08b..44ac54ae937ed9c7e4ad9e2ebcddd5e2c1436f42 100644 (file)
@@ -30,6 +30,7 @@ class CommentsNode extends \Test\TestCase {
        protected $node;
        protected $userManager;
        protected $logger;
+       protected $userSession;
 
        public function setUp() {
                parent::setUp();
@@ -37,9 +38,16 @@ class CommentsNode extends \Test\TestCase {
                $this->commentsManager = $this->getMock('\OCP\Comments\ICommentsManager');
                $this->comment = $this->getMock('\OCP\Comments\IComment');
                $this->userManager = $this->getMock('\OCP\IUserManager');
+               $this->userSession = $this->getMock('\OCP\IUserSession');
                $this->logger = $this->getMock('\OCP\ILogger');
 
-               $this->node = new CommentNode($this->commentsManager, $this->comment, $this->userManager, $this->logger);
+               $this->node = new CommentNode(
+                       $this->commentsManager,
+                       $this->comment,
+                       $this->userManager,
+                       $this->userSession,
+                       $this->logger
+               );
        }
 
        public function testDelete() {
@@ -133,6 +141,7 @@ class CommentsNode extends \Test\TestCase {
                        $ns . 'latestChildDateTime' => new \DateTime('2016-01-12 18:48:00'),
                        $ns . 'objectType' => 'files',
                        $ns . 'objectId' => '1848',
+                       $ns . 'isUnread' => null,
                ];
 
                $this->comment->expects($this->once())
@@ -198,10 +207,45 @@ class CommentsNode extends \Test\TestCase {
                $properties = $this->node->getProperties(null);
 
                foreach($properties as $name => $value) {
-                       $this->assertTrue(isset($expected[$name]));
+                       $this->assertTrue(array_key_exists($name, $expected));
                        $this->assertSame($expected[$name], $value);
                        unset($expected[$name]);
                }
                $this->assertTrue(empty($expected));
        }
+
+       public function readCommentProvider() {
+               $creationDT = new \DateTime('2016-01-19 18:48:00');
+               $diff = new \DateInterval('PT2H');
+               $readDT1 = clone $creationDT; $readDT1->sub($diff);
+               $readDT2 = clone $creationDT; $readDT2->add($diff);
+               return [
+                       [$creationDT, $readDT1, 'true'],
+                       [$creationDT, $readDT2, 'false'],
+                       [$creationDT, null, 'true'],
+               ];
+       }
+
+       /**
+        * @dataProvider readCommentProvider
+        * @param $expected
+        */
+       public function testGetPropertiesUnreadProperty($creationDT, $readDT, $expected) {
+               $this->comment->expects($this->any())
+                       ->method('getCreationDateTime')
+                       ->will($this->returnValue($creationDT));
+
+               $this->commentsManager->expects($this->once())
+                       ->method('getReadMark')
+                       ->will($this->returnValue($readDT));
+
+               $this->userSession->expects($this->once())
+                       ->method('getUser')
+                       ->will($this->returnValue($this->getMock('\OCP\IUser')));
+
+               $properties = $this->node->getProperties(null);
+
+               $this->assertTrue(array_key_exists(CommentNode::PROPERTY_NAME_UNREAD, $properties));
+               $this->assertSame($properties[CommentNode::PROPERTY_NAME_UNREAD], $expected);
+       }
 }