tutorial

93 Studi Kasus: API Produk & Keranjang Belanja

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:

  1. Konsistensi Data: Produk berubah harga, stok, atau status promo sementara user sudah memasukkan ke keranjang.
  2. Atomicity & Concurrent Update: Situasi race condition saat update banyak keranjang sekaligus.
  3. Experience Real-time: Perubahan pada produk/keranjang harus dapat tersaji dengan minim delay.
  4. 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 user
  • POST /api/cart/items - Tambah produk ke keranjang
  • PATCH /api/cart/items/{itemId} - Ubah qty
  • DELETE /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

SkenarioResponsePenjelasan
Stok CukupSuccessTransaksi diteruskan, stok dikurangi sesuai quantity.
Stok KurangFailPesan error, user disuruh update/cart refresh.Contoh: “Maaf, stok tinggal 1, silakan ubah quantity.”
Harga Produk BerubahSuccess/WarningJika 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

  1. Simpan harga saat add to cart. Ini menjadi pengaman konsistensi harga walau katalog berubah.
  2. Cek stok hanya saat checkout, untuk menghindari masalah race condition, sekaligus memberi pengalaman belanja lebih smooth.
  3. Perbanyak validasi di server: jangan hanya percaya data dari frontend.
  4. 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. 🚀

comments powered by Disqus