diff options
author | Vincent Petry <pvince81@owncloud.com> | 2016-09-12 17:09:46 +0200 |
---|---|---|
committer | Roeland Jago Douma <roeland@famdouma.nl> | 2016-10-19 11:06:29 +0200 |
commit | 361f008c705009eee8d7435f46095760ac706456 (patch) | |
tree | 95e7033befa4ff0fc20e60f5df2a4b249575d636 /apps/dav | |
parent | 5e48ce98c70fa511ea2c1caeb332594912c9d96a (diff) | |
download | nextcloud-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.php | 42 | ||||
-rw-r--r-- | apps/dav/lib/Connector/Sabre/ServerFactory.php | 1 | ||||
-rw-r--r-- | apps/dav/lib/Connector/Sabre/ShareTypeList.php | 6 | ||||
-rw-r--r-- | apps/dav/lib/Connector/Sabre/TagList.php | 6 | ||||
-rw-r--r-- | apps/dav/tests/unit/Connector/Sabre/FilesReportPluginTest.php | 39 |
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]))); + } } |