- Fix Next.js build failure: remove duplicate route at (dashboard)/listings/[id] that conflicted with (public)/listings/[id] (same URL path in two route groups) - Fix 772 ESLint errors: auto-fix import ordering (import-x/order), remove unused imports/variables, convert empty interfaces to type aliases, replace require() with ESM imports, fix consistent-type-imports violations - Add CLAUDE.md for developer onboarding documentation - All checks pass: 0 lint errors, typecheck clean, 230 tests passing, build success Co-Authored-By: Paperclip <noreply@paperclip.ing>
3.0 KiB
3.0 KiB
GoodGo Platform
Vietnamese real estate platform — monorepo powered by pnpm workspaces + Turborepo.
Quick Start
pnpm install
pnpm db:generate # Generate Prisma client
pnpm db:migrate:dev # Run migrations (needs PostgreSQL 16 + PostGIS)
pnpm db:seed # Seed sample data (users, listings, districts)
pnpm dev # Start all apps (API :3001, Web :3000)
Architecture
- apps/api — NestJS backend (CQRS, DDD, clean architecture)
- apps/web — Next.js 14 frontend (App Router, Tailwind, Zustand)
- libs/mcp-servers — MCP tool server library
- prisma/ — Schema, migrations, seed scripts
- e2e/ — Playwright E2E tests (API + Web projects)
Key Commands
| Command | Description |
|---|---|
pnpm lint |
ESLint (auto-fixable with --fix) |
pnpm typecheck |
TypeScript type checking |
pnpm test |
Unit tests via Vitest (API only) |
pnpm build |
Production build (all packages) |
pnpm test:e2e |
Playwright E2E tests |
pnpm db:studio |
Prisma Studio GUI |
Tech Stack
- Runtime: Node.js >= 22, pnpm 10
- Backend: NestJS, Prisma ORM, PostgreSQL 16 + PostGIS, Redis
- Frontend: Next.js 14, React 18, Tailwind CSS 3, Zustand, Mapbox GL
- Testing: Vitest (unit), Playwright (E2E)
- CI: GitHub Actions (lint → typecheck → test → build)
Project Structure (API)
apps/api/src/modules/
auth/ — Authentication (JWT, OAuth, refresh tokens, CSRF)
listings/ — Property listings CRUD
payments/ — VNPay payment integration
subscriptions/ — Plans, quotas, usage tracking
admin/ — Moderation, KYC, user management
analytics/ — Market data, heatmaps, price trends
search/ — Geo search, full-text search (Typesense)
notifications/ — Email, push (FCM), in-app notifications
metrics/ — Prometheus metrics
mcp/ — MCP tool server endpoints
shared/ — Domain primitives, guards, pipes, logging
Each module follows DDD layers: domain/ → application/ → infrastructure/ → presentation/.
Database
- PostgreSQL 16 with PostGIS extension for geospatial queries
- 22 models (User, Property, Listing, Payment, Subscription, etc.)
- Migrations in
prisma/migrations/ - Seed data covers: users, agents, Ho Chi Minh City districts/wards, sample properties, subscription plans
Environment Variables
Required in .env:
DATABASE_URL— PostgreSQL connection stringJWT_SECRET,JWT_REFRESH_SECRET— Auth tokensVNPAY_*— Payment gateway configMAPBOX_TOKEN— Map rendering (frontend)REDIS_URL— Cache layer (optional for dev)
Conventions
- Import order enforced by eslint-plugin-import-x (external → internal → relative)
- Path aliases:
@modules/*in API,@/*in Web - Vietnamese UI text throughout (property types, districts, currency in VND)
- All handlers return typed
Result<T>or throwDomainException - Commit messages follow conventional commits