diff options
Diffstat (limited to 'apps/files/lib/Collaboration')
-rw-r--r-- | apps/files/lib/Collaboration/Resources/Listener.php | 33 | ||||
-rw-r--r-- | apps/files/lib/Collaboration/Resources/ResourceProvider.php | 109 |
2 files changed, 142 insertions, 0 deletions
diff --git a/apps/files/lib/Collaboration/Resources/Listener.php b/apps/files/lib/Collaboration/Resources/Listener.php new file mode 100644 index 00000000000..e4ff5d83b7a --- /dev/null +++ b/apps/files/lib/Collaboration/Resources/Listener.php @@ -0,0 +1,33 @@ +<?php + +declare(strict_types=1); + +/** + * SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +namespace OCA\Files\Collaboration\Resources; + +use OCP\Collaboration\Resources\IManager; +use OCP\EventDispatcher\IEventDispatcher; +use OCP\Server; +use OCP\Share\Events\ShareCreatedEvent; +use OCP\Share\Events\ShareDeletedEvent; +use OCP\Share\Events\ShareDeletedFromSelfEvent; + +class Listener { + public static function register(IEventDispatcher $dispatcher): void { + $dispatcher->addListener(ShareCreatedEvent::class, [self::class, 'shareModification']); + $dispatcher->addListener(ShareDeletedEvent::class, [self::class, 'shareModification']); + $dispatcher->addListener(ShareDeletedFromSelfEvent::class, [self::class, 'shareModification']); + } + + public static function shareModification(): void { + /** @var IManager $resourceManager */ + $resourceManager = Server::get(IManager::class); + /** @var ResourceProvider $resourceProvider */ + $resourceProvider = Server::get(ResourceProvider::class); + + $resourceManager->invalidateAccessCacheForProvider($resourceProvider); + } +} diff --git a/apps/files/lib/Collaboration/Resources/ResourceProvider.php b/apps/files/lib/Collaboration/Resources/ResourceProvider.php new file mode 100644 index 00000000000..73883bc4c6a --- /dev/null +++ b/apps/files/lib/Collaboration/Resources/ResourceProvider.php @@ -0,0 +1,109 @@ +<?php + +declare(strict_types=1); + +/** + * SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +namespace OCA\Files\Collaboration\Resources; + +use OCP\Collaboration\Resources\IProvider; +use OCP\Collaboration\Resources\IResource; +use OCP\Collaboration\Resources\ResourceException; +use OCP\Files\IRootFolder; +use OCP\Files\Node; +use OCP\IPreview; +use OCP\IURLGenerator; +use OCP\IUser; + +class ResourceProvider implements IProvider { + public const RESOURCE_TYPE = 'file'; + + /** @var array */ + protected $nodes = []; + + public function __construct( + protected IRootFolder $rootFolder, + private IPreview $preview, + private IURLGenerator $urlGenerator, + ) { + } + + private function getNode(IResource $resource): ?Node { + if (isset($this->nodes[(int)$resource->getId()])) { + return $this->nodes[(int)$resource->getId()]; + } + $node = $this->rootFolder->getFirstNodeById((int)$resource->getId()); + if ($node) { + $this->nodes[(int)$resource->getId()] = $node; + return $this->nodes[(int)$resource->getId()]; + } + return null; + } + + /** + * @param IResource $resource + * @return array + * @since 16.0.0 + */ + public function getResourceRichObject(IResource $resource): array { + if (isset($this->nodes[(int)$resource->getId()])) { + $node = $this->nodes[(int)$resource->getId()]->getPath(); + } else { + $node = $this->getNode($resource); + } + + if ($node instanceof Node) { + $link = $this->urlGenerator->linkToRouteAbsolute( + 'files.viewcontroller.showFile', + ['fileid' => $resource->getId()] + ); + return [ + 'type' => 'file', + 'id' => $resource->getId(), + 'name' => $node->getName(), + 'path' => $node->getInternalPath(), + 'link' => $link, + 'mimetype' => $node->getMimetype(), + 'preview-available' => $this->preview->isAvailable($node), + ]; + } + + throw new ResourceException('File not found'); + } + + /** + * Can a user/guest access the collection + * + * @param IResource $resource + * @param IUser $user + * @return bool + * @since 16.0.0 + */ + public function canAccessResource(IResource $resource, ?IUser $user = null): bool { + if (!$user instanceof IUser) { + return false; + } + + $userFolder = $this->rootFolder->getUserFolder($user->getUID()); + $node = $userFolder->getById((int)$resource->getId()); + + if ($node) { + $this->nodes[(int)$resource->getId()] = $node; + return true; + } + + return false; + } + + /** + * Get the resource type of the provider + * + * @return string + * @since 16.0.0 + */ + public function getType(): string { + return self::RESOURCE_TYPE; + } +} |