Jatah Kuota Harian Asisten Pintar yang Adil
Memberikan batas harian bagi tiap pengguna agar layanan asisten pintar tetap lancar, cepat, dan kuota hanya berkurang saat jadwal liburan berhasil dibuat.
Memberikan batas harian bagi tiap pengguna agar layanan asisten pintar tetap lancar, cepat, dan kuota hanya berkurang saat jadwal liburan berhasil dibuat.
Tantangan & Kebutuhan Pengguna
Pemanggilan API LLM eksternal untuk menyusun rencana perjalanan multi-hari mengonsumsi ribuan token per eksekusi. Tanpa sistem kuota di sisi server, pengguna dapat melakukan spam request secara berulang yang menghabiskan batas rate-limit API proyek. Sebaliknya, jika kuota langsung dipotong di awal request sebelum AI merespons, pengguna akan kehilangan jatah kuotanya secara tidak adil ketika API eksternal mengalami timeout atau mengembalikan format JSON yang tidak valid.
Verifikasi ketersediaan kuota di gerbang paling depan untuk melindungi sumber daya server, namun eksekusi pemotongan kuota di garis paling akhir hanya setelah output dinyatakan sah.
Solusi & Cara Kerja
Tabel `users` diperluas melalui migrasi khusus yang menambahkan dua kolom `unsignedInteger`: `trip_plan_quota` (batas kuota akun, default 2) dan `trip_plan_generated_count` (jumlah pemakaian berhasil, default 0). Saat pengguna memanggil `TripPlannerController::generate`, metode memeriksa apakah `trip_plan_generated_count >= trip_plan_quota` sebelum melakukan query destinasi maupun request HTTP ke Groq. Operasi atomik `$user->increment('trip_plan_generated_count')` baru dipanggil setelah respons AI lolos dekode JSON, memiliki struktur `hari`, dan selesai dihidrasi dengan data database.
Berikut adalah skema migrasi kuota dan logika penjagaan kuota dua tahap di `app/Http/Controllers/Public/TripPlannerController.php`:
Detail & Hal yang Diperhatikan
- Desain dua kolom (`quota` vs `generated_count`): Memisahkan kapasitas kuota dan penghitung pemakaian memungkinkan admin menaikkan kuota pengguna tertentu di database tanpa menghapus histori berapa kali pengguna tersebut telah membuat itinerary.
- Keamanan dari kegagalan jaringan eksternal: Setiap blok error (`$response->failed()`, respons kosong, atau `catch (\Exception $e)`) langsung melakukan early-return sebelum baris `$user->increment()`, menjamin kuota pengguna utuh 100% saat terjadi gangguan API.
- Penambahan nilai atomik di database: Penggunaan metode Eloquent `$user->increment('trip_plan_generated_count')` mengeksekusi query `UPDATE users SET trip_plan_generated_count = trip_plan_generated_count + 1` secara atomik di level database.