Self-order pelanggan
Aplikasi web apps/order. Tanpa login dan tanpa instal. Hanya bayar di kasir pada versi ini.
flowchart TD
A["Scan QR meja atau buka link restoran"] --> B["GET /v1/public/outlets/:slug/menu"]
A --> Q{"Ada token QR?"}
Q -- "ya" --> R["GET /v1/public/qr/resolve<br/>Meja A1"]
Q -- "tidak / tidak valid" --> S["Takeaway atau pickup saja"]
R --> T["Dine-in tersedia"]
B --> M["Pilih menu, modifier, catatan"]
T --> M
S --> M
M --> C["Keranjang + perkiraan total"]
C --> D["Isi nama dan telepon<br/>(pickup: waktu ambil)"]
D --> E["POST /v1/public/orders<br/>Idempotency-Key"]
E --> F["Halaman status<br/>polling 5 detik"]
F --> G["Menunggu kasir, Diterima, Dibuat, Siap, Selesai"]
Keamanan (yang dijaga server)
Section titled “Keamanan (yang dijaga server)”| Ancaman | Perlindungan |
|---|---|
| Mengubah harga | Server menghitung ulang dari menu; harga klien diabaikan |
| QR palsu | Token HMAC slug.tableId.sig; sig salah → 404 tanpa alasan |
| Spam | Maks 5 order per IP per 10 menit, 3 order menunggu per meja, 50 per outlet |
| Kirim ganda | Header Idempotency-Key wajib; kunci sama = satu order |
| Melihat order orang lain | Status butuh token yang diturunkan dari HMAC |
Pesan 404/422/429 dapat ditampilkan apa adanya; kode ITEM_UNAVAILABLE dan MODIFIER_INVALID berarti menu berubah: minta pelanggan menyegarkan.
Halaman
Section titled “Halaman”| Rute | File | Isi |
|---|---|---|
/<slug>?t=<token> |
src/app/[slug].tsx |
Menu, keranjang, checkout |
/status?id=&token=&slug= |
src/app/status.tsx |
Status pesanan |
Keranjang tersimpan di localStorage per outlet. Pesanan terakhir diingat agar status bisa dibuka lagi.