9cfea31905edaccea702b486b3636b12e0543954
LocalStrategy and auth controllers were importing UnauthorizedException from @nestjs/common instead of @modules/shared. While both return 401, only the custom DomainException-based version produces the structured error format (errorCode, correlationId, timestamp) expected by the GlobalExceptionFilter's primary code path. Also adds handleRequest() override to LocalAuthGuard to ensure custom exceptions from the strategy propagate directly without Passport transforming them. Co-Authored-By: Paperclip <noreply@paperclip.ing>
GoodGo Platform AI
Vietnam's intelligent real estate platform — property search, AI-powered valuation, and end-to-end transaction management.
Tech Stack
| Layer | Technology |
|---|---|
| Backend | NestJS 11, TypeScript, Prisma ORM, CQRS |
| Frontend | Next.js 14, React 18, Tailwind CSS, Zustand |
| Database | PostgreSQL 16 + PostGIS 3.4 |
| Search | Typesense 27 |
| Cache/Queue | Redis 7 |
| AI/ML | FastAPI, XGBoost, Claude API, Underthesea |
| MCP | Model Context Protocol servers (property search, valuation, analytics) |
| Storage | MinIO (S3-compatible) |
| Monitoring | Prometheus + Grafana |
| Payments | VNPay, MoMo, ZaloPay |
Architecture Overview
┌─────────────┐ ┌──────────────┐ ┌──────────────────┐
│ Next.js 14 │────▶│ NestJS API │────▶│ PostgreSQL + │
│ (Web App) │ │ (REST) │ │ PostGIS │
└─────────────┘ └──────┬───────┘ └──────────────────┘
│
┌────────────┼────────────┐
│ │ │
┌─────▼──┐ ┌──────▼───┐ ┌────▼─────┐
│ Redis │ │Typesense │ │ MinIO │
│ Cache │ │ Search │ │ Storage │
└────────┘ └──────────┘ └──────────┘
│
┌─────▼──────────────────────────┐
│ MCP Servers │
│ ├─ Property Search │
│ ├─ Market Analytics │
│ └─ Valuation │
└─────────────┬─────────────────┘
│
┌───────▼────────┐
│ AI Services │
│ (FastAPI) │
│ ├─ AVM │
│ └─ Moderation │
└────────────────┘
Monorepo Structure
goodgo-platform-ai/
├── apps/
│ ├── api/ # NestJS backend (port 3000)
│ └── web/ # Next.js frontend (port 3001)
├── libs/
│ ├── ai-services/ # Python FastAPI — AVM + content moderation
│ └── mcp-servers/ # MCP server implementations
├── prisma/ # Database schema & migrations
├── e2e/ # Playwright E2E tests
├── monitoring/ # Prometheus & Grafana configs
└── docs/ # Developer documentation
Quick Start
Prerequisites
- Docker Engine 24+ & Docker Compose v2
- Node.js 22 LTS
- pnpm 10.27+ (
corepack enable && corepack prepare pnpm@latest --activate)
Setup
# 1. Clone the repository
git clone <repo-url> && cd goodgo-platform-ai
# 2. Copy environment file
cp .env.example .env
# 3. Start infrastructure services
docker compose up -d
# 4. Verify services are healthy
docker compose ps
# 5. Install dependencies
pnpm install
# 6. Generate Prisma client
pnpm db:generate
# 7. Run database migrations
pnpm db:migrate:dev
# 8. Seed the database (optional)
pnpm db:seed
# 9. Start all apps in dev mode
pnpm dev
The API will be available at http://localhost:3000 and the web app at http://localhost:3001.
Infrastructure Services
| Service | Port(s) | Dashboard |
|---|---|---|
| PostgreSQL + PostGIS | 5432 | — |
| Redis | 6379 | — |
| Typesense | 8108 | http://localhost:8108/health |
| MinIO | 9000 / 9001 | http://localhost:9001 (console) |
| AI Services (FastAPI) | 8000 | http://localhost:8000/health |
| Prometheus | 9090 | http://localhost:9090 |
| Grafana | 3002 | http://localhost:3002 |
Development
Common Commands
pnpm dev # Start all apps (API + Web)
pnpm build # Build all packages
pnpm lint # Run ESLint
pnpm typecheck # TypeScript type checking
pnpm format # Format with Prettier
pnpm test # Run unit/integration tests
Database
pnpm db:generate # Regenerate Prisma client
pnpm db:migrate:dev # Create and apply migrations
pnpm db:migrate:deploy # Apply migrations (CI/production)
pnpm db:seed # Seed database
pnpm db:studio # Open Prisma Studio (visual editor)
pnpm db:reset # Reset database (destructive)
E2E Testing
pnpm test:e2e # Run all E2E tests
pnpm test:e2e:api # API tests only
pnpm test:e2e:web # Web UI tests only
pnpm test:e2e:report # Open HTML test report
API Modules
| Module | Description |
|---|---|
| auth | Registration, login, JWT + refresh token rotation, OAuth (Google/Zalo), KYC |
| listings | Property listing CRUD, status workflow, media management |
| search | Typesense full-text search with geo-spatial filters |
| payments | VNPay, MoMo, ZaloPay integration |
| subscriptions | Plan management, usage tracking |
| notifications | Email and in-app notifications |
| admin | Listing moderation, user management |
| analytics | Market reports, price indices, AVM integration |
| mcp | MCP server bridge (property search, valuation, analytics) |
| metrics | Prometheus metrics endpoint |
Each module follows Domain-Driven Design with presentation/, application/, domain/, and infrastructure/ layers.
Documentation
- Development Environment — Docker setup and local services
- Architecture — System design, data flow, module structure
- Deployment — Production deployment guide
License
Proprietary — All rights reserved.
Description
Languages
TypeScript
95.4%
Python
2.7%
Shell
0.9%
JavaScript
0.8%
Dockerfile
0.1%