# Auto Permissions

## Apa Itu Auto Permissions?

Auto Permissions adalah feature untuk **auto-generate permission** berdasarkan Model Eloquent yang dipilih, tanpa perlu create permission satu-satu secara manual dekat **Permissions → Create**.

---

## Masalah Asal

Setiap kali ada module baru (contoh: `content-slider`, `content-article`), kena buat manually:

1. Buka **Permissions → Create** → isi `content-slider.view` — save
2. Repeat untuk `content-slider.create`
3. Repeat untuk `content-slider.update`
4. Repeat untuk `content-slider.delete`
5. Buka **Roles → Edit** → cari permission baru → tick → save

Kalau ada 5 roles, kena ulang langkah 5 sebanyak 5 kali.

**Auto Permissions** selesaikan semua ni dalam **satu klik**.

---

## Cara Kerja

### 1. Model Discovery

Controller scan `app/Models/Backend/` untuk cari model-model yang ada:

```php
protected array $excluded = [
    'ContentSliderTranslation',
    'ContentArticleTranslation',
    'ContentApplicationTranslation',
    'ContentDownloadTranslation',
    'ContentVideoTranslation',
    'ContentPhotoGalleryTranslation',
    'VisitorSetting',
];
```

Model dalam `$excluded` ni automatik disembunyi dari dropdown sebab:
- Translation models — bukan module sebenar, cuma child table
- `VisitorSetting` — guna permission berbeza

### 2. Permission Prefix

Nama permission di-generate guna `Str::kebab()` dari class name model:

| Model | Prefix |
|---|---|
| `ContentSlider` | `content-slider` |
| `ContentArticle` | `content-article` |
| `ContentDownload` | `content-download` |
| `ContentApplication` | `content-application` |
| `ContentTestimonial` | `content-testimonial` |

### 3. Generate & Assign

Bila klik **Generate & Assign**:

1. `Permission::firstOrCreate()` — create permission kalau belum ada, kalau dah ada dia skip
2. `Role::givePermissionTo()` — assign permission yang baru digenerate ke role yang dipilih
3. `PermissionRegistrar::forgetCachedPermissions()` — clear cache supaya permission terus生效

---

## Cara Guna

### Untuk Module Baru

1. **Buat Model** dalam `app/Models/Backend/`
2. **Tambah Routes** dengan permission middleware:

```php
Route::get('/content-testimonial', 'index')
    ->middleware('permission:content-testimonial.view,admin')
    ->name('content-testimonial.index');

Route::get('/content-testimonial/create', 'create')
    ->middleware('permission:content-testimonial.create,admin')
    ->name('content-testimonial.create');
// etc...
```

3. **Buka** Admin → Backend → Roles & Permissions → **Auto Permissions**
4. **Pilih Model** dari dropdown (contoh: `ContentTestimonial`)
5. **Tick Actions** yang nak bagi akses (view, create, update, delete)
6. **Pilih Roles** nak assign permission pada role mana
7. Klik **Generate & Assign**

### Untuk Guna Dalam View

```blade
@can('content-testimonial.view')
    <a href="{{ route('content-testimonial.index') }}">Testimonials</a>
@endcan

@can('content-testimonial.create')
    <button>Add Testimonial</button>
@endcan
```

### Untuk Guna Dalam Controller/Route

```php
public function __construct()
{
    $this->middleware('permission:content-testimonial.view,admin')->only(['index', 'show']);
    $this->middleware('permission:content-testimonial.create,admin')->only(['create', 'store']);
    $this->middleware('permission:content-testimonial.update,admin')->only(['edit', 'update']);
    $this->middleware('permission:content-testimonial.delete,admin')->only(['destroy']);
}
```

### Di Sidebar

```blade
@can('content-testimonial.view')
    <a href="{{ route('content-testimonial.index') }}">Testimonials</a>
@endcan
```

---

## File Structure

```
app/Http/Controllers/Backend/
├── AutoPermissionController.php       ← Controller untuk auto permission

resources/views/backend/module/auto-permission/
├── index.blade.php                    ← Form page
└── README.md                          ← Dokumentasi ni

routes/
└── web.php                            ← Route definition:
                                       Route::get('/auto-permissions', ...)
                                       Route::post('/auto-permissions/generate', ...)
```

---

## Permission Yang Digunakan

Route Auto Permissions sendiri guard guna permission sedia ada:

| Route | Permission Required |
|---|---|
| GET `/admin/auto-permissions` | `permission.create` |
| POST `/admin/auto-permissions/generate` | `permission.create` |

Sebab tu hanya user yang ada akses **Permissions → Create** boleh access halaman ni.
