feat(files_sharing): Support priority in public template providers

Signed-off-by: Louis Chmn <louis@chmn.me>
pull/56745/head
Louis Chmn 2025-12-04 10:59:58 +07:00
parent 1c7ed89855
commit 10b82c8bf8
4 changed files with 40 additions and 0 deletions

@ -814,6 +814,7 @@ return array(
'OCP\\Share\\IProviderFactory' => $baseDir . '/lib/public/Share/IProviderFactory.php',
'OCP\\Share\\IPublicShareTemplateFactory' => $baseDir . '/lib/public/Share/IPublicShareTemplateFactory.php',
'OCP\\Share\\IPublicShareTemplateProvider' => $baseDir . '/lib/public/Share/IPublicShareTemplateProvider.php',
'OCP\\Share\\IPublicShareTemplateProviderWithPriority' => $baseDir . '/lib/public/Share/IPublicShareTemplateProviderWithPriority.php',
'OCP\\Share\\IShare' => $baseDir . '/lib/public/Share/IShare.php',
'OCP\\Share\\IShareHelper' => $baseDir . '/lib/public/Share/IShareHelper.php',
'OCP\\Share\\IShareProvider' => $baseDir . '/lib/public/Share/IShareProvider.php',

@ -855,6 +855,7 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2
'OCP\\Share\\IProviderFactory' => __DIR__ . '/../../..' . '/lib/public/Share/IProviderFactory.php',
'OCP\\Share\\IPublicShareTemplateFactory' => __DIR__ . '/../../..' . '/lib/public/Share/IPublicShareTemplateFactory.php',
'OCP\\Share\\IPublicShareTemplateProvider' => __DIR__ . '/../../..' . '/lib/public/Share/IPublicShareTemplateProvider.php',
'OCP\\Share\\IPublicShareTemplateProviderWithPriority' => __DIR__ . '/../../..' . '/lib/public/Share/IPublicShareTemplateProviderWithPriority.php',
'OCP\\Share\\IShare' => __DIR__ . '/../../..' . '/lib/public/Share/IShare.php',
'OCP\\Share\\IShareHelper' => __DIR__ . '/../../..' . '/lib/public/Share/IShareHelper.php',
'OCP\\Share\\IShareProvider' => __DIR__ . '/../../..' . '/lib/public/Share/IShareProvider.php',

@ -13,9 +13,12 @@ use OCA\Files_Sharing\DefaultPublicShareTemplateProvider;
use OCP\Server;
use OCP\Share\IPublicShareTemplateFactory;
use OCP\Share\IPublicShareTemplateProvider;
use OCP\Share\IPublicShareTemplateProviderWithPriority;
use OCP\Share\IShare;
class PublicShareTemplateFactory implements IPublicShareTemplateFactory {
public const DEFAULT_PRIORITY = 10;
public function __construct(
private Coordinator $coordinator,
private DefaultPublicShareTemplateProvider $defaultProvider,
@ -41,6 +44,13 @@ class PublicShareTemplateFactory implements IPublicShareTemplateFactory {
if (count($filteredProviders) === 0) {
return $this->defaultProvider;
} else {
usort($filteredProviders, function (IPublicShareTemplateProvider $a, IPublicShareTemplateProvider $b) {
$aPriority = $a instanceof IPublicShareTemplateProviderWithPriority ? $a->getPriority() : self::DEFAULT_PRIORITY;
$bPriority = $b instanceof IPublicShareTemplateProviderWithPriority ? $b->getPriority() : self::DEFAULT_PRIORITY;
return $aPriority <=> $bPriority;
});
return array_shift($filteredProviders);
}
}

@ -0,0 +1,28 @@
<?php
declare(strict_types=1);
/**
* SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCP\Share;
use OCP\AppFramework\Attribute\Consumable;
use OCP\AppFramework\Attribute\Implementable;
/**
* Allow providers to specify a priority for selection when multiple providers can handle a share.
*
* @since 33.0.0
*/
#[Consumable(since: '33.0.0')]
#[Implementable(since: '33.0.0')]
interface IPublicShareTemplateProviderWithPriority {
/**
* Returns the priority of the provider. Lower values indicate higher priority.
*
* @since 33.0.0
*/
public function getPriority(): int;
}