Provider functionality

Signed-off-by: Joas Schilling <coding@schilljs.com>
This commit is contained in:
Joas Schilling 2018-10-17 20:03:44 +02:00 committed by Julius Härtl
parent 65a9ab47ea
commit 136d2c39ac
No known key found for this signature in database
GPG Key ID: 4C614C6ED2CDE6DF
7 changed files with 160 additions and 5 deletions

View File

@ -31,19 +31,26 @@ use OCP\Collaboration\Resources\IManager;
use OCP\Collaboration\Resources\IResource;
use OCP\Collaboration\Resources\ResourceException;
use OCP\IRequest;
use OCP\IUserSession;
class CollaborationResourcesController extends OCSController {
/** @var IManager */
private $manager;
/** @var IUserSession */
private $userSession;
public function __construct(
$appName,
string $appName,
IRequest $request,
IManager $manager
IManager $manager,
IUserSession $userSession
) {
parent::__construct($appName, $request);
$this->manager = $manager;
$this->userSession = $userSession;
}
/**
@ -54,7 +61,7 @@ class CollaborationResourcesController extends OCSController {
protected function getCollection(int $collectionId): ICollection {
$collection = $this->manager->getCollection($collectionId);
if (false) { // TODO auth checking
if (!$collection->canAccess($this->userSession->getUser())) {
throw new CollectionException('Not found');
}
@ -141,12 +148,15 @@ class CollaborationResourcesController extends OCSController {
*/
public function getCollectionsByResource(string $resourceType, string $resourceId): DataResponse {
try {
// TODO auth checking
$resource = $this->manager->getResource($resourceType, $resourceId);
} catch (CollectionException $e) {
return new DataResponse([], Http::STATUS_NOT_FOUND);
}
if (!$resource->canAccess($this->userSession->getUser())) {
return new DataResponse([], Http::STATUS_NOT_FOUND);
}
return new DataResponse(array_map([$this, 'prepareCollection'], $resource->getCollections()));
}
@ -157,7 +167,8 @@ class CollaborationResourcesController extends OCSController {
protected function prepareResources(IResource $resource): array {
return [
'type' => $resource->getType(),
'id' => $resource->getId()
'id' => $resource->getId(),
'name' => $resource->getName(),
];
}
}

View File

@ -30,6 +30,7 @@ use OCP\Collaboration\Resources\ICollection;
use OCP\Collaboration\Resources\IResource;
use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\IDBConnection;
use OCP\IUser;
class Collection implements ICollection {
@ -131,6 +132,23 @@ class Collection implements ICollection {
}
}
/**
* Can a user/guest access the collection
*
* @param IUser $user
* @return bool
* @since 15.0.0
*/
public function canAccess(IUser $user = null): bool {
foreach ($this->getResources() as $resource) {
if ($resource->canAccess($user)) {
return true;
}
}
return false;
}
protected function isSameResource(IResource $resource1, IResource $resource2): bool {
return $resource1->getType() === $resource2->getType() &&
$resource1->getId() === $resource2->getId();

View File

@ -25,8 +25,11 @@ namespace OC\Collaboration\Resources;
use OCP\Collaboration\Resources\ICollection;
use OCP\Collaboration\Resources\IManager;
use OCP\Collaboration\Resources\IProvider;
use OCP\Collaboration\Resources\IResource;
use OCP\Collaboration\Resources\ResourceException;
use OCP\IDBConnection;
use OCP\IUser;
class Manager implements IManager {
@ -55,4 +58,51 @@ class Manager implements IManager {
public function getResource(string $type, string $id): IResource {
return new Resource($this, $this->connection, $type, $id);
}
/**
* @return IProvider[]
* @since 15.0.0
*/
public function getProviders(): array {
return [];
}
/**
* Get the display name of a resource
*
* @param IResource $resource
* @return string
* @since 15.0.0
*/
public function getName(IResource $resource): string {
foreach ($this->getProviders() as $provider) {
try {
return $provider->getName($resource);
} catch (ResourceException $e) {
}
}
return '';
}
/**
* Can a user/guest access the collection
*
* @param IResource $resource
* @param IUser $user
* @return bool
* @since 15.0.0
*/
public function canAccess(IResource $resource, IUser $user = null): bool {
foreach ($this->getProviders() as $provider) {
try {
if ($provider->canAccess($resource, $user)) {
return true;
}
} catch (ResourceException $e) {
}
}
return false;
}
}

View File

@ -26,7 +26,9 @@ namespace OC\Collaboration\Resources;
use OCP\Collaboration\Resources\ICollection;
use OCP\Collaboration\Resources\IManager;
use OCP\Collaboration\Resources\IResource;
use OCP\Collaboration\Resources\ResourceException;
use OCP\IDBConnection;
use OCP\IUser;
class Resource implements IResource {
@ -42,6 +44,9 @@ class Resource implements IResource {
/** @var string */
protected $id;
/** @var string|null */
protected $name;
public function __construct(IManager $manager, IDBConnection $connection, string $type, string $id) {
$this->manager = $manager;
$this->connection = $connection;
@ -65,6 +70,29 @@ class Resource implements IResource {
return $this->id;
}
/**
* @return string
* @since 15.0.0
*/
public function getName(): string {
if ($this->name === null) {
$this->name = $this->manager->getName($this);
}
return $this->name;
}
/**
* Can a user/guest access the resource
*
* @param IUser $user
* @return bool
* @since 15.0.0
*/
public function canAccess(IUser $user = null): bool {
return $this->manager->canAccess($this, $user);
}
/**
* @return ICollection[]
* @since 15.0.0

View File

@ -22,6 +22,8 @@ declare(strict_types=1);
namespace OCP\Collaboration\Resources;
use OCP\IUser;
/**
* @since 15.0.0
*/
@ -49,4 +51,13 @@ interface ICollection {
* @since 15.0.0
*/
public function removeResource(IResource $resource);
/**
* Can a user/guest access the collection
*
* @param IUser $user
* @return bool
* @since 15.0.0
*/
public function canAccess(IUser $user = null): bool;
}

View File

@ -22,7 +22,27 @@ declare(strict_types=1);
namespace OCP\Collaboration\Resources;
use OCP\IUser;
interface IProvider {
/**
* Get the display name of a resource
*
* @param IResource $resource
* @return string
* @since 15.0.0
*/
public function getName(IResource $resource): string;
/**
* Can a user/guest access the collection
*
* @param IResource $resource
* @param IUser $user
* @return bool
* @since 15.0.0
*/
public function canAccess(IResource $resource, IUser $user = null): bool;
}

View File

@ -22,6 +22,8 @@ declare(strict_types=1);
namespace OCP\Collaboration\Resources;
use OCP\IUser;
/**
* @since 15.0.0
*/
@ -39,6 +41,21 @@ interface IResource {
*/
public function getId(): string;
/**
* @return string
* @since 15.0.0
*/
public function getName(): string;
/**
* Can a user/guest access the resource
*
* @param IUser $user
* @return bool
* @since 15.0.0
*/
public function canAccess(IUser $user = null): bool;
/**
* @return ICollection[]
* @since 15.0.0