structure changes
This commit is contained in:
@@ -3,20 +3,127 @@
|
||||
namespace Modules\Settings\Services;
|
||||
|
||||
use Illuminate\Support\Facades\Cache;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
use Modules\Settings\Models\Setting;
|
||||
|
||||
final class SettingsRepository
|
||||
{
|
||||
public function get(string $key, mixed $default = null, string $group = 'general'): mixed
|
||||
{
|
||||
return Cache::rememberForever("settings.$group.$key", fn () => Setting::query()->where(compact('group', 'key'))->value('value') ?? $default);
|
||||
if (! $this->tableExists()) {
|
||||
return $default;
|
||||
}
|
||||
|
||||
$setting = Cache::rememberForever(
|
||||
"settings.$group.$key",
|
||||
fn (): ?Setting => Setting::query()
|
||||
->where([
|
||||
'group' => $group,
|
||||
'key' => $key,
|
||||
])
|
||||
->first()
|
||||
);
|
||||
|
||||
return $setting ? $this->decode($setting->value, $setting->type) : $default;
|
||||
}
|
||||
|
||||
/** @return array<string, mixed> */
|
||||
public function group(string $group): array
|
||||
{
|
||||
if (! $this->tableExists()) {
|
||||
return [];
|
||||
}
|
||||
|
||||
return Cache::rememberForever("settings.group.$group", function () use ($group): array {
|
||||
return Setting::query()
|
||||
->where('group', $group)
|
||||
->get()
|
||||
->mapWithKeys(fn (Setting $setting): array => [
|
||||
$setting->key => $this->decode($setting->value, $setting->type),
|
||||
])
|
||||
->all();
|
||||
});
|
||||
}
|
||||
|
||||
/** @return array<string, mixed> */
|
||||
public function site(): array
|
||||
{
|
||||
$defaults = [
|
||||
'site_name' => config('app.name', 'Content Manager'),
|
||||
'tagline' => '',
|
||||
'site_description' => 'Modern software for modern companies.',
|
||||
'company_name' => config('app.name', 'Content Manager'),
|
||||
'site_url' => url('/'),
|
||||
'logo_url' => '',
|
||||
'logo_dark_url' => '',
|
||||
'favicon_url' => '/favicon.ico',
|
||||
'contact_email' => '',
|
||||
'contact_phone' => '',
|
||||
'address' => '',
|
||||
'facebook_url' => '',
|
||||
'x_url' => '',
|
||||
'linkedin_url' => '',
|
||||
'instagram_url' => '',
|
||||
'copyright' => '',
|
||||
'dashboard_label' => 'Dashboard',
|
||||
'login_label' => 'Log in',
|
||||
'registration_label' => 'Get started',
|
||||
'default_meta_title' => '',
|
||||
'default_meta_description' => '',
|
||||
];
|
||||
|
||||
return array_replace($defaults, $this->group('site'));
|
||||
}
|
||||
|
||||
public function put(string $key, mixed $value, string $group = 'general', string $type = 'string', bool $public = false): Setting
|
||||
{
|
||||
$setting = Setting::query()->updateOrCreate(compact('group', 'key'), ['value' => is_scalar($value) || $value === null ? (string) $value : json_encode($value, JSON_THROW_ON_ERROR), 'type' => $type, 'is_public' => $public]);
|
||||
$setting = Setting::query()->updateOrCreate(
|
||||
compact('group', 'key'),
|
||||
[
|
||||
'value' => $this->encode($value, $type),
|
||||
'type' => $type,
|
||||
'is_public' => $public,
|
||||
]
|
||||
);
|
||||
|
||||
Cache::forget("settings.$group.$key");
|
||||
Cache::forget("settings.group.$group");
|
||||
|
||||
return $setting;
|
||||
}
|
||||
|
||||
private function tableExists(): bool
|
||||
{
|
||||
try {
|
||||
return Schema::hasTable((new Setting())->getTable());
|
||||
} catch (\Throwable) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
private function encode(mixed $value, string $type): ?string
|
||||
{
|
||||
if ($value === null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return match ($type) {
|
||||
'boolean' => filter_var($value, FILTER_VALIDATE_BOOL) ? '1' : '0',
|
||||
'integer' => (string) (int) $value,
|
||||
'float' => (string) (float) $value,
|
||||
'json', 'array' => json_encode($value, JSON_THROW_ON_ERROR),
|
||||
default => (string) $value,
|
||||
};
|
||||
}
|
||||
|
||||
private function decode(?string $value, string $type): mixed
|
||||
{
|
||||
return match ($type) {
|
||||
'boolean' => filter_var($value, FILTER_VALIDATE_BOOL),
|
||||
'integer' => (int) $value,
|
||||
'float' => (float) $value,
|
||||
'json', 'array' => filled($value) ? json_decode($value, true, 512, JSON_THROW_ON_ERROR) : [],
|
||||
default => $value,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user