Backend NestJS sẵn sàng cho sản xuất của nền tảng Greengrass, tập trung vào sự kiện môi trường, quy trình check-in, thông báo và gamification.
Greengrass Backend cung cấp API cho:
- Xác thực và phân quyền người dùng (JWT + luồng refresh token)
- Quản lý vòng đời sự kiện (tạo, duyệt, đăng ký, quản lý người tham gia)
- Check-in sự kiện dựa trên QR
- Điểm, huy hiệu, streaks và bảng xếp hạng
- Gửi thông báo và công việc nhắc nhở
- Đánh dấu bản đồ và khám phá sự kiện lân cận
- Quản lý yêu cầu người tổ chức cho admin
Dự án này được thiết kế để hỗ trợ cả phát triển cục bộ và triển khai đám mây (Render).
- Runtime: Node.js 20+
- Framework: NestJS 11
- Ngôn ngữ: TypeScript
- Database: PostgreSQL
- ORM: Prisma
- Auth: Passport JWT + bcrypt
- Validation: class-validator + class-transformer
- Testing: Jest (unit + e2e)
- CI/CD: GitHub Actions + Render Deploy Hook
- Lớp
Controller: Định tuyến HTTP và xử lý request/response - Lớp
Service: Logic nghiệp vụ và điều phối Truy cập dữ liệu: Prisma client quaPrismaServiceCross-cutting: guards, decorators, filters, interceptors trongsrc/common
auth: đăng nhập/đăng ký/refresh/đăng xuất (JWT + Google OAuth)users: hồ sơ và thống kê người dùngevents: event CRUD, đăng ký, xem người tham giaregistrations: quản lý đăng ký sự kiện riêng biệtcheckin: tạo QR và check-in sự kiện với xác thực GPSgamification: điểm, huy hiệu, streaksleaderboard: bảng xếp hạng người dùngnotifications: thông báo trong ứng dụng + nhắc nhở theo lịchmap: đánh dấu bản đồ và tìm kiếm lân cậnadmin: luồng xem xét yêu cầu người tổ chứcupload: upload ảnh lên Cloudinarychatbot: tích hợp trợ lý AI (OpenRouter API)
- Client gửi request có/không có JWT.
- Guards xác thực authentication/role (
JwtAuthGuard,RolesGuard). - Xác thực DTO chạy qua
ValidationPipetoàn cục. - Controller ủy thác cho Service.
- Service thực thi logic nghiệp vụ và thao tác Prisma.
- Filter/interceptor toàn cục chuẩn hóa lỗi và logs.
- Node.js 20+
- Yarn 1.22+
- PostgreSQL chạy cục bộ hoặc từ xa
yarn installTạo file .env trong thư mục gốc với các biến sau:
# Database
DATABASE_URL=postgresql://user:password@localhost:5432/greengrass
# JWT Secrets (tối thiểu 32 ký tự)
JWT_SECRET=your-jwt-secret-key-min-32-characters
JWT_REFRESH_SECRET=your-refresh-secret-key-min-32-char
# QR Check-in Secret (tối thiểu 16 ký tự)
QR_SECRET=your-qr-secret-key
# CORS
ALLOWED_ORIGINS=http://localhost:5173,http://localhost:3000
# Server
NODE_ENV=development
PORT=3000
# Admin Account (cho seed)
ADMIN_EMAIL=admin@example.com
ADMIN_PASSWORD=admin123
ADMIN_FULL_NAME=System Admin
# Google OAuth (tùy chọn)
GOOGLE_CLIENT_ID=your-google-client-id
# Cloudinary (tùy chọn)
CLOUDINARY_CLOUD_NAME=your-cloud
CLOUDINARY_API_KEY=your-key
CLOUDINARY_API_SECRET=your-secret
# OpenRouter AI (tùy chọn)
OPENROUTER_API_KEY=your-openrouter-keyyarn db:migrate:deployyarn seedyarn start:devBackend chạy trên http://localhost:3000 theo mặc định.
yarn build
yarn start:prodRepository này bao gồm render.yaml với:
- Lệnh build:
yarn install --frozen-lockfile && yarn build - Lệnh start:
yarn db:migrate:deploy && yarn start:prod
Tạo Render web service và kết nối repository. Đảm bảo tất cả các biến môi trường bắt buộc được cấu hình trong Render.
Các biến bắt buộc cốt lõi:
DATABASE_URL: chuỗi kết nối PostgreSQLJWT_SECRET: bí mật ký access token (khuyến nghị tối thiểu 32 ký tự)JWT_REFRESH_SECRET: bí mật ký refresh token (khuyến nghị tối thiểu 32 ký tự)QR_SECRET: bí mật QR check-in (khuyến nghị tối thiểu 16 ký tự)ALLOWED_ORIGINS: các nguồn CORS được phép, phân tách bằng dấu phẩyNODE_ENV:developmenthoặcproductionPORT: cổng serverADMIN_EMAIL: email admin account (cho seed)ADMIN_PASSWORD: mật khẩu admin account (cho seed)ADMIN_FULL_NAME: tên đầy đủ admin account (cho seed)
Tích hợp tùy chọn:
GOOGLE_CLIENT_IDCLOUDINARY_CLOUD_NAME,CLOUDINARY_API_KEY,CLOUDINARY_API_SECRETOPENROUTER_API_KEYADMIN_EMAIL,ADMIN_PASSWORD,ADMIN_FULL_NAME
Swagger UI được bật trong môi trường phát triển:
GET /api
- Auth:
/auth/* - Users:
/users/* - Events:
/events/* - Registrations:
/registrations/* - Check-in:
/events/:eventId/qr,/events/:eventId/check-in - Gamification:
/points/*,/badges/* - Leaderboard:
/leaderboard/* - Notifications:
/notifications/* - Admin:
/admin/* - Map:
/map/* - Upload:
/upload/* - Chatbot:
/chatbot/* - Forum:
/forum/*
Authorization: Bearer <access_token>Chạy tất cả các bộ kiểm thử:
yarn test
yarn test:e2eCác lệnh kiểm thử bổ sung:
yarn test:watch
yarn test:covFile: .github/workflows/ci.yml
Khi PR và push lên main, CI chạy:
- Cài đặt dependencies
- Cung cấp dịch vụ PostgreSQL
- Chạy Prisma migrations
- Kiểm tra lint (hiện không bắt buộc)
- Kiểm thử đơn vị
- Kiểm thử E2E
- Build
File: .github/workflows/deploy-render.yml
- Trigger: khi quy trình CI thành công trên
main - Hành động: gọi Render Deploy Hook qua GitHub secret
RENDER_DEPLOY_HOOK_URL
GitHub secret bắt buộc:
RENDER_DEPLOY_HOOK_URL
yarn start:dev: chạy ở chế độ watchyarn build: biên dịch TypeScriptyarn start:prod: chạy server đã biên dịchyarn db:migrate:deploy: áp dụng Prisma migrations an toàn cho productionyarn test: kiểm thử đơn vịyarn test:e2e: kiểm thử e2e
Xem CONTRIBUTING.md cho quy trình phát triển, tiêu chuẩn viết code và danh sách kiểm tra PR.