Display share status info in favorite list

Returns the shareTypes share status info to the favorites file list.
This commit is contained in:
Vincent Petry 2016-03-16 11:03:26 +01:00
parent f778e48ee5
commit 950530b162
4 changed files with 112 additions and 15 deletions

View File

@ -40,8 +40,10 @@ class Application extends App {
return new ApiController( return new ApiController(
$c->query('AppName'), $c->query('AppName'),
$c->query('Request'), $c->query('Request'),
$server->getUserSession(),
$c->query('TagService'), $c->query('TagService'),
$server->getPreviewManager() $server->getPreviewManager(),
$server->getShareManager()
); );
}); });

View File

@ -34,6 +34,10 @@ use OCP\AppFramework\Http\DataResponse;
use OCP\AppFramework\Http\DataDisplayResponse; use OCP\AppFramework\Http\DataDisplayResponse;
use OCA\Files\Service\TagService; use OCA\Files\Service\TagService;
use OCP\IPreview; use OCP\IPreview;
use OCP\Share\IManager;
use OCP\Files\FileInfo;
use OCP\Files\Node;
use OCP\IUserSession;
/** /**
* Class ApiController * Class ApiController
@ -43,8 +47,12 @@ use OCP\IPreview;
class ApiController extends Controller { class ApiController extends Controller {
/** @var TagService */ /** @var TagService */
private $tagService; private $tagService;
/** @var IManager **/
private $shareManager;
/** @var IPreview */ /** @var IPreview */
private $previewManager; private $previewManager;
/** IUserSession */
private $userSession;
/** /**
* @param string $appName * @param string $appName
@ -54,11 +62,15 @@ class ApiController extends Controller {
*/ */
public function __construct($appName, public function __construct($appName,
IRequest $request, IRequest $request,
IUserSession $userSession,
TagService $tagService, TagService $tagService,
IPreview $previewManager){ IPreview $previewManager,
IManager $shareManager) {
parent::__construct($appName, $request); parent::__construct($appName, $request);
$this->userSession = $userSession;
$this->tagService = $tagService; $this->tagService = $tagService;
$this->previewManager = $previewManager; $this->previewManager = $previewManager;
$this->shareManager = $shareManager;
} }
/** /**
@ -132,8 +144,10 @@ class ApiController extends Controller {
*/ */
public function getFilesByTag($tagName) { public function getFilesByTag($tagName) {
$files = array(); $files = array();
$fileInfos = $this->tagService->getFilesByTag($tagName); $nodes = $this->tagService->getFilesByTag($tagName);
foreach ($fileInfos as &$fileInfo) { foreach ($nodes as &$node) {
$shareTypes = $this->getShareTypes($node);
$fileInfo = $node->getFileInfo();
$file = \OCA\Files\Helper::formatFileInfo($fileInfo); $file = \OCA\Files\Helper::formatFileInfo($fileInfo);
$parts = explode('/', dirname($fileInfo->getPath()), 4); $parts = explode('/', dirname($fileInfo->getPath()), 4);
if(isset($parts[3])) { if(isset($parts[3])) {
@ -142,9 +156,43 @@ class ApiController extends Controller {
$file['path'] = '/'; $file['path'] = '/';
} }
$file['tags'] = [$tagName]; $file['tags'] = [$tagName];
if (!empty($shareTypes)) {
$file['shareTypes'] = $shareTypes;
}
$files[] = $file; $files[] = $file;
} }
return new DataResponse(['files' => $files]); return new DataResponse(['files' => $files]);
} }
/**
* Return a list of share types for outgoing shares
*
* @param Node $node file node
*
* @return int[] array of share types
*/
private function getShareTypes(Node $node) {
$userId = $this->userSession->getUser()->getUID();
$shareTypes = [];
$requestedShareTypes = [
\OCP\Share::SHARE_TYPE_USER,
\OCP\Share::SHARE_TYPE_GROUP,
\OCP\Share::SHARE_TYPE_LINK
];
foreach ($requestedShareTypes as $requestedShareType) {
// one of each type is enough to find out about the types
$shares = $this->shareManager->getSharesBy(
$userId,
$requestedShareType,
$node,
false,
1
);
if (!empty($shares)) {
$shareTypes[] = $requestedShareType;
}
}
return $shareTypes;
}
} }

View File

@ -25,6 +25,7 @@
namespace OCA\Files\Service; namespace OCA\Files\Service;
use OC\Files\FileInfo; use OC\Files\FileInfo;
use OCP\Files\Node;
/** /**
* Service class to manage tags on files. * Service class to manage tags on files.
@ -93,7 +94,7 @@ class TagService {
* Get all files for the given tag * Get all files for the given tag
* *
* @param string $tagName tag name to filter by * @param string $tagName tag name to filter by
* @return FileInfo[] list of matching files * @return Node[] list of matching files
* @throws \Exception if the tag does not exist * @throws \Exception if the tag does not exist
*/ */
public function getFilesByTag($tagName) { public function getFilesByTag($tagName) {
@ -103,15 +104,11 @@ class TagService {
return []; return [];
} }
$fileInfos = []; $allNodes = [];
foreach ($fileIds as $fileId) { foreach ($fileIds as $fileId) {
$nodes = $this->homeFolder->getById((int) $fileId); $allNodes = array_merge($allNodes, $this->homeFolder->getById((int) $fileId));
foreach ($nodes as $node) {
/** @var \OC\Files\Node\Node $node */
$fileInfos[] = $node->getFileInfo();
} }
} return $allNodes;
return $fileInfos;
} }
} }

View File

@ -51,14 +51,27 @@ class ApiControllerTest extends TestCase {
private $preview; private $preview;
/** @var ApiController */ /** @var ApiController */
private $apiController; private $apiController;
/** @var \OCP\Share\IManager */
private $shareManager;
public function setUp() { public function setUp() {
$this->request = $this->getMockBuilder('\OCP\IRequest') $this->request = $this->getMockBuilder('\OCP\IRequest')
->disableOriginalConstructor() ->disableOriginalConstructor()
->getMock(); ->getMock();
$user = $this->getMock('\OCP\IUser');
$user->expects($this->any())
->method('getUID')
->will($this->returnValue('user1'));
$userSession = $this->getMock('\OCP\IUserSession');
$userSession->expects($this->any())
->method('getUser')
->will($this->returnValue($user));
$this->tagService = $this->getMockBuilder('\OCA\Files\Service\TagService') $this->tagService = $this->getMockBuilder('\OCA\Files\Service\TagService')
->disableOriginalConstructor() ->disableOriginalConstructor()
->getMock(); ->getMock();
$this->shareManager = $this->getMockBuilder('\OCP\Share\IManager')
->disableOriginalConstructor()
->getMock();
$this->preview = $this->getMockBuilder('\OCP\IPreview') $this->preview = $this->getMockBuilder('\OCP\IPreview')
->disableOriginalConstructor() ->disableOriginalConstructor()
->getMock(); ->getMock();
@ -66,8 +79,10 @@ class ApiControllerTest extends TestCase {
$this->apiController = new ApiController( $this->apiController = new ApiController(
$this->appName, $this->appName,
$this->request, $this->request,
$userSession,
$this->tagService, $this->tagService,
$this->preview $this->preview,
$this->shareManager
); );
} }
@ -101,10 +116,32 @@ class ApiControllerTest extends TestCase {
->disableOriginalConstructor() ->disableOriginalConstructor()
->getMock() ->getMock()
); );
$node = $this->getMockBuilder('\OC\Files\Node\File')
->disableOriginalConstructor()
->getMock();
$node->expects($this->once())
->method('getFileInfo')
->will($this->returnValue($fileInfo));
$this->tagService->expects($this->once()) $this->tagService->expects($this->once())
->method('getFilesByTag') ->method('getFilesByTag')
->with($this->equalTo([$tagName])) ->with($this->equalTo([$tagName]))
->will($this->returnValue([$fileInfo])); ->will($this->returnValue([$node]));
$this->shareManager->expects($this->any())
->method('getSharesBy')
->with(
$this->equalTo('user1'),
$this->anything(),
$node,
$this->equalTo(false),
$this->equalTo(1)
)
->will($this->returnCallback(function($userId, $shareType) {
if ($shareType === \OCP\Share::SHARE_TYPE_USER || $shareType === \OCP\Share::SHARE_TYPE_LINK) {
return ['dummy_share'];
}
return [];
}));
$expected = new DataResponse([ $expected = new DataResponse([
'files' => [ 'files' => [
@ -124,6 +161,7 @@ class ApiControllerTest extends TestCase {
'MyTagName' 'MyTagName'
] ]
], ],
'shareTypes' => [\OCP\Share::SHARE_TYPE_USER, \OCP\Share::SHARE_TYPE_LINK]
], ],
], ],
]); ]);
@ -166,10 +204,22 @@ class ApiControllerTest extends TestCase {
->disableOriginalConstructor() ->disableOriginalConstructor()
->getMock() ->getMock()
); );
$node1 = $this->getMockBuilder('\OC\Files\Node\File')
->disableOriginalConstructor()
->getMock();
$node1->expects($this->once())
->method('getFileInfo')
->will($this->returnValue($fileInfo1));
$node2 = $this->getMockBuilder('\OC\Files\Node\File')
->disableOriginalConstructor()
->getMock();
$node2->expects($this->once())
->method('getFileInfo')
->will($this->returnValue($fileInfo2));
$this->tagService->expects($this->once()) $this->tagService->expects($this->once())
->method('getFilesByTag') ->method('getFilesByTag')
->with($this->equalTo([$tagName])) ->with($this->equalTo([$tagName]))
->will($this->returnValue([$fileInfo1, $fileInfo2])); ->will($this->returnValue([$node1, $node2]));
$expected = new DataResponse([ $expected = new DataResponse([
'files' => [ 'files' => [