~/portfolio/project-detail.html
UTF-8 LF HTML5
← kembali ke projects

case study

CafePOS v3.1

Sistem Point-of-Sale multi-tenant untuk cafe kecil-menengah — dari pemesanan lewat QR di meja sampai dashboard real-time untuk kasir dan owner.

Flask SQLite SocketIO Multi-tenant PWA

Masalah

Cafe kecil sering terjebak antara dua pilihan buruk: mencatat order manual (rawan salah & lambat), atau berlangganan SaaS POS mahal yang tidak fleksibel untuk kebutuhan multi-cabang. CafePOS dibangun sebagai sistem yang bisa di-hosting sendiri, mendukung banyak tenant (cafe) sekaligus, dengan pengalaman pemesanan yang tetap cepat untuk pelanggan.

Pendekatan Arsitektur

Setiap tenant diakses lewat subdomain unik (mis. kedaikopi.domain.com) yang di-resolve lewat wildcard routing di Flask. Ini memungkinkan satu instance aplikasi melayani banyak cafe tanpa duplikasi deployment, sambil tetap menjaga isolasi data lewat tenant-scoped query di setiap akses database.

  • Wildcard subdomain routing untuk resolusi tenant otomatis
  • Setiap query database di-scope ke tenant_id — tidak ada query "global" yang berisiko bocor antar cafe
  • SocketIO untuk update status order real-time ke dapur & kasir tanpa polling

Keamanan yang Diterapkan

Karena pemesanan dari meja tidak mengharuskan pelanggan login, token QR ditandatangani (signed) dan diberi masa berlaku untuk mencegah pemesanan palsu atau replay dari QR yang difoto ulang. Mobile API menggunakan token bertanda tangan terpisah dari sesi web, dengan audit menyeluruh terhadap kemungkinan IDOR — memastikan satu tenant tidak bisa mengakses order atau meja milik tenant lain hanya dengan mengubah ID di request.

  • Signed QR token dengan expiry untuk sesi pemesanan per meja
  • Signed mobile token terpisah dari sesi browser
  • Overhaul autentikasi API mobile setelah audit menemukan celah akses lintas-tenant
  • Kebersihan credential: rotasi .env dan pemisahan secret per environment

Fitur Tambahan

Di luar transaksi inti, CafePOS dilengkapi PWA agar kasir bisa "install" aplikasi di Android tanpa Play Store, AI chat assistant berbasis Gemini untuk membantu pelanggan bertanya soal menu, dan integrasi bot Telegram untuk notifikasi order ke owner secara langsung.

Yang Saya Pelajari

Project ini adalah kali pertama saya benar-benar merasakan dampak dari keputusan arsitektur yang salah di awal — beberapa refactor besar terjadi karena scoping tenant tidak konsisten di versi awal. Pelajaran terbesarnya: keamanan multi-tenant harus jadi keputusan desain sejak schema pertama, bukan patch di versi 2.0.

main | Ln 1, Col 1
no problems detected
UTF-8 00:00:00