API (Cloudflare Workers)
Runtime API adalah Cloudflare Workers (fetch handler) dengan framework Effect (domain programs) + Drizzle ORM (PostgreSQL), mengikuti pola ports-and-adapters hexagonal.
Struktur direktori
Section titled “Struktur direktori”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 preflightPrinsip desain
Section titled “Prinsip desain”- Routes tipis: handler HTTP hanya validate input → panggil domain program → pattern-match result ke HTTP.
- Domain logic hidup di
apps/api/src/domain/*/programs.tssebagai Effect programs dengan typed errors (domain/*/errors.ts). - Ports didefinisikan di
shared/ports/, adapters diinfra/adapters/mengimplementasikannya (Midtrans, Kurir, Ember, Upstash, R2). - Boundary enforcement via
dependency-cruiser(apps/api/.dependency-cruiser.cjs) danscripts/validate-source-ownership.mjs.