Service Topology
Map of services, data flows, and internal dependencies of Kesles Merchant.
High-Level Diagram
┌──────────────────────────────┐
│ Clients │
│ - apps/mobile_user (Flutter)│
│ - apps/merchant_dashboard │
│ (Flutter Web) │
└──────────┬───────────────────┘
│ HTTPS (JWT)
│
┌─────────────────────┼───────────────────────┐
▼ ▼ ▼
┌────────────┐ ┌────────────┐ ┌──────────────┐
│ merchant_ │ │ services/ │ │ services/ │
│ core_api │ │ dashboard_ │ │ whatsapp_ │
│ (Go, 8080) │ │ api │ │ service │
│ │ │ (Go, 8082) │ │ (Go, 8091) │
└──┬──────┬──┘ └──┬──┬──────┘ └──────┬───────┘
│ │ │ │ HTTP (X-Internal-API-Key) │
│ │ │ ├──► core_api /internal/psp/* │
│ │ │ ├──► payment_service /internal/transactions
│ │ │ └──► payment_service /internal/qris-config
│ │ │ │
│ │ HTTP │ │
│ ▼ ▼ │
│ ┌───────────────────────────────────────┐ │
│ │ services/firebase_service (Go, 8093) │ │
│ │ — FCM HTTP v1 (Firebase) │ │
│ └──────────┬────────────────────────────┘ │
│ │ FCM HTTP v1 │
│ ▼ │
│ ┌────────────┐ │
│ │ Firebase │ │
│ │ (FCM SDK) │ │
│ └────────────┘ │
│ │
▼ ▼
┌──────────────────────────────┐ ┌──────────────────┐
│ PostgreSQL │ │ Redis │
│ db_kesles_merchant │ │ (OTP runtime + │
│ db_kesles_merchant_auth │ │ rate limit) │
│ db_kesles_merchant_notification └──────────────────┘
│ db_kesles_merchant_inventory │
│ db_kesles_merchant_order │ ┌─────────────────────────┐
│ db_kesles_merchant_payment │ ← HMAC → │ payment.kesles.com │
│ db_kesles_merchant_marketing │◄────────────►│ (PSP external) │
│ db_kesles_merchant_partner │ └─────────────────────────┘
│ db_reference │
└──────────────────────────────┘
Multi-DB (kondisi live per 2026-06-07):
| Database | Owner service | Keterangan |
|---|---|---|
db_kesles_merchant | merchant_core_api | Main app (merchants, dll.). Schema integration + sandbox dimiliki oleh integration_api (mig 107–108). |
db_kesles_merchant_auth | auth_service | IAM + KYC. Sole source sejak mig 057 (iam.* DROP CASCADE) |
db_kesles_merchant_notification | firebase_service, whatsapp_service, email_service | Push tokens, WA log, email log |
db_kesles_merchant_inventory | inventory_service | Product catalog + unit lifecycle + stock. Sole source sejak Phase 8H |
db_kesles_merchant_order | order_service | Sales order lifecycle + orders.sales_order_payments (mig 004) |
db_kesles_merchant_payment | payment_service | Transaksi PSP (Flow A + B). Sole source — direct cutover (tanpa dual-write legacy) |
db_kesles_merchant_marketing | marketing_service | Promo, broadcast. Sole source (legacy tables DROP Phase 9) |
db_kesles_merchant_partner | partner_service | Partner data |
db_reference | read-only | Master data (tidak boleh dihapus) |
Catatan FCM (post 2026-05-14 Phase 4 cleanup):
merchant_core_apitidak lagi punya Firebase SDK embedded. Semua push notification dikirim via HTTP keservices/firebase_service.services/firebase_serviceadalah satu-satunya service yang punya kredensial Firebase (FIREBASE_PROJECT_ID/CLIENT_EMAIL/PRIVATE_KEY) di env-nya.- Token registration juga via service: mobile →
merchant_core_api→services/firebase_service /internal/fcm/tokens→ DBnotification.fcm_push_tokens. - DB
notification.fcm_push_tokensdi-write hanya olehservices/firebase_service.
Services
| Service | Path | Runtime | Port (local) | Responsibility |
|---|---|---|---|---|
merchant_core_api | merchant_core_api | Go 1.25 | 8080 | OTP auth, merchant registration, profile, transaction facade. Permanent core — tidak ada extract terpisah. DB: db_kesles_merchant. Env var port: PORT (bukan APP_PORT seperti service lain). |
dashboard_api | services/dashboard_api | Go 1.25 | 8082 | Admin dashboard, PSP integration (HMAC), master data. Phase 3 reader cutover: PSP merchant lookup + recent transactions + QRIS config via HTTP ke service masing-masing. |
auth_service | services/auth_service | Go 1.25 | 8081 | IAM + KYC. DB: db_kesles_merchant_auth. Extracted Phase 4 2026-05-30. |
order_service | services/order_service | Go 1.25 | 8083 | Sales order lifecycle + payment lifecycle produk Kesles (orders.sales_order_payments). DB: db_kesles_merchant_order. |
inventory_service | services/inventory_service | Go 1.25 | 8084 | Product catalog + unit lifecycle + stock. DB: db_kesles_merchant_inventory. Sole source sejak Phase 8H. |
payment_service | services/payment_service | Go 1.25 | 8085 | Transaksi PSP (Flow A: customer→merchant, Flow B: merchant→Kesles). psp.qris_config singleton (NMID korporat). DB: db_kesles_merchant_payment (sole source, direct cutover). |
partner_service | services/partner_service | Go 1.25 | 8086 | Partner data. DB: db_kesles_merchant_partner. |
content_service | services/content_service | Go 1.25 | 8090 | Konten statis, UMKM Academy. |
whatsapp_service | services/whatsapp_service | Go 1.25 | 8091 | WhatsApp delivery, Meta webhook. DB: db_kesles_merchant_notification. Docs → notification site |
firebase_service | services/firebase_service | Go 1.25 | 8093 | FCM push + Phone Auth verify. DB: db_kesles_merchant_notification. Docs → notification site |
email_service | services/email_service | Go 1.25 | 8094 | Email delivery (SMTP). DB: db_kesles_merchant_notification. Phase 4 hardening DONE 2026-05-29. Docs → notification site |
marketing_service | services/marketing_service | Go 1.25 | 8095 | Promo, broadcast, jadwal kirim. DB: db_kesles_merchant_marketing. Sole source (legacy DROP Phase 9 Marketing). |
fraud_service | services/fraud_service | Go 1.25 | — | Scaffold — belum LIVE. Fraud signal collection + review workflow. Saat ini logik fraud berjalan di merchant_core_api (fraud.*). Extraction ke service ini belum dijadwalkan. |
poslite_service | services/poslite_service | Go 1.25 | 8096 | POS lite — kasir offline. DB: db_kesles_merchant_poslite. LIVE 2026-06-09. |
planning_service | services/planning_service | Go 1.25 | 8097 | Planning (Modelary) — financial scenario modeling. DB: db_kesles_merchant_planning. Phase 1 LIVE 2026-06-11 (mig v1/106 DROP legacy schemas). Docs → planning site |
reference_service | (standalone repo kesles_reference) | Go 1.25 | 8098 | Master reference data (shipping/geo/business). DB: db_reference. Fase 1+2 ALL DONE 2026-06-11. |
integration_api | services/integration_api | Go 1.25 | 8092 | Platform integrasi & sandbox testing. DB: db_kesles_merchant (schema integration + sandbox). Phase 1–5 DONE 2026-06-15. PSP Tester cutover dari dashboard_api ke service ini per 2026-06-16. |
data_processor | workers/data_processor_python | Python/uvicorn | 8000 | Maintenance jobs (cleanup + retention audit). DB: db_kesles_merchant (read via keslesmerchant_worker role). LIVE 2026-06-03. |
Apps
| App | Path | Framework | Target |
|---|---|---|---|
| mobile_user | apps/mobile_user | Flutter | Android/iOS — merchant app |
| dashboard | apps/merchant_dashboard | Flutter Web | Admin dashboard (browser) |
| merchant_integration | apps/merchant_integration | Flutter Web | Integration & sandbox testing (super admin + partner + merchant tertentu) |
| mobile_partner | (future) | Flutter | partner app |
Data Flow
Login OTP
mobile_user → merchant_core_api: POST /auth/request-otp
merchant_core_api → whatsapp_service: POST /internal/notifications/whatsapp/otp
whatsapp_service → Meta WhatsApp Cloud API: send template
Meta → user phone
mobile_user → merchant_core_api: POST /auth/verify-otp
merchant_core_api: verify challenge in Redis/Postgres → issue JWT
PSP Event Forward — Flow A (customer → merchant)
Flow A menangani transaksi masuk dari pelanggan (QRIS, terminal).
payment.kesles.com → payment_service: POST /webhook/psp/payment-events (HMAC)
payment_service: verify HMAC
→ INSERT payment.transactions (db_kesles_merchant_payment)
→ resolve merchant_id → lookup owner push tokens
→ POST /internal/fcm/send ke firebase_service (X-Internal-API-Key)
firebase_service → Firebase FCM HTTP v1 → merchant device
PSP Event Forward — Flow B (merchant → Kesles beli produk)
Flow B menangani webhook pembayaran order produk Kesles (device QRIS Plus, dll.).
payment.kesles.com → payment_service: POST /webhook/psp/payment-events (HMAC)
payment_service: verify HMAC, deteksi konteks order produk
→ INSERT payment.transactions
→ notify order_service: POST /internal/orders/{sales_order_id}/mark-paid (X-Internal-API-Key)
order_service: UPDATE orders.sales_order_payments → mark paid
→ UPDATE sales_orders.status = payment_received