Provider functionality
Signed-off-by: Joas Schilling <coding@schilljs.com>
This commit is contained in:
parent
65a9ab47ea
commit
136d2c39ac
|
@ -31,19 +31,26 @@ use OCP\Collaboration\Resources\IManager;
|
||||||
use OCP\Collaboration\Resources\IResource;
|
use OCP\Collaboration\Resources\IResource;
|
||||||
use OCP\Collaboration\Resources\ResourceException;
|
use OCP\Collaboration\Resources\ResourceException;
|
||||||
use OCP\IRequest;
|
use OCP\IRequest;
|
||||||
|
use OCP\IUserSession;
|
||||||
|
|
||||||
class CollaborationResourcesController extends OCSController {
|
class CollaborationResourcesController extends OCSController {
|
||||||
|
|
||||||
/** @var IManager */
|
/** @var IManager */
|
||||||
private $manager;
|
private $manager;
|
||||||
|
|
||||||
|
/** @var IUserSession */
|
||||||
|
private $userSession;
|
||||||
|
|
||||||
public function __construct(
|
public function __construct(
|
||||||
$appName,
|
string $appName,
|
||||||
IRequest $request,
|
IRequest $request,
|
||||||
IManager $manager
|
IManager $manager,
|
||||||
|
IUserSession $userSession
|
||||||
) {
|
) {
|
||||||
parent::__construct($appName, $request);
|
parent::__construct($appName, $request);
|
||||||
|
|
||||||
$this->manager = $manager;
|
$this->manager = $manager;
|
||||||
|
$this->userSession = $userSession;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -54,7 +61,7 @@ class CollaborationResourcesController extends OCSController {
|
||||||
protected function getCollection(int $collectionId): ICollection {
|
protected function getCollection(int $collectionId): ICollection {
|
||||||
$collection = $this->manager->getCollection($collectionId);
|
$collection = $this->manager->getCollection($collectionId);
|
||||||
|
|
||||||
if (false) { // TODO auth checking
|
if (!$collection->canAccess($this->userSession->getUser())) {
|
||||||
throw new CollectionException('Not found');
|
throw new CollectionException('Not found');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -141,12 +148,15 @@ class CollaborationResourcesController extends OCSController {
|
||||||
*/
|
*/
|
||||||
public function getCollectionsByResource(string $resourceType, string $resourceId): DataResponse {
|
public function getCollectionsByResource(string $resourceType, string $resourceId): DataResponse {
|
||||||
try {
|
try {
|
||||||
// TODO auth checking
|
|
||||||
$resource = $this->manager->getResource($resourceType, $resourceId);
|
$resource = $this->manager->getResource($resourceType, $resourceId);
|
||||||
} catch (CollectionException $e) {
|
} catch (CollectionException $e) {
|
||||||
return new DataResponse([], Http::STATUS_NOT_FOUND);
|
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()));
|
return new DataResponse(array_map([$this, 'prepareCollection'], $resource->getCollections()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -157,7 +167,8 @@ class CollaborationResourcesController extends OCSController {
|
||||||
protected function prepareResources(IResource $resource): array {
|
protected function prepareResources(IResource $resource): array {
|
||||||
return [
|
return [
|
||||||
'type' => $resource->getType(),
|
'type' => $resource->getType(),
|
||||||
'id' => $resource->getId()
|
'id' => $resource->getId(),
|
||||||
|
'name' => $resource->getName(),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,6 +30,7 @@ use OCP\Collaboration\Resources\ICollection;
|
||||||
use OCP\Collaboration\Resources\IResource;
|
use OCP\Collaboration\Resources\IResource;
|
||||||
use OCP\DB\QueryBuilder\IQueryBuilder;
|
use OCP\DB\QueryBuilder\IQueryBuilder;
|
||||||
use OCP\IDBConnection;
|
use OCP\IDBConnection;
|
||||||
|
use OCP\IUser;
|
||||||
|
|
||||||
class Collection implements ICollection {
|
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 {
|
protected function isSameResource(IResource $resource1, IResource $resource2): bool {
|
||||||
return $resource1->getType() === $resource2->getType() &&
|
return $resource1->getType() === $resource2->getType() &&
|
||||||
$resource1->getId() === $resource2->getId();
|
$resource1->getId() === $resource2->getId();
|
||||||
|
|
|
@ -25,8 +25,11 @@ namespace OC\Collaboration\Resources;
|
||||||
|
|
||||||
use OCP\Collaboration\Resources\ICollection;
|
use OCP\Collaboration\Resources\ICollection;
|
||||||
use OCP\Collaboration\Resources\IManager;
|
use OCP\Collaboration\Resources\IManager;
|
||||||
|
use OCP\Collaboration\Resources\IProvider;
|
||||||
use OCP\Collaboration\Resources\IResource;
|
use OCP\Collaboration\Resources\IResource;
|
||||||
|
use OCP\Collaboration\Resources\ResourceException;
|
||||||
use OCP\IDBConnection;
|
use OCP\IDBConnection;
|
||||||
|
use OCP\IUser;
|
||||||
|
|
||||||
class Manager implements IManager {
|
class Manager implements IManager {
|
||||||
|
|
||||||
|
@ -55,4 +58,51 @@ class Manager implements IManager {
|
||||||
public function getResource(string $type, string $id): IResource {
|
public function getResource(string $type, string $id): IResource {
|
||||||
return new Resource($this, $this->connection, $type, $id);
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,7 +26,9 @@ namespace OC\Collaboration\Resources;
|
||||||
use OCP\Collaboration\Resources\ICollection;
|
use OCP\Collaboration\Resources\ICollection;
|
||||||
use OCP\Collaboration\Resources\IManager;
|
use OCP\Collaboration\Resources\IManager;
|
||||||
use OCP\Collaboration\Resources\IResource;
|
use OCP\Collaboration\Resources\IResource;
|
||||||
|
use OCP\Collaboration\Resources\ResourceException;
|
||||||
use OCP\IDBConnection;
|
use OCP\IDBConnection;
|
||||||
|
use OCP\IUser;
|
||||||
|
|
||||||
class Resource implements IResource {
|
class Resource implements IResource {
|
||||||
|
|
||||||
|
@ -42,6 +44,9 @@ class Resource implements IResource {
|
||||||
/** @var string */
|
/** @var string */
|
||||||
protected $id;
|
protected $id;
|
||||||
|
|
||||||
|
/** @var string|null */
|
||||||
|
protected $name;
|
||||||
|
|
||||||
public function __construct(IManager $manager, IDBConnection $connection, string $type, string $id) {
|
public function __construct(IManager $manager, IDBConnection $connection, string $type, string $id) {
|
||||||
$this->manager = $manager;
|
$this->manager = $manager;
|
||||||
$this->connection = $connection;
|
$this->connection = $connection;
|
||||||
|
@ -65,6 +70,29 @@ class Resource implements IResource {
|
||||||
return $this->id;
|
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[]
|
* @return ICollection[]
|
||||||
* @since 15.0.0
|
* @since 15.0.0
|
||||||
|
|
|
@ -22,6 +22,8 @@ declare(strict_types=1);
|
||||||
|
|
||||||
namespace OCP\Collaboration\Resources;
|
namespace OCP\Collaboration\Resources;
|
||||||
|
|
||||||
|
use OCP\IUser;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @since 15.0.0
|
* @since 15.0.0
|
||||||
*/
|
*/
|
||||||
|
@ -49,4 +51,13 @@ interface ICollection {
|
||||||
* @since 15.0.0
|
* @since 15.0.0
|
||||||
*/
|
*/
|
||||||
public function removeResource(IResource $resource);
|
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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,7 +22,27 @@ declare(strict_types=1);
|
||||||
|
|
||||||
namespace OCP\Collaboration\Resources;
|
namespace OCP\Collaboration\Resources;
|
||||||
|
|
||||||
|
use OCP\IUser;
|
||||||
|
|
||||||
interface IProvider {
|
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;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,6 +22,8 @@ declare(strict_types=1);
|
||||||
|
|
||||||
namespace OCP\Collaboration\Resources;
|
namespace OCP\Collaboration\Resources;
|
||||||
|
|
||||||
|
use OCP\IUser;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @since 15.0.0
|
* @since 15.0.0
|
||||||
*/
|
*/
|
||||||
|
@ -39,6 +41,21 @@ interface IResource {
|
||||||
*/
|
*/
|
||||||
public function getId(): string;
|
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[]
|
* @return ICollection[]
|
||||||
* @since 15.0.0
|
* @since 15.0.0
|
||||||
|
|
Loading…
Reference in New Issue