Case Study

Online Bookstore & Admin Dashboard

Sistem end-to-end yang mencakup katalog produk, manajemen inventaris, siklus hidup pesanan, serta operasional admin.

NestJSNextJSTypeScriptTailwindDrizzle
app-screenshot

Boundaries & Goals

Ruang Lingkup & Batasan

Batasan dan kebutuhan utama yang menjadi dasar dalam pengambilan keputusan teknis.

Sistem ditujukan untuk dua kelompok pengguna utama: customer yang melakukan pencarian dan pembelian buku, serta admin yang mengelola produk, stok, dan pesanan.

Technical Rationale

Keputusan Engineering

Keputusan teknis utama untuk menjaga keamanan, maintainability, dan kesesuaian dengan kebutuhan.

Decision 1

Strategi Autentikasi Hybrid (Web & Mobile)

Sistem menggunakan pendekatan autentikasi hybrid untuk menyesuaikan perbedaan lingkungan client. Web menggunakan cookie yang aman dan httpOnly untuk mengurangi risiko XSS serta memanfaatkan pengelolaan kredensial otomatis oleh browser, sementara mobile menggunakan autentikasi berbasis JWT yang disimpan secara aman dan dikirim melalui header Authorization karena lingkungan mobile tidak mengelola cookie secara otomatis.

Decision 2

Idempotency Key pada Proses Order & Pembayaran

Untuk mencegah pembuatan order ganda dan risiko double payment, operasi write seperti pembuatan order dan inisiasi pembayaran dirancang bersifat idempotent dengan menggunakan idempotency key.Setiap permintaan pembuatan order menyertakan idempotency key unik yang dihasilkan di sisi client,Pendekatan ini melindungi sistem dari retry jaringan, refresh halaman, dan submit ganda dari user.

Decision 3

Validasi di Batas Sistem

Setiap request yang masuk divalidasi menggunakan Zod untuk memastikan type safety dan mencegah data tidak valid masuk ke domain logic.

Decision 4

API Rate Limiting untuk Pencegahan Abuse

Rate limiting diterapkan pada layer API untuk melindungi endpoint penting dari penyalahgunaan, percobaan brute-force, dan lonjakan trafik. Pendekatan ini menjaga stabilitas sistem serta penggunaan resource yang adil, khususnya pada endpoint autentikasi dan pemesanan.

Decision 5

Server Actions untuk Mutasi Data

Server Actions digunakan untuk menangani submit form dan operasi mutasi data agar logika perubahan data tetap berjalan di sisi server, mengurangi boilerplate API, meningkatkan keamanan, serta menjaga konsistensi tipe antara frontend dan backend.

Decision 6

Strategi Hybrid Data Fetching

Aplikasi mengombinasikan pengambilan data di Server Components untuk initial render dengan React Query di client untuk data yang bersifat interaktif atau sering berubah, sehingga performa dan pengalaman pengguna tetap seimbang.

Business Logic

Alur Pesanan

Gambaran umum alur perjalanan pesanan di dalam sistem, termasuk proses normal dan pembatalan.

Happy Path / Main Flow
PENDING
CUSTOMER
PAY
PAID
ADMIN
SHIP
DELIVERED
CUSTOMER
COMPLETE
COMPLETED
CANCELLED
Exception Handling
PENDING
Entry Point
CUSTOMER
CANCEL
CANCELLED
SYSTEM
EXPIRED
CANCELLED
ADMIN
CANCEL
CANCELLED

Diagram ini merepresentasikan State Machine dari sistem pemesanan. Transisi antar status dikontrol secara ketat melalui Service Layer untuk memastikan konsistensi data dan mencegah perubahan status yang tidak valid.

State Transitions

Perubahan Status Pesanan

Aturan yang menjelaskan perubahan status pesanan dari awal hingga selesai.

Current StatusTrigger ActionActorNext StatusLogic Notes
PENDINGPAY
CUSTOMER
PAID

Pembayaran berhasil dan sudah dikonfirmasi oleh sistem

PENDINGCONTINUE_PAYMENT
CUSTOMER
PENDING

Melanjutkan pembayaran dengan token yang sama atau token baru

PENDINGCANCEL
CUSTOMER
CANCELLED

Pesanan dibatalkan oleh pelanggan

PENDINGCANCEL
SYSTEM
CANCELLED

Pesanan dibatalkan karena pembayaran melewati batas waktu

PENDINGCANCEL
ADMIN
CANCELLED

Pesanan dibatalkan oleh admin

PAIDSHIP
ADMIN
DELIVERED

Pesanan diproses dan dikirim secara manual oleh admin

DELIVEREDCOMPLETE
CUSTOMER
COMPLETED

Pelanggan mengonfirmasi bahwa pesanan sudah diterima

PAIDCANCEL
N/A

Pesanan yang sudah dibayar tidak bisa dibatalkan

Domain Mapping

Pemetaan Status Pembayaran

Hubungan antara status pesanan dan kondisi pembayaran yang terjadi.

Order DomainPayment DomainContext / Rule
PENDINGUNPAID

Pembayaran sudah dimulai, tetapi belum ada konfirmasi

PAIDPAID

Pembayaran sudah dikonfirmasi melalui sistem Midtrans

CANCELLEDEXPIRED

Batas waktu pembayaran habis setelah 24 jam

CANCELLEDUNPAID

Pesanan dibatalkan secara manual oleh pelanggan atau admin

Note: This mapping ensures atomicity between Order Service and Payment Gateway callbacks.

Technology Blueprint

Teknologi Inti

Kumpulan teknologi inti yang dipilih untuk mendukung skalabilitas, kemudahan perawatan, dan pengalaman pengembangan yang baik.

Platform Frontend

Next.js (App Router)

Next.js App Router menyediakan kerangka kerja terpadu untuk routing, layout, server rendering, dan data mutation. Pendekatan ini memungkinkan pembuatan halaman yang SEO-friendly sekaligus menjaga logika UI dan data tetap kohesif, sehingga mengurangi boilerplate dan meningkatkan maintainability jangka panjang.

Styling Frontend

Tailwind CSS

Tailwind CSS menerapkan pendekatan utility-first dengan design token yang terpusat, memungkinkan iterasi UI yang cepat sekaligus menjaga konsistensi visual tanpa kompleksitas file CSS kustom yang besar.

Component Library

Shadcn/UI

Shadcn/UI dibangun di atas Radix primitives untuk menyediakan komponen yang aksesibel dan composable, tanpa mengunci proyek pada design system yang kaku, sehingga tetap fleksibel dan memberikan kontrol penuh terhadap styling.

Framework Backend API

NestJS

NestJS mendorong arsitektur modular berbasis domain yang mudah diskalakan seiring pertumbuhan codebase. Dependency injection dan pemisahan tanggung jawab yang jelas membuat sistem lebih mudah diuji, dikembangkan, dan dirawat.

Validasi & Keamanan Tipe

Zod

Zod memastikan validasi runtime yang selaras dengan tipe TypeScript, sehingga meminimalkan data tidak valid di boundary sistem dan membuat validasi request, response, serta domain menjadi eksplisit dan andal.

Database

MySQL

MySQL merupakan database relasional yang telah terbukti andal untuk beban kerja transaksional seperti order dan inventory, dengan jaminan konsistensi data yang kuat serta performa yang stabil.

ORM / Query Layer

Drizzle ORM

Drizzle ORM menawarkan pendekatan SQL-first yang ringan dan type-safe, menjaga query tetap eksplisit serta menghindari overhead dan abstraksi tersembunyi yang sering ditemukan pada ORM yang lebih berat.

Manajemen Server State

React Query

React Query menangani caching server-state, sinkronisasi data, dan background refetching, sehingga mengurangi logika data-fetching manual dan memastikan konsistensi antara UI dan state backend.

Manajemen UI State Client

Zustand

Zustand menyediakan solusi state management yang minimal dan mudah diprediksi untuk state UI lokal, menjaga kompleksitas tetap rendah dan logika state mudah dipahami.

Future Roadmap

Peningkatan Jika Sistem Digunakan di Production

Refleksi dan rencana peningkatan arsitektur agar siap digunakan di lingkungan produksi.

Notifikasi Email & Pembuatan Invoice

Menambahkan notifikasi email transaksional untuk aksi penting pengguna seperti konfirmasi pesanan, pembaruan status pembayaran, dan reset password, serta pembuatan invoice otomatis untuk pesanan yang telah selesai.

Background Job untuk Proses Asinkron

Memindahkan proses non-kritis seperti pengiriman email, pembuatan invoice, dan webhook ke background job agar API tetap responsif.

Redis sebagai Cache Layer

Menggunakan Redis untuk menyimpan data yang sering diakses seperti katalog produk agar beban database berkurang dan performa meningkat.

Message Queue untuk Proses Order

Menggunakan message queue untuk memisahkan proses order, pembayaran, dan update stok sehingga sistem lebih scalable dan tahan gagal.

Integrasi dengan Layanan Pengiriman

Integrasi dengan pihak ketiga pengiriman agar customer dapat memantau status dan progres pengiriman secara real-time.

Observability Terpusat

Menambahkan logging terstruktur, metrics, dan tracing untuk mempermudah monitoring dan debugging di lingkungan production.

Audit Log untuk Aksi Sensitif

Mencatat aktivitas penting seperti perubahan stok, pembatalan order, dan aksi admin untuk keperluan audit dan keamanan.

Faidancode