93 Studi Kasus: API Produk & Keranjang Belanja
Dalam dunia pengembangan aplikasi e-commerce, API untuk produk dan keranjang belanja adalah dua komponen fundamental yang sering menjadi dasar integrasi maupun pengembangan fitur lanjutan. Kali ini, saya ingin membagikan satu studi kasus menarik yang saya kerjakan —proyek internal yang kami beri kode: 93— dengan fokus pada desain, implementasi, serta simulasi penggunaan API produk dan keranjang belanja.
Artikel ini membahas tantangan umum, solusi terukur, hingga contoh kode yang harapannya bisa memberi sudut pandang praktis pada rekan-rekan engineer yang tengah membangun sistem serupa.
Bagian 1: Tantangan API Produk & Keranjang Belanja
Sebelum ke solusi, mari identifikasi beberapa tantangan paling umum:
- Konsistensi Data: Produk berubah harga, stok, atau status promo sementara user sudah memasukkan ke keranjang.
- Atomicity & Concurrent Update: Situasi race condition saat update banyak keranjang sekaligus.
- Experience Real-time: Perubahan pada produk/keranjang harus dapat tersaji dengan minim delay.
- Scalability: Ratusan ribu user mengakses API bersamaan.
Bagian 2: Model Data
Entity Diagram (ERD) Sederhana
erDiagram USER ||--o{ CART : owns CART ||--|{ CART_ITEM : contains PRODUCT ||--o{ CART_ITEM : referenced USER { string id string email } CART { string id string user_id } CART_ITEM { string id string cart_id string product_id int quantity float price_at_added } PRODUCT { string id string name float price int stock bool enabled }
Perhatikan field price_at_added
pada CART_ITEM. Ini menyimpan harga produk saat user menambahnya ke keranjang, sehingga perubahan harga setelah itu tidak otomatis memengaruhi item lama. Hal ini membantu mitigasi potensi konflik harga.
Bagian 3: Desain API
1. Produk Endpoint
Contoh:GET /api/products?limit=10&offset=0&search=jaket
Response:
{
"data": [
{
"id": "P001",
"name": "Jaket Waterproof",
"price": 299000,
"stock": 12,
"enabled": true
},
// ...
],
"meta": {
"total": 120,
"limit": 10,
"offset": 0
}
}
2. Keranjang Belanja
Endpoint dasar:
GET /api/cart
- Lihat isi keranjang userPOST /api/cart/items
- Tambah produk ke keranjangPATCH /api/cart/items/{itemId}
- Ubah qtyDELETE /api/cart/items/{itemId}
- Hapus dari keranjang
Contoh request tambah item:
POST /api/cart/items
Content-Type: application/json
{
"product_id": "P001",
"quantity": 2
}
Contoh response:
{
"success": true,
"cart": {
"items": [
{
"item_id": "CI01",
"product_id": "P001",
"product_name": "Jaket Waterproof",
"quantity": 2,
"price_at_added": 299000
}
]
}
}
Bagian 4: Simulasi Skenario Penting
1. Harga Berubah Setelah Barang di Keranjang
- Kasus: User A memasukkan jaket harga 299.000 ke keranjang. Ketika checkout, harga jaket, di katalog telah naik jadi 349.000.
- Solusi: Harga pada item keranjang tetap 299.000, sesuai history (
price_at_added
).
Kalau promo habis, status promo di-checkout diverifikasi sebelum order benar-benar selesai.
2. Update & Konsistensi Stok
- Ketika user menambah produk ke keranjang:
- Sistem tidak langsung mengurangi stok.
- Saat
POST /api/order
(checkout), validasi stok dilakukan. - Jika stok tidak cukup, response error dan user bisa perbarui isi keranjang.
Tabel Simulasi Respons Checkout
Skenario | Response | Penjelasan |
---|---|---|
Stok Cukup | Success | Transaksi diteruskan, stok dikurangi sesuai quantity. |
Stok Kurang | Fail | Pesan error, user disuruh update/cart refresh.Contoh: “Maaf, stok tinggal 1, silakan ubah quantity.” |
Harga Produk Berubah | Success/Warning | Jika sistem mengunci harga saat add to cart, pesan success.Jika tidak, server response dengan price update dan meminta user validasi ulang. |
Bagian 5: Contoh Kode Simpel (Node.js pseudo code)
1. Add Item to Cart
// add item ke cart
async function addItemToCart(userId, productId, qty) {
const product = await db.products.findById(productId);
if (!product || !product.enabled) throw new Error('Produk tidak tersedia');
const cart = await db.carts.findOrCreateByUserId(userId);
// Query price/stok terkini
const item = {
cart_id: cart.id,
product_id: productId,
quantity: qty,
price_at_added: product.price, // Simpan harga saat itu
};
// Upsert (update jika sudah ada, insert jika belum)
await db.cart_items.upsert(item);
return item;
}
2. Simulasi Checkout dengan Validasi
async function checkout(userId) {
const cart = await db.carts.findByUserId(userId);
for (const item of cart.items) {
const product = await db.products.findById(item.product_id);
if (product.stock < item.quantity) {
throw new Error(`Stok ${product.name} tinggal ${product.stock}`);
}
}
// Deduct stock, create order, etc.
// ...
return { status: 'success' };
}
Bagian 6: Diagram Alur Checkout
flowchart TD A[User klik checkout] --> B{Loop: Semua item di cart} B --> |Stok cukup| C C --> D{Item berikutnya?} D -->|Ya|B D -->|Tidak| E[Bikin order & kurangi stok] B --> |Stok kurang| F[Gagal: minta user ubah cart]
Diagram alur di atas memastikan atomicity seluruh proses: jika satu item gagal, proses dibatalkan sebelum order dibuat.
Bagian 7: Key Takeaways
- Simpan harga saat add to cart. Ini menjadi pengaman konsistensi harga walau katalog berubah.
- Cek stok hanya saat checkout, untuk menghindari masalah race condition, sekaligus memberi pengalaman belanja lebih smooth.
- Perbanyak validasi di server: jangan hanya percaya data dari frontend.
- Implementasikan proses atomic. Pastikan semua perubahan (order, pengurangan stok) dalam satu transaksi.
Penutup
Pada studi kasus “93”, desain API produk & keranjang belanja yang solid dan skalabel adalah fondasi penting untuk mengakomodir lebih banyak fitur di e-commerce, mulai dari promo, wishlist, hingga loyalty point. Dengan pemisahan concern, model data yang robust, dan validation di level API, sistem yang dibangun mampu menghadapi dinamika bisnis sekaligus skala traffic besar.
Semoga breakdown dan simulasi di atas bermanfaat, baik untuk junior yang baru belajar, maupun engineer senior yang mengutak-atik level scalability!
Sampai jumpa di studi kasus berikutnya. 🚀
92 Studi Kasus: Aplikasi Todo dengan Auth dan DB
Artikel Terhangat
99 Kontribusi ke Open Source graphql-go
10 Oct 2025
98 Membuat Plugin Sendiri untuk graphql-go
10 Oct 2025
96 Migrasi REST API ke GraphQL
10 Oct 2025
94 Studi Kasus: Dashboard Admin Real-time
10 Oct 2025

99 Kontribusi ke Open Source graphql-go

98 Membuat Plugin Sendiri untuk graphql-go

96 Migrasi REST API ke GraphQL
