Skip to content

perbaikan cache website - #1711

Open
pandigresik wants to merge 2 commits into
rilis-devfrom
fix/cache_website
Open

perbaikan cache website#1711
pandigresik wants to merge 2 commits into
rilis-devfrom
fix/cache_website

Conversation

@pandigresik

Copy link
Copy Markdown
Contributor

Pull Request: Fix Cache Invalidation pada Website API

Description

Fix issue #1710 di mana data slide (dan data website lainnya seperti profil, medsos, navigasi, pengurus, dll) yang ditambahkan/dihapus/diupdate melalui admin panel tidak langsung tampil di halaman website. Akar masalahnya adalah WebsiteController::index() menggunakan Cache::remember() untuk caching response, namun tidak ada mekanisme invalidation cache ketika data berubah. Data tetap stale sampai cache expired (1 jam).

Changes made:

  1. New Observer: Membuat WebsiteCacheObserver yang otomatis clear cache website:api pada event created, updated, deleted di model-model yang berkontribusi ke data website
  2. Controller: Mengubah WebsiteController::index() dari Cache::remember() ke CacheService::remember() agar cache key ter-track di table cache_keys
  3. Config: Menambahkan theme-api.website.cache_prefix di config/theme-api.php
  4. Model: Mendaftarkan WebsiteCacheObserver di 11 model: Slide, MediaSosial, Navigation, NavMenu, Pengurus, SinergiProgram, Event, Profil, DataUmum, MediaTerkait, SettingAplikasi
  5. Env: Menambahkan variabel API_CACHE_ENABLED dan API_CACHE_DURATION di .env.example

Reason for change:

  • Bug: Data slide/media sosial/navigasi/etc tidak tampil terbaru di website setelah diubah di admin panel
  • Root Cause: Tidak ada mekanisme cache invalidation - WebsiteController cache response 1 jam tanpa clear saat data berubah
  • User Impact: Admin harus manual clear cache setiap kali mengubah data website, yang tidak praktis

Impact of change:

Bug Fix: Data website otomatis update saat ada perubahan di admin panel
UX: Admin tidak perlu manual clear cache lagi
Consistency: Mengikuti pattern yang sudah ada (seperti GaleriObserver, ArtikelChanged listener)

Related Issue

Steps to Reproduce

Before fix (problem):

  1. Login ke admin panel
  2. Buka Setting > Slide
  3. Tambah atau hapus slide
  4. Buka halaman website
  5. ❌ Data slide tidak berubah (masih menggunakan data dari cache lama)

After fix (solution):

  1. Login ke admin panel
  2. Buka Setting > Slide
  3. Tambah atau hapus slide
  4. Buka halaman website
  5. ✅ Data slide langsung terupdate sesuai perubahan

Testing on related features:

  • Tambah/hapus slide ✅ Cache ter-clear
  • Update profil kecamatan ✅ Cache ter-clear
  • Ubah media sosial ✅ Cache ter-clear
  • Ubah navigasi menu ✅ Cache ter-clear
  • Ubah pengurus ✅ Cache ter-clear
  • Ubah sinergi program ✅ Cache ter-clear
  • Tambah/hapus event ✅ Cache ter-clear

Checklist

Technical Details

Technical Explanation

Akar masalah:

WebsiteController::index() menggunakan Cache::remember($key, 3600, callback) yang menyimpan response API di cache selama 1 jam. Ketika admin mengubah data (slide, profil, medsos, dll), tidak ada kode yang clear cache ini. Sehingga request berikutnya ke website API masih membaca data lama dari cache.

Solusi:

Membuat WebsiteCacheObserver yang didaftarkan sebagai Eloquent Observer di semua model yang data nya ditampilkan di website. Observer ini akan clear cache website:api setiap kali model di-create, di-update, atau di-delete.

Alur cache invalidation:

Admin ubah slide → $slide->update()
  → Eloquent fire "updated" event
    → WebsiteCacheObserver::updated()
      → CacheService::removeCachePrefix('website:api')
      → Cache::forget('website:api:website:api')
        → Cache website di-clear

Request berikutnya ke Website API
  → CacheService::remember() → cache kosong
    → Query fresh dari database
    → Simpan ke cache + track di cache_keys table

File changes detail

Baru:

  • app/Observers/WebsiteCacheObserver.php - Observer yang clear website cache

Diubah:

  • app/Http/Controllers/Api/Frontend/WebsiteController.php - Cache::remember()CacheService::remember() dengan prefix tracking
  • config/theme-api.php - Tambah website.cache_prefix config
  • app/Models/Slide.php - Register WebsiteCacheObserver
  • app/Models/MediaSosial.php - Register WebsiteCacheObserver
  • app/Models/Navigation.php - Register WebsiteCacheObserver
  • app/Models/NavMenu.php - Register WebsiteCacheObserver
  • app/Models/Pengurus.php - Register WebsiteCacheObserver
  • app/Models/SinergiProgram.php - Register WebsiteCacheObserver
  • app/Models/Event.php - Register WebsiteCacheObserver
  • app/Models/Profil.php - Register WebsiteCacheObserver (additional ke observer yang sudah ada)
  • app/Models/DataUmum.php - Register WebsiteCacheObserver (additional ke observer yang sudah ada)
  • app/Models/MediaTerkait.php - Register WebsiteCacheObserver (additional ke observer yang sudah ada)
  • app/Models/SettingAplikasi.php - Register WebsiteCacheObserver (additional ke observer yang sudah ada)
  • .env.example - Tambah API cache env vars

Configuration changes

Ditambahkan entry baru di config/theme-api.php:

'website' => [
    'cache_prefix' => env('WEBSITE_API_CACHE_PREFIX', 'website:api'),
],

Dependencies added

None

Testing

Manual Testing

  • Tambah slide baru → website langsung tampilkan slide baru
  • Hapus slide → website langsung tidak tampilkan slide yang dihapus
  • Ubah profil kecamatan → website langsung tampilkan data terbaru
  • Tambah/hapus media sosial → website langsung update
  • Ubah navigasi → website langsung update
  • Tambah/hapus pengurus → website langsung update
  • Existing features tidak terpengaruh (artikel, galeri, potensi, regulasi)

Video

simplescreenrecorder-2026-08-20_10.38.47.mp4

Migration Guide

Not required

References


Additional notes: Observer didaftarkan di 11 model yang berkontribusi ke data website. Model yang sudah memiliki observer lain (Profil, DataUmum, MediaTerkait, SettingAplikasi) tetap mempertahankan observer lama dan menambahkan WebsiteCacheObserver sebagai observer tambahan. Pattern ini mengikuti convention yang sudah ada di codebase (seperti GaleriObserver, ClearArtikelCacheListener).

@github-actions

Copy link
Copy Markdown
Contributor

🔄 AI PR Review sedang antri di server...

Proses review akan segera dimulai di background — hasil akan muncul sebagai komentar setelah selesai.
Powered by CrewAI · PR #1711

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant