2021-07-19 15:00:09 +02:00
|
|
|
<?php
|
|
|
|
namespace App\Model\Table;
|
|
|
|
|
|
|
|
use App\Model\Table\AppTable;
|
|
|
|
use Cake\ORM\Table;
|
|
|
|
use Cake\Core\Configure;
|
2021-10-21 10:58:07 +02:00
|
|
|
use Cake\Error\Debugger;
|
2021-10-18 13:24:30 +02:00
|
|
|
|
|
|
|
require_once(APP . 'Model' . DS . 'Table' . DS . 'SettingProviders' . DS . 'CerebrateSettingsProvider.php');
|
|
|
|
use App\Settings\SettingsProvider\CerebrateSettingsProvider;
|
2021-07-19 15:00:09 +02:00
|
|
|
|
|
|
|
class SettingsTable extends AppTable
|
|
|
|
{
|
2021-07-27 10:40:58 +02:00
|
|
|
private static $FILENAME = 'cerebrate';
|
|
|
|
private static $CONFIG_KEY = 'Cerebrate';
|
2021-10-21 10:58:07 +02:00
|
|
|
private static $DUMPABLE = [
|
|
|
|
'Cerebrate',
|
|
|
|
'proxy',
|
|
|
|
'ui',
|
|
|
|
'keycloak',
|
|
|
|
'app'
|
|
|
|
];
|
|
|
|
|
2021-07-19 15:00:09 +02:00
|
|
|
public function initialize(array $config): void
|
|
|
|
{
|
|
|
|
parent::initialize($config);
|
|
|
|
$this->setTable(false);
|
2021-10-18 13:24:30 +02:00
|
|
|
$this->SettingsProvider = new CerebrateSettingsProvider();
|
2021-11-17 15:43:52 +01:00
|
|
|
$this->addBehavior('AuditLog');
|
2021-07-19 15:00:09 +02:00
|
|
|
}
|
|
|
|
|
2021-07-20 11:54:55 +02:00
|
|
|
public function getSettings($full=false): array
|
2021-07-19 15:00:09 +02:00
|
|
|
{
|
2021-07-27 10:40:58 +02:00
|
|
|
$settings = $this->readSettings();
|
2021-07-20 11:54:55 +02:00
|
|
|
if (empty($full)) {
|
|
|
|
return $settings;
|
|
|
|
} else {
|
|
|
|
$settingsProvider = $this->SettingsProvider->getSettingsConfiguration($settings);
|
2021-07-21 11:18:06 +02:00
|
|
|
$settingsFlattened = $this->SettingsProvider->flattenSettingsConfiguration($settingsProvider);
|
2021-07-20 11:54:55 +02:00
|
|
|
$notices = $this->SettingsProvider->getNoticesFromSettingsConfiguration($settingsProvider, $settings);
|
|
|
|
return [
|
|
|
|
'settings' => $settings,
|
|
|
|
'settingsProvider' => $settingsProvider,
|
2021-07-21 11:18:06 +02:00
|
|
|
'settingsFlattened' => $settingsFlattened,
|
2021-07-20 11:54:55 +02:00
|
|
|
'notices' => $notices,
|
|
|
|
];
|
|
|
|
}
|
2021-07-19 15:00:09 +02:00
|
|
|
}
|
2021-07-21 16:07:30 +02:00
|
|
|
|
|
|
|
public function getSetting($name=false): array
|
|
|
|
{
|
2021-07-27 10:40:58 +02:00
|
|
|
$settings = $this->readSettings();
|
2021-07-21 16:07:30 +02:00
|
|
|
$settingsProvider = $this->SettingsProvider->getSettingsConfiguration($settings);
|
|
|
|
$settingsFlattened = $this->SettingsProvider->flattenSettingsConfiguration($settingsProvider);
|
|
|
|
return $settingsFlattened[$name] ?? [];
|
|
|
|
}
|
|
|
|
|
|
|
|
public function saveSetting(string $name, string $value): array
|
|
|
|
{
|
|
|
|
$errors = [];
|
2021-07-27 10:40:58 +02:00
|
|
|
$setting = $this->getSetting($name);
|
2021-07-27 10:58:34 +02:00
|
|
|
$value = $this->normaliseValue($value, $setting);
|
2021-07-30 08:16:04 +02:00
|
|
|
if ($setting['type'] == 'select') {
|
|
|
|
if (!in_array($value, array_keys($setting['options']))) {
|
|
|
|
$errors[] = __('Invalid option provided');
|
|
|
|
}
|
|
|
|
}
|
2021-10-20 12:48:13 +02:00
|
|
|
if ($setting['type'] == 'multi-select') {
|
|
|
|
foreach ($value as $v) {
|
|
|
|
if (!in_array($v, array_keys($setting['options']))) {
|
|
|
|
$errors[] = __('Invalid option provided');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2022-01-27 20:57:35 +01:00
|
|
|
$setting['value'] = $value ?? '';
|
2021-07-30 08:16:04 +02:00
|
|
|
if (empty($errors) && !empty($setting['beforeSave'])) {
|
2021-07-27 10:40:58 +02:00
|
|
|
$beforeSaveResult = $this->SettingsProvider->evaluateFunctionForSetting($setting['beforeSave'], $setting);
|
|
|
|
if ($beforeSaveResult !== true) {
|
|
|
|
$errors[] = $beforeSaveResult;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (empty($errors)) {
|
2022-01-27 20:57:35 +01:00
|
|
|
$saveResult = $this->saveSettingOnDisk($name, $setting['value']);
|
2021-07-27 10:40:58 +02:00
|
|
|
if ($saveResult) {
|
|
|
|
if (!empty($setting['afterSave'])) {
|
|
|
|
$this->SettingsProvider->evaluateFunctionForSetting($setting['afterSave'], $setting);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2021-07-21 16:07:30 +02:00
|
|
|
return $errors;
|
|
|
|
}
|
2021-07-27 10:40:58 +02:00
|
|
|
|
2021-07-27 10:58:34 +02:00
|
|
|
private function normaliseValue($value, $setting)
|
|
|
|
{
|
|
|
|
if ($setting['type'] == 'boolean') {
|
|
|
|
return (bool) $value;
|
|
|
|
}
|
2021-10-20 12:48:13 +02:00
|
|
|
if ($setting['type'] == 'multi-select') {
|
|
|
|
if (!is_array($value)) {
|
|
|
|
$value = json_decode($value);
|
|
|
|
}
|
|
|
|
}
|
2021-07-27 10:58:34 +02:00
|
|
|
return $value;
|
|
|
|
}
|
|
|
|
|
2021-07-27 10:40:58 +02:00
|
|
|
private function readSettings()
|
|
|
|
{
|
2021-10-21 10:58:07 +02:00
|
|
|
$settingPaths = $this->SettingsProvider->retrieveSettingPathsBasedOnBlueprint();
|
|
|
|
$settings = [];
|
|
|
|
foreach ($settingPaths as $path) {
|
|
|
|
if (Configure::check($path)) {
|
|
|
|
$settings[$path] = Configure::read($path);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return $settings;
|
|
|
|
}
|
|
|
|
|
|
|
|
private function loadSettings(): void
|
|
|
|
{
|
|
|
|
$settings = file_get_contents(CONFIG . 'config.json');
|
|
|
|
$settings = json_decode($settings, true);
|
|
|
|
foreach ($settings as $path => $setting) {
|
|
|
|
Configure::write($path, $setting);
|
|
|
|
}
|
2021-07-27 10:40:58 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
private function saveSettingOnDisk($name, $value)
|
|
|
|
{
|
|
|
|
$settings = $this->readSettings();
|
|
|
|
$settings[$name] = $value;
|
2021-10-21 10:58:07 +02:00
|
|
|
$settings = json_encode($settings, JSON_PRETTY_PRINT);
|
|
|
|
file_put_contents(CONFIG . 'config.json', $settings);
|
|
|
|
$this->loadSettings();
|
2021-07-27 10:40:58 +02:00
|
|
|
return true;
|
|
|
|
}
|
2021-07-19 15:00:09 +02:00
|
|
|
}
|