summaryrefslogtreecommitdiffstats
path: root/apps/dav
diff options
context:
space:
mode:
authorVincent Petry <pvince81@owncloud.com>2016-09-12 17:09:46 +0200
committerRoeland Jago Douma <roeland@famdouma.nl>2016-10-19 11:06:29 +0200
commit361f008c705009eee8d7435f46095760ac706456 (patch)
tree95e7033befa4ff0fc20e60f5df2a4b249575d636 /apps/dav
parent5e48ce98c70fa511ea2c1caeb332594912c9d96a (diff)
downloadnextcloud-server-361f008c705009eee8d7435f46095760ac706456.tar.gz
nextcloud-server-361f008c705009eee8d7435f46095760ac706456.zip
Make it possible to filter by tags with REPORT method
Enhanced the REPORT method on the Webdav endpoint and added a "oc:favorite" filter rule. When set, it will return a flat list of results filtered with only favorite files. The web UI was also adjusted to use this REPORT method instead of the private API endpoint. Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
Diffstat (limited to 'apps/dav')
-rw-r--r--apps/dav/lib/Connector/Sabre/FilesReportPlugin.php42
-rw-r--r--apps/dav/lib/Connector/Sabre/ServerFactory.php1
-rw-r--r--apps/dav/lib/Connector/Sabre/ShareTypeList.php6
-rw-r--r--apps/dav/lib/Connector/Sabre/TagList.php6
-rw-r--r--apps/dav/tests/unit/Connector/Sabre/FilesReportPluginTest.php39
5 files changed, 82 insertions, 12 deletions
diff --git a/apps/dav/lib/Connector/Sabre/FilesReportPlugin.php b/apps/dav/lib/Connector/Sabre/FilesReportPlugin.php
index 5b96f4f0f64..4df5f8b80e5 100644
--- a/apps/dav/lib/Connector/Sabre/FilesReportPlugin.php
+++ b/apps/dav/lib/Connector/Sabre/FilesReportPlugin.php
@@ -39,6 +39,7 @@ use OCP\Files\Folder;
use OCP\IGroupManager;
use OCP\SystemTag\ISystemTagManager;
use OCP\SystemTag\TagNotFoundException;
+use OCP\ITagManager;
class FilesReportPlugin extends ServerPlugin {
@@ -75,6 +76,13 @@ class FilesReportPlugin extends ServerPlugin {
private $tagMapper;
/**
+ * Manager for private tags
+ *
+ * @var ITagManager
+ */
+ private $fileTagger;
+
+ /**
* @var IUserSession
*/
private $userSession;
@@ -92,11 +100,18 @@ class FilesReportPlugin extends ServerPlugin {
/**
* @param Tree $tree
* @param View $view
+ * @param ISystemTagManager $tagManager
+ * @param ISystemTagObjectMapper $tagMapper
+ * @param ITagManager $fileTagger manager for private tags
+ * @param IUserSession $userSession
+ * @param IGroupManager $groupManager
+ * @param Folder $userfolder
*/
public function __construct(Tree $tree,
View $view,
ISystemTagManager $tagManager,
ISystemTagObjectMapper $tagMapper,
+ ITagManager $fileTagger,
IUserSession $userSession,
IGroupManager $groupManager,
Folder $userFolder
@@ -105,6 +120,7 @@ class FilesReportPlugin extends ServerPlugin {
$this->fileView = $view;
$this->tagManager = $tagManager;
$this->tagMapper = $tagMapper;
+ $this->fileTagger = $fileTagger;
$this->userSession = $userSession;
$this->groupManager = $groupManager;
$this->userFolder = $userFolder;
@@ -215,12 +231,38 @@ class FilesReportPlugin extends ServerPlugin {
$ns = '{' . $this::NS_OWNCLOUD . '}';
$resultFileIds = null;
$systemTagIds = [];
+ $favoriteFilter = null;
foreach ($filterRules as $filterRule) {
if ($filterRule['name'] === $ns . 'systemtag') {
$systemTagIds[] = $filterRule['value'];
}
+ if ($filterRule['name'] === $ns . 'favorite') {
+ $favoriteFilter = true;
+ }
}
+ if ($favoriteFilter !== null) {
+ $resultFileIds = $this->fileTagger->load('files')->getFavorites();
+ if (empty($resultFileIds)) {
+ return [];
+ }
+ }
+
+ if (!empty($systemTagIds)) {
+ $fileIds = $this->getSystemTagFileIds($systemTagIds);
+ if (empty($resultFileIds)) {
+ $resultFileIds = $fileIds;
+ } else {
+ $resultFileIds = array_intersect($fileIds, $resultFileIds);
+ }
+ }
+
+ return $resultFileIds;
+ }
+
+ private function getSystemTagFileIds($systemTagIds) {
+ $resultFileIds = null;
+
// check user permissions, if applicable
if (!$this->isAdmin()) {
// check visibility/permission
diff --git a/apps/dav/lib/Connector/Sabre/ServerFactory.php b/apps/dav/lib/Connector/Sabre/ServerFactory.php
index 644f0f28f57..6d9f9b1bc8b 100644
--- a/apps/dav/lib/Connector/Sabre/ServerFactory.php
+++ b/apps/dav/lib/Connector/Sabre/ServerFactory.php
@@ -177,6 +177,7 @@ class ServerFactory {
$view,
\OC::$server->getSystemTagManager(),
\OC::$server->getSystemTagObjectMapper(),
+ \OC::$server->getTagManager(),
$this->userSession,
\OC::$server->getGroupManager(),
$userFolder
diff --git a/apps/dav/lib/Connector/Sabre/ShareTypeList.php b/apps/dav/lib/Connector/Sabre/ShareTypeList.php
index fd9ba3f7267..4d9179b6651 100644
--- a/apps/dav/lib/Connector/Sabre/ShareTypeList.php
+++ b/apps/dav/lib/Connector/Sabre/ShareTypeList.php
@@ -66,7 +66,11 @@ class ShareTypeList implements Element {
static function xmlDeserialize(Reader $reader) {
$shareTypes = [];
- foreach ($reader->parseInnerTree() as $elem) {
+ $tree = $reader->parseInnerTree();
+ if ($tree === null) {
+ return null;
+ }
+ foreach ($tree as $elem) {
if ($elem['name'] === '{' . self::NS_OWNCLOUD . '}share-type') {
$shareTypes[] = (int)$elem['value'];
}
diff --git a/apps/dav/lib/Connector/Sabre/TagList.php b/apps/dav/lib/Connector/Sabre/TagList.php
index 23576171262..2f514112a43 100644
--- a/apps/dav/lib/Connector/Sabre/TagList.php
+++ b/apps/dav/lib/Connector/Sabre/TagList.php
@@ -85,7 +85,11 @@ class TagList implements Element {
static function xmlDeserialize(Reader $reader) {
$tags = [];
- foreach ($reader->parseInnerTree() as $elem) {
+ $tree = $reader->parseInnerTree();
+ if ($tree === null) {
+ return null;
+ }
+ foreach ($tree as $elem) {
if ($elem['name'] === '{' . self::NS_OWNCLOUD . '}tag') {
$tags[] = $elem['value'];
}
diff --git a/apps/dav/tests/unit/Connector/Sabre/FilesReportPluginTest.php b/apps/dav/tests/unit/Connector/Sabre/FilesReportPluginTest.php
index 336a33058bf..2097777c8fd 100644
--- a/apps/dav/tests/unit/Connector/Sabre/FilesReportPluginTest.php
+++ b/apps/dav/tests/unit/Connector/Sabre/FilesReportPluginTest.php
@@ -26,12 +26,15 @@ namespace OCA\DAV\Tests\unit\Connector\Sabre;
use OCA\DAV\Connector\Sabre\FilesReportPlugin as FilesReportPluginImplementation;
use OCP\IPreview;
+use OCP\ITagManager;
+use OCP\IUserSession;
use Sabre\DAV\Exception\NotFound;
use OCP\SystemTag\ISystemTagObjectMapper;
use OC\Files\View;
use OCP\Files\Folder;
use OCP\IGroupManager;
use OCP\SystemTag\ISystemTagManager;
+use OCP\ITags;
class FilesReportPluginTest extends \Test\TestCase {
/** @var \Sabre\DAV\Server|\PHPUnit_Framework_MockObject_MockObject */
@@ -46,6 +49,9 @@ class FilesReportPluginTest extends \Test\TestCase {
/** @var ISystemTagManager|\PHPUnit_Framework_MockObject_MockObject */
private $tagManager;
+ /** @var ITags|\PHPUnit_Framework_MockObject_MockObject */
+ private $privateTags;
+
/** @var \OCP\IUserSession */
private $userSession;
@@ -87,20 +93,20 @@ class FilesReportPluginTest extends \Test\TestCase {
->disableOriginalConstructor()
->getMock();
- $this->tagManager = $this->getMockBuilder('\OCP\SystemTag\ISystemTagManager')
- ->disableOriginalConstructor()
- ->getMock();
- $this->tagMapper = $this->getMockBuilder('\OCP\SystemTag\ISystemTagObjectMapper')
- ->disableOriginalConstructor()
- ->getMock();
- $this->userSession = $this->getMockBuilder('\OCP\IUserSession')
- ->disableOriginalConstructor()
- ->getMock();
-
$this->previewManager = $this->getMockBuilder('\OCP\IPreview')
->disableOriginalConstructor()
->getMock();
+ $this->tagManager = $this->createMock(ISystemTagManager::class);
+ $this->tagMapper = $this->createMock(ISystemTagObjectMapper::class);
+ $this->userSession = $this->createMock(IUserSession::class);
+ $this->privateTags = $this->createMock(ITags::class);
+ $privateTagManager = $this->createMock(ITagManager::class);
+ $privateTagManager->expects($this->any())
+ ->method('load')
+ ->with('files')
+ ->will($this->returnValue($this->privateTags));
+
$user = $this->getMockBuilder('\OCP\IUser')
->disableOriginalConstructor()
->getMock();
@@ -116,6 +122,7 @@ class FilesReportPluginTest extends \Test\TestCase {
$this->view,
$this->tagManager,
$this->tagMapper,
+ $privateTagManager,
$this->userSession,
$this->groupManager,
$this->userFolder
@@ -652,4 +659,16 @@ class FilesReportPluginTest extends \Test\TestCase {
$this->assertEquals(['222'], array_values($this->invokePrivate($this->plugin, 'processFilterRules', [$rules])));
}
+
+ public function testProcessFavoriteFilter() {
+ $rules = [
+ ['name' => '{http://owncloud.org/ns}favorite', 'value' => '1'],
+ ];
+
+ $this->privateTags->expects($this->once())
+ ->method('getFavorites')
+ ->will($this->returnValue(['456', '789']));
+
+ $this->assertEquals(['456', '789'], array_values($this->invokePrivate($this->plugin, 'processFilterRules', [$rules])));
+ }
}