Skip to content

Commit

Permalink
Merge pull request #48721 from nextcloud/feat/allow-getter-setter-dec…
Browse files Browse the repository at this point in the history
…l-fors
  • Loading branch information
skjnldsv authored Nov 6, 2024
2 parents 01ad23a + bcfb02f commit 8fab143
Show file tree
Hide file tree
Showing 12 changed files with 183 additions and 120 deletions.
4 changes: 1 addition & 3 deletions apps/files/composer/composer/autoload_classmap.php
Original file line number Diff line number Diff line change
Expand Up @@ -58,9 +58,6 @@
'OCA\\Files\\Event\\LoadSidebar' => $baseDir . '/../lib/Event/LoadSidebar.php',
'OCA\\Files\\Exception\\TransferOwnershipException' => $baseDir . '/../lib/Exception/TransferOwnershipException.php',
'OCA\\Files\\Helper' => $baseDir . '/../lib/Helper.php',
'OCA\\Files\\Listener\\DeclarativeSettingsGetValueEventListener' => $baseDir . '/../lib/Listener/DeclarativeSettingsGetValueEventListener.php',
'OCA\\Files\\Listener\\DeclarativeSettingsRegisterFormEventListener' => $baseDir . '/../lib/Listener/DeclarativeSettingsRegisterFormEventListener.php',
'OCA\\Files\\Listener\\DeclarativeSettingsSetValueEventListener' => $baseDir . '/../lib/Listener/DeclarativeSettingsSetValueEventListener.php',
'OCA\\Files\\Listener\\LoadSearchPluginsListener' => $baseDir . '/../lib/Listener/LoadSearchPluginsListener.php',
'OCA\\Files\\Listener\\LoadSidebarListener' => $baseDir . '/../lib/Listener/LoadSidebarListener.php',
'OCA\\Files\\Listener\\RenderReferenceEventListener' => $baseDir . '/../lib/Listener/RenderReferenceEventListener.php',
Expand All @@ -79,5 +76,6 @@
'OCA\\Files\\Service\\TagService' => $baseDir . '/../lib/Service/TagService.php',
'OCA\\Files\\Service\\UserConfig' => $baseDir . '/../lib/Service/UserConfig.php',
'OCA\\Files\\Service\\ViewConfig' => $baseDir . '/../lib/Service/ViewConfig.php',
'OCA\\Files\\Settings\\DeclarativeAdminSettings' => $baseDir . '/../lib/Settings/DeclarativeAdminSettings.php',
'OCA\\Files\\Settings\\PersonalSettings' => $baseDir . '/../lib/Settings/PersonalSettings.php',
);
4 changes: 1 addition & 3 deletions apps/files/composer/composer/autoload_static.php
Original file line number Diff line number Diff line change
Expand Up @@ -73,9 +73,6 @@ class ComposerStaticInitFiles
'OCA\\Files\\Event\\LoadSidebar' => __DIR__ . '/..' . '/../lib/Event/LoadSidebar.php',
'OCA\\Files\\Exception\\TransferOwnershipException' => __DIR__ . '/..' . '/../lib/Exception/TransferOwnershipException.php',
'OCA\\Files\\Helper' => __DIR__ . '/..' . '/../lib/Helper.php',
'OCA\\Files\\Listener\\DeclarativeSettingsGetValueEventListener' => __DIR__ . '/..' . '/../lib/Listener/DeclarativeSettingsGetValueEventListener.php',
'OCA\\Files\\Listener\\DeclarativeSettingsRegisterFormEventListener' => __DIR__ . '/..' . '/../lib/Listener/DeclarativeSettingsRegisterFormEventListener.php',
'OCA\\Files\\Listener\\DeclarativeSettingsSetValueEventListener' => __DIR__ . '/..' . '/../lib/Listener/DeclarativeSettingsSetValueEventListener.php',
'OCA\\Files\\Listener\\LoadSearchPluginsListener' => __DIR__ . '/..' . '/../lib/Listener/LoadSearchPluginsListener.php',
'OCA\\Files\\Listener\\LoadSidebarListener' => __DIR__ . '/..' . '/../lib/Listener/LoadSidebarListener.php',
'OCA\\Files\\Listener\\RenderReferenceEventListener' => __DIR__ . '/..' . '/../lib/Listener/RenderReferenceEventListener.php',
Expand All @@ -94,6 +91,7 @@ class ComposerStaticInitFiles
'OCA\\Files\\Service\\TagService' => __DIR__ . '/..' . '/../lib/Service/TagService.php',
'OCA\\Files\\Service\\UserConfig' => __DIR__ . '/..' . '/../lib/Service/UserConfig.php',
'OCA\\Files\\Service\\ViewConfig' => __DIR__ . '/..' . '/../lib/Service/ViewConfig.php',
'OCA\\Files\\Settings\\DeclarativeAdminSettings' => __DIR__ . '/..' . '/../lib/Settings/DeclarativeAdminSettings.php',
'OCA\\Files\\Settings\\PersonalSettings' => __DIR__ . '/..' . '/../lib/Settings/PersonalSettings.php',
);

Expand Down
12 changes: 3 additions & 9 deletions apps/files/lib/AppInfo/Application.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,6 @@
use OCA\Files\DirectEditingCapabilities;
use OCA\Files\Event\LoadSearchPlugins;
use OCA\Files\Event\LoadSidebar;
use OCA\Files\Listener\DeclarativeSettingsGetValueEventListener;
use OCA\Files\Listener\DeclarativeSettingsRegisterFormEventListener;
use OCA\Files\Listener\DeclarativeSettingsSetValueEventListener;
use OCA\Files\Listener\LoadSearchPluginsListener;
use OCA\Files\Listener\LoadSidebarListener;
use OCA\Files\Listener\RenderReferenceEventListener;
Expand All @@ -28,6 +25,7 @@
use OCA\Files\Service\TagService;
use OCA\Files\Service\UserConfig;
use OCA\Files\Service\ViewConfig;
use OCA\Files\Settings\DeclarativeAdminSettings;
use OCP\Activity\IManager as IActivityManager;
use OCP\AppFramework\App;
use OCP\AppFramework\Bootstrap\IBootContext;
Expand All @@ -49,9 +47,6 @@
use OCP\IServerContainer;
use OCP\ITagManager;
use OCP\IUserSession;
use OCP\Settings\Events\DeclarativeSettingsGetValueEvent;
use OCP\Settings\Events\DeclarativeSettingsRegisterFormEvent;
use OCP\Settings\Events\DeclarativeSettingsSetValueEvent;
use OCP\Share\IManager as IShareManager;
use OCP\Util;
use Psr\Container\ContainerInterface;
Expand Down Expand Up @@ -111,6 +106,8 @@ public function register(IRegistrationContext $context): void {
$context->registerCapability(Capabilities::class);
$context->registerCapability(DirectEditingCapabilities::class);

$context->registerDeclarativeSettings(DeclarativeAdminSettings::class);

$context->registerEventListener(LoadSidebar::class, LoadSidebarListener::class);
$context->registerEventListener(RenderReferenceEvent::class, RenderReferenceEventListener::class);
$context->registerEventListener(BeforeNodeRenamedEvent::class, SyncLivePhotosListener::class);
Expand All @@ -119,9 +116,6 @@ public function register(IRegistrationContext $context): void {
$context->registerEventListener(BeforeNodeCopiedEvent::class, SyncLivePhotosListener::class);
$context->registerEventListener(NodeCopiedEvent::class, SyncLivePhotosListener::class);
$context->registerEventListener(LoadSearchPlugins::class, LoadSearchPluginsListener::class);
$context->registerEventListener(DeclarativeSettingsRegisterFormEvent::class, DeclarativeSettingsRegisterFormEventListener::class);
$context->registerEventListener(DeclarativeSettingsGetValueEvent::class, DeclarativeSettingsGetValueEventListener::class);
$context->registerEventListener(DeclarativeSettingsSetValueEvent::class, DeclarativeSettingsSetValueEventListener::class);

$context->registerSearchProvider(FilesSearchProvider::class);

Expand Down

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -2,32 +2,42 @@

declare(strict_types=1);
/**
* SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors
* SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Files\Listener;
namespace OCA\Files\Settings;

use OCA\Files\AppInfo\Application;
use OCP\EventDispatcher\Event;
use OCP\EventDispatcher\IEventListener;
use OCA\Files\Service\SettingsService;
use OCP\IL10N;
use OCP\IUser;
use OCP\Settings\DeclarativeSettingsTypes;
use OCP\Settings\Events\DeclarativeSettingsRegisterFormEvent;
use OCP\Settings\IDeclarativeSettingsFormWithHandlers;

/** @template-implements IEventListener<DeclarativeSettingsRegisterFormEvent> */
class DeclarativeSettingsRegisterFormEventListener implements IEventListener {
class DeclarativeAdminSettings implements IDeclarativeSettingsFormWithHandlers {

public function __construct(
private IL10N $l,
private SettingsService $service,
) {
}

public function handle(Event $event): void {
if (!($event instanceof DeclarativeSettingsRegisterFormEvent)) {
return;
public function getValue(string $fieldId, IUser $user): mixed {
return match($fieldId) {
'windows_support' => $this->service->hasFilesWindowsSupport(),
default => throw new \InvalidArgumentException('Unexpected field id ' . $fieldId),
};
}

public function setValue(string $fieldId, mixed $value, IUser $user): void {
switch ($fieldId) {
case 'windows_support':
$this->service->setFilesWindowsSupport((bool)$value);
break;
}
}

$event->registerSchema(Application::APP_ID, [
public function getSchema(): array {
return [
'id' => 'files-filename-support',
'priority' => 10,
'section_type' => DeclarativeSettingsTypes::SECTION_TYPE_ADMIN,
Expand All @@ -45,6 +55,6 @@ public function handle(Event $event): void {
'default' => false,
],
],
]);
];
}
}
1 change: 1 addition & 0 deletions lib/composer/composer/autoload_classmap.php
Original file line number Diff line number Diff line change
Expand Up @@ -698,6 +698,7 @@
'OCP\\Settings\\Events\\DeclarativeSettingsSetValueEvent' => $baseDir . '/lib/public/Settings/Events/DeclarativeSettingsSetValueEvent.php',
'OCP\\Settings\\IDeclarativeManager' => $baseDir . '/lib/public/Settings/IDeclarativeManager.php',
'OCP\\Settings\\IDeclarativeSettingsForm' => $baseDir . '/lib/public/Settings/IDeclarativeSettingsForm.php',
'OCP\\Settings\\IDeclarativeSettingsFormWithHandlers' => $baseDir . '/lib/public/Settings/IDeclarativeSettingsFormWithHandlers.php',
'OCP\\Settings\\IDelegatedSettings' => $baseDir . '/lib/public/Settings/IDelegatedSettings.php',
'OCP\\Settings\\IIconSection' => $baseDir . '/lib/public/Settings/IIconSection.php',
'OCP\\Settings\\IManager' => $baseDir . '/lib/public/Settings/IManager.php',
Expand Down
1 change: 1 addition & 0 deletions lib/composer/composer/autoload_static.php
Original file line number Diff line number Diff line change
Expand Up @@ -731,6 +731,7 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2
'OCP\\Settings\\Events\\DeclarativeSettingsSetValueEvent' => __DIR__ . '/../../..' . '/lib/public/Settings/Events/DeclarativeSettingsSetValueEvent.php',
'OCP\\Settings\\IDeclarativeManager' => __DIR__ . '/../../..' . '/lib/public/Settings/IDeclarativeManager.php',
'OCP\\Settings\\IDeclarativeSettingsForm' => __DIR__ . '/../../..' . '/lib/public/Settings/IDeclarativeSettingsForm.php',
'OCP\\Settings\\IDeclarativeSettingsFormWithHandlers' => __DIR__ . '/../../..' . '/lib/public/Settings/IDeclarativeSettingsFormWithHandlers.php',
'OCP\\Settings\\IDelegatedSettings' => __DIR__ . '/../../..' . '/lib/public/Settings/IDelegatedSettings.php',
'OCP\\Settings\\IIconSection' => __DIR__ . '/../../..' . '/lib/public/Settings/IIconSection.php',
'OCP\\Settings\\IManager' => __DIR__ . '/../../..' . '/lib/public/Settings/IManager.php',
Expand Down
53 changes: 43 additions & 10 deletions lib/private/Settings/DeclarativeManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
use OCP\Settings\Events\DeclarativeSettingsSetValueEvent;
use OCP\Settings\IDeclarativeManager;
use OCP\Settings\IDeclarativeSettingsForm;
use OCP\Settings\IDeclarativeSettingsFormWithHandlers;
use Psr\Log\LoggerInterface;

/**
Expand All @@ -32,6 +33,15 @@
* @psalm-import-type DeclarativeSettingsFormSchemaWithoutValues from IDeclarativeSettingsForm
*/
class DeclarativeManager implements IDeclarativeManager {

/** @var array<string, list<IDeclarativeSettingsForm>> */
private array $declarativeForms = [];

/**
* @var array<string, list<DeclarativeSettingsFormSchemaWithoutValues>>
*/
private array $appSchemas = [];

public function __construct(
private IEventDispatcher $eventDispatcher,
private IGroupManager $groupManager,
Expand All @@ -42,11 +52,6 @@ public function __construct(
) {
}

/**
* @var array<string, list<DeclarativeSettingsFormSchemaWithoutValues>>
*/
private array $appSchemas = [];

/**
* @inheritdoc
*/
Expand Down Expand Up @@ -77,11 +82,15 @@ public function registerSchema(string $app, array $schema): void {
* @inheritdoc
*/
public function loadSchemas(): void {
$declarativeSettings = $this->coordinator->getRegistrationContext()->getDeclarativeSettings();
foreach ($declarativeSettings as $declarativeSetting) {
/** @var IDeclarativeSettingsForm $declarativeSettingObject */
$declarativeSettingObject = Server::get($declarativeSetting->getService());
$this->registerSchema($declarativeSetting->getAppId(), $declarativeSettingObject->getSchema());
if (empty($this->declarativeForms)) {
$declarativeSettings = $this->coordinator->getRegistrationContext()->getDeclarativeSettings();
foreach ($declarativeSettings as $declarativeSetting) {
$app = $declarativeSetting->getAppId();
/** @var IDeclarativeSettingsForm $declarativeForm */
$declarativeForm = Server::get($declarativeSetting->getService());
$this->registerSchema($app, $declarativeForm->getSchema());
$this->declarativeForms[$app][] = $declarativeForm;
}
}

$this->eventDispatcher->dispatchTyped(new DeclarativeSettingsRegisterFormEvent($this));
Expand Down Expand Up @@ -224,6 +233,10 @@ private function getValue(IUser $user, string $app, string $formId, string $fiel
$storageType = $this->getStorageType($app, $fieldId);
switch ($storageType) {
case DeclarativeSettingsTypes::STORAGE_TYPE_EXTERNAL:
$form = $this->getForm($app, $formId);
if ($form !== null && $form instanceof IDeclarativeSettingsFormWithHandlers) {
return $form->getValue($fieldId, $user);
}
$event = new DeclarativeSettingsGetValueEvent($user, $app, $formId, $fieldId);
$this->eventDispatcher->dispatchTyped($event);
return $event->getValue();
Expand All @@ -244,6 +257,12 @@ public function setValue(IUser $user, string $app, string $formId, string $field
$storageType = $this->getStorageType($app, $fieldId);
switch ($storageType) {
case DeclarativeSettingsTypes::STORAGE_TYPE_EXTERNAL:
$form = $this->getForm($app, $formId);
if ($form !== null && $form instanceof IDeclarativeSettingsFormWithHandlers) {
$form->setValue($fieldId, $value, $user);
break;
}
// fall back to event handling
$this->eventDispatcher->dispatchTyped(new DeclarativeSettingsSetValueEvent($user, $app, $formId, $fieldId, $value));
break;
case DeclarativeSettingsTypes::STORAGE_TYPE_INTERNAL:
Expand All @@ -254,6 +273,20 @@ public function setValue(IUser $user, string $app, string $formId, string $field
}
}

/**
* If a declarative setting was registered as a form and not just a schema
* then this will yield the registering form.
*/
private function getForm(string $app, string $formId): ?IDeclarativeSettingsForm {
$allForms = $this->declarativeForms[$app] ?? [];
foreach ($allForms as $form) {
if ($form->getSchema()['id'] === $formId) {
return $form;
}
}
return null;
}

private function getInternalValue(IUser $user, string $app, string $formId, string $fieldId): mixed {
$sectionType = $this->getSectionType($app, $fieldId);
$defaultValue = $this->getDefaultValue($app, $formId, $fieldId);
Expand Down
6 changes: 3 additions & 3 deletions lib/public/Settings/DeclarativeSettingsTypes.php
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,9 @@ final class DeclarativeSettingsTypes {
/**
* IDeclarativeSettingsForm storage_type which is determines where and how the config value is stored
*
*
* For `external` storage_type the app implementing \OCP\Settings\SetDeclarativeSettingsValueEvent and \OCP\Settings\GetDeclarativeSettingsValueEvent events is responsible for storing and retrieving the config value.
* For `external` storage_type the app needs to either implement event listeners for \OCP\Settings\SetDeclarativeSettingsValueEvent
* and \OCP\Settings\GetDeclarativeSettingsValueEvent or the IDeclarativeSettingsForm also needs to implement
* IDeclarativeSettingsFormWithHandlers for storing and retrieving the config value.
*
* @since 29.0.0
*/
Expand All @@ -43,7 +44,6 @@ final class DeclarativeSettingsTypes {
* IDeclarativeSettingsForm storage_type which is determines where and how the config value is stored
*
* For `internal` storage_type the config value is stored in default `appconfig` and `preferences` tables.
* For `external` storage_type the app implementing \OCP\Settings\SetDeclarativeSettingsValueEvent and \OCP\Settings\GetDeclarativeSettingsValueEvent events is responsible for storing and retrieving the config value.
*
* @since 29.0.0
*/
Expand Down
31 changes: 31 additions & 0 deletions lib/public/Settings/IDeclarativeSettingsFormWithHandlers.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
<?php

declare(strict_types=1);

/**
* SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/

namespace OCP\Settings;

use OCP\IUser;

/**
* @since 31.0.0
*/
interface IDeclarativeSettingsFormWithHandlers extends IDeclarativeSettingsForm {

/**
* This function is called to get the current value of a specific forms field.
* @since 31.0.0
*/
public function getValue(string $fieldId, IUser $user): mixed;

/**
* This function is called when a user updated a form field to persist the setting.
* @since 31.0.0
*/
public function setValue(string $fieldId, mixed $value, IUser $user): void;

}
Loading

0 comments on commit 8fab143

Please sign in to comment.