From 33c4fe504d7ad9ecad2d833167352b6539fc2dd9 Mon Sep 17 00:00:00 2001 From: Maxence Lange Date: Tue, 29 Jul 2025 13:47:23 -0100 Subject: [PATCH] feat(preset): new PresetManager Signed-off-by: Maxence Lange --- core/Command/Config/Preset.php | 10 +++--- lib/private/AppConfig.php | 22 +++++-------- lib/private/Config/ConfigManager.php | 22 +++++-------- lib/private/Config/PresetManager.php | 47 ++++++++++++++++++++++++++++ lib/private/Config/UserConfig.php | 17 +++------- 5 files changed, 69 insertions(+), 49 deletions(-) create mode 100644 lib/private/Config/PresetManager.php diff --git a/core/Command/Config/Preset.php b/core/Command/Config/Preset.php index 4f0278896db..ebd8aaa5cdf 100644 --- a/core/Command/Config/Preset.php +++ b/core/Command/Config/Preset.php @@ -8,10 +8,9 @@ declare(strict_types=1); */ namespace OC\Core\Command\Config; -use OC\Config\ConfigManager; +use OC\Config\PresetManager; use OC\Core\Command\Base; use OCP\Config\Lexicon\Preset as ConfigLexiconPreset; -use OCP\IConfig; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; @@ -19,8 +18,7 @@ use Symfony\Component\Console\Output\OutputInterface; class Preset extends Base { public function __construct( - private readonly IConfig $config, - private readonly ConfigManager $configManager, + private readonly PresetManager $presetManager, ) { parent::__construct(); } @@ -49,10 +47,10 @@ class Preset extends Base { return self::INVALID; } - $this->configManager->setLexiconPreset($preset); + $this->presetManager->setLexiconPreset($preset); } - $current = ConfigLexiconPreset::tryFrom($this->config->getSystemValueInt(ConfigManager::PRESET_CONFIGKEY, 0)) ?? ConfigLexiconPreset::NONE; + $current = $this->presetManager->getLexiconPreset(); $this->writeArrayInOutputFormat($input, $output, [$current->name], 'current preset: '); return self::SUCCESS; } diff --git a/lib/private/AppConfig.php b/lib/private/AppConfig.php index 2280ac1a79f..8c409dcd747 100644 --- a/lib/private/AppConfig.php +++ b/lib/private/AppConfig.php @@ -13,6 +13,7 @@ use InvalidArgumentException; use JsonException; use OC\AppFramework\Bootstrap\Coordinator; use OC\Config\ConfigManager; +use OC\Config\PresetManager; use OCP\Config\Lexicon\Entry; use OCP\Config\Lexicon\ILexicon; use OCP\Config\Lexicon\Preset; @@ -66,13 +67,14 @@ class AppConfig implements IAppConfig { /** @var array, aliases: array, strictness: Strictness}> ['app_id' => ['strictness' => ConfigLexiconStrictness, 'entries' => ['config_key' => ConfigLexiconEntry[]]] */ private array $configLexiconDetails = []; private bool $ignoreLexiconAliases = false; - private ?Preset $configLexiconPreset = null; /** @var ?array */ private ?array $appVersionsCache = null; public function __construct( protected IDBConnection $connection, protected IConfig $config, + private readonly ConfigManager $configManager, + private readonly PresetManager $presetManager, protected LoggerInterface $logger, protected ICrypto $crypto, ) { @@ -520,8 +522,7 @@ class AppConfig implements IAppConfig { // interested to check options in case a modification of the value is needed // ie inverting value from previous key when using lexicon option RENAME_INVERT_BOOLEAN if ($origKey !== $key && $type === self::VALUE_BOOL) { - $configManager = Server::get(ConfigManager::class); - $value = ($configManager->convertToBool($value, $this->getLexiconEntry($app, $key))) ? '1' : '0'; + $value = ($this->configManager->convertToBool($value, $this->getLexiconEntry($app, $key))) ? '1' : '0'; } return $value; @@ -1108,7 +1109,7 @@ class AppConfig implements IAppConfig { $this->assertParams($app, $key); try { $details = $this->getDetails($app, $key); - } catch (AppConfigUnknownKeyException $e) { + } catch (AppConfigUnknownKeyException) { $details = [ 'app' => $app, 'key' => $key @@ -1129,7 +1130,7 @@ class AppConfig implements IAppConfig { 'valueType' => $lexiconEntry->getValueType(), 'valueTypeName' => $lexiconEntry->getValueType()->name, 'sensitive' => $lexiconEntry->isFlagged(self::FLAG_SENSITIVE), - 'default' => $lexiconEntry->getDefault($this->getLexiconPreset()), + 'default' => $lexiconEntry->getDefault($this->presetManager->getLexiconPreset()), 'definition' => $lexiconEntry->getDefinition(), 'note' => $lexiconEntry->getNote(), ]); @@ -1228,7 +1229,6 @@ class AppConfig implements IAppConfig { public function clearCache(bool $reload = false): void { $this->lazyLoaded = $this->fastLoaded = false; $this->lazyCache = $this->fastCache = $this->valueTypes = $this->configLexiconDetails = []; - $this->configLexiconPreset = null; if (!$reload) { return; @@ -1714,7 +1714,7 @@ class AppConfig implements IAppConfig { $lazy = $lexiconEntry->isLazy(); // only look for default if needed, default from Lexicon got priority if ($default !== null) { - $default = $lexiconEntry->getDefault($this->getLexiconPreset()) ?? $default; + $default = $lexiconEntry->getDefault($this->presetManager->getLexiconPreset()) ?? $default; } if ($lexiconEntry->isFlagged(self::FLAG_SENSITIVE)) { @@ -1802,14 +1802,6 @@ class AppConfig implements IAppConfig { $this->ignoreLexiconAliases = $ignore; } - private function getLexiconPreset(): Preset { - if ($this->configLexiconPreset === null) { - $this->configLexiconPreset = Preset::tryFrom($this->config->getSystemValueInt(ConfigManager::PRESET_CONFIGKEY, 0)) ?? Preset::NONE; - } - - return $this->configLexiconPreset; - } - /** * Returns the installed versions of all apps * diff --git a/lib/private/Config/ConfigManager.php b/lib/private/Config/ConfigManager.php index ed516abdcbf..3b057c09402 100644 --- a/lib/private/Config/ConfigManager.php +++ b/lib/private/Config/ConfigManager.php @@ -27,20 +27,23 @@ use Psr\Log\LoggerInterface; * @since 32.0.0 */ class ConfigManager { - /** @since 32.0.0 */ - public const PRESET_CONFIGKEY = 'config_preset'; - /** @var AppConfig|null $appConfig */ private ?IAppConfig $appConfig = null; /** @var UserConfig|null $userConfig */ private ?IUserConfig $userConfig = null; public function __construct( - private readonly IConfig $config, private readonly LoggerInterface $logger, ) { } + public function clearConfigCaches(): void { + $this->loadConfigServices(); + $this->appConfig->clearCache(); + $this->userConfig->clearCacheAll(); + } + + /** * Use the rename values from the list of ConfigLexiconEntry defined in each app ConfigLexicon * to migrate config value to a new config key. @@ -81,17 +84,6 @@ class ConfigManager { $this->userConfig->ignoreLexiconAliases(false); } - /** - * store in config.php the new preset - * refresh cached preset - */ - public function setLexiconPreset(Preset $preset): void { - $this->config->setSystemValue(self::PRESET_CONFIGKEY, $preset->value); - $this->loadConfigServices(); - $this->appConfig->clearCache(); - $this->userConfig->clearCacheAll(); - } - /** * config services cannot be load at __construct() or install will fail */ diff --git a/lib/private/Config/PresetManager.php b/lib/private/Config/PresetManager.php new file mode 100644 index 00000000000..70dfd2e2101 --- /dev/null +++ b/lib/private/Config/PresetManager.php @@ -0,0 +1,47 @@ +config->setSystemValue(self::PRESET_CONFIGKEY, $preset->value); + $this->configLexiconPreset = $preset; + $this->configManager->clearConfigCaches(); + } + + public function getLexiconPreset(): Preset { + if ($this->configLexiconPreset === null) { + $this->configLexiconPreset = Preset::tryFrom($this->config->getSystemValueInt(self::PRESET_CONFIGKEY, 0)) ?? Preset::NONE; + } + + return $this->configLexiconPreset; + } +} diff --git a/lib/private/Config/UserConfig.php b/lib/private/Config/UserConfig.php index 04ba0e29db0..6f296b6c605 100644 --- a/lib/private/Config/UserConfig.php +++ b/lib/private/Config/UserConfig.php @@ -68,11 +68,12 @@ class UserConfig implements IUserConfig { /** @var array, aliases: array, strictness: Strictness}> ['app_id' => ['strictness' => ConfigLexiconStrictness, 'entries' => ['config_key' => ConfigLexiconEntry[]]] */ private array $configLexiconDetails = []; private bool $ignoreLexiconAliases = false; - private ?Preset $configLexiconPreset = null; public function __construct( protected IDBConnection $connection, protected IConfig $config, + private readonly ConfigManager $configManager, + private readonly PresetManager $presetManager, protected LoggerInterface $logger, protected ICrypto $crypto, ) { @@ -772,8 +773,7 @@ class UserConfig implements IUserConfig { // interested to check options in case a modification of the value is needed // ie inverting value from previous key when using lexicon option RENAME_INVERT_BOOLEAN if ($origKey !== $key && $type === ValueType::BOOL) { - $configManager = Server::get(ConfigManager::class); - $value = ($configManager->convertToBool($value, $this->getLexiconEntry($app, $key))) ? '1' : '0'; + $value = ($this->configManager->convertToBool($value, $this->getLexiconEntry($app, $key))) ? '1' : '0'; } return $value; @@ -1636,7 +1636,6 @@ class UserConfig implements IUserConfig { public function clearCacheAll(): void { $this->lazyLoaded = $this->fastLoaded = []; $this->lazyCache = $this->fastCache = $this->valueDetails = $this->configLexiconDetails = []; - $this->configLexiconPreset = null; } /** @@ -1937,7 +1936,7 @@ class UserConfig implements IUserConfig { // only look for default if needed, default from Lexicon got priority if not overwritten by admin if ($default !== null) { - $default = $this->getSystemDefault($app, $configValue) ?? $configValue->getDefault($this->getLexiconPreset()) ?? $default; + $default = $this->getSystemDefault($app, $configValue) ?? $configValue->getDefault($this->presetManager->getLexiconPreset()) ?? $default; } // returning false will make get() returning $default and set() not changing value in database @@ -2039,12 +2038,4 @@ class UserConfig implements IUserConfig { public function ignoreLexiconAliases(bool $ignore): void { $this->ignoreLexiconAliases = $ignore; } - - private function getLexiconPreset(): Preset { - if ($this->configLexiconPreset === null) { - $this->configLexiconPreset = Preset::tryFrom($this->config->getSystemValueInt(ConfigManager::PRESET_CONFIGKEY, 0)) ?? Preset::NONE; - } - - return $this->configLexiconPreset; - } }