Files
papa-kind-treff.info/src/App/SystemSettings.php
Lars Gebhardt-Kusche 49c13dfd80
All checks were successful
Deploy / deploy (push) Successful in 1m8s
big
2026-08-23 02:47:01 +02:00

111 lines
3.7 KiB
PHP

<?php
declare(strict_types=1);
namespace App;
final class SystemSettings
{
private array $tableCache = [];
private const DEFAULTS = [
'google_places_enabled' => '0',
'azure_maps_enabled' => '0',
'osm_places_enabled' => '1',
'forum_maintenance_mode' => '0',
'site_maintenance_mode' => '0',
'site_maintenance_message' => 'Papa-Kind-Treff ist gerade kurz in Wartung. Bitte versuche es in Kürze erneut.',
'place_data_provider' => 'osm',
'community_levels_json' => '',
];
public function __construct(private \PDO $pdo)
{
}
public function ensureSchema(): void
{
$this->pdo->exec(
'CREATE TABLE IF NOT EXISTS system_settings (
`key` VARCHAR(120) NOT NULL PRIMARY KEY,
`value` TEXT NULL,
updated_by BIGINT UNSIGNED NULL,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
CONSTRAINT fk_system_settings_updated_by FOREIGN KEY (updated_by) REFERENCES users(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci'
);
$stmt = $this->pdo->prepare(
'INSERT INTO system_settings (`key`, `value`, updated_by)
VALUES (:key, :value, NULL)
ON DUPLICATE KEY UPDATE `value` = `value`'
);
foreach (self::DEFAULTS as $key => $value) {
$stmt->execute([
'key' => $key,
'value' => $value,
]);
}
}
public function getAll(): array
{
$this->ensureSchema();
$settings = self::DEFAULTS;
$stmt = $this->pdo->query('SELECT `key`, `value` FROM system_settings');
foreach ($stmt->fetchAll(\PDO::FETCH_ASSOC) ?: [] as $row) {
$settings[(string)$row['key']] = (string)($row['value'] ?? '');
}
return $settings;
}
public function get(string $key, ?string $default = null): ?string
{
$this->ensureSchema();
$stmt = $this->pdo->prepare('SELECT `value` FROM system_settings WHERE `key` = :key LIMIT 1');
$stmt->execute(['key' => $key]);
$value = $stmt->fetchColumn();
if ($value === false) {
return $default ?? (self::DEFAULTS[$key] ?? null);
}
return (string)$value;
}
public function getBool(string $key, bool $default = false): bool
{
$value = $this->get($key, $default ? '1' : '0');
return in_array((string)$value, ['1', 'true', 'yes', 'on'], true);
}
public function set(string $key, string $value, ?int $updatedBy = null): void
{
$this->ensureSchema();
$stmt = $this->pdo->prepare(
'INSERT INTO system_settings (`key`, `value`, updated_by)
VALUES (:key, :value, :updatedBy)
ON DUPLICATE KEY UPDATE `value` = VALUES(`value`), updated_by = VALUES(updated_by), updated_at = CURRENT_TIMESTAMP'
);
$stmt->execute([
'key' => $key,
'value' => $value,
'updatedBy' => $updatedBy,
]);
}
public function updateMany(array $values, ?int $updatedBy = null): void
{
$this->ensureSchema();
$stmt = $this->pdo->prepare(
'INSERT INTO system_settings (`key`, `value`, updated_by)
VALUES (:key, :value, :updatedBy)
ON DUPLICATE KEY UPDATE `value` = VALUES(`value`), updated_by = VALUES(updated_by), updated_at = CURRENT_TIMESTAMP'
);
foreach ($values as $key => $value) {
$stmt->execute([
'key' => (string)$key,
'value' => (string)$value,
'updatedBy' => $updatedBy,
]);
}
}
}