Skip to content

Commit

Permalink
Aggiornamento delle impostazioni del database e del modello di config…
Browse files Browse the repository at this point in the history
…urazione
  • Loading branch information
inerba committed Feb 28, 2024
1 parent 19cf385 commit deb9c22
Show file tree
Hide file tree
Showing 3 changed files with 68 additions and 75 deletions.
6 changes: 5 additions & 1 deletion database/migrations/create_db_config_table.php.stub
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,14 @@ return new class extends Migration
Schema::create('db_config', function (Blueprint $table) {
$table->id();

$table->string('key')->nullable();
$table->string('group');

$table->string('key');

$table->json('settings')->nullable();

$table->unique(['group', 'key']);

$table->timestamps();
});
}
Expand Down
31 changes: 5 additions & 26 deletions src/AbstractPageSettings.php
Original file line number Diff line number Diff line change
Expand Up @@ -24,36 +24,15 @@ abstract protected function settingName(): string;

public function mount(): void
{
if (! DB::table('db_config')->where('key', $this->settingName())->exists()) {
DB::table('db_config')->insert([
'key' => $this->settingName(),
'settings' => json_encode([]),
]);
}

$setting = DB::table('db_config')->where('key', $this->settingName())->first()->settings;
$setting = json_decode($setting, true);

$this->form->fill($setting);
$this->data = DbConfig::getGroup($this->settingName());
$this->form->fill($this->data);
}

public function save(): void
{

try {
$data = $this->form->getState();

DB::table('db_config')
->where('key', $this->settingName())
->update([
'settings' => $data,
]);

} catch (Halt $exception) {
return;
}

Cache::forget("db-config.{$this->settingName()}");
collect($this->form->getState())->each(function ($setting,$key) {
DbConfig::set($this->settingName().'.'.$key, $setting);
});

Notification::make()
->success()
Expand Down
106 changes: 58 additions & 48 deletions src/DbConfig.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,76 +7,86 @@

class DbConfig
{


/**
* Recupera un'impostazione dal database.
* Retrieve a configuration value from the database.
*
* @param string $key Chiave dell'impostazione, può includere la notazione "puntata" per sottoelementi.
* esempio: "mortage_rate.anticipo_percentuale" $durataAnniPredefinita = \App\Helpers\SettingsHelper::get('mortage_rate.durata_anni_predefinita');
* @param string $key The configuration key.
* @param mixed $default The default value to return if the configuration key is not found.
* @return mixed The configuration value.
*/
public static function get(string $key, mixed $default = null): mixed
{
$parts = explode('.', $key);
$key = array_shift($parts);

$cachename = "db-config.$key";

$keyParts = explode('.', $key);
$group = array_shift($keyParts); // Prende il primo elemento dell'array e lo rimuove dall'array
$setting = $keyParts[0] ?? null;

// Utilizzo del caching per evitare chiamate al database multiple
$data = Cache::remember("db-config.$key", 3600, function () use ($key) {
$setting = DB::table('db_config')->where('key', $key)->first();
$data = Cache::rememberForever($cachename, function () use ($group, $setting) {

$item = DB::table('db_config')
->where('group', $group)
->where('key', $setting)
->first();

return [
$setting => json_decode($item->settings, true)
];

return $setting ? json_decode($setting->settings, true) : [];
});

$subKey = implode('.', $parts);
$subKey = implode('.', $keyParts);

return data_get($data, $subKey, $default);

}

/**
* Imposta o aggiorna il valore di un'impostazione nel database.
* Se l'impostazione non esiste, verrà creata.
* Set a configuration value in the database.
*
* @param string $key Chiave dell'impostazione, può includere la notazione "puntata" per sottoelementi.
* @param mixed $value Valore da impostare per la chiave specificata.
* @param string $key The configuration key.
* @param mixed $value The configuration value.
* @return void
*/
public static function set(string $key, mixed $value): void
{
$keyParts = explode('.', $key);
$group = array_shift($keyParts);
$setting = $keyParts[0] ?? null;

$data = Cache::forget("db-config.$key");

DB::table('db_config')
->updateOrInsert(
[
'group' => $group,
'key' => $setting,
],
[
'settings' => json_encode($value),
]
);
}

/**
* Imposta o aggiorna il valore di un'impostazione nel database.
* Se l'impostazione non esiste, verrà creata.
* Retrieves the settings for a specific group from the database.
*
* @param string $key Chiave dell'impostazione, può includere la notazione "puntata" per sottoelementi.
* @param mixed $value Valore da impostare per la chiave specificata.
* @param string $group The group name.
* @return array|null The settings for the group, or null if no settings are found.
*/
public static function set(string $key, mixed $value): void
public static function getGroup(string $group): ?array
{
// Divide la chiave per determinare il nome dell'impostazione e il percorso delle sottochiavi
$parts = explode('.', $key);
$key = array_shift($parts);

DB::transaction(function () use ($key, $parts, $value) {
// Tenta di ottenere l'impostazione corrente
$setting = DB::table('db_config')->where('key', $key)->lockForUpdate()->first();

$settings = $setting ? json_decode($setting->settings, true) : [];

// Se ci sono sotto-chiavi, aggiornale nel JSON, altrimenti aggiorna l'intero valore
if ($parts) {
data_set($settings, implode('.', $parts), $value);
} else {
$settings = $value;
}

// Se l'impostazione esiste, aggiorna, altrimenti crea una nuova riga
if ($setting) {
DB::table('db_config')->where('key', $key)->update(['preferences' => json_encode($settings)]);
} else {
DB::table('db_config')->insert([
'key' => $key,
'settings' => json_encode($settings),
'created_at' => now(),
'updated_at' => now(),
]);
}
$settings = [];

DB::table('db_config')->where('group', $group)->get()->each(function ($setting) use (&$settings) {
$settings[$setting->key] = json_decode($setting->settings, true);
});

// Invalida la cache relativa all'impostazione
Cache::forget("settings.$key");
return $settings;
}

}

0 comments on commit deb9c22

Please sign in to comment.