Skip to content

Codebase tour

Jalan-jalan lewat tiga repo utama, supaya kamu tahu di mana sebuah perubahan seharusnya sebelum membuka file. Repo pendukung punya halaman repo-nya sendiri.

Cara halaman ini diverifikasi

Dibaca pada 2026-09-15 dari pohon module src/ backend dan pohon App Router kedua frontend. Jalur bersifat relatif-repo.

Backend — def-exsport-backend

NestJS 10. Entry-nya src/main.tssrc/app.module.ts. Setiap area bisnis adalah folder module berbentuk <domain>/<domain>.module.ts dengan resolvers/, services/, models/ (TypeORM entity) dan dto/, dan sering controllers/ untuk REST.

ModuleMemiliki
catalogsproducts, articles (variants), heads/types/subtypes, categories, brands, series, collaborations, tags — dan WmsService untuk stok
usersmembers, member addresses, cart, stores, reference locations
ordersorders, order items, order status, cron payment-expiry
paymentsDOKU client dan webhook-nya (REST saja)
deliveriesBiteship client dan webhook-nya (REST saja)
promotionsvouchers, discounts, flash sales
journalskonten blog
adminsadmin users, roles, menus (RBAC), dan konten homepage / banners / CMS
public, storages, smtp, health, events, database, utilspenyajian file, storage S3/lokal, mail, liveness, domain events, config DB, helper

Tiga fakta menentukan bentuk seluruh backend:

  • GraphQL itu code-first. GraphQLModule.forRoot memakai autoSchemaFile: true, jadi schema dihasilkan saat boot dari decorator. Tidak ada schema.gql untuk dibaca — boot app-nya untuk melihat SDL. Hanya sebagian module yang masuk include GraphQL: admins, catalogs, users, orders, promotions, journals. deliveries, payments, public, health, storages adalah REST-only.
  • Schema adalah entity-nya. TypeORM menjalankan synchronize: true; tidak ada folder migrations dan tidak ada seed script. "Seeding" adalah beberapa REST endpoint (POST admins/seed-settings, POST vouchers/seed-voucher-types, …).
  • Dua realm auth. Resolver admin menumpuk @UseGuards(JwtAuthGuard, LastActivityGuard, RoleAbilityGuard); resolver member memakai JwtMemberAuthGuard. Tidak ada global guard. Lihat API dan auth.

Operasi GraphQL storefront diawali front*; operasi admin/CMS polos. Create/update dengan file upload adalah REST controller (multipart), misalnya catalogs/products.

Storefront — def-exsport-frontend-storefront

Next.js 15 App Router di bawah src/app/, alias path @/* → ./src/*. Sebagian besar halaman adalah client component yang mengambil data lewat Apollo hook; beberapa file layout.tsx adalah server component yang hanya membangun metadata SEO. Tidak ada SSG/ISR dan tidak ada middleware.ts; penjagaan route dilakukan di dalam halaman.

Layout kodenya:

  • src/app/ — routes: /, /products dan /products/[slug], /series, /collaboration, /flash-sale, /sale, /new-arrival, /search, /checkout/shipping, /auth/*, /user/* (profile, address, my-order), /journals, /store-locator.
  • src/lib/<domain>/ — dokumen GraphQL (*.gql.ts) dan type (*.type.ts), operasi bernama front*.
  • src/modules/<feature>/components/ — UI fitur; src/components/ — UI kit buatan tangan (Tailwind v4 + Headless UI, tanpa component library).
  • src/context/ — lima React context (cart, address, homepage, dialog, alert). Tanpa Redux/Zustand.
  • Auth adalah NextAuth (src/app/auth.ts), Credentials provider → loginAsMember; token menumpang di NextAuth JWT session dan dikirim sebagai Bearer di setiap panggilan Apollo/axios.

Ada cart, tetapi tidak ada route /cart — cart adalah context dan slide-over.

Admin — def-exsport-frontend-admin

Next.js 15 App Router. Semuanya di bawah /admin; / redirect ke /admin/dashboard. src/middleware.ts adalah gerbang kasar "sudah login atau belum".

  • src/app/admin/<area>/page.tsx list ditambah halaman add-* / edit-* / [slug]. Area: products (+ variants), heads-types, categories, sub-categories, brands, tags, series, collaborations, members, orders (view only), stores, homepage, discounts, vouchers, flash-sales, journals, admins, roles.
  • src/lib/<domain>/index.ts (GraphQL), *.rest.ts (axios multipart untuk upload), *.type.ts.
  • src/modules/<area>/ — form dan list. UI adalah template Metronic yang di-vendor ditambah Tailwind v3; tidak ada React component library, dan modal/menu memakai JS imperatif Metronic.
  • RBAC bersifat data-driven dan client-side. src/hooks/useAccess.tsx membaca session.user.me.role.menus[] (tiap menu punya view/add/update/delete/export). Ia menyembunyikan item sidebar dan menjaga halaman; backend menegakkan hak yang sama per resolver.

Dua area yang perlu diketahui: dashboard itu stub (merender heading kosong), dan orders view-only (src/lib/orders punya query, tanpa mutation).

Kekhasan penamaan yang harus dipertahankan

Kutip apa adanya — semuanya nyata di kode: wrapper Apollo storefront adalah appollo-wrapper.tsx (triple p) dan route community-nya adalah /comunity; domain vouchers admin dieja vourchers (src/lib/vourchers, vourcer.rest.ts).