Merge pull request #21967 from owncloud/comments-webdav
Comments WebDAV adjustementsremotes/origin/comments-markallread-dav
commit
b4853f3fce
@ -0,0 +1,130 @@ |
||||
<?php |
||||
/** |
||||
* @author Arthur Schiwon <blizzz@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 OCA\DAV\Connector\Sabre; |
||||
|
||||
use OCP\Comments\ICommentsManager; |
||||
use OCP\IUserSession; |
||||
use Sabre\DAV\PropFind; |
||||
use Sabre\DAV\ServerPlugin; |
||||
|
||||
class CommentPropertiesPlugin extends ServerPlugin { |
||||
|
||||
const PROPERTY_NAME_HREF = '{http://owncloud.org/ns}comments-href'; |
||||
const PROPERTY_NAME_COUNT = '{http://owncloud.org/ns}comments-count'; |
||||
const PROPERTY_NAME_UNREAD = '{http://owncloud.org/ns}comments-unread'; |
||||
|
||||
/** @var \Sabre\DAV\Server */ |
||||
protected $server; |
||||
|
||||
/** @var ICommentsManager */ |
||||
private $commentsManager; |
||||
|
||||
/** @var IUserSession */ |
||||
private $userSession; |
||||
|
||||
public function __construct(ICommentsManager $commentsManager, IUserSession $userSession) { |
||||
$this->commentsManager = $commentsManager; |
||||
$this->userSession = $userSession; |
||||
} |
||||
|
||||
/** |
||||
* This initializes the plugin. |
||||
* |
||||
* This function is called by Sabre\DAV\Server, after |
||||
* addPlugin is called. |
||||
* |
||||
* This method should set up the required event subscriptions. |
||||
* |
||||
* @param \Sabre\DAV\Server $server |
||||
* @return void |
||||
*/ |
||||
function initialize(\Sabre\DAV\Server $server) { |
||||
$this->server = $server; |
||||
$this->server->on('propFind', array($this, 'handleGetProperties')); |
||||
} |
||||
|
||||
/** |
||||
* Adds tags and favorites properties to the response, |
||||
* if requested. |
||||
* |
||||
* @param PropFind $propFind |
||||
* @param \Sabre\DAV\INode $node |
||||
* @return void |
||||
*/ |
||||
public function handleGetProperties( |
||||
PropFind $propFind, |
||||
\Sabre\DAV\INode $node |
||||
) { |
||||
if (!($node instanceof File) && !($node instanceof Directory)) { |
||||
return; |
||||
} |
||||
|
||||
$propFind->handle(self::PROPERTY_NAME_COUNT, function() use ($node) { |
||||
return $this->commentsManager->getNumberOfCommentsForObject('files', strval($node->getId())); |
||||
}); |
||||
|
||||
$propFind->handle(self::PROPERTY_NAME_HREF, function() use ($node) { |
||||
return $this->getCommentsLink($node); |
||||
}); |
||||
|
||||
$propFind->handle(self::PROPERTY_NAME_UNREAD, function() use ($node) { |
||||
return $this->getUnreadCount($node); |
||||
}); |
||||
} |
||||
|
||||
/** |
||||
* returns a reference to the comments node |
||||
* |
||||
* @param Node $node |
||||
* @return mixed|string |
||||
*/ |
||||
public function getCommentsLink(Node $node) { |
||||
$href = $this->server->getBaseUri(); |
||||
$entryPoint = strrpos($href, '/webdav/'); |
||||
if($entryPoint === false) { |
||||
// in case we end up somewhere else, unexpectedly. |
||||
return null; |
||||
} |
||||
$href = substr_replace($href, '/dav/', $entryPoint); |
||||
$href .= 'comments/files/' . rawurldecode($node->getId()); |
||||
return $href; |
||||
} |
||||
|
||||
/** |
||||
* returns the number of unread comments for the currently logged in user |
||||
* on the given file or directory node |
||||
* |
||||
* @param Node $node |
||||
* @return Int|null |
||||
*/ |
||||
public function getUnreadCount(Node $node) { |
||||
$user = $this->userSession->getUser(); |
||||
if(is_null($user)) { |
||||
return null; |
||||
} |
||||
|
||||
$lastRead = $this->commentsManager->getReadMark('files', strval($node->getId()), $user); |
||||
|
||||
return $this->commentsManager->getNumberOfCommentsForObject('files', strval($node->getId()), $lastRead); |
||||
} |
||||
|
||||
} |
||||
@ -0,0 +1,148 @@ |
||||
<?php |
||||
/** |
||||
* @author Arthur Schiwon <blizzz@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 OCA\DAV\Tests\Unit\Connector\Sabre; |
||||
|
||||
use \OCA\DAV\Connector\Sabre\CommentPropertiesPlugin as CommentPropertiesPluginImplementation; |
||||
|
||||
class CommentsPropertiesPlugin extends \Test\TestCase { |
||||
|
||||
/** @var CommentPropertiesPluginImplementation */ |
||||
protected $plugin; |
||||
protected $commentsManager; |
||||
protected $userSession; |
||||
protected $server; |
||||
|
||||
public function setUp() { |
||||
parent::setUp(); |
||||
|
||||
$this->commentsManager = $this->getMock('\OCP\Comments\ICommentsManager'); |
||||
$this->userSession = $this->getMock('\OCP\IUserSession'); |
||||
|
||||
$this->server = $this->getMockBuilder('\Sabre\DAV\Server') |
||||
->disableOriginalConstructor() |
||||
->getMock(); |
||||
|
||||
$this->plugin = new CommentPropertiesPluginImplementation($this->commentsManager, $this->userSession); |
||||
$this->plugin->initialize($this->server); |
||||
} |
||||
|
||||
public function nodeProvider() { |
||||
$mocks = []; |
||||
foreach(['\OCA\DAV\Connector\Sabre\File', '\OCA\DAV\Connector\Sabre\Directory', '\Sabre\DAV\INode'] as $class) { |
||||
$mocks[] = $this->getMockBuilder($class) |
||||
->disableOriginalConstructor() |
||||
->getMock(); |
||||
} |
||||
|
||||
return [ |
||||
[$mocks[0], true], |
||||
[$mocks[1], true], |
||||
[$mocks[2], false] |
||||
]; |
||||
} |
||||
|
||||
/** |
||||
* @dataProvider nodeProvider |
||||
* @param $node |
||||
* @param $expectedSuccessful |
||||
*/ |
||||
public function testHandleGetProperties($node, $expectedSuccessful) { |
||||
$propFind = $this->getMockBuilder('\Sabre\DAV\PropFind') |
||||
->disableOriginalConstructor() |
||||
->getMock(); |
||||
|
||||
if($expectedSuccessful) { |
||||
$propFind->expects($this->exactly(3)) |
||||
->method('handle'); |
||||
} else { |
||||
$propFind->expects($this->never()) |
||||
->method('handle'); |
||||
} |
||||
|
||||
$this->plugin->handleGetProperties($propFind, $node); |
||||
} |
||||
|
||||
public function baseUriProvider() { |
||||
return [ |
||||
['owncloud/remote.php/webdav/', '4567', 'owncloud/remote.php/dav/comments/files/4567'], |
||||
['owncloud/remote.php/wicked/', '4567', null] |
||||
]; |
||||
} |
||||
|
||||
/** |
||||
* @dataProvider baseUriProvider |
||||
* @param $baseUri |
||||
* @param $fid |
||||
* @param $expectedHref |
||||
*/ |
||||
public function testGetCommentsLink($baseUri, $fid, $expectedHref) { |
||||
$node = $this->getMockBuilder('\OCA\DAV\Connector\Sabre\File') |
||||
->disableOriginalConstructor() |
||||
->getMock(); |
||||
$node->expects($this->any()) |
||||
->method('getId') |
||||
->will($this->returnValue($fid)); |
||||
|
||||
$this->server->expects($this->once()) |
||||
->method('getBaseUri') |
||||
->will($this->returnValue($baseUri)); |
||||
|
||||
$href = $this->plugin->getCommentsLink($node); |
||||
$this->assertSame($expectedHref, $href); |
||||
} |
||||
|
||||
public function userProvider() { |
||||
return [ |
||||
[$this->getMock('\OCP\IUser')], |
||||
[null] |
||||
]; |
||||
} |
||||
|
||||
/** |
||||
* @dataProvider userProvider |
||||
* @param $user |
||||
*/ |
||||
public function testGetUnreadCount($user) { |
||||
$node = $this->getMockBuilder('\OCA\DAV\Connector\Sabre\File') |
||||
->disableOriginalConstructor() |
||||
->getMock(); |
||||
$node->expects($this->any()) |
||||
->method('getId') |
||||
->will($this->returnValue('4567')); |
||||
|
||||
$this->userSession->expects($this->once()) |
||||
->method('getUser') |
||||
->will($this->returnValue($user)); |
||||
|
||||
$this->commentsManager->expects($this->any()) |
||||
->method('getNumberOfCommentsForObject') |
||||
->will($this->returnValue(42)); |
||||
|
||||
$unread = $this->plugin->getUnreadCount($node); |
||||
if(is_null($user)) { |
||||
$this->assertNull($unread); |
||||
} else { |
||||
$this->assertSame($unread, 42); |
||||
} |
||||
} |
||||
|
||||
} |
||||
Loading…
Reference in new issue