# Dokumentasi Sistem Auto-Fetch Data Karakter NinjaSage

Sistem ini berfungsi untuk secara otomatis melakukan login dan pengambilan data karakter terbaru dari server `play.ninjasage.id` untuk setiap user yang terdaftar di database `login_user_kus`.

## Komponen Utama

1.  **Backend Service (NestJS)**
    -   **File**: `backend/nest/src/modules/amf-proxy/amf-proxy.service.ts`
    -   **Fungsi**: `fetchSystemLoginLoginUser`
    -   **Deskripsi**: Menangani komunikasi AMF dengan server game untuk login. Mengirim `username` dan `password_hash` ke `SystemLogin.loginUser`.

2.  **Backend Logic (Laravel)**
    -   **Service**: `App\Services\AutoFetchService.php`
    -   **Deskripsi**: Mengelola alur kerja utama:
        1.  Mengambil daftar user yang memiliki username & password_hash.
        2.  Login ke NestJS proxy -> mendapatkan Session Key baru.
        3.  Menggunakan Session Key untuk request `getAllCharacters`.
        4.  Menyimpan data karakter ke `login_user_kus`.
        5.  Mencatat riwayat pengambilan (sukses/gagal) ke `login_user_ku_histories`.

3.  **Scheduler (Laravel Artisan)**
    -   **Command**: `app:auto-fetch-characters`
    -   **File**: `app/Console/Commands/AutoFetchCharacters.php`
    -   **Jadwal**: Setiap jam (`hourly()`) via `app/Console/Kernel.php`.

## Cara Menjalankan

### 1. Manual (Testing)
Anda dapat menjalankan proses ini secara manual melalui terminal untuk pengujian:

```bash
cd backend
php artisan app:auto-fetch-characters
```

Output akan muncul di terminal dan log detail akan tersimpan di `storage/logs/laravel.log`.

### 2. Otomatis (Production)
Pastikan worker scheduler Laravel berjalan di server Anda. Biasanya menggunakan crontab:

```bash
* * * * * cd /path-to-your-project/backend && php artisan schedule:run >> /dev/null 2>&1
```

Untuk development (local), Anda bisa mensimulasikan scheduler dengan:

```bash
php artisan schedule:work
```

## Troubleshooting

### Error: Login Failed
-   **Penyebab**: Username/Password salah, atau server game sedang maintenance.
-   **Cek**: Lihat `login_user_ku_histories` kolom `error_message`.
-   **Solusi**: Pastikan data login user benar. Coba login manual di game.

### Error: Upstream Error (666/Session Expired)
-   **Penyebab**: Session Key tidak valid saat mengambil karakter.
-   **Solusi**: Sistem otomatis melakukan login ulang untuk mendapatkan session baru. Jika masih gagal, cek apakah akun sedang login di tempat lain (kick).

### Log File
Cek log untuk debug lebih lanjut:
`backend/storage/logs/laravel.log`

Cari keyword: `AutoFetchService`

## Struktur Database History
Tabel `login_user_ku_histories`:
-   `status`: 'success' atau 'failed'
-   `error_message`: Detail error jika gagal.
-   `session_key`: Session key yang digunakan/didapat.
-   `character_data`: Snapshot data karakter saat pengambilan.
