Also add type (file/folder) to IShare object

We need this for the hooks :(
This commit is contained in:
Roeland Jago Douma 2016-02-04 14:28:09 +01:00
parent 2c0cb5a00e
commit 0f22a8db1d
5 changed files with 147 additions and 3 deletions

View File

@ -745,6 +745,7 @@ class DefaultShareProvider implements IShareProvider {
}
$share->setNodeId((int)$data['file_source']);
$share->setNodeType($data['item_type']);
if ($data['expiration'] !== null) {
$expiration = \DateTime::createFromFormat('Y-m-d H:i:s', $data['expiration']);

View File

@ -663,13 +663,13 @@ class Manager implements IManager {
$hookParams = [
'id' => $share->getId(),
'itemType' => $share->getNode() instanceof \OCP\Files\File ? 'file' : 'folder',
'itemSource' => $share->getNode()->getId(),
'itemType' => $share->getNodeType(),
'itemSource' => $share->getNodeId(),
'shareType' => $shareType,
'shareWith' => $sharedWith,
'itemparent' => $share->getParent(),
'uidOwner' => $share->getSharedBy(),
'fileSource' => $share->getNode()->getId(),
'fileSource' => $share->getNodeId(),
'fileTarget' => $share->getTarget()
];
return $hookParams;

View File

@ -20,6 +20,7 @@
*/
namespace OC\Share20;
use OCP\Files\File;
use OCP\Files\IRootFolder;
use OCP\Files\Node;
use OCP\Files\NotFoundException;
@ -36,6 +37,8 @@ class Share implements \OCP\Share\IShare {
private $node;
/** @var int */
private $fileId;
/** @var string */
private $nodeType;
/** @var int */
private $shareType;
/** @var string */
@ -138,6 +141,40 @@ class Share implements \OCP\Share\IShare {
return $this;
}
/**
* @inheritdoc
*/
public function getNodeId() {
if ($this->fileId === null) {
$this->fileId = $this->getNode()->getId();
}
return $this->fileId;
}
/**
* @inheritdoc
*/
public function setNodeType($type) {
if ($type !== 'file' && $type !== 'folder') {
throw new \InvalidArgumentException();
}
$this->nodeType = $type;
}
/**
* @inheritdoc
*/
public function getNodeType() {
if ($this->nodeType === null) {
$node = $this->getNode();
$this->nodeType = $node instanceof File ? 'file' : 'folder';
}
return $this->nodeType;
}
/**
* @inheritdoc
*/

View File

@ -77,6 +77,32 @@ interface IShare {
*/
public function setNodeId($fileId);
/**
* Get the fileid of the node of this share
* @return int
* @since 9.0.0
* @throws NotFoundException
*/
public function getNodeId();
/**
* Set the type of node (file/folder)
*
* @param string $type
* @return \OCP\Share\IShare The modified object
* @since 9.0.0
*/
public function setNodeType($type);
/**
* Get the type of node (file/folder)
*
* @return string
* @since 9.0.0
* @throws NotFoundException
*/
public function getNodeType();
/**
* Set the shareType
*

View File

@ -242,6 +242,86 @@ class ManagerTest extends \Test\TestCase {
$manager->deleteShare($share);
}
public function testDeleteLazyShare() {
$manager = $this->createManagerMock()
->setMethods(['getShareById', 'deleteChildren'])
->getMock();
$share = $this->manager->newShare();
$share->setId(42)
->setProviderId('prov')
->setShareType(\OCP\Share::SHARE_TYPE_USER)
->setSharedWith('sharedWith')
->setSharedBy('sharedBy')
->setShareOwner('shareOwner')
->setTarget('myTarget')
->setNodeId(1)
->setNodeType('file');
$this->rootFolder->expects($this->never())->method($this->anything());
$manager->expects($this->once())->method('getShareById')->with('prov:42')->willReturn($share);
$manager->expects($this->once())->method('deleteChildren')->with($share);
$this->defaultProvider
->expects($this->once())
->method('delete')
->with($share);
$hookListner = $this->getMockBuilder('Dummy')->setMethods(['pre', 'post'])->getMock();
\OCP\Util::connectHook('OCP\Share', 'pre_unshare', $hookListner, 'pre');
\OCP\Util::connectHook('OCP\Share', 'post_unshare', $hookListner, 'post');
$hookListnerExpectsPre = [
'id' => 42,
'itemType' => 'file',
'itemSource' => 1,
'shareType' => \OCP\Share::SHARE_TYPE_USER,
'shareWith' => 'sharedWith',
'itemparent' => null,
'uidOwner' => 'sharedBy',
'fileSource' => 1,
'fileTarget' => 'myTarget',
];
$hookListnerExpectsPost = [
'id' => 42,
'itemType' => 'file',
'itemSource' => 1,
'shareType' => \OCP\Share::SHARE_TYPE_USER,
'shareWith' => 'sharedWith',
'itemparent' => null,
'uidOwner' => 'sharedBy',
'fileSource' => 1,
'fileTarget' => 'myTarget',
'deletedShares' => [
[
'id' => 42,
'itemType' => 'file',
'itemSource' => 1,
'shareType' => \OCP\Share::SHARE_TYPE_USER,
'shareWith' => 'sharedWith',
'itemparent' => null,
'uidOwner' => 'sharedBy',
'fileSource' => 1,
'fileTarget' => 'myTarget',
],
],
];
$hookListner
->expects($this->exactly(1))
->method('pre')
->with($hookListnerExpectsPre);
$hookListner
->expects($this->exactly(1))
->method('post')
->with($hookListnerExpectsPost);
$manager->deleteShare($share);
}
public function testDeleteNested() {
$manager = $this->createManagerMock()
->setMethods(['getShareById'])