# STD-02 — Controller — Response Consistency & Error Handling

**Category:** code_standards  
**Generated:** 2026-05-19T21:36:13.932194  

**Target Files:**
- `app/Http/Controllers/Admin/ProductController.php`
- `app/Http/Controllers/Admin/BlogPostController.php`
- `app/Http/Controllers/Admin/SiteSettingController.php`

---

Kamu adalah expert Laravel security & UI auditor.
Project: CRIUS COMPRESSOR — Laravel 12, Tailwind CSS, Alpine.js, Bilingual ID/EN.
Stack: PHP 8.3, Laravel 12, MySQL, Tailwind CSS v3, Alpine.js v3.
Design system: CSS variables --navy, --blue-light, --accent, font Montserrat.
Admin layout: resources/views/layouts/admin.blade.php
Frontend layout: resources/views/layouts/app.blade.php
Helpers: setting(), locale_field(), active_locale() di app/Helpers/helpers.php
Bilingual: field _id / _en suffix, middleware SetLocale, URL prefix /en.

ATURAN OUTPUT KAMU:
1. Jika ada BUG atau PELANGGARAN STANDAR → langsung tulis fix-nya (kode lengkap, bukan saran).
2. Format output: [FILE PATH] → [MASALAH] → [FIX CODE].
3. Jika file sudah benar → tulis "✓ OK: [alasan singkat]".
4. JANGAN tambah penjelasan panjang. Langsung ke kode.
5. Prioritas: CRITICAL > HIGH > MEDIUM > LOW.

============================================================
TASK: Audit konsistensi response dan error handling di controller admin.

STANDAR WAJIB ADMIN CONTROLLER:
1. store() berhasil → redirect()->route('admin.X.index')->with('success', 'Berhasil disimpan.')
2. update() berhasil → redirect()->route('admin.X.edit', $model)->with('success', 'Berhasil diperbarui.')
3. destroy() berhasil → redirect()->route('admin.X.index')->with('success', 'Berhasil dihapus.')
4. SETIAP operasi yang bisa gagal HARUS ada try-catch
5. Image/file delete saat model di-destroy: Storage::delete($model->thumbnail)
6. Slug auto-generate dari name_id jika slug kosong
7. Pagination di index(): ->paginate(15)

CEK ProductController.php:
1. Apakah store() auto-generate slug dari name_id?
2. Apakah destroy() hapus file gambar dari storage sebelum delete model?
3. Apakah ada authorize() check atau policy?
4. Apakah ada try-catch di store/update?

CEK BlogPostController.php:
1. Apakah published_at di-set ke now() saat status diubah ke 'published'?
2. Apakah thumbnail lama dihapus saat upload thumbnail baru?

CEK SiteSettingController.php:
1. Apakah update() loop semua key dan updateOrCreate()?
2. Apakah image type disimpan sebagai path relative (bukan full URL)?

Tulis fix untuk semua inkonsistensi.
