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
{
"userId": 1,
"voucherCode": "PROMO50"
}
{
"message": "Voucher redeemed successfully"
}
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 = [];
userId atau voucherCode tidak diisi di request body, kembalikan HTTP 400 dengan pesan error.voucherCode tidak ditemukan di array vouchers, kembalikan HTTP 404 dengan pesan "Voucher tidak ditemukan".HTTP 400 dengan pesan "Anda sudah pernah mengklaim voucher ini".quota <= 0). Kembalikan HTTP 400 dengan pesan "Kuota voucher sudah habis".voucher.quota -= 1).{ userId, voucherCode } ke dalam array redeemedVouchers.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;