# Frontend User Module

## 1. Pengenalan

Module untuk manage frontend users (public site users) — CRUD, profile, email verification, authentication.

## 2. Database

**Table:** `frontend_users`

Sama struktur dengan `backend_users`:
- id, username (unique), email (unique), password, first_name, last_name, profile_picture, is_active
- email_verified_at, expires_at, two_factor_code, two_factor_expires_at, last_login_at
- remember_token, timestamps

## 3. Routes

### Admin CRUD

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

### Public Auth (No Permission — Accessible to All)

| Method | URI | Name |
|--------|-----|------|
| GET | `/user/login` | `user.login` |
| POST | `/user/login` | `user.login.submit` |
| GET | `/user/register` | `user.register` |
| POST | `/user/register` | `user.register.submit` |
| POST | `/user/logout` | `user.logout` |
| GET | `/user/forgot-password` | `user.password.request` |
| POST | `/user/forgot-password` | `user.password.email` |
| GET | `/user/profile/edit` | `user.profile.edit` |
| PUT | `/user/profile` | `user.profile.update` |
| GET | `/user/dashboard` | `user.dashboard` |

## 4. Controller

### `Backend\FrontendUserController` (Admin CRUD)

Sama pattern dengan BackendUserController. Functions:
- `index()` — List users, search, paginate
- `create()` — Return create form
- `store(UserRequest)` — Create user + upload profile picture. `send_verification_email` masih disokong controller, tetapi checkbox tidak lagi dipaparkan pada create view.
- `show($id)` — Detail view
- `edit($id)` — Return edit form
- `update(UserRequest, $id)` — Update user + handle password + profile picture
- `destroy($id)` — Delete user

### `Frontend\UserController` (User Self-Profile)

| Method | URI | Name |
|--------|-----|------|
| GET | `/user/profile/edit` | `user.profile.edit` |
| PUT | `/user/profile` | `user.profile.update` |

**File:** `app/Http/Controllers/Frontend/UserController.php`

**updateProfile():**
- Validasi: username (unique), email, first_name, last_name, password (nullable; jika diisi mesti 8–12 + huruf besar/kecil/nombor/simbol + confirmed), **profile_picture** (nullable|image|max:15360)
- Upload profile_picture ke `storage/app/public/profile_pictures/frontend/` via FilePond
- Delete gambar lama jika ada sebelum replace

## 5. Model — `FrontendUser`

- Table: `frontend_users`
- Implements: `MustVerifyEmail`
- Traits: `HasFactory, Notifiable, HasRoles`
- Guard: `user`
- Same fillable/hidden as BackendUser
- Email notifications:
  - `sendPasswordResetNotification()` → `FrontendResetPassword` (DB template `user.password_reset`, fallback `MailMessage`)
  - `sendEmailVerificationNotification()` → `TemplatedVerifyEmail('user.verify_email')`
  - URL reset/verify menggunakan `SettingHelper::defaultSiteSlug()` dan absolute URL
- Audit Trail records web-request CRUD changes for this model; see [Audit Trail](audit-trail.md).

## 6. Views

### Admin CRUD

- `index.blade.php` — Table: No, Username, Email, Full Name, Last Login, Actions
- `create.blade.php` — Layout dua kolum (profile picture kiri, fields kanan): Username, Email, Password + Confirm Password (eye toggle berasingan), First Name, Last Name, Profile Picture (FilePond). Guna hidden `password_mode=manual` kerana `UserRequest` dikongsi dengan BackendUser. Checkbox email verification tidak lagi dipaparkan.
- `edit.blade.php` — Layout sama seperti create dengan pre-filled values; password/confirm optional, label First/Last Name dan eye toggle sama dengan backend.
- `show.blade.php` — Detail view

### User Self-Profile

- `frontend/profile/edit.blade.php` — Edit profile form dengan FilePond untuk profile picture (sama UI dengan backend profile edit)

## 7. Seeder — `FrontendUserSeeder`

- Create default user: `frontenduser@example.com` / `password`
- Seeder runs in console and does not generate web-request Audit Trail entries.

## 8. Permissions

| Permission | Description |
|------------|-------------|
| `frontend-user.view` | View list & detail |
| `frontend-user.create` | Create new user |
| `frontend-user.update` | Edit user |
| `frontend-user.delete` | Delete user |
