add dav property to check if a file has a preview available

This commit is contained in:
Robin Appelman 2016-07-26 13:15:12 +02:00
parent 318d68a9a9
commit 1fef5d3d06
8 changed files with 85 additions and 6 deletions

View File

@ -50,7 +50,8 @@ $serverFactory = new OCA\DAV\Connector\Sabre\ServerFactory(
\OC::$server->getUserSession(), \OC::$server->getUserSession(),
\OC::$server->getMountManager(), \OC::$server->getMountManager(),
\OC::$server->getTagManager(), \OC::$server->getTagManager(),
\OC::$server->getRequest() \OC::$server->getRequest(),
\OC::$server->getPreviewManager()
); );
$requestUri = \OC::$server->getRequest()->getRequestUri(); $requestUri = \OC::$server->getRequest()->getRequestUri();

View File

@ -36,7 +36,8 @@ $serverFactory = new \OCA\DAV\Connector\Sabre\ServerFactory(
\OC::$server->getUserSession(), \OC::$server->getUserSession(),
\OC::$server->getMountManager(), \OC::$server->getMountManager(),
\OC::$server->getTagManager(), \OC::$server->getTagManager(),
\OC::$server->getRequest() \OC::$server->getRequest(),
\OC::$server->getPreviewManager()
); );
// Backends // Backends

View File

@ -33,6 +33,7 @@ namespace OCA\DAV\Connector\Sabre;
use OC\Files\View; use OC\Files\View;
use OCA\DAV\Upload\FutureFile; use OCA\DAV\Upload\FutureFile;
use OCP\Files\ForbiddenException; use OCP\Files\ForbiddenException;
use OCP\IPreview;
use Sabre\DAV\Exception\Forbidden; use Sabre\DAV\Exception\Forbidden;
use Sabre\DAV\Exception\NotFound; use Sabre\DAV\Exception\NotFound;
use Sabre\DAV\IFile; use Sabre\DAV\IFile;
@ -50,6 +51,7 @@ class FilesPlugin extends ServerPlugin {
// namespace // namespace
const NS_OWNCLOUD = 'http://owncloud.org/ns'; const NS_OWNCLOUD = 'http://owncloud.org/ns';
const NS_NEXTCLOUD = 'http://nextcloud.org/ns';
const FILEID_PROPERTYNAME = '{http://owncloud.org/ns}id'; const FILEID_PROPERTYNAME = '{http://owncloud.org/ns}id';
const INTERNAL_FILEID_PROPERTYNAME = '{http://owncloud.org/ns}fileid'; const INTERNAL_FILEID_PROPERTYNAME = '{http://owncloud.org/ns}fileid';
const PERMISSIONS_PROPERTYNAME = '{http://owncloud.org/ns}permissions'; const PERMISSIONS_PROPERTYNAME = '{http://owncloud.org/ns}permissions';
@ -62,6 +64,7 @@ class FilesPlugin extends ServerPlugin {
const OWNER_DISPLAY_NAME_PROPERTYNAME = '{http://owncloud.org/ns}owner-display-name'; const OWNER_DISPLAY_NAME_PROPERTYNAME = '{http://owncloud.org/ns}owner-display-name';
const CHECKSUMS_PROPERTYNAME = '{http://owncloud.org/ns}checksums'; const CHECKSUMS_PROPERTYNAME = '{http://owncloud.org/ns}checksums';
const DATA_FINGERPRINT_PROPERTYNAME = '{http://owncloud.org/ns}data-fingerprint'; const DATA_FINGERPRINT_PROPERTYNAME = '{http://owncloud.org/ns}data-fingerprint';
const HAS_PREVIEW_PROPERTYNAME = '{http://nextcloud.org/ns}has-preview';
/** /**
* Reference to main server object * Reference to main server object
@ -103,11 +106,17 @@ class FilesPlugin extends ServerPlugin {
*/ */
private $request; private $request;
/**
* @var IPreview
*/
private $previewManager;
/** /**
* @param Tree $tree * @param Tree $tree
* @param View $view * @param View $view
* @param IConfig $config * @param IConfig $config
* @param IRequest $request * @param IRequest $request
* @param IPreview $previewManager
* @param bool $isPublic * @param bool $isPublic
* @param bool $downloadAttachment * @param bool $downloadAttachment
*/ */
@ -115,6 +124,7 @@ class FilesPlugin extends ServerPlugin {
View $view, View $view,
IConfig $config, IConfig $config,
IRequest $request, IRequest $request,
IPreview $previewManager,
$isPublic = false, $isPublic = false,
$downloadAttachment = true) { $downloadAttachment = true) {
$this->tree = $tree; $this->tree = $tree;
@ -123,6 +133,7 @@ class FilesPlugin extends ServerPlugin {
$this->request = $request; $this->request = $request;
$this->isPublic = $isPublic; $this->isPublic = $isPublic;
$this->downloadAttachment = $downloadAttachment; $this->downloadAttachment = $downloadAttachment;
$this->previewManager = $previewManager;
} }
/** /**
@ -139,6 +150,7 @@ class FilesPlugin extends ServerPlugin {
public function initialize(\Sabre\DAV\Server $server) { public function initialize(\Sabre\DAV\Server $server) {
$server->xml->namespaceMap[self::NS_OWNCLOUD] = 'oc'; $server->xml->namespaceMap[self::NS_OWNCLOUD] = 'oc';
$server->xml->namespaceMap[self::NS_NEXTCLOUD] = 'nc';
$server->protectedProperties[] = self::FILEID_PROPERTYNAME; $server->protectedProperties[] = self::FILEID_PROPERTYNAME;
$server->protectedProperties[] = self::INTERNAL_FILEID_PROPERTYNAME; $server->protectedProperties[] = self::INTERNAL_FILEID_PROPERTYNAME;
$server->protectedProperties[] = self::PERMISSIONS_PROPERTYNAME; $server->protectedProperties[] = self::PERMISSIONS_PROPERTYNAME;
@ -149,6 +161,7 @@ class FilesPlugin extends ServerPlugin {
$server->protectedProperties[] = self::OWNER_DISPLAY_NAME_PROPERTYNAME; $server->protectedProperties[] = self::OWNER_DISPLAY_NAME_PROPERTYNAME;
$server->protectedProperties[] = self::CHECKSUMS_PROPERTYNAME; $server->protectedProperties[] = self::CHECKSUMS_PROPERTYNAME;
$server->protectedProperties[] = self::DATA_FINGERPRINT_PROPERTYNAME; $server->protectedProperties[] = self::DATA_FINGERPRINT_PROPERTYNAME;
$server->protectedProperties[] = self::HAS_PREVIEW_PROPERTYNAME;
// normally these cannot be changed (RFC4918), but we want them modifiable through PROPPATCH // normally these cannot be changed (RFC4918), but we want them modifiable through PROPPATCH
$allowedProperties = ['{DAV:}getetag']; $allowedProperties = ['{DAV:}getetag'];
@ -316,6 +329,10 @@ class FilesPlugin extends ServerPlugin {
return $this->config->getSystemValue('data-fingerprint', ''); return $this->config->getSystemValue('data-fingerprint', '');
} }
}); });
$propFind->handle(self::HAS_PREVIEW_PROPERTYNAME, function () use ($node) {
return json_encode($this->previewManager->isAvailable($node->getFileInfo()));
});
} }
if ($node instanceof \OCA\DAV\Files\FilesHome) { if ($node instanceof \OCA\DAV\Files\FilesHome) {

View File

@ -34,6 +34,7 @@ use OCP\Files\Mount\IMountManager;
use OCP\IConfig; use OCP\IConfig;
use OCP\IDBConnection; use OCP\IDBConnection;
use OCP\ILogger; use OCP\ILogger;
use OCP\IPreview;
use OCP\IRequest; use OCP\IRequest;
use OCP\ITagManager; use OCP\ITagManager;
use OCP\IUserSession; use OCP\IUserSession;
@ -54,6 +55,8 @@ class ServerFactory {
private $tagManager; private $tagManager;
/** @var IRequest */ /** @var IRequest */
private $request; private $request;
/** @var IPreview */
private $previewManager;
/** /**
* @param IConfig $config * @param IConfig $config
@ -63,6 +66,7 @@ class ServerFactory {
* @param IMountManager $mountManager * @param IMountManager $mountManager
* @param ITagManager $tagManager * @param ITagManager $tagManager
* @param IRequest $request * @param IRequest $request
* @param IPreview $previewManager
*/ */
public function __construct( public function __construct(
IConfig $config, IConfig $config,
@ -71,7 +75,8 @@ class ServerFactory {
IUserSession $userSession, IUserSession $userSession,
IMountManager $mountManager, IMountManager $mountManager,
ITagManager $tagManager, ITagManager $tagManager,
IRequest $request IRequest $request,
IPreview $previewManager
) { ) {
$this->config = $config; $this->config = $config;
$this->logger = $logger; $this->logger = $logger;
@ -80,6 +85,7 @@ class ServerFactory {
$this->mountManager = $mountManager; $this->mountManager = $mountManager;
$this->tagManager = $tagManager; $this->tagManager = $tagManager;
$this->request = $request; $this->request = $request;
$this->previewManager = $previewManager;
} }
/** /**
@ -145,6 +151,7 @@ class ServerFactory {
$view, $view,
$this->config, $this->config,
$this->request, $this->request,
$this->previewManager,
false, false,
!$this->config->getSystemValue('debug', false) !$this->config->getSystemValue('debug', false)
) )

View File

@ -158,6 +158,7 @@ class Server {
$view, $view,
\OC::$server->getConfig(), \OC::$server->getConfig(),
$this->request, $this->request,
\OC::$server->getPreviewManager(),
false, false,
!\OC::$server->getConfig()->getSystemValue('debug', false) !\OC::$server->getConfig()->getSystemValue('debug', false)
) )

View File

@ -48,6 +48,7 @@ class FilesPluginTest extends TestCase {
const OWNER_ID_PROPERTYNAME = FilesPlugin::OWNER_ID_PROPERTYNAME; const OWNER_ID_PROPERTYNAME = FilesPlugin::OWNER_ID_PROPERTYNAME;
const OWNER_DISPLAY_NAME_PROPERTYNAME = FilesPlugin::OWNER_DISPLAY_NAME_PROPERTYNAME; const OWNER_DISPLAY_NAME_PROPERTYNAME = FilesPlugin::OWNER_DISPLAY_NAME_PROPERTYNAME;
const DATA_FINGERPRINT_PROPERTYNAME = FilesPlugin::DATA_FINGERPRINT_PROPERTYNAME; const DATA_FINGERPRINT_PROPERTYNAME = FilesPlugin::DATA_FINGERPRINT_PROPERTYNAME;
const HAS_PREVIEW_PROPERTYNAME = FilesPlugin::HAS_PREVIEW_PROPERTYNAME;
/** /**
* @var \Sabre\DAV\Server | \PHPUnit_Framework_MockObject_MockObject * @var \Sabre\DAV\Server | \PHPUnit_Framework_MockObject_MockObject
@ -79,6 +80,11 @@ class FilesPluginTest extends TestCase {
*/ */
private $request; private $request;
/**
* @var \OCP\IPreview | \PHPUnit_Framework_MockObject_MockObject
*/
private $previewManager;
public function setUp() { public function setUp() {
parent::setUp(); parent::setUp();
$this->server = $this->getMockBuilder('\Sabre\DAV\Server') $this->server = $this->getMockBuilder('\Sabre\DAV\Server')
@ -99,12 +105,16 @@ class FilesPluginTest extends TestCase {
$this->request = $this->getMockBuilder('\OCP\IRequest') $this->request = $this->getMockBuilder('\OCP\IRequest')
->disableOriginalConstructor() ->disableOriginalConstructor()
->getMock(); ->getMock();
$this->previewManager = $this->getMockBuilder('\OCP\IPreview')
->disableOriginalConstructor()
->getMock();
$this->plugin = new FilesPlugin( $this->plugin = new FilesPlugin(
$this->tree, $this->tree,
$this->view, $this->view,
$this->config, $this->config,
$this->request $this->request,
$this->previewManager
); );
$this->plugin->initialize($this->server); $this->plugin->initialize($this->server);
} }
@ -139,6 +149,13 @@ class FilesPluginTest extends TestCase {
$node->expects($this->any()) $node->expects($this->any())
->method('getDavPermissions') ->method('getDavPermissions')
->will($this->returnValue('DWCKMSR')); ->will($this->returnValue('DWCKMSR'));
$node->expects($this->any())
->method('getFileInfo')
->will($this->returnValue(
$this->getMockBuilder('\OCP\Files\FileInfo')
->disableOriginalConstructor()
->getMock()
));
return $node; return $node;
} }
@ -283,6 +300,7 @@ class FilesPluginTest extends TestCase {
$this->getMockBuilder('\OCP\IRequest') $this->getMockBuilder('\OCP\IRequest')
->disableOriginalConstructor() ->disableOriginalConstructor()
->getMock(), ->getMock(),
$this->previewManager,
true); true);
$this->plugin->initialize($this->server); $this->plugin->initialize($this->server);
@ -555,4 +573,28 @@ class FilesPluginTest extends TestCase {
$this->plugin->httpGet($request, $response); $this->plugin->httpGet($request, $response);
} }
public function testHasPreview() {
/** @var \OCA\DAV\Connector\Sabre\Directory | \PHPUnit_Framework_MockObject_MockObject $node */
$node = $this->createTestNode('\OCA\DAV\Connector\Sabre\Directory');
$propFind = new PropFind(
'/dummyPath',
array(
self::HAS_PREVIEW_PROPERTYNAME
),
0
);
$this->previewManager->expects($this->once())
->method('isAvailable')
->will($this->returnValue(false));
$this->plugin->handleGetProperties(
$propFind,
$node
);
$this->assertEquals("false", $propFind->get(self::HAS_PREVIEW_PROPERTYNAME));
}
} }

View File

@ -25,6 +25,7 @@
namespace OCA\DAV\Tests\unit\Connector\Sabre; namespace OCA\DAV\Tests\unit\Connector\Sabre;
use OCA\DAV\Connector\Sabre\FilesReportPlugin as FilesReportPluginImplementation; use OCA\DAV\Connector\Sabre\FilesReportPlugin as FilesReportPluginImplementation;
use OCP\IPreview;
use Sabre\DAV\Exception\NotFound; use Sabre\DAV\Exception\NotFound;
use OCP\SystemTag\ISystemTagObjectMapper; use OCP\SystemTag\ISystemTagObjectMapper;
use OC\Files\View; use OC\Files\View;
@ -60,6 +61,9 @@ class FilesReportPluginTest extends \Test\TestCase {
/** @var Folder|\PHPUnit_Framework_MockObject_MockObject **/ /** @var Folder|\PHPUnit_Framework_MockObject_MockObject **/
private $userFolder; private $userFolder;
/** @var IPreview|\PHPUnit_Framework_MockObject_MockObject * */
private $previewManager;
public function setUp() { public function setUp() {
parent::setUp(); parent::setUp();
$this->tree = $this->getMockBuilder('\Sabre\DAV\Tree') $this->tree = $this->getMockBuilder('\Sabre\DAV\Tree')
@ -93,6 +97,10 @@ class FilesReportPluginTest extends \Test\TestCase {
->disableOriginalConstructor() ->disableOriginalConstructor()
->getMock(); ->getMock();
$this->previewManager = $this->getMockBuilder('\OCP\IPreview')
->disableOriginalConstructor()
->getMock();
$user = $this->getMockBuilder('\OCP\IUser') $user = $this->getMockBuilder('\OCP\IUser')
->disableOriginalConstructor() ->disableOriginalConstructor()
->getMock(); ->getMock();
@ -365,7 +373,8 @@ class FilesReportPluginTest extends \Test\TestCase {
$config, $config,
$this->getMockBuilder('\OCP\IRequest') $this->getMockBuilder('\OCP\IRequest')
->disableOriginalConstructor() ->disableOriginalConstructor()
->getMock() ->getMock(),
$this->previewManager
) )
); );
$this->plugin->initialize($this->server); $this->plugin->initialize($this->server);

View File

@ -66,7 +66,8 @@ abstract class RequestTest extends TestCase {
\OC::$server->getTagManager(), \OC::$server->getTagManager(),
$this->getMockBuilder('\OCP\IRequest') $this->getMockBuilder('\OCP\IRequest')
->disableOriginalConstructor() ->disableOriginalConstructor()
->getMock() ->getMock(),
\OC::$server->getPreviewManager()
); );
} }