# 🤖 AI Agent Guide: High Concurrency Coding Optimization

Dokumen ini berisi instruksi teknis eksplisit untuk memperbaiki _bottleneck_ pada kode program agar sistem siap menangani **1000 user concurrent**. Dokumen ini diformat agar mudah dipahami oleh AI Coding Assistant.

---

## 1. Perbaikan Blocking I/O (Asynchronous File System) -- DONE ✅

**Problem:**
File `src/common/helpers/file-upload.helper.ts` menggunakan fungsi sinkron (`fs.mkdirSync`, `fs.writeFileSync`, `fs.unlinkSync`) yang memblock _event loop_ Node.js.

**Instruction for AI:**

1. Buka file `src/common/helpers/file-upload.helper.ts`.
2. Ubah import `fs` menjadi `import { promises as fs } from 'fs';` atau gunakan `fs.promises`.
3. Ubah semua pemanggilan fungsi sinkron menjadi asinkron dengan `await`:
   - `fs.mkdirSync(...)` -> `await fs.mkdir(..., { recursive: true })`
   - `fs.writeFileSync(...)` -> `await fs.writeFile(...)`
   - `fs.unlinkSync(...)` -> `await fs.unlink(...)`
   - `fs.existsSync(...)` -> gunakan `await fs.access(...)` dan tangani errornya (atau biarkan jika hanya pengecekan folder sederhana).
4. Pastikan method `fileUpload`, `fileDelete`, dan `generateQrCode` ditandai sebagai `async`.

---

## 2. Implementasi Structured Logging (Pino/Winston) -- DONE ✅

**Problem:**
Penggunaan `console.log` dan `console.error` bersifat sinkron dan melambatkan aplikasi pada trafik tinggi.

**Instruction for AI:**

1. Instal library `nestjs-pino` atau setup `Winston`.
2. Ganti semua `console.log` dan `console.error` di seluruh aplikasi dengan `this.logger.log()` atau `this.logger.error()` menggunakan `Logger` dari `@nestjs/common`.
3. Pastikan `Logger` di-inject melalui constructor service masing-masing.
4. Di `main.ts`, gunakan logger tersebut sebagai global logger.

---

## 3. Dinamisasi Konfigurasi Keamanan (CORS & Env) -- DONE ✅

**Problem:**
Konfigurasi CORS di `main.ts` saat ini bertipe _hardcoded_ (`origin: 'http://localhost:5173'`).

**Instruction for AI:**

1. Buka `main.ts`.
2. Ambil `ConfigService` menggunakan `app.get(ConfigService)`.
3. Pindahkan nilai origin ke `.env` dengan key `CORS_ORIGIN`.
4. Update `app.enableCors` untuk membaca nilai dari `ConfigService.get('CORS_ORIGIN')`. Jika bernilai `*`, pastikan diproses dengan benar.

---

## 4. Penanganan Serialisasi BigInt (JSON Patch) -- DONE ✅

**Problem:**
Database menggunakan `BigInt` (misal pada `user_answers`). JavaScript akan error `Do not know how to serialize a BigInt` saat mengirim respon JSON.

**Instruction for AI:**

1. Buat sebuah file baru `src/common/utils/bigint-serializer.ts`.
2. Tambahkan global patch:
   ```typescript
   (BigInt.prototype as any).toJSON = function () {
     return this.toString();
   };
   ```
3. Import file tersebut di `main.ts` sebelum `bootstrap()`.
4. Pastikan semua respon API yang mengandung `BigInt` terkonversi menjadi `string` secara otomatis di JSON.

---

## 5. Optimasi Bcrypt & JWT Strategy -- DONE ✅

**Problem:**
Verifikasi password dengan banyak _rounds_ bisa mematikan CPU saat login massal.

**Instruction for AI:**

1. Buka `src/auth/auth.service.ts`.
2. Pastikan `saltRounds` maksimal bernilai `10`.
3. Implementasikan cache untuk hasil verifikasi token di Redis jika JWT sering dipanggil (opsional tapi disarankan untuk high load).
4. Pastikan `updateRefreshToken` menggunakan indexing yang tepat di Prisma.

---

## 6. Tuning Rate Limiter (Throttler) - DONE ✅

**Problem:**
Limit `20` request per menit terlalu kecil untuk sistem Tryout.

**Instruction for AI:**

1. Buka `src/app.module.ts`.
2. Update konfigurasi `ThrottlerModule.forRoot`.
3. Set `ttl` ke `60000` (1 menit) dan `limit` ke `300`.
4. Jika Redis sudah aktif, ganti storage default dengan `ThrottlerStorageRedisService` dari `@nestjs/throttler-storage-redis`.

# Untuk seeding (jika database bersih)

npx ts-node --transpile-only scripts/seed-load-test.ts

# Untuk menjalankan load test

k6 run tests/load/tryout-load-test.js

# 1. Reset Database (Ini akan menghapus semua data dan menjalankan seeder awal)

# PERINGATAN: Semua data yang Anda buat manual akan hilang, kembali ke settingan awal seeder.

npx prisma migrate reset --force
