E-commerce Voucher Redemption API

20: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

⏱️ Alokasi Waktu Live Coding (20 Menit):

  • 5 Menit Pertama: Memahami aturan validasi, status code HTTP, dan skenario kegagalan.
  • 15 Menit Koding: Mengimplementasikan pengecekan in-memory dan status code 200/400/404.

2. Spesifikasi Input & Output

Request Body:

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

Response Berhasil (HTTP 200):

{
  "message": "Voucher redeemed successfully"
}

3. Data Awal In-Memory

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 Jelaskan bagaimana cara mencegah race condition (overselling kuota saat concurrent requests) menggunakan SELECT FOR UPDATE atau Atomic UPDATE query.

solution.js
Loading...
Local Test Console