Skip to main content

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

ItemNilai
Port127.0.0.1:8083
Main DBdb_kesles_merchant_order (schema orders)
VM dir/home/enalfarid/kesles_merchant/merchant_order/
Binaryorder-service (Linux amd64)
Systemd unitorder-service.service
Nginx/merchant/orders/*127.0.0.1:8083
Seeder binarykomerce_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:

TabelKeterangan
sales_quotationsKatalog produk Kesles (snapshot harga saat order)
sales_ordersHeader order — status lifecycle
sales_order_itemsLine items per order
sales_order_paymentsRiwayat pembayaran (full/DP/cicilan/settlement)
shipping_orders + shipping_order_unitsLogistik per order
merchant_depositsDeposit refundable per order
shipping_service_fee_configKonfigurasi biaya layanan pengiriman
ref_komerce_destinationRef destinasi Komerce
ref_komerce_shipping_rateTarif ongkir Komerce
ref_shipping_originOrigin pengiriman default
worker_komerce_seed_stateState sinkronisasi data Komerce

Migrations: db_kesles_merchant_order/v1/001009.

Endpoint

Merchant (JWT auth, prefix /merchant/order):

MethodPathKeterangan
GET/quotationsList katalog quotation
GET/POST/sales-orders + /sales-orders/{id}Buat & baca order
POST/start-paymentMulai flow pembayaran
POST/payment-proofUpload bukti bayar ke MinIO
GET/payment-destination + /payment-destinationsTujuan pembayaran (proxy core_api)
POST/shipping + /confirm-receiptBuat shipping & konfirmasi terima
GET/shipping-rate + /shipping-previewTarif & preview ongkir
GET/depositsList deposit

Internal (X-Internal-API-Key):

MethodPathKeterangan
GET/POST/internal/orders/sales-ordersList & create order
GET/internal/orders/sales-orders/allList semua order
POST/internal/orders/sales-orders/items-batchItems 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-configKonfigurasi biaya layanan
GET/internal/orders/shipping-origins + /{id}Origin pengiriman
GET/internal/notifications/recentNotifikasi terbaru
GET/internal/orders/reports/sales-order-funnelAgregat funnel order (dashboard)
GET/internal/orders/reports/shipping-funnelAgregat funnel shipping (dashboard)

Infra: GET /health (liveness), GET /ready (readiness — DB ping).

Integrasi & Routing

CallerEndpoint order_serviceKeterangan
payment_servicePOST /internal/orders/sales-orders/{id}/mark-paidKonfirmasi 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, reportsDashboard web 100% lewat HTTP; tidak ada query SQL langsung ke order DB

Outbound dari order_service:

TujuanUntuk
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 APIRate lookup subdistrict-level
MinIOUpload 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

ItemNilai
Host folder/home/enalfarid/kesles_merchant/merchant_order/
Binaryorder-service
Seederkomerce_seeder
Systemdorder-service.service (WorkingDirectory = folder di atas)
Port127.0.0.1:8083
Nginx/merchant/orders/*:8083
Logsjournalctl -u order-service.service

Environment Variables

VarKeterangan
APP_ENVproduction (line 1 .env.production)
APP_PORT8083
POSTGRES_DSNDSN ke db_kesles_merchant_order (wajib)
JWT_SECRET (wajib) + JWT_ISSUERAuth merchant — issuer default kesles-merchant-auth, harus match auth_service
INTERNAL_API_KEYX-Internal-API-Key untuk /internal/* (wajib di production)
CORE_API_URL + INTERNAL_CORE_API_KEYProxy payment-destination
FIREBASE_SERVICE_URL + INTERNAL_FIREBASE_API_KEYPush notif
WHATSAPP_SERVICE_URL + INTERNAL_WHATSAPP_API_KEYWA notif
INVENTORY_SERVICE_URL + INVENTORY_SERVICE_API_KEYDimensi produk
MINIO_ENDPOINT + MINIO_ACCESS_KEY + MINIO_SECRET_KEYUpload bukti bayar
MINIO_BUCKET (default merchants) + MINIO_USE_SSL + MINIO_PUBLIC_BASE_URLBucket + URL publik bukti bayar
DB_REFERENCE_POSTGRES_DSNdb_reference — fallback rate city-level (kosong = fallback nonaktif)
KOMERCE_API_KEY + KOMERCE_BASE_URLAPI Komerce / RajaOngkir Collaborator
KOMERCE_DAILY_QUOTAMax calls/hari (default 90, free tier)
KOMERCE_COURIERSKurir aktif (colon-separated)
KOMERCE_WEIGHT_BUCKETS_GRAMS + KOMERCE_BENCHMARK_WEIGHT_GRAMSBucket & benchmark berat untuk prefetch rate
KOMERCE_SAFETY_MARGIN_PCTMarkup safety atas tarif Komerce (%)
KOMERCE_BLACKLIST_SERVICESService kurir yang dikecualikan
KOMERCE_USE_VOLUMETRIC + KOMERCE_VOLUMETRIC_MULTIPLIER + KOMERCE_PACKING_WEIGHT_GRAMSKalkulasi berat volumetrik
KOMERCE_REFRESH_AFTER_DAYSInterval refresh cache rate (hari)
KOMERCE_REQUEST_TIMEOUTTimeout 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, CSP default-src 'none', HSTS, Permissions-Policy).
  • Middleware recovery (panic → 500, tidak crash proses) + logging request (slog, method/path/status/duration).
  • INTERNAL_API_KEY dibandingkan dengan subtle.ConstantTimeCompare (anti timing attack); production fail-fast bila kosong.
  • JWT merchant: HS256, issuer divalidasi, expiration wajib.
  • DB driver pgx/v5 via database/sql stdlib. 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/001009