Order Service
Order Service adalah sole writer untuk domain order (quotation, sales order, pembayaran, shipping, deposit). Live di production. Seluruh write order-domain melewati service ini; tidak ada lagi tabel order di db_kesles_merchant — SOT tunggal adalah schema orders di db_kesles_merchant_order.
Identitas Service
| Item | Nilai |
|---|---|
| Port | 127.0.0.1:8083 |
| Main DB | db_kesles_merchant_order (schema orders) |
| VM dir | /home/enalfarid/kesles_merchant/merchant_order/ |
| Binary | order-service (Linux amd64) |
| Systemd unit | order-service.service |
| Nginx | /merchant/orders/* → 127.0.0.1:8083 |
| Seeder binary | komerce_seeder (cmd/komerce_seeder) — batch job terpisah |
Tanggung Jawab
- Katalog quotation (snapshot harga produk Kesles saat order dibuat).
- Lifecycle sales order: header, line items, dan status.
- Riwayat pembayaran (full / DP / cicilan / settlement) + upload bukti bayar ke MinIO.
- Mark-paid dari PSP — dipanggil payment_service saat webhook sukses.
- Shipping order + unit, rate lookup Komerce (subdistrict-level) dengan fallback city-level dari
db_reference, dan shipping preview. - Deposit refundable per order.
- Notifikasi order (FCM via firebase_service, WA via whatsapp_service) untuk event seperti order_created, order_delivered, order_psp_confirmed.
- Worker latar belakang: auto-cancel order kedaluwarsa dan payment reminder.
Arsitektur
mobile_user → nginx /merchant/orders/* → order_service:8083
│
┌───────────────┼───────────────┐
orders DB core_api (internal) MinIO
db_kesles_merchant (payment-destination (bukti
_order lookup) bayar)
(sole writer)
│
┌─────────────────┼─────────────────┬──────────────────┐
firebase_service whatsapp_service inventory_service db_reference
(FCM order) (WA order) (dimensi produk) (city-level rate)
Tabel
Database db_kesles_merchant_order, schema orders:
| Tabel | Keterangan |
|---|---|
sales_quotations | Katalog produk Kesles (snapshot harga saat order) |
sales_orders | Header order — status lifecycle |
sales_order_items | Line items per order |
sales_order_payments | Riwayat pembayaran (full/DP/cicilan/settlement) |
shipping_orders + shipping_order_units | Logistik per order |
merchant_deposits | Deposit refundable per order |
shipping_service_fee_config | Konfigurasi biaya layanan pengiriman |
ref_komerce_destination | Ref destinasi Komerce |
ref_komerce_shipping_rate | Tarif ongkir Komerce |
ref_shipping_origin | Origin pengiriman default |
worker_komerce_seed_state | State sinkronisasi data Komerce |
Migrations: db_kesles_merchant_order/v1/001–009.
Endpoint
Merchant (JWT auth, prefix /merchant/order):
| Method | Path | Keterangan |
|---|---|---|
GET | /quotations | List katalog quotation |
GET/POST | /sales-orders + /sales-orders/{id} | Buat & baca order |
POST | /start-payment | Mulai flow pembayaran |
POST | /payment-proof | Upload bukti bayar ke MinIO |
GET | /payment-destination + /payment-destinations | Tujuan pembayaran (proxy core_api) |
POST | /shipping + /confirm-receipt | Buat shipping & konfirmasi terima |
GET | /shipping-rate + /shipping-preview | Tarif & preview ongkir |
GET | /deposits | List deposit |
Internal (X-Internal-API-Key):
| Method | Path | Keterangan |
|---|---|---|
GET/POST | /internal/orders/sales-orders | List & create order |
GET | /internal/orders/sales-orders/all | List semua order |
POST | /internal/orders/sales-orders/items-batch | Items batch |
GET/PATCH | /internal/orders/sales-orders/{id} | Detail order; {id}/mark-paid (PSP confirm) |
GET | /internal/orders/quotations + /{id} | List & detail quotation |
GET/PATCH | /internal/orders/shipping/{id} | Detail & transisi status shipping |
GET | /internal/orders/deposits/{id} | Detail deposit |
GET/PATCH | /internal/orders/shipping-fee-config | Konfigurasi biaya layanan |
GET | /internal/orders/shipping-origins + /{id} | Origin pengiriman |
GET | /internal/notifications/recent | Notifikasi terbaru |
GET | /internal/orders/reports/sales-order-funnel | Agregat funnel order (dashboard) |
GET | /internal/orders/reports/shipping-funnel | Agregat funnel shipping (dashboard) |
Infra: GET /health (liveness), GET /ready (readiness — DB ping).
Integrasi & Routing
| Caller | Endpoint order_service | Keterangan |
|---|---|---|
payment_service | POST /internal/orders/sales-orders/{id}/mark-paid | Konfirmasi PSP webhook → fire FCM order_psp_confirmed |
dashboard_api (orderClient di internal/app/order_client.go) | /internal/orders/* — quotations, sales-orders, shipping, deposits, origins, fee-config, reports | Dashboard web 100% lewat HTTP; tidak ada query SQL langsung ke order DB |
Outbound dari order_service:
| Tujuan | Untuk |
|---|---|
core_api (CORE_API_URL) | Proxy payment-destination |
firebase_service (FIREBASE_SERVICE_URL) | FCM notifikasi order |
whatsapp_service (WHATSAPP_SERVICE_URL) | WA notifikasi order |
inventory_service (INVENTORY_SERVICE_URL) | Dimensi produk untuk kalkulasi volumetrik shipping preview |
db_reference (DB_REFERENCE_POSTGRES_DSN) | Fallback tarif ongkir city-level |
| Komerce / RajaOngkir Collaborator API | Rate lookup subdistrict-level |
| MinIO | Upload bukti bayar |
Shipping preview memakai fallback chain: (1) Komerce subdistrict-level dari cache orders.ref_komerce_*; (2) city-level dari db_reference; (3) destination_pending=true bila destinasi belum diketahui.
Deployment VM
| Item | Nilai |
|---|---|
| Host folder | /home/enalfarid/kesles_merchant/merchant_order/ |
| Binary | order-service |
| Seeder | komerce_seeder |
| Systemd | order-service.service (WorkingDirectory = folder di atas) |
| Port | 127.0.0.1:8083 |
| Nginx | /merchant/orders/* → :8083 |
| Logs | journalctl -u order-service.service |
Environment Variables
| Var | Keterangan |
|---|---|
APP_ENV | production (line 1 .env.production) |
APP_PORT | 8083 |
POSTGRES_DSN | DSN ke db_kesles_merchant_order (wajib) |
JWT_SECRET (wajib) + JWT_ISSUER | Auth merchant — issuer default kesles-merchant-auth, harus match auth_service |
INTERNAL_API_KEY | X-Internal-API-Key untuk /internal/* (wajib di production) |
CORE_API_URL + INTERNAL_CORE_API_KEY | Proxy payment-destination |
FIREBASE_SERVICE_URL + INTERNAL_FIREBASE_API_KEY | Push notif |
WHATSAPP_SERVICE_URL + INTERNAL_WHATSAPP_API_KEY | WA notif |
INVENTORY_SERVICE_URL + INVENTORY_SERVICE_API_KEY | Dimensi produk |
MINIO_ENDPOINT + MINIO_ACCESS_KEY + MINIO_SECRET_KEY | Upload bukti bayar |
MINIO_BUCKET (default merchants) + MINIO_USE_SSL + MINIO_PUBLIC_BASE_URL | Bucket + URL publik bukti bayar |
DB_REFERENCE_POSTGRES_DSN | db_reference — fallback rate city-level (kosong = fallback nonaktif) |
KOMERCE_API_KEY + KOMERCE_BASE_URL | API Komerce / RajaOngkir Collaborator |
KOMERCE_DAILY_QUOTA | Max calls/hari (default 90, free tier) |
KOMERCE_COURIERS | Kurir aktif (colon-separated) |
KOMERCE_WEIGHT_BUCKETS_GRAMS + KOMERCE_BENCHMARK_WEIGHT_GRAMS | Bucket & benchmark berat untuk prefetch rate |
KOMERCE_SAFETY_MARGIN_PCT | Markup safety atas tarif Komerce (%) |
KOMERCE_BLACKLIST_SERVICES | Service kurir yang dikecualikan |
KOMERCE_USE_VOLUMETRIC + KOMERCE_VOLUMETRIC_MULTIPLIER + KOMERCE_PACKING_WEIGHT_GRAMS | Kalkulasi berat volumetrik |
KOMERCE_REFRESH_AFTER_DAYS | Interval refresh cache rate (hari) |
KOMERCE_REQUEST_TIMEOUT | Timeout request Komerce (default 20s) |
Security & Hardening
Konfigurasi yang berlaku saat ini:
- Bind hanya ke
127.0.0.1:8083— tidak terekspos publik kecuali via nginx. - HTTP server timeouts: ReadTimeout 30s, WriteTimeout 60s, IdleTimeout 120s.
- Body limit 1 MB untuk POST/PUT/PATCH.
- Security headers di semua response (
X-Content-Type-Options,X-Frame-Options: DENY, CSPdefault-src 'none', HSTS, Permissions-Policy). - Middleware recovery (panic → 500, tidak crash proses) + logging request (
slog, method/path/status/duration). INTERNAL_API_KEYdibandingkan dengansubtle.ConstantTimeCompare(anti timing attack); production fail-fast bila kosong.- JWT merchant: HS256, issuer divalidasi, expiration wajib.
- DB driver
pgx/v5viadatabase/sqlstdlib. Pool: MaxOpenConns 25, MaxIdleConns 5, ConnMaxLifetime 5m, ConnMaxIdleTime 5m. Ping fail-fast 30s saat init. - Graceful shutdown:
http.Shutdown+db.Close.
Referensi
- Architecture — arsitektur dan schema lengkap
- Security
- Migration
db_kesles_merchant_order/v1/001–009