Skip to content

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

FeatureBackend moduleStorefrontAdminThird party
Cataloguecatalogs/products, /products/[slug], /series, /collaborationProducts, Heads/Types, Categories, Brands, Series, Collaborations, Tags
Cart and checkoutusers (cart) + orders/checkout/shippingBiteship (rates), DOKU (pay)
Ordersorders/user/my-orderOrders (view only)WMS, Biteship, DOKU
Payment (DOKU)paymentsDOKU Jokul CheckoutDOKU
Delivery (Biteship)deliveriescourier choice in checkoutBiteship
Stock (PowerBiz WMS)catalogs (WmsService)stock shown on PDPproduct quantityPowerBiz WMS
Promotionspromotionsvoucher + flash-sale surfacesVouchers, Discounts, Flash sales
Members and authusers/auth/*, /user/*Members
Homepage and contentadmins (homepage)/Homepage, Stores
Journalsjournals/journalsJournals
Admin users and RBACadminsAdmins, Roles

Two things that shape every feature

  • The database schema is defined only by the entity files. The backend runs TypeORM with synchronize: true and has no migrations folder and no seed scripts. A table exists because a *.model.ts says @Entity({ name: '...' }). See Database.
  • Content is bilingual in the data, not in the UI. Most entities carry nameId/nameEn, descId/descEn and so on. Neither frontend has locale routing; the storefront picks the Indonesian fields.