Files
nextcloud-forum/lib/Service/AdminSettingsService.php

150 lines
4.2 KiB
PHP

<?php
declare(strict_types=1);
// SPDX-FileCopyrightText: Chen Asraf <contact@casraf.dev>
// SPDX-License-Identifier: AGPL-3.0-or-later
namespace OCA\Forum\Service;
use OCP\AppFramework\Services\IAppConfig;
use OCP\IL10N;
use Psr\Log\LoggerInterface;
class AdminSettingsService {
/** Setting key for forum title */
public const SETTING_TITLE = 'title';
/** Setting key for forum subtitle */
public const SETTING_SUBTITLE = 'subtitle';
/** Setting key for guest access */
public const SETTING_ALLOW_GUEST_ACCESS = 'allow_guest_access';
/** Setting key for initialization status */
public const SETTING_IS_INITIALIZED = 'is_initialized';
/** Setting key for public edit history */
public const SETTING_PUBLIC_EDIT_HISTORY = 'public_edit_history';
/** Setting key for allowing user override of edit history visibility */
public const SETTING_ALLOW_EDIT_HISTORY_USER_OVERRIDE = 'allow_edit_history_user_override';
/** @var array<string> List of valid setting keys */
private const VALID_KEYS = [
self::SETTING_TITLE,
self::SETTING_SUBTITLE,
self::SETTING_ALLOW_GUEST_ACCESS,
self::SETTING_IS_INITIALIZED,
self::SETTING_PUBLIC_EDIT_HISTORY,
self::SETTING_ALLOW_EDIT_HISTORY_USER_OVERRIDE,
];
public function __construct(
private IAppConfig $config,
private IL10N $l10n,
private LoggerInterface $logger,
) {
}
/**
* Get default value for a setting
*
* @param string $key The setting key
* @return mixed The default value
*/
private function getDefault(string $key): mixed {
return match ($key) {
self::SETTING_TITLE => $this->l10n->t('Forum'),
self::SETTING_SUBTITLE => $this->l10n->t('Welcome to the forum!'),
self::SETTING_ALLOW_GUEST_ACCESS => false,
self::SETTING_IS_INITIALIZED => false,
self::SETTING_PUBLIC_EDIT_HISTORY => true,
self::SETTING_ALLOW_EDIT_HISTORY_USER_OVERRIDE => false,
default => null,
};
}
/**
* Get all settings
*
* @return array<string, mixed> All settings
*/
public function getAllSettings(): array {
$settings = [];
foreach (self::VALID_KEYS as $key) {
$settings[$key] = $this->getSetting($key);
}
return $settings;
}
/**
* Get a single setting
*
* @param string $key The setting key
* @return mixed The setting value
* @throws \InvalidArgumentException If the setting key is invalid
*/
public function getSetting(string $key): mixed {
if (!in_array($key, self::VALID_KEYS, true)) {
throw new \InvalidArgumentException("Invalid setting key: $key");
}
$default = $this->getDefault($key);
return match ($key) {
self::SETTING_ALLOW_GUEST_ACCESS,
self::SETTING_IS_INITIALIZED,
self::SETTING_PUBLIC_EDIT_HISTORY,
self::SETTING_ALLOW_EDIT_HISTORY_USER_OVERRIDE => $this->config->getAppValueBool($key, $default, true),
default => $this->config->getAppValueString($key, $default, true),
};
}
/**
* Update multiple settings
*
* @param array<string, mixed> $settings Key-value pairs of settings to update
* @return array<string, mixed> All settings after update
* @throws \InvalidArgumentException If any setting key is invalid
*/
public function updateSettings(array $settings): array {
// Validate all keys before updating
foreach ($settings as $key => $value) {
if (!in_array($key, self::VALID_KEYS, true)) {
throw new \InvalidArgumentException("Invalid setting key: $key");
}
}
// Update each setting
foreach ($settings as $key => $value) {
$this->setSetting($key, $value);
}
// Return all settings after update
return $this->getAllSettings();
}
/**
* Set a single setting
*
* @param string $key The setting key
* @param mixed $value The setting value
* @throws \InvalidArgumentException If the setting key is invalid
*/
public function setSetting(string $key, mixed $value): void {
if (!in_array($key, self::VALID_KEYS, true)) {
throw new \InvalidArgumentException("Invalid setting key: $key");
}
if ($key === self::SETTING_ALLOW_GUEST_ACCESS || $key === self::SETTING_IS_INITIALIZED
|| $key === self::SETTING_PUBLIC_EDIT_HISTORY || $key === self::SETTING_ALLOW_EDIT_HISTORY_USER_OVERRIDE) {
$this->config->setAppValueBool($key, (bool)$value, true);
} else {
$this->config->setAppValueString($key, (string)$value, true);
}
}
}