Lewati ke konten

API (Cloudflare Workers)

Runtime API adalah Cloudflare Workers (fetch handler) dengan framework Effect (domain programs) + Drizzle ORM (PostgreSQL), mengikuti pola ports-and-adapters hexagonal.

apps/api/src
|-- server.ts Worker fetch handler (entrypoint)
|-- infra/
| |-- adapters/ Midtrans, Kurir (email/WhatsApp), Ember,
| | Upstash, R2, idempotency, queue
| |-- auth/ Session token, OTP, capability matrix
| |-- db/drizzle/ Drizzle client + schema re-export
| |-- release-control/ Maintenance mode, feature flags
| |-- runtime/ App runtime, outbox scheduler, notification
|-- lib/api/http/ REST dispatcher + per-domain handlers
|-- domain/ 41+ bounded contexts
| |-- product/ Catalog, variants, pricing, stock
| |-- order/ POS orders, void, refunds
| |-- payment/ Payment aggregate lifecycle
| |-- inventory/ Batches, stock movements, transfers
| |-- accounting/ Chart of accounts, journal entries, HPP
| |-- laundry/ Laundry custody, receive-by-label
| |-- loyalty/ Points, tiers, vouchers/promo codes
| |-- portal/ Public catalog, bookings
| |-- identity/ Auth, OTP, workspace switching
| +-- ... (boarding, grooming, bakery, dll.)
|-- shared/
|-- ports/ Hexagonal ports (email, payment, cache)
|-- env/ Environment config + production preflight
  • Routes tipis: handler HTTP hanya validate input → panggil domain program → pattern-match result ke HTTP.
  • Domain logic hidup di apps/api/src/domain/*/programs.ts sebagai Effect programs dengan typed errors (domain/*/errors.ts).
  • Ports didefinisikan di shared/ports/, adapters di infra/adapters/ mengimplementasikannya (Midtrans, Kurir, Ember, Upstash, R2).
  • Boundary enforcement via dependency-cruiser (apps/api/.dependency-cruiser.cjs) dan scripts/validate-source-ownership.mjs.