diff --git a/.env.example b/.env.example index 0c784458d..dd29c9047 100644 --- a/.env.example +++ b/.env.example @@ -79,3 +79,6 @@ TELEGRAM_BOT_TOKEN= # Scribe / OpenAPI # SCRIBE_AUTH_KEY=your-api-key-here +# pengaturan cache untuk API, jika ingin menonaktifkan cache, ubah API_CACHE_ENABLED menjadi false +API_CACHE_ENABLED=true +API_CACHE_DURATION=3600 # dalam detik (1 jam) \ No newline at end of file diff --git a/app/Http/Controllers/Api/Frontend/WebsiteController.php b/app/Http/Controllers/Api/Frontend/WebsiteController.php index b76f03121..8422c6f71 100644 --- a/app/Http/Controllers/Api/Frontend/WebsiteController.php +++ b/app/Http/Controllers/Api/Frontend/WebsiteController.php @@ -35,6 +35,7 @@ use App\Repositories\DesaApiRepository; use App\Repositories\ProfilApiRepository; use App\Repositories\WebsiteApiRepository; +use App\Services\CacheService; use App\Transformers\ProfilTransformer; use App\Transformers\WebsiteTransformer; use Illuminate\Http\Request; @@ -74,9 +75,10 @@ public function __construct( public function index(Request $request): Fractal|JsonResponse { $params = $request->only(['page', 'per_page', 'filter', 'fields', 'search', 'sort', 'order', 'include']); - $cacheKey = $this->getCacheKey('index', $params); + $prefix = config('theme-api.website.cache_prefix', 'website:api'); + $cacheKey = $this->getCacheKey($prefix, $params); - return Cache::remember($cacheKey, $this->getCacheDuration(), function () use ($request) { + return app(CacheService::class)->remember($cacheKey, $this->getCacheDuration(), function () use ($request) { $websiteData = $this->websiteApiRepository->getAllWebsiteData(); return $this->fractal([ ['id' => 'profile', (new ProfilTransformer())->transform(Profil::with(['dataUmum'])->first())], @@ -92,6 +94,6 @@ public function index(Request $request): Fractal|JsonResponse ['id' => 'counter', $websiteData['counter']], ['id' => 'config', config('profil')], ], new WebsiteTransformer()); - }); + }, $prefix); } } \ No newline at end of file diff --git a/app/Models/DataUmum.php b/app/Models/DataUmum.php index aa992ad6e..e3e6d46e0 100644 --- a/app/Models/DataUmum.php +++ b/app/Models/DataUmum.php @@ -32,6 +32,7 @@ namespace App\Models; use App\Observers\DataUmumObserver; +use App\Observers\WebsiteCacheObserver; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; @@ -120,5 +121,6 @@ public function setPathAttribute($value) protected static function booted(): void { static::observe(DataUmumObserver::class); + static::observe(WebsiteCacheObserver::class); } } diff --git a/app/Models/Event.php b/app/Models/Event.php index 88d1155d7..99c12bc59 100644 --- a/app/Models/Event.php +++ b/app/Models/Event.php @@ -31,17 +31,17 @@ namespace App\Models; -use Illuminate\Support\Carbon; +use App\Observers\WebsiteCacheObserver; use App\Traits\HandlesResourceDeletion; -use Illuminate\Database\Eloquent\Model; use Cviebrock\EloquentSluggable\Sluggable; use Illuminate\Database\Eloquent\Factories\HasFactory; +use Illuminate\Database\Eloquent\Model; class Event extends Model { + use HandlesResourceDeletion; use HasFactory; use Sluggable; - use HandlesResourceDeletion; protected $table = 'das_events'; @@ -91,4 +91,9 @@ public static function getOpenEvents() { return self::open()->orderBy('start', 'desc')->get(); } + + protected static function booted(): void + { + static::observe(WebsiteCacheObserver::class); + } } diff --git a/app/Models/MediaSosial.php b/app/Models/MediaSosial.php index 9cb5e8fa5..cb301dd9e 100644 --- a/app/Models/MediaSosial.php +++ b/app/Models/MediaSosial.php @@ -31,6 +31,7 @@ namespace App\Models; +use App\Observers\WebsiteCacheObserver; use App\Traits\HandlesResourceDeletion; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; @@ -56,4 +57,9 @@ class MediaSosial extends Model protected $resources = [ 'logo', ]; + + protected static function booted(): void + { + static::observe(WebsiteCacheObserver::class); + } } diff --git a/app/Models/MediaTerkait.php b/app/Models/MediaTerkait.php index 05a9bcba8..d811b0dad 100644 --- a/app/Models/MediaTerkait.php +++ b/app/Models/MediaTerkait.php @@ -2,22 +2,15 @@ namespace App\Models; +use App\Observers\MediaTerkaitObserver; +use App\Observers\WebsiteCacheObserver; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; -use App\Observers\MediaTerkaitObserver; class MediaTerkait extends Model { use HasFactory; - /** - * Register model lifecycle hooks. - */ - protected static function booted(): void - { - static::observe(MediaTerkaitObserver::class); - } - protected $fillable = [ 'logo', 'url', @@ -28,8 +21,8 @@ protected static function booted(): void public function scopeSearch($query, $search) { - return empty($search) - ? $query + return empty($search) + ? $query : $query->where('nama', 'LIKE', "%{$search}%"); } @@ -40,5 +33,12 @@ public function scopeStatus($query, $status) }); } - + /** + * Register model lifecycle hooks. + */ + protected static function booted(): void + { + static::observe(MediaTerkaitObserver::class); + static::observe(WebsiteCacheObserver::class); + } } diff --git a/app/Models/NavMenu.php b/app/Models/NavMenu.php index b52eab2c1..37bbc3e6b 100644 --- a/app/Models/NavMenu.php +++ b/app/Models/NavMenu.php @@ -2,9 +2,9 @@ namespace App\Models; +use App\Observers\WebsiteCacheObserver; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; -use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\HasMany; class NavMenu extends Model @@ -27,13 +27,18 @@ class NavMenu extends Model public function child(): HasMany { - return $this->hasMany(NavMenu::class, 'parent_id', 'id'); + return $this->hasMany(self::class, 'parent_id', 'id'); } public function children(): HasMany { - return $this->hasMany(NavMenu::class, 'parent_id', 'id')->with(['children' => function ($q) { + return $this->hasMany(self::class, 'parent_id', 'id')->with(['children' => function ($q) { return $q->selectRaw("id, parent_id , name as text, url as href, target, type, is_show,'fa fa-list' as icon"); }]); } + + protected static function booted(): void + { + static::observe(WebsiteCacheObserver::class); + } } diff --git a/app/Models/Navigation.php b/app/Models/Navigation.php index 2df52ab77..c1737847e 100644 --- a/app/Models/Navigation.php +++ b/app/Models/Navigation.php @@ -32,14 +32,11 @@ namespace App\Models; use App\Enums\MenuTipe; -use Illuminate\Support\Facades\Log; +use App\Observers\WebsiteCacheObserver; use Illuminate\Database\Eloquent\Model; -use Cviebrock\EloquentSluggable\Sluggable; -use Illuminate\Database\Eloquent\Factories\HasFactory; class Navigation extends Model { - /** * {@inheritDoc} */ @@ -71,12 +68,12 @@ public static function lastOrder($parent_id = 0) public function parent() { - return $this->belongsTo(Navigation::class, 'parent_id'); + return $this->belongsTo(self::class, 'parent_id'); } public function childrens() { - return $this->hasMany(Navigation::class, 'parent_id'); + return $this->hasMany(self::class, 'parent_id'); } public function setParentIdAttribute($value) @@ -116,4 +113,9 @@ public function getFullUrlAttribute() break; } } + + protected static function booted(): void + { + static::observe(WebsiteCacheObserver::class); + } } diff --git a/app/Models/Pengurus.php b/app/Models/Pengurus.php index 2992c726f..e89c187cf 100644 --- a/app/Models/Pengurus.php +++ b/app/Models/Pengurus.php @@ -35,6 +35,7 @@ use App\Enums\JenisJabatan; use App\Enums\Status; +use App\Observers\WebsiteCacheObserver; use App\Traits\HandlesResourceDeletion; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; @@ -167,12 +168,12 @@ public function cekPengurus(): array $kecuali = []; // Cek apakah kades - if (Pengurus::whereHas('jabatan', fn ($q) => $q->where('jenis', JenisJabatan::Camat))->where('status', Status::Aktif)->exists()) { + if (self::whereHas('jabatan', fn ($q) => $q->where('jenis', JenisJabatan::Camat))->where('status', Status::Aktif)->exists()) { $kecuali[] = JenisJabatan::Camat; } // Cek apakah sekdes - if (Pengurus::whereHas('jabatan', fn ($q) => $q->where('jenis', JenisJabatan::Sekretaris))->where('status', Status::Aktif)->exists()) { + if (self::whereHas('jabatan', fn ($q) => $q->where('jenis', JenisJabatan::Sekretaris))->where('status', Status::Aktif)->exists()) { $kecuali[] = JenisJabatan::Sekretaris; } @@ -193,4 +194,9 @@ public function scopeListAtasan(\Illuminate\Database\Eloquent\Builder $query, ?i 'das_pengurus.nik', ])->join('ref_jabatan', 'das_pengurus.jabatan_id', '=', 'ref_jabatan.id'); } + + protected static function booted(): void + { + static::observe(WebsiteCacheObserver::class); + } } diff --git a/app/Models/Profil.php b/app/Models/Profil.php index ed1419035..5f52b00a7 100644 --- a/app/Models/Profil.php +++ b/app/Models/Profil.php @@ -32,6 +32,7 @@ namespace App\Models; use App\Observers\ProfilObserver; +use App\Observers\WebsiteCacheObserver; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Facades\Cache; @@ -97,6 +98,7 @@ public function strukturOrganisasi() protected static function booted(): void { static::observe(ProfilObserver::class); + static::observe(WebsiteCacheObserver::class); static::saved(function () { Cache::forget('profil'); diff --git a/app/Models/SettingAplikasi.php b/app/Models/SettingAplikasi.php index e4e9cf618..f68104c62 100644 --- a/app/Models/SettingAplikasi.php +++ b/app/Models/SettingAplikasi.php @@ -32,6 +32,7 @@ namespace App\Models; use App\Observers\SettingAplikasiObserver; +use App\Observers\WebsiteCacheObserver; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Facades\Cache; @@ -56,6 +57,7 @@ class SettingAplikasi extends Model protected static function booted(): void { static::observe(SettingAplikasiObserver::class); + static::observe(WebsiteCacheObserver::class); static::saved(function () { Cache::forget('setting'); diff --git a/app/Models/SinergiProgram.php b/app/Models/SinergiProgram.php index c61d48274..33853a2da 100644 --- a/app/Models/SinergiProgram.php +++ b/app/Models/SinergiProgram.php @@ -31,6 +31,7 @@ namespace App\Models; +use App\Observers\WebsiteCacheObserver; use App\Traits\HandlesResourceDeletion; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; @@ -58,11 +59,16 @@ class SinergiProgram extends Model 'gambar', ]; + protected static function booted(): void + { + static::observe(WebsiteCacheObserver::class); + } + protected static function boot() { parent::boot(); - SinergiProgram::creating(function ($model) { + self::creating(function ($model) { $model->urutan = SinergiProgram::max('urutan') + 1; }); } diff --git a/app/Models/Slide.php b/app/Models/Slide.php index f526e4d2d..66bc343d5 100644 --- a/app/Models/Slide.php +++ b/app/Models/Slide.php @@ -31,7 +31,7 @@ namespace App\Models; -use Illuminate\Support\Facades\Log; +use App\Observers\WebsiteCacheObserver; use App\Traits\HandlesResourceDeletion; use Illuminate\Database\Eloquent\Model; @@ -55,4 +55,9 @@ class Slide extends Model protected $resources = [ 'gambar', ]; + + protected static function booted(): void + { + static::observe(WebsiteCacheObserver::class); + } } diff --git a/app/Observers/WebsiteCacheObserver.php b/app/Observers/WebsiteCacheObserver.php new file mode 100644 index 000000000..5ac072d03 --- /dev/null +++ b/app/Observers/WebsiteCacheObserver.php @@ -0,0 +1,36 @@ +clearWebsiteCache(); + } + + public function updated($model): void + { + $this->clearWebsiteCache(); + } + + public function deleted($model): void + { + $this->clearWebsiteCache(); + } + + protected function clearWebsiteCache(): void + { + try { + $prefix = config('theme-api.website.cache_prefix', 'website:api'); + + $cacheService = app(CacheService::class); + $cacheService->removeCachePrefix($prefix); + } catch (\Exception $e) { + // + } + } +} diff --git a/catatan_rilis.md b/catatan_rilis.md index 5ee2f8482..8150c738a 100644 --- a/catatan_rilis.md +++ b/catatan_rilis.md @@ -6,6 +6,7 @@ Terimakasih [isi disini] yang telah berkontribusi langsung mengembangkan aplikas #### FITUR 1. [#1324](https://github.com/OpenSID/OpenDK/issues/1324) Penambahan fitur log aktivitas. +2. [#1710](https://github.com/OpenSID/OpenDK/issues/1710) Data slide yang ditambahkan/dihapus tidak tampil sesuai di halaman web. #### BUG diff --git a/config/theme-api.php b/config/theme-api.php index 5422e64a9..894468ba0 100644 --- a/config/theme-api.php +++ b/config/theme-api.php @@ -140,6 +140,15 @@ 'cache_prefix' => env('KOMPLAIN_API_CACHE_PREFIX', 'komplain:api'), ], + /* + |-------------------------------------------------------------------------- + | Website API Settings + |-------------------------------------------------------------------------- + */ + 'website' => [ + 'cache_prefix' => env('WEBSITE_API_CACHE_PREFIX', 'website:api'), + ], + /* |-------------------------------------------------------------------------- | Theme and Endpoint Settings