# Loket DOJ — Implementation Plan

Membuat aplikasi Laravel baru bernama **Loket** di `C:\laragon\www\satu_mimpi\Loket` sebagai portal publik untuk masyarakat mengajukan permohonan ke DOJ. Aplikasi berbagi database `satumimpi` dengan DOJ Portal, namun sepenuhnya terpisah (codebase, auth, session).

---

## User Review Required

> [!IMPORTANT]
> **Discord OAuth2 Credentials** — Setelah install selesai, kamu perlu membuat **Discord Application** di [Discord Developer Portal](https://discord.com/developers/applications) dan mengisi:
> - `DISCORD_CLIENT_ID`
> - `DISCORD_CLIENT_SECRET`
> - `DISCORD_REDIRECT_URI` = `https://loket.satu-mimpi.com/auth/discord/callback`
> 
> Saya akan siapkan templatenya di [.env](file:///C:/laragon/www/satu_mimpi/DOJ/.env), kamu tinggal isi nilainya.

> [!NOTE]
> **Kolom FK baru di tabel DOJ** — Saya akan menambahkan kolom `loket_user_id` (nullable) pada tabel-tabel form (`expungement_requests`, `arrest_warrant_requests`, `search_warrant_requests`, `case_umum`) via migration **baru di dalam project Loket**. Ini agar data yang disubmit publik bisa ditelusuri ke akun Loket mereka, tanpa menyentuh kode DOJ.

---

## Proposed Changes

### 1. Laravel Project Baru

#### [NEW] `C:\laragon\www\satu_mimpi\Loket\` (seluruh project)

- Install Laravel 10 via `composer create-project`
- Konfigurasi [.env](file:///C:/laragon/www/satu_mimpi/DOJ/.env) → DB sama: `satumimpi`

---

### 2. Packages yang Diinstall

| Package | Fungsi |
|---|---|
| `laravel/socialite` | Discord OAuth2 |
| `socialiteproviders/discord` | Driver Discord untuk Socialite |
| `barryvdh/laravel-dompdf` | (Opsional) PDF jika nanti dibutuhkan |

---

### 3. Database: Migration Baru (di project Loket)

#### [NEW] `database/migrations/..._create_users_loket_table.php`
Kolom: `id`, `discord_id`, `name`, `email`, `avatar`, `access_token`, `refresh_token`, `timestamps`

#### [NEW] `database/migrations/..._add_loket_user_id_to_forms.php`
Menambahkan kolom `loket_user_id` (nullable, FK ke `users_loket`) ke tabel:
- `expungement_requests`
- `arrest_warrant_requests`  
- `search_warrant_requests`
- `case_umum`

> [!WARNING]
> Migration ini akan berjalan terhadap database `satumimpi` yang juga dipakai DOJ. Pastikan DOJ tidak error — kolom ini **nullable** sehingga data lama tetap valid.

---

### 4. Auth — Discord OAuth2

#### [NEW] `app/Models/LoketUser.php`
- Table: `users_loket`
- Auth guard sendiri (tidak campur dengan `users_doj`)

#### [NEW] [config/auth.php](file:///c:/laragon/www/albyn/albyn/config/auth.php) — Tambah guard `loket`
```php
'guards' => [
    'web'   => ['driver' => 'session', 'provider' => 'loket_users'],
    ...
],
'providers' => [
    'loket_users' => ['driver' => 'eloquent', 'model' => App\Models\LoketUser::class],
],
```

#### [NEW] `app/Http/Controllers/Auth/DiscordController.php`
- `redirect()` → arahkan ke Discord
- `callback()` → simpan/update user di `users_loket`, login, redirect dashboard

#### [NEW] Routes Auth:
```
GET  /auth/discord          → redirect ke Discord
GET  /auth/discord/callback → proses callback
POST /logout                → logout
```

---

### 5. Controllers Form (4 Form)

#### [NEW] `app/Http/Controllers/ExpungementController.php`
- `create()` → tampilkan form
- `store()` → simpan ke `expungement_requests`, auto-generate `application_no`, set `loket_user_id`

#### [NEW] `app/Http/Controllers/ArrestWarrantController.php`
- `create()` + `store()` → tabel `arrest_warrant_requests`

#### [NEW] `app/Http/Controllers/SearchWarrantController.php`
- `create()` + `store()` → tabel `search_warrant_requests`

#### [NEW] `app/Http/Controllers/CaseUmumController.php`
- `create()` + `store()` → tabel `case_umum`

#### [NEW] `app/Http/Controllers/DashboardController.php`
- `index()` → tampilkan semua pengajuan milik user yang login (query by `loket_user_id`)

---

### 6. Views (Blade)

#### [NEW] [resources/views/layouts/app.blade.php](file:///c:/laragon/www/albyn/albyn/resources/views/layouts/app.blade.php)
- Header dengan info user Discord (avatar, nama)
- Navbar: Dashboard, Form-form, Logout

#### [NEW] [resources/views/auth/login.blade.php](file:///c:/laragon/www/albyn/albyn/resources/views/auth/login.blade.php)
- Landing page dengan tombol **"Login dengan Discord"**

#### [NEW] [resources/views/dashboard/index.blade.php](file:///c:/laragon/www/AffElnusa/resources/views/dashboard/index.blade.php)
- Tabel status semua pengajuan user
- Badge status: `pending` (kuning), `approved` (hijau), `rejected` (merah)

#### [NEW] Views per form:
- `views/forms/expungement/create.blade.php`
- `views/forms/arrest-warrant/create.blade.php`
- `views/forms/search-warrant/create.blade.php`
- `views/forms/case-umum/create.blade.php`

Tiap form memiliki halaman **konfirmasi/sukses** setelah submit yang menampilkan `application_no`.

---

### 7. Routes (web.php)

```
GET  /                    → landing/login page
GET  /auth/discord        → redirect Discord
GET  /auth/discord/callback
POST /logout

[middleware: auth:loket]
GET  /dashboard           → status semua pengajuan
GET  /forms/expungement/create
POST /forms/expungement
GET  /forms/arrest-warrant/create
POST /forms/arrest-warrant
GET  /forms/search-warrant/create
POST /forms/search-warrant
GET  /forms/case-umum/create
POST /forms/case-umum
```

---

## Verification Plan

### Setup Manual (Perlu Kamu Lakukan)
1. Buat Discord App di [discord.com/developers/applications](https://discord.com/developers/applications)
2. Tambah Redirect URI: `http://loket.test/auth/discord/callback` (lokal)
3. Isi [.env](file:///C:/laragon/www/satu_mimpi/DOJ/.env) Loket dengan `DISCORD_CLIENT_ID` dan `DISCORD_CLIENT_SECRET`

### Automated: Migration
```bash
cd C:\laragon\www\satu_mimpi\Loket
php artisan migrate
```
Cek tabel `users_loket` & kolom `loket_user_id` terbuat.

### Manual Test — Browser
1. Buka `http://loket.test` → tampil halaman login dengan tombol Discord
2. Klik "Login dengan Discord" → diarahkan ke Discord OAuth
3. Setelah authorize → redirect ke `/dashboard`
4. Buka salah satu form, isi, dan submit
5. Pastikan data muncul di dashboard dengan status `pending`
6. Login ke DOJ Portal → pastikan data tersebut juga terlihat di DOJ (shared DB)
