System Guide
Project Overview
UP: 07/04/2026
AI MODERATOR
~15 MINS
PROJECT_CONTEXT.md — Nhà Cộng
Auto-generated by Antigravity on 2026-02-26. Update when the stack changes.
Overview
Nhà Cộng is a Vietnamese property rental management SaaS platform.
It allows landlords (chủ nhà), residents (cư dân), and collaborators (CTV) to manage rooms, buildings, contracts, invoices, payments, community discussions, asset tracking, and more.
- Domains: (production) /DOCUMENTATION CODE
nhacong.com.vn(staging)DOCUMENTATION CODEnc.thigio.com - Version: (inDOCUMENTATION CODE
0.1.5,DOCUMENTATION CODEversion.txt)DOCUMENTATION CODEpackage.json - Registry: GitHub Container Registry (GHCR) — /DOCUMENTATION CODE
ghcr.io/xonevn-ai/nhacong-beDOCUMENTATION CODEnhacong-fe
Tech Stack
Backend (DOCUMENTATION CODE/backend
)
DOCUMENTATION CODE
/backend| Concern | Tool / Version | Evidence |
|---|---|---|
| Language | TypeScript 5 | DOCUMENTATION CODE |
| Runtime | Node.js (LTS) | DOCUMENTATION CODE |
| Framework | NestJS 10 | DOCUMENTATION CODE |
| ORM | TypeORM 0.3 | DOCUMENTATION CODE DOCUMENTATION CODE |
| Database | MySQL 8.0 | DOCUMENTATION CODE DOCUMENTATION CODE |
| Auth | JWT + Passport + Google OAuth | DOCUMENTATION CODE DOCUMENTATION CODE DOCUMENTATION CODE |
| WebSockets | Socket.IO 4 | DOCUMENTATION CODE DOCUMENTATION CODE |
| Scheduler | DOCUMENTATION CODE DOCUMENTATION CODE | DOCUMENTATION CODE |
| API Docs | Swagger / OpenAPI | DOCUMENTATION CODE DOCUMENTATION CODE |
| File Upload | Multer + local/S3 | DOCUMENTATION CODE DOCUMENTATION CODE |
| Nodemailer + Resend | DOCUMENTATION CODE DOCUMENTATION CODE | |
| Payment | VNPay | DOCUMENTATION CODE |
| Messaging | Zalo / ZNS | DOCUMENTATION CODE |
| pdf-lib | DOCUMENTATION CODE | |
| Logging | Winston (via DOCUMENTATION CODE | DOCUMENTATION CODE DOCUMENTATION CODE |
| Validation | class-validator + class-transformer | DOCUMENTATION CODE DOCUMENTATION CODE DOCUMENTATION CODE |
| Caching | DOCUMENTATION CODE DOCUMENTATION CODE | DOCUMENTATION CODE |
| Rate limiting | DOCUMENTATION CODE | DOCUMENTATION CODE |
| Testing | Jest 29 + Supertest | DOCUMENTATION CODE |
| Security | Helmet, compression, cookie-parser | DOCUMENTATION CODE |
Frontend (DOCUMENTATION CODE/frontend
)
DOCUMENTATION CODE
/frontend| Concern | Tool / Version | Evidence |
|---|---|---|
| Language | TypeScript 5 | DOCUMENTATION CODE |
| Framework | Next.js 16 (standalone output) | DOCUMENTATION CODE DOCUMENTATION CODE |
| UI Library | React 19 | DOCUMENTATION CODE |
| Component Library | Ant Design 6 | DOCUMENTATION CODE |
| Styling | TailwindCSS v4 + PostCSS | DOCUMENTATION CODE DOCUMENTATION CODE |
| State | Zustand 5 | DOCUMENTATION CODE |
| Forms | react-hook-form 7 | DOCUMENTATION CODE |
| Chart | Recharts + DOCUMENTATION CODE | DOCUMENTATION CODE |
| Maps | Leaflet + react-leaflet | DOCUMENTATION CODE |
| WebSockets | socket.io-client 4 | DOCUMENTATION CODE |
| Rich Text | suneditor-react | DOCUMENTATION CODE |
| Toast | react-hot-toast + react-toastify | DOCUMENTATION CODE |
| E2E Testing | Playwright | DOCUMENTATION CODE DOCUMENTATION CODE |
| Build output | Next.js standalone | DOCUMENTATION CODE |
Infrastructure
| Concern | Tool | Evidence |
|---|---|---|
| Containerization | Docker (multi-stage) | DOCUMENTATION CODE DOCUMENTATION CODE |
| Orchestration | Docker Compose | DOCUMENTATION CODE DOCUMENTATION CODE |
| Reverse Proxy | Nginx Proxy Manager | DOCUMENTATION CODE DOCUMENTATION CODE |
| DB Admin | phpMyAdmin | DOCUMENTATION CODE |
| Storage | Local fs (default) or S3/Spaces | DOCUMENTATION CODE |
| Cloud | DigitalOcean Droplet | DOCUMENTATION CODE DOCUMENTATION CODE |
| CI/CD | GitHub Actions | DOCUMENTATION CODE |
| Image Registry | GHCR | DOCUMENTATION CODE |
| Cloud Deploy | Render (backend alt) | DOCUMENTATION CODE |
Repo Layout
DOCUMENTATION CODEprj/ ├── backend/ # NestJS API service │ ├── src/ │ │ ├── main.ts # Bootstrap: Swagger, CORS, global pipes/filters │ │ ├── app.module.ts # Root module │ │ ├── common/ # Shared: filters, guards, decorators, adapters │ │ ├── config/ # ConfigService configs (logger, database, etc.) │ │ ├── database/ # TypeORM data-source, migrations, seeds │ │ ├── modules/ # 74 domain feature modules (see below) │ │ ├── upload/ # File upload module │ │ └── utils/ # Utility helpers │ ├── .eslintrc.js │ ├── .prettierrc │ ├── tsconfig.json │ └── Dockerfile / Dockerfile.dev │ ├── frontend/ # Next.js app │ ├── src/ │ │ ├── app/ # Next.js App Router pages │ │ ├── components/ # Shared UI components │ │ ├── features/ # Feature-specific component groups │ │ ├── hooks/ # Custom React hooks │ │ ├── services/ # API service layer (axios calls) │ │ ├── type/ # Global TypeScript type definitions │ │ ├── utils/ # Frontend utilities │ │ ├── contexts/ # React context providers │ │ ├── config/ # Frontend config constants │ │ ├── lib/ # Library wrappers │ │ └── theme/ # Ant Design / theme config │ ├── e2e/ # Playwright tests │ ├── public/ # Static assets │ ├── .prettierrc │ ├── tsconfig.json │ └── Dockerfile / Dockerfile.dev │ ├── docker-compose.yml # Production stack ├── docker-compose.staging.yml # Staging stack (ports offset +50/+1) ├── build-deploy.sh # Manual deploy helper ├── version.txt # App version string └── .github/workflows/ └── deploy.yml # CI: build → GHCR → SSH deploy
Key Backend Modules (74 total under DOCUMENTATION CODEbackend/src/modules/
)
DOCUMENTATION CODE
backend/src/modules/DOCUMENTATION CODE
authDOCUMENTATION CODE
usersDOCUMENTATION CODE
apartmentDOCUMENTATION CODE
buildingDOCUMENTATION CODE
floorsDOCUMENTATION CODE
bedDOCUMENTATION CODE
contractsDOCUMENTATION CODE
depositsDOCUMENTATION CODE
invoiceDOCUMENTATION CODE
paymentDOCUMENTATION CODE
walletDOCUMENTATION CODE
thu-chiDOCUMENTATION CODE
meter-readingDOCUMENTATION CODE
tasksDOCUMENTATION CODE
assetDOCUMENTATION CODE
notificationsDOCUMENTATION CODE
conversationsDOCUMENTATION CODE
community-discussionsDOCUMENTATION CODE
marketplaceDOCUMENTATION CODE
ctv-*DOCUMENTATION CODE
zaloDOCUMENTATION CODE
zalo-accountsDOCUMENTATION CODE
kycDOCUMENTATION CODE
reportsDOCUMENTATION CODE
adminDOCUMENTATION CODE
admin-dashboardDOCUMENTATION CODE
schedulerKey Scripts
Backend (DOCUMENTATION CODEcd backend
)
DOCUMENTATION CODE
cd backendDOCUMENTATION CODEnpm run start:dev # Development mode with watch npm run build # Compile TypeScript npm run start:prod # Run compiled dist/main.js npm run lint # ESLint + auto-fix npm run format # Prettier format npm run test # Jest unit tests npm run test:cov # Coverage report npm run migration:generate # Generate new TypeORM migration npm run migration:run # Run pending migrations npm run migration:revert # Revert last migration npm run seed # Seed the database npm run db:init # Initialize DB schema
Frontend (DOCUMENTATION CODEcd frontend
)
DOCUMENTATION CODE
cd frontendDOCUMENTATION CODEnpm run dev # Next.js dev server on port 3001 npm run build # Production build (+ postbuild standalone copy) npm run start # Serve standalone build npm run format # Prettier npm run lint # Next.js lint npm run test:e2e # Playwright E2E tests
Run Book
Local Development (Docker preferred)
DOCUMENTATION CODE# Start all services (backend, frontend, MySQL, Nginx, phpMyAdmin) docker compose up -d # Or develop individually cd backend && npm install && npm run start:dev # API on :5000 cd frontend && npm install && npm run dev # UI on :3001
Environment files:
DOCUMENTATION CODE
backend/.envDOCUMENTATION CODE
frontend/.envDOCUMENTATION CODE
.env.exampleStaging
DOCUMENTATION CODEdocker compose -p nhacong-staging -f docker-compose.staging.yml up -d # Backend on :5050, DB on :3307
Test / Lint / Format
DOCUMENTATION CODE# Backend cd backend npm run test # Jest unit tests (*.spec.ts in src/) npm run test:e2e # Jest e2e (test/jest-e2e.json) npm run lint # ESLint fix npm run format # Prettier write # Frontend cd frontend npm run test:e2e # Playwright npm run lint # next lint npm run format # Prettier write
Architecture
Backend — NestJS Module-First (feature-module layered)
Each domain module follows a consistent structure:
DOCUMENTATION CODEmodules/<domain>/ ├── <domain>.module.ts # NestJS module declaration ├── <domain>.controller.ts # REST controller (decorators, guards) ├── <domain>.service.ts # Business logic ├── <domain>.entity.ts # TypeORM entity / table ├── dto/ # Data Transfer Objects (class-validator) └── (optional) <domain>.gateway.ts # WebSocket gateway
- Global prefix: DOCUMENTATION CODE
/api - Swagger docs: DOCUMENTATION CODE
/docs - Health check: DOCUMENTATION CODE
/api/health - Global pipes: DOCUMENTATION CODE
ValidationPipe({ whitelist: true, transform: true }) - Global filters: DOCUMENTATION CODE
AllExceptionsFilter - WebSocket adapter: DOCUMENTATION CODE
AuthenticatedSocketAdapter
Frontend — Next.js App Router + Feature Folders
- Pages in using App Router conventionsDOCUMENTATION CODE
src/app/ - Shared UI in DOCUMENTATION CODE
src/components/ - Domain UI in DOCUMENTATION CODE
src/features/ - API calls in (axios-based service modules)DOCUMENTATION CODE
src/services/ - Types in DOCUMENTATION CODE
src/type/ - Global state in Zustand stores
Conventions
Formatting
| Location | Rule |
|---|---|
| Backend prettier | DOCUMENTATION CODE DOCUMENTATION CODE |
| Frontend prettier | DOCUMENTATION CODE DOCUMENTATION CODE DOCUMENTATION CODE DOCUMENTATION CODE |
| Frontend editorconfig | Charset utf-8, LF, 2-space indent |
Naming
| Item | Convention | Example |
|---|---|---|
| Backend files | DOCUMENTATION CODE | DOCUMENTATION CODE DOCUMENTATION CODE |
| NestJS classes | DOCUMENTATION CODE | DOCUMENTATION CODE DOCUMENTATION CODE |
| Backend module dirs | DOCUMENTATION CODE | DOCUMENTATION CODE DOCUMENTATION CODE |
| Frontend pages | Next.js App Router dirs | DOCUMENTATION CODE |
| Frontend components | DOCUMENTATION CODE | DOCUMENTATION CODE |
| Frontend services | DOCUMENTATION CODE DOCUMENTATION CODE | DOCUMENTATION CODE |
| API endpoints | REST DOCUMENTATION CODE | DOCUMENTATION CODE |
| Env vars | DOCUMENTATION CODE | DOCUMENTATION CODE DOCUMENTATION CODE |
Error Handling
- Backend uses (DOCUMENTATION CODE
AllExceptionsFilter) for consistent error shapeDOCUMENTATION CODEcommon/filters/http-exception.filter.ts - Use NestJS built-in HTTP exceptions (,DOCUMENTATION CODE
NotFoundException, etc.)DOCUMENTATION CODEUnauthorizedException - Catch-and-log patterns in for graceful startup failuresDOCUMENTATION CODE
main.ts
Logging
- Winston via (configured inDOCUMENTATION CODE
nest-winston)DOCUMENTATION CODEconfig/logger.config.ts - fromDOCUMENTATION CODE
Loggerused for per-class loggingDOCUMENTATION CODE@nestjs/common - Frontend uses (no logging framework detected)DOCUMENTATION CODE
console.*
API Design
- RESTful CRUD endpoints per module
- JWT Bearer auth ()DOCUMENTATION CODE
Authorization: Bearer <token> - Google OAuth flow available
- Swagger decorators (,DOCUMENTATION CODE
@ApiTags,DOCUMENTATION CODE@ApiBearerAuth) on controllersDOCUMENTATION CODE@ApiOperation - DTOs use decoratorsDOCUMENTATION CODE
class-validator
TypeScript Strictness
| Location | Strict mode |
|---|---|
| Backend | Relaxed — DOCUMENTATION CODE DOCUMENTATION CODE |
| Frontend | Full strict mode — DOCUMENTATION CODE |
Do ✅ and Do Not ❌
| Do ✅ | Do Not ❌ |
|---|---|
| Follow module folder pattern for new domains | Do not place business logic in controllers |
| Add DTOs with class-validator decorators | Do not bypass DOCUMENTATION CODE |
| Use TypeORM entities with migrations | Do not enable DOCUMENTATION CODE |
| Use Swagger decorators on new endpoints | Do not skip DOCUMENTATION CODE DOCUMENTATION CODE |
| Use DOCUMENTATION CODE DOCUMENTATION CODE | Do not use raw DOCUMENTATION CODE |
| Throw NestJS HTTP exceptions in services | Do not let unhandled errors escape |
| Use DOCUMENTATION CODE | Do not call DOCUMENTATION CODE DOCUMENTATION CODE |
| Run DOCUMENTATION CODE DOCUMENTATION CODE | Do not commit unformatted code |
| Copy DOCUMENTATION CODE DOCUMENTATION CODE | Do not commit DOCUMENTATION CODE |
| Use separate staging compose file for staging tests | Do not use production ports for staging |
Contribution Checklist
Before opening a PR:
- Created/updated the NestJS module (module, controller, service, entity, DTOs)
- Added or updated migration for schema changes
- Ran in the changed workspaceDOCUMENTATION CODE
npm run format - Ran and resolved errorsDOCUMENTATION CODE
npm run lint - Ran in backend (zero failing unit tests)DOCUMENTATION CODE
npm run test - Swagger docs updated if new endpoint added
- No secrets committed (check is inDOCUMENTATION CODE
.env)DOCUMENTATION CODE.gitignore - Docker-compose files unchanged unless infra change is intended
- Branch pushed to for staging deploy; toDOCUMENTATION CODE
stagingfor productionDOCUMENTATION CODEmain