# Discord Job Checker System

Sistem ini secara otomatis memeriksa role Discord user di guild `1459788220530426109` dan memetakan role tersebut ke kolom `job` di tabel `users_loket`. Checker dijalankan sebagai **Laravel Artisan Command** yang dijadwalkan (via [app/Console/Kernel.php](file:///c:/laragon/www/satu_mimpi/loket/app/Console/Kernel.php)), dan juga dipanggil langsung setelah user menyelesaikan profil.

Moderator (berdasarkan `discord_id`) bisa mengatur **role pool** (mapping Discord Role ID → job name) melalui halaman admin.

---

## Proposed Changes

### 1. Database Migrations

#### [NEW] `2026_03_17_000001_create_discord_role_configs_table.php`
Tabel konfigurasi mapping: Discord Role ID → job name.

| Kolom | Tipe | Keterangan |
|-------|------|------------|
| `id` | bigint | PK |
| `role_id` | string | Discord Role ID |
| `role_name` | string | Nama role (label display) |
| `job` | enum('civilian','leo','doj','government') | Job yang dimapping |
| `priority` | int (default 0) | Urutan prioritas (makin besar = lebih prioritas) |
| `timestamps` | — | — |

#### [NEW] `2026_03_17_000002_create_discord_moderators_table.php`
Tabel whitelist moderator yang boleh mengatur role pool.

| Kolom | Tipe | Keterangan |
|-------|------|------------|
| `id` | bigint | PK |
| `discord_id` | string unique | Discord ID moderator |
| `name` | string nullable | Nama (label display) |
| `timestamps` | — | — |

---

### 2. Models

#### [NEW] `app/Models/DiscordRoleConfig.php`
Model Eloquent untuk `discord_role_configs`.

#### [NEW] `app/Models/DiscordModerator.php`
Model Eloquent untuk `discord_moderators`.

---

### 3. Artisan Command — Job Checker

#### [NEW] `app/Console/Commands/CheckDiscordJob.php`

**Signature:** `discord:check-job {--user=} {--all}`

**Logic:**
1. Jika `--user=<loket_user_id>` → check satu user. Jika `--all` → check semua user.
2. Untuk setiap user yang punya `discord_id`:
   - Hit Discord API: `GET https://discord.com/api/v9/users/{discord_id}/profile?guild_id=1459788220530426109`
   - Header: `authorization: <BOT_TOKEN>` dari config/env.
   - Ambil `guild_member.roles` (array of role_id string).
   - Cari role yang ada di `discord_role_configs` → ambil yang **priority tertinggi**.
   - Update `users_loket.job` sesuai mapping. Jika tidak ada role yang match → set `civilian`.
3. Log hasilnya (Laravel Log).

**Config baru di [.env](file:///c:/laragon/www/satu_mimpi/loket/.env):**
```
DISCORD_BOT_TOKEN=ODE2MjgxMTEwMDM5NjI1NzI5.GjRyT1.z0rMOq-UXp1fiNDSu1lGfVDac3hsEcqXlH8miE
DISCORD_GUILD_ID=1459788220530426109
```

---

### 4. Console Kernel — Schedule

#### [MODIFY] [app/Console/Kernel.php](file:///c:/laragon/www/satu_mimpi/loket/app/Console/Kernel.php)
Daftarkan command dan jadwalkan setiap **5 menit**:
```php
$schedule->command('discord:check-job --all')->everyFiveMinutes();
```

---

### 5. Integrasi Profile Complete

#### [MODIFY] [app/Http/Controllers/ProfileController.php](file:///c:/laragon/www/satu_mimpi/loket/app/Http/Controllers/ProfileController.php)
Setelah `Auth::user()->update($validated)` berhasil, panggil artisan command untuk user tersebut:
```php
Artisan::call('discord:check-job', ['--user' => Auth::user()->id]);
```

---

### 6. Seeder

#### [NEW] `database/seeders/DiscordRoleConfigSeeder.php`
Seed role awal DOJ role `1463749832417218829` → `doj` (priority 10).

> [!NOTE]
> Role pool lain akan ditambahkan oleh moderator via UI admin. Seeder hanya isi contoh awal.

#### [NEW] `database/seeders/DiscordModeratorSeeder.php`
Seed moderator awal: discord_id `816281110039625729`.

---

### 7. Moderator Admin UI

#### [NEW] `app/Http/Controllers/ModeratorController.php`
Dua resource:
- **Role Config:** index, store, destroy (tambah/hapus mapping role)
- **Moderator:** index, store, destroy (tambah/hapus mod)

#### [NEW] Middleware `app/Http/Middleware/IsModerator.php`
Cek apakah `auth()->user()->discord_id` ada di tabel `discord_moderators`.  
Jika tidak → abort 403.

#### [MODIFY] [app/Http/Kernel.php](file:///c:/laragon/www/satu_mimpi/loket/app/Http/Kernel.php)
Tambah alias: `'moderator' => \App\Http\Middleware\IsModerator::class`

#### [NEW] Routes di [routes/web.php](file:///c:/laragon/www/satu_mimpi/loket/routes/web.php)
```php
Route::middleware(['auth', 'moderator'])->prefix('admin')->group(function () {
    Route::get('/roles', [ModeratorController::class, 'rolesIndex'])->name('admin.roles.index');
    Route::post('/roles', [ModeratorController::class, 'rolesStore'])->name('admin.roles.store');
    Route::delete('/roles/{id}', [ModeratorController::class, 'rolesDestroy'])->name('admin.roles.destroy');

    Route::get('/moderators', [ModeratorController::class, 'modsIndex'])->name('admin.mods.index');
    Route::post('/moderators', [ModeratorController::class, 'modsStore'])->name('admin.mods.store');
    Route::delete('/moderators/{id}', [ModeratorController::class, 'modsDestroy'])->name('admin.mods.destroy');
});
```

#### [NEW] Views
- `resources/views/admin/roles/index.blade.php` — tabel role config + form tambah
- `resources/views/admin/moderators/index.blade.php` — tabel moderator + form tambah

---

## User Review Required

> [!IMPORTANT]
> **Role Priority:** Sistem mengambil role dengan `priority` tertinggi dari database jika user punya lebih dari satu role yang terdaftar. Misalnya jika user punya role `doj` (priority 10) dan `leo` (priority 5), maka job = `doj`. Apakah logika ini sudah sesuai?

> [!IMPORTANT]
> **Bot Token:** Token yang ada di curl request kamu adalah **user token**, bukan bot token. Penggunaan user token di server-side bisa melanggar TOS Discord dan bisa di-ban. Apakah kamu ingin tetap pakai ini (untuk server RP/dev) atau mau pakai Bot Token resmi?

> [!NOTE]
> **Jadwal:** Default schedule adalah setiap 5 menit. Bisa diubah ke interval lain (misalnya `everyMinute()` atau `hourly()`).

---

## Verification Plan

### Automated (Manual CLI)
```bash
# 1. Jalankan migrasi
php artisan migrate

# 2. Jalankan seeder
php artisan db:seed --class=DiscordRoleConfigSeeder
php artisan db:seed --class=DiscordModeratorSeeder

# 3. Test command untuk satu user (ganti <id> dengan ID user di db)
php artisan discord:check-job --user=1

# 4. Test command untuk semua user
php artisan discord:check-job --all
```

### Manual Testing
1. Login dengan Discord account yang punya role `1463749832417218829` di guild.
2. Isi profil lengkap di `/profile/complete`.
3. Setelah submit, cek di database: `SELECT job FROM users_loket WHERE discord_id = '340120135849345024';` — harus `doj`.
4. Login sebagai moderator (discord_id `816281110039625729`), akses `/admin/roles` → pastikan bisa tambah/hapus role config.
5. Test user tanpa role yang terdaftar → job harus `civilian`.
