| Current Path : /var/www/html/dynaweb-cms-v1/app/Services/ |
| Current File : /var/www/html/dynaweb-cms-v1/app/Services/FrontendSiteCacheService.php |
<?php
namespace App\Services;
use App\Models\Backend\FrontendSite;
use Illuminate\Support\Facades\Storage;
class FrontendSiteCacheService
{
/**
* Rebuild cache site-meta.json.
*
* Kumpul semua site + pages + components,
* simpan sebagai JSON di storage untuk rujukan cepat.
* Panggil lepas create/update site/page/component.
*/
public function rebuild(): void
{
$meta = [];
$sites = FrontendSite::with('pages.components')->where('status', true)->get();
foreach ($sites as $site) {
$siteMeta = [
'id' => $site->id,
'name' => $site->name,
'slug' => $site->slug,
'is_default' => $site->is_default,
'header_code' => $site->header?->code,
'footer_code' => $site->footer?->code,
'pages' => [],
];
foreach ($site->pages()->where('status', true)->get() as $page) {
$siteMeta['pages'][$page->slug] = [
'id' => $page->id,
'name' => $page->name,
'is_default' => $page->is_default,
'components' => $page->components->pluck('code')->toArray(),
];
}
$meta[$site->slug] = $siteMeta;
}
Storage::put('site-meta.json', json_encode($meta, JSON_PRETTY_PRINT));
}
/**
* Ambil meta untuk satu site berdasarkan slug.
* Auto rebuild kalau file belum wujud.
*/
public function get(string $slug): ?array
{
return $this->all()[$slug] ?? null;
}
/**
* Ambil semua site meta.
* Auto rebuild kalau file cache takde.
*/
public function all(): array
{
if (!Storage::exists('site-meta.json')) {
$this->rebuild();
}
return json_decode(Storage::get('site-meta.json'), true) ?? [];
}
/**
* Cari default site dari cache.
*/
public function getDefaultSite(): ?array
{
foreach ($this->all() as $slug => $meta) {
if ($meta['is_default']) {
return $meta;
}
}
return null;
}
}