Resep
Membangun fitur
Resep ujung-ke-ujung untuk Feedback — Prisma, Zod, Hono, TanStack Query, dan UI.
Panduan ini menelusuri fitur Feedback yang sudah ada di boilerplate. Gunakan sebagai checklist setiap kali Anda menambah slice vertikal baru.
Yang Anda dapatkan
- Tamu bisa mengirim masukan dari situs marketing (email wajib)
- Pengguna yang masuk bisa mengirim dari dashboard SaaS (email dari sesi)
- Data disimpan di Postgres lewat Prisma
- Validasi dibagikan lewat
@repo/validations - HTTP lewat Hono di
@repo/api(tanpa Server Actions) - UI memanggil API dengan klien Hono bertipe + TanStack Query
1. Schema
Tambahkan model di packages/database/prisma/schema.prisma, lalu migrate dan generate:
pnpm --filter @repo/database db:migrate
pnpm --filter @repo/database db:generate2. Validasi bersama
Buat packages/validations/src/feedback/feedback.ts dan ekspor dari packages/validations/package.json.
3. Modul API
- Service:
packages/api/src/modules/feedback/service.ts - Router:
POST /denganrateLimit("WRITE")+zValidator— sesi opsional (janganrequireAuth) - Mount:
.route("/feedback", feedbackRouter)dipackages/api/src/index.ts - CORS ke origin marketing +
OPTIONSdi route catch-all marketing
4. Mutasi frontend
- Marketing:
apps/marketing/src/mutations/use-create-feedback.ts→api.feedback.$post - Marketing client:
apps/marketing/src/lib/api.tsmemakaiNEXT_PUBLIC_MARKETING_URL+QueryClientProvider
5. Widget UI
- Marketing:
<FeedbackWidget />diLandingLayout(schema tamu wajib email) - String i18n di namespace
feedback(EN + ID)
Checklist
- Model Prisma + migrasi
- Schema Zod di
@repo/validations - Service + router Hono + mount
- CORS / OPTIONS bila marketing memanggil SaaS
- Mutasi TanStack Query +
api.*bertipe - Widget di layout yang tepat
- Copy EN + ID
- Path OpenAPI (opsional)
-
pnpm check/pnpm lintlulus