Mengembangkan
Checklist menambah modul/tabel/kolom ke lapisan database, alur migrasi + mirror schema, dan konvensi testing tiap variant ORM.
Mengembangkan
Panduan untuk developer yang menambah modul baru, tabel baru, atau kolom baru ke lapisan database BigStarter.
A. Menambah Modul Baru (atau Memigrasi ke Query Contract)
Checklist lengkap — urutan ini yang dipakai semua modul official:
- Inventarisasi — petakan semua titik akses data modul (
.from(,.rpc() beserta konsumen lintas modul. - Tabel Drizzle — buat
modules/<m>/server/db/tables.drizzle.tsdari DDL kanonik; daftarkan ke agregatorinfrastructure/db/schema.drizzle.ts. FK lintas modul = kolom polos (tanpa.references()); PK komposit & unique mengikuti nama constraint DDL. - Contract — tulis
modules/<m>/server/queries/contract.tsdari semantik call-site (filter, urutan, matematika paginasi, guard soft-delete). Bentuk input/output netral-ORM. - Variant — implementasikan
drizzle.ts(danprisma.tsbila modul masuk program paritas) + binder zero-arg; konversi impl lama jadisupabase.ts(legacy) dengan binder. - Binding —
queries/index.tsberisi tepat satu baris import binding (import { bindXQueries } from "./drizzle"). - Konsumen — rewrite service/api/actions/jobs memakai singleton; serap straggler; pindahkan query browser ke oRPC.
- RPC — bungkus fungsi SQL sebagai method contract bertipe di variant.
- Hapus repository lama setelah nol importer (grep + typecheck).
- Testing — test variant (import file variant langsung) + test service tetap mock di boundary
@modules/<m>/server/queries. - Registrasi —
modules/<m>/module.ts(manifest: tabel, contract, implementations, contributions) + daftarkan ditooling/modules/catalog.ts, lalu aktifkan rule arch untukmodules/<m>/server/(api|services)/.
B. Menambah Kolom
Tiga file wajib berubah bersama:
- Migrasi SQL kanonik —
tooling/supabase/migrations/<timestamp>_<name>.sql(alter table ... add column ...). - Mirror Drizzle — kolom di
modules/<pemilik>/server/db/tables.drizzle.ts. - Mirror Prisma — field di model terkait (schema kontribusi modul, mis.
tooling/templates/database/prisma/postgresql/<m>/prisma/<m>.prisma).
Lalu sesuaikan contract/variant yang mengekspos kolom itu, dan test-nya.
C. Testing per Variant
Drizzle — fake driver pg-proxy (tooling/test/helpers/fake-drizzle.ts):
import { createFakeDrizzle } from "@tooling/test/helpers/fake-drizzle";
const fake = createFakeDrizzle(() => [["row-1", ...]]); // rows = ARRAY posisional!
const queries = createDrizzleTaskQueries(fake.db as unknown as DrizzleDatabase);Penting: baris hasil adalah array posisional mengikuti urutan kolom select — bukan objek bernama. Objek SQL Drizzle bersifat opak: asersi ditujukan pada pemetaan hasil, bukan teks SQL.
Billing (SQL mentah via execute) — harness { execute }:
const execute = jest.fn().mockResolvedValue({ rows: [...] });
const queries = createDrizzleBillingQueries({ execute } as never);Prisma — mock delegat struktural ({ task: { findMany: jest.fn() } }), tanpa generated client.
Service — mock module boundary: jest.mock("@modules/<m>/server/queries", ...).
D. Aturan yang Dijaga Architecture Check
modules/<m>/server/(api|services)/modul yang sudah termigrasi: bebas dari import supabase & PostgREST chaining.modules/<m>/index.tstidak boleh me-re-export./server/— melanggar batas browser.app/dan zonaweb/tidak boleh query langsung atau mengimpor repository internal modul lain.
