# Permission Module

## 1. Pengenalan

Module untuk manage permissions menggunakan **Spatie Permission** package. CRUD permission, guard filter, protected permissions.

## 2. Database

**Table:** `permissions` (Spatie default)

| Column | Type | Description |
|--------|------|-------------|
| id | bigint (PK) | Primary key |
| name | string | Permission name (format: `{module}.{action}`) |
| guard_name | string | Guard (admin/web) |
| timestamps | - | created_at, updated_at |

Unique: `[name, guard_name]`

**Related Tables:** `roles`, `model_has_permissions`, `model_has_roles`, `role_has_permissions`

## 3. Routes

| Method | URI | Permission | Name |
|--------|-----|------------|------|
| GET | `/admin/permissions` | `permission.view` | `permissions.index` |
| GET | `/admin/permissions/create` | `permission.create` | `permissions.create` |
| POST | `/admin/permissions` | `permission.create` | `permissions.store` |
| GET | `/admin/permissions/{id}/edit` | `permission.update` | `permissions.edit` |
| PUT | `/admin/permissions/{id}` | `permission.update` | `permissions.update` |
| DELETE | `/admin/permissions/{id}` | `permission.delete` | `permissions.destroy` |

## 4. Controller — `PermissionController`

**Functions:**
- `index()` — List permissions dengan search, guard filter, pagination.
- `create()` — Return create form.
- `store(Request)` — Create permission dengan name + guard_name.
- `edit($id)` — Return edit form.
- `update(Request, $id)` — Update permission.
- `destroy($id)` — Delete permission. **Protected permissions tak boleh delete**:
  ```php
  protected $protectedPermissions = [
      'backend-user.view', 'backend-user.create', 'backend-user.update', 'backend-user.delete',
      'activity-log.view', 'role.view', 'role.create', 'role.update', 'role.delete',
      'permission.view', 'permission.create', 'permission.update', 'permission.delete',
  ];
  ```

## 5. Views

- `index.blade.php` — Table: No, Permission Name, Guard Name, Actions (edit/delete). Guard filter dropdown, search, pagination.
- `create.blade.php` — Form: Name (format: `module.action`), Guard Name select.
- `edit.blade.php` — Same dengan pre-filled values. Edit untuk protected permissions menunjukkan warning.

## 6. Permissions

| Permission | Description |
|------------|-------------|
| `permission.view` | View permission list |
| `permission.create` | Create permission |
| `permission.update` | Edit permission |
| `permission.delete` | Delete permission |

**Protected:** Permission CRUD sendiri tak boleh delete (protected dalam controller).
