diff options
Diffstat (limited to 'lib/private/Share20/PublicShareTemplateFactory.php')
-rw-r--r-- | lib/private/Share20/PublicShareTemplateFactory.php | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/lib/private/Share20/PublicShareTemplateFactory.php b/lib/private/Share20/PublicShareTemplateFactory.php new file mode 100644 index 00000000000..34dd9b13b61 --- /dev/null +++ b/lib/private/Share20/PublicShareTemplateFactory.php @@ -0,0 +1,47 @@ +<?php + +declare(strict_types=1); +/** + * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +namespace OC\Share20; + +use Exception; +use OC\AppFramework\Bootstrap\Coordinator; +use OCA\Files_Sharing\DefaultPublicShareTemplateProvider; +use OCP\Server; +use OCP\Share\IPublicShareTemplateFactory; +use OCP\Share\IPublicShareTemplateProvider; +use OCP\Share\IShare; + +class PublicShareTemplateFactory implements IPublicShareTemplateFactory { + public function __construct( + private Coordinator $coordinator, + private DefaultPublicShareTemplateProvider $defaultProvider, + ) { + } + + public function getProvider(IShare $share): IPublicShareTemplateProvider { + $context = $this->coordinator->getRegistrationContext(); + if ($context === null) { + throw new Exception("Can't retrieve public share template providers as context is not defined"); + } + + $providers = array_map( + fn ($registration) => Server::get($registration->getService()), + $context->getPublicShareTemplateProviders() + ); + + $filteredProviders = array_filter( + $providers, + fn (IPublicShareTemplateProvider $provider) => $provider->shouldRespond($share) + ); + + if (count($filteredProviders) === 0) { + return $this->defaultProvider; + } else { + return array_shift($filteredProviders); + } + } +} |