E-commerce Voucher Redemption API

30:00

1. Studi Kasus

Sebuah aplikasi e-commerce memiliki fitur redeem voucher promosi. Untuk melindungi margin bisnis, setiap voucher hanya dapat digunakan 1 kali oleh setiap pengguna, dan setiap voucher memiliki kuota yang terbatas.

Anda diminta membuat logika endpoint REST API Express.js untuk:

POST /redeem

2. Spesifikasi Input & Output

Request Body:

{
  "userId": 1,
  "voucherCode": "PROMO50"
}

Response Berhasil (HTTP 200):

{
  "message": "Voucher redeemed successfully"
}

3. Data Awal In-Memory

TIDAK PERLU menggunakan database eksternal. Cukup gunakan variabel in-memory array/object berikut:

const vouchers = [
  { code: "PROMO50", quota: 5 },
  { code: "WELCOME", quota: 10 }
];

const redeemedVouchers = [];

4. Requirement & Aturan Validasi

  1. Validasi Field: Jika userId atau voucherCode tidak diisi di request body, kembalikan HTTP 400 dengan pesan error.
  2. Aturan 1 (Voucher Harus Ada): Jika voucherCode tidak ditemukan di array vouchers, kembalikan HTTP 404 dengan pesan "Voucher tidak ditemukan".
  3. Aturan 2 (Klaim Ganda): Satu user hanya boleh me-redeem voucher yang sama satu kali. Jika user sudah pernah klaim, kembalikan HTTP 400 dengan pesan "Anda sudah pernah mengklaim voucher ini".
  4. Aturan 3 (Batas Kuota): Voucher tidak boleh diredeem jika kuotanya habis (quota <= 0). Kembalikan HTTP 400 dengan pesan "Kuota voucher sudah habis".
  5. Update State Data: Jika semua validasi lolos:
    • Kurangi kuota voucher sebanyak 1 (voucher.quota -= 1).
    • Simpan catatan klaim { userId, voucherCode } ke dalam array redeemedVouchers.

5. Pertanyaan Bonus Konseptual 💡

Penanganan Race Condition di PostgreSQL Di bagian komentar kode solusi Anda, jelaskan bagaimana cara mencegah race condition (misalnya overselling kuota saat banyak request masuk bersamaan) jika API ini dimigrasi menggunakan PostgreSQL.

Jelaskan 3 pendekatan berikut:

  • Database Transaction & Row Locking: SELECT FOR UPDATE
  • Unique Constraint: Unique index pada kolom (user_id, voucher_code)
  • Atomic Update Query: UPDATE vouchers SET quota = quota - 1 WHERE code = $1 AND quota > 0;
solution.js
Loading...
Local Test Console