Add route to resolve fileid to files app URL
The following routes will redirect to the files app and display the matching folder. If the fileid is a file, it will scroll to it. - http://localhost/owncloud/index.php/f/$fileid - http://localhost/owncloud/index.php/files/?dir=somedir&fileid=$fileid
This commit is contained in:
parent
ba99867033
commit
093e9dd422
|
@ -26,6 +26,7 @@ use OCA\Files\Controller\ApiController;
|
|||
use OCP\AppFramework\App;
|
||||
use \OCA\Files\Service\TagService;
|
||||
use \OCP\IContainer;
|
||||
use OCA\Files\Controller\ViewController;
|
||||
|
||||
class Application extends App {
|
||||
public function __construct(array $urlParams=array()) {
|
||||
|
@ -48,6 +49,20 @@ class Application extends App {
|
|||
);
|
||||
});
|
||||
|
||||
$container->registerService('ViewController', function (IContainer $c) use ($server) {
|
||||
return new ViewController(
|
||||
$c->query('AppName'),
|
||||
$c->query('Request'),
|
||||
$server->getURLGenerator(),
|
||||
$server->getNavigationManager(),
|
||||
$c->query('L10N'),
|
||||
$server->getConfig(),
|
||||
$server->getEventDispatcher(),
|
||||
$server->getUserSession(),
|
||||
$server->getUserFolder()
|
||||
);
|
||||
});
|
||||
|
||||
/**
|
||||
* Core
|
||||
*/
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
* @author Christoph Wurst <christoph@winzerhof-wurst.at>
|
||||
* @author Lukas Reschke <lukas@owncloud.com>
|
||||
* @author Thomas Müller <thomas.mueller@tmit.eu>
|
||||
* @author Vincent Petry <pvince81@owncloud.com>
|
||||
*
|
||||
* @copyright Copyright (c) 2016, ownCloud, Inc.
|
||||
* @license AGPL-3.0
|
||||
|
@ -26,6 +27,7 @@ namespace OCA\Files\Controller;
|
|||
use OC\AppFramework\Http\Request;
|
||||
use OCP\AppFramework\Controller;
|
||||
use OCP\AppFramework\Http\ContentSecurityPolicy;
|
||||
use OCP\AppFramework\Http\Response;
|
||||
use OCP\AppFramework\Http\RedirectResponse;
|
||||
use OCP\AppFramework\Http\TemplateResponse;
|
||||
use OCP\IConfig;
|
||||
|
@ -35,6 +37,8 @@ use OCP\IRequest;
|
|||
use OCP\IURLGenerator;
|
||||
use OCP\IUserSession;
|
||||
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
|
||||
use OCP\AppFramework\Http\NotFoundResponse;
|
||||
use OCP\Files\Folder;
|
||||
|
||||
/**
|
||||
* Class ViewController
|
||||
|
@ -58,6 +62,8 @@ class ViewController extends Controller {
|
|||
protected $eventDispatcher;
|
||||
/** @var IUserSession */
|
||||
protected $userSession;
|
||||
/** @var \OCP\Files\Folder */
|
||||
protected $userFolder;
|
||||
|
||||
/**
|
||||
* @param string $appName
|
||||
|
@ -68,6 +74,7 @@ class ViewController extends Controller {
|
|||
* @param IConfig $config
|
||||
* @param EventDispatcherInterface $eventDispatcherInterface
|
||||
* @param IUserSession $userSession
|
||||
* @param Folder $userFolder
|
||||
*/
|
||||
public function __construct($appName,
|
||||
IRequest $request,
|
||||
|
@ -76,7 +83,9 @@ class ViewController extends Controller {
|
|||
IL10N $l10n,
|
||||
IConfig $config,
|
||||
EventDispatcherInterface $eventDispatcherInterface,
|
||||
IUserSession $userSession) {
|
||||
IUserSession $userSession,
|
||||
Folder $userFolder
|
||||
) {
|
||||
parent::__construct($appName, $request);
|
||||
$this->appName = $appName;
|
||||
$this->request = $request;
|
||||
|
@ -86,6 +95,7 @@ class ViewController extends Controller {
|
|||
$this->config = $config;
|
||||
$this->eventDispatcher = $eventDispatcherInterface;
|
||||
$this->userSession = $userSession;
|
||||
$this->userFolder = $userFolder;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -124,10 +134,15 @@ class ViewController extends Controller {
|
|||
*
|
||||
* @param string $dir
|
||||
* @param string $view
|
||||
* @param string $fileid
|
||||
* @return TemplateResponse
|
||||
* @throws \OCP\Files\NotFoundException
|
||||
*/
|
||||
public function index($dir = '', $view = '') {
|
||||
public function index($dir = '', $view = '', $fileid = null) {
|
||||
if ($fileid !== null) {
|
||||
return $this->showFile($fileid);
|
||||
}
|
||||
|
||||
$nav = new \OCP\Template('files', 'appnavigation', '');
|
||||
|
||||
// Load the files we need
|
||||
|
@ -239,4 +254,33 @@ class ViewController extends Controller {
|
|||
|
||||
return $response;
|
||||
}
|
||||
|
||||
/**
|
||||
* Redirects to the file list and highlight the given file id
|
||||
*
|
||||
* @param string $fileId file id to show
|
||||
* @return Response redirect response or not found response
|
||||
*
|
||||
* @NoCSRFRequired
|
||||
* @NoAdminRequired
|
||||
*/
|
||||
public function showFile($fileId) {
|
||||
$files = $this->userFolder->getById($fileId);
|
||||
$params = [];
|
||||
|
||||
if (!empty($files)) {
|
||||
$file = current($files);
|
||||
if ($file instanceof Folder) {
|
||||
// set the full path to enter the folder
|
||||
$params['dir'] = $this->userFolder->getRelativePath($file->getPath());
|
||||
} else {
|
||||
// set parent path as dir
|
||||
$params['dir'] = $this->userFolder->getRelativePath($file->getParent()->getPath());
|
||||
// and scroll to the entry
|
||||
$params['scrollto'] = $file->getName();
|
||||
}
|
||||
return new RedirectResponse($this->urlGenerator->linkToRoute('files.view.index', $params));
|
||||
}
|
||||
return new NotFoundResponse();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -36,6 +36,7 @@ use OCP\IL10N;
|
|||
use OCP\IConfig;
|
||||
use OCP\IUserSession;
|
||||
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
|
||||
use OCP\Files\Folder;
|
||||
|
||||
/**
|
||||
* Class ViewControllerTest
|
||||
|
@ -61,6 +62,8 @@ class ViewControllerTest extends TestCase {
|
|||
private $user;
|
||||
/** @var IUserSession */
|
||||
private $userSession;
|
||||
/** @var Folder */
|
||||
private $userFolder;
|
||||
|
||||
public function setUp() {
|
||||
parent::setUp();
|
||||
|
@ -75,6 +78,7 @@ class ViewControllerTest extends TestCase {
|
|||
$this->userSession->expects($this->any())
|
||||
->method('getUser')
|
||||
->will($this->returnValue($this->user));
|
||||
$this->userFolder = $this->getMock('\OCP\Files\Folder');
|
||||
$this->viewController = $this->getMockBuilder('\OCA\Files\Controller\ViewController')
|
||||
->setConstructorArgs([
|
||||
'files',
|
||||
|
@ -84,7 +88,8 @@ class ViewControllerTest extends TestCase {
|
|||
$this->l10n,
|
||||
$this->config,
|
||||
$this->eventDispatcher,
|
||||
$this->userSession
|
||||
$this->userSession,
|
||||
$this->userFolder
|
||||
])
|
||||
->setMethods([
|
||||
'getStorageInfo',
|
||||
|
@ -287,4 +292,100 @@ class ViewControllerTest extends TestCase {
|
|||
$expected->setContentSecurityPolicy($policy);
|
||||
$this->assertEquals($expected, $this->viewController->index('MyDir', 'MyView'));
|
||||
}
|
||||
|
||||
public function showFileMethodProvider() {
|
||||
return [
|
||||
[true],
|
||||
[false],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider showFileMethodProvider
|
||||
*/
|
||||
public function testShowFileRouteWithFolder($useShowFile) {
|
||||
$node = $this->getMock('\OCP\Files\Folder');
|
||||
$node->expects($this->once())
|
||||
->method('getPath')
|
||||
->will($this->returnValue('/user/files/test/sub'));
|
||||
|
||||
$this->userFolder->expects($this->at(0))
|
||||
->method('getById')
|
||||
->with(123)
|
||||
->will($this->returnValue([$node]));
|
||||
$this->userFolder->expects($this->at(1))
|
||||
->method('getRelativePath')
|
||||
->with('/user/files/test/sub')
|
||||
->will($this->returnValue('/test/sub'));
|
||||
|
||||
$this->urlGenerator
|
||||
->expects($this->once())
|
||||
->method('linkToRoute')
|
||||
->with('files.view.index', ['dir' => '/test/sub'])
|
||||
->will($this->returnValue('/apps/files/?dir=/test/sub'));
|
||||
|
||||
$expected = new Http\RedirectResponse('/apps/files/?dir=/test/sub');
|
||||
if ($useShowFile) {
|
||||
$this->assertEquals($expected, $this->viewController->showFile(123));
|
||||
} else {
|
||||
$this->assertEquals($expected, $this->viewController->index('/whatever', '', '123'));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider showFileMethodProvider
|
||||
*/
|
||||
public function testShowFileRouteWithFile($useShowFile) {
|
||||
$parentNode = $this->getMock('\OCP\Files\Folder');
|
||||
$parentNode->expects($this->once())
|
||||
->method('getPath')
|
||||
->will($this->returnValue('/user/files/test'));
|
||||
|
||||
$node = $this->getMock('\OCP\Files\File');
|
||||
$node->expects($this->once())
|
||||
->method('getParent')
|
||||
->will($this->returnValue($parentNode));
|
||||
$node->expects($this->once())
|
||||
->method('getName')
|
||||
->will($this->returnValue('somefile.txt'));
|
||||
|
||||
$this->userFolder->expects($this->at(0))
|
||||
->method('getById')
|
||||
->with(123)
|
||||
->will($this->returnValue([$node]));
|
||||
$this->userFolder->expects($this->at(1))
|
||||
->method('getRelativePath')
|
||||
->with('/user/files/test')
|
||||
->will($this->returnValue('/test'));
|
||||
|
||||
$this->urlGenerator
|
||||
->expects($this->once())
|
||||
->method('linkToRoute')
|
||||
->with('files.view.index', ['dir' => '/test', 'scrollto' => 'somefile.txt'])
|
||||
->will($this->returnValue('/apps/files/?dir=/test/sub&scrollto=somefile.txt'));
|
||||
|
||||
$expected = new Http\RedirectResponse('/apps/files/?dir=/test/sub&scrollto=somefile.txt');
|
||||
if ($useShowFile) {
|
||||
$this->assertEquals($expected, $this->viewController->showFile(123));
|
||||
} else {
|
||||
$this->assertEquals($expected, $this->viewController->index('/whatever', '', '123'));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider showFileMethodProvider
|
||||
*/
|
||||
public function testShowFileRouteWithInvalidFileId($useShowFile) {
|
||||
$this->userFolder->expects($this->at(0))
|
||||
->method('getById')
|
||||
->with(123)
|
||||
->will($this->returnValue([]));
|
||||
|
||||
$expected = new Http\NotFoundResponse();
|
||||
if ($useShowFile) {
|
||||
$this->assertEquals($expected, $this->viewController->showFile(123));
|
||||
} else {
|
||||
$this->assertEquals($expected, $this->viewController->index('/whatever', '', '123'));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -108,6 +108,12 @@ $this->create('core_ajax_preview', '/core/preview.png')
|
|||
$this->create('core_ajax_update', '/core/ajax/update.php')
|
||||
->actionInclude('core/ajax/update.php');
|
||||
|
||||
// File routes
|
||||
$this->create('files.viewcontroller.showFile', '/f/{fileId}')->action(function($urlParams) {
|
||||
$app = new \OCA\Files\AppInfo\Application($urlParams);
|
||||
$app->dispatch('ViewController', 'showFile');
|
||||
});
|
||||
|
||||
// Sharing routes
|
||||
$this->create('files_sharing.sharecontroller.showShare', '/s/{token}')->action(function($urlParams) {
|
||||
$app = new \OCA\Files_Sharing\AppInfo\Application($urlParams);
|
||||
|
|
Loading…
Reference in New Issue