Your IP : 216.73.216.79


Current Path : /var/www/html/dynaweb-cms-v1/app/Services/
Upload File :
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;
    }
}