Skip to content

Commit

Permalink
Merge pull request #21967 from owncloud/comments-webdav
Browse files Browse the repository at this point in the history
Comments WebDAV adjustements
  • Loading branch information
DeepDiver1975 committed Feb 1, 2016
2 parents a2e13ae + 6dc7933 commit b4853f3
Show file tree
Hide file tree
Showing 12 changed files with 590 additions and 8 deletions.
4 changes: 2 additions & 2 deletions apps/dav/lib/comments/commentsplugin.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
/**
* @author Arthur Schiwon <[email protected]>
*
* @copyright Copyright (c) 2015, ownCloud, Inc.
* @copyright Copyright (c) 2016, ownCloud, Inc.
* @license AGPL-3.0
*
* This code is free software: you can redistribute it and/or modify
Expand Down Expand Up @@ -88,7 +88,7 @@ function initialize(Server $server) {
$this->server->xml->namespaceMap[self::NS_OWNCLOUD] = 'oc';

$this->server->xml->classMap['DateTime'] = function(Writer $writer, \DateTime $value) {
$writer->write($value->format('Y-m-d H:m:i'));
$writer->write(\Sabre\HTTP\toDate($value));
};

$this->server->on('report', [$this, 'onReport']);
Expand Down
130 changes: 130 additions & 0 deletions apps/dav/lib/connector/sabre/commentpropertiesplugin.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
<?php
/**
* @author Arthur Schiwon <[email protected]>
*
* @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);
}

}
1 change: 1 addition & 0 deletions apps/dav/lib/connector/sabre/serverfactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,7 @@ public function createServer($baseUri,

if($this->userSession->isLoggedIn()) {
$server->addPlugin(new \OCA\DAV\Connector\Sabre\TagsPlugin($objectTree, $this->tagManager));
$server->addPlugin(new \OCA\DAV\Connector\Sabre\CommentPropertiesPlugin(\OC::$server->getCommentsManager(), $this->userSession));
// custom properties plugin must be the last one
$server->addPlugin(
new \Sabre\DAV\PropertyStorage\Plugin(
Expand Down
148 changes: 148 additions & 0 deletions apps/dav/tests/unit/connector/sabre/commentpropertiesplugin.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,148 @@
<?php
/**
* @author Arthur Schiwon <[email protected]>
*
* @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);
}
}

}
43 changes: 43 additions & 0 deletions db_structure.xml
Original file line number Diff line number Diff line change
Expand Up @@ -1580,6 +1580,49 @@

</table>

<table>
<!--
default place to store per user and object read markers
-->
<name>*dbprefix*comments_read_markers</name>

<declaration>

<field>
<name>user_id</name>
<type>text</type>
<default></default>
<notnull>true</notnull>
<length>64</length>
</field>

<field>
<name>marker_datetime</name>
<type>timestamp</type>
<default></default>
<notnull>false</notnull>
</field>

<field>
<name>object_type</name>
<type>text</type>
<default></default>
<notnull>true</notnull>
<length>64</length>
</field>

<field>
<name>object_id</name>
<type>text</type>
<default></default>
<notnull>true</notnull>
<length>64</length>
</field>

</declaration>

</table>

<table>
<!--
Encrypted credentials storage
Expand Down
Loading

0 comments on commit b4853f3

Please sign in to comment.