Features
Exsport is one product split across repos. A feature is rarely in one place: it has a backend domain (a NestJS module), a storefront surface (the customer sees it), and an admin surface (staff manage it). This page is the map. Each row links to the page that traces the feature end to end.
How this page was verified
Read on 2026-09-15 from def-exsport-backend (NestJS modules, resolvers, entities), def-exsport-frontend-storefront and def-exsport-frontend-admin (Next.js App Router routes). No code was changed.
The request path
The two frontends never call a third party directly. They call the backend, and the backend calls Biteship, DOKU and the WMS.
Storefront (Next.js) ─┐
├─► Backend (NestJS, /gapi/graphql + REST) ─► Biteship · DOKU · PowerBiz WMS
Admin (Next.js) ─┘ ◄─ webhooks/* (their callbacks)- Storefront GraphQL operations are prefixed
front*(frontProducts,frontMemberCart). Admin operations have plain names (products,createVoucher). - Reads and file-less writes go through GraphQL. Create/update that uploads a file goes through REST (multipart), for example
POST catalogs/products. See API and auth. - The three third parties call back in through REST routes under
webhooks/*. See Third parties.
Domain map
| Feature | Backend module | Storefront | Admin | Third party |
|---|---|---|---|---|
| Catalogue | catalogs | /products, /products/[slug], /series, /collaboration | Products, Heads/Types, Categories, Brands, Series, Collaborations, Tags | — |
| Cart and checkout | users (cart) + orders | /checkout/shipping | — | Biteship (rates), DOKU (pay) |
| Orders | orders | /user/my-order | Orders (view only) | WMS, Biteship, DOKU |
| Payment (DOKU) | payments | DOKU Jokul Checkout | — | DOKU |
| Delivery (Biteship) | deliveries | courier choice in checkout | — | Biteship |
| Stock (PowerBiz WMS) | catalogs (WmsService) | stock shown on PDP | product quantity | PowerBiz WMS |
| Promotions | promotions | voucher + flash-sale surfaces | Vouchers, Discounts, Flash sales | — |
| Members and auth | users | /auth/*, /user/* | Members | — |
| Homepage and content | admins (homepage) | / | Homepage, Stores | — |
| Journals | journals | /journals | Journals | — |
| Admin users and RBAC | admins | — | Admins, Roles | — |
Two things that shape every feature
- The database schema is defined only by the entity files. The backend runs TypeORM with
synchronize: trueand has no migrations folder and no seed scripts. A table exists because a*.model.tssays@Entity({ name: '...' }). See Database. - Content is bilingual in the data, not in the UI. Most entities carry
nameId/nameEn,descId/descEnand so on. Neither frontend has locale routing; the storefront picks the Indonesian fields.