# Service Template / Template Dịch Vụ > **EN**: Standard template for creating new microservices in the @goodgo ecosystem. > **VI**: Template chuẩn để tạo các microservice mới trong hệ sinh thái @goodgo. ## Features / Tính Năng - **Framework**: Express.js with TypeScript / Express.js với TypeScript. - **Database**: Prisma ORM with PostgreSQL / Prisma ORM với PostgreSQL. - **Validation**: Zod for environment & input validation / Zod cho validation biến môi trường và đầu vào. - **Observability / Khả năng quan sát**: - **Metrics**: Prometheus metrics at `/metrics` / Metrics Prometheus tại `/metrics`. - **Logging**: Common logger with request tracking / Logger chung với theo dõi request. - **Tracing**: OpenTelemetry/Jaeger integration / Tích hợp OpenTelemetry/Jaeger. - **Resilience / Khả năng phục hồi**: - Graceful shutdown / Đóng ứng dụng an toàn. - Rate limiting (Distributed via Redis) / Giới hạn tốc độ request (Phân tán qua Redis). - Circuit Breaker / Ngắt mạch. - Health checks (liveness/readiness) / Kiểm tra sức khỏe hệ thống. - **Caching**: Redis caching strategy / Chiến lược caching với Redis. - **Security / Bảo mật**: Helmet & CORS configured / Đã cấu hình Helmet & CORS. ## Project Structure / Cấu trúc Dự án ``` src/ ├── config/ # Configuration & Env validation / Cấu hình & Validate biến môi trường ├── middlewares/ # Express middlewares (error, logger, metrics) ├── modules/ # Feature modules (controller, service, repository) ├── routes/ # API route definitions └── main.ts # Entry point & App bootstrapping ``` ## Getting Started / Bắt đầu ### Prerequisites / Yêu cầu tiên quyết - Node.js >= 20 - pnpm - Docker (Redis required) ### Installation / Cài đặt #### Option 1: Local Development / Phát triển Cục bộ 1. **Clone & Install dependencies**: ```bash pnpm install ``` 2. **Start infrastructure with Docker**: For local development, start the platform infrastructure from `deployments/local/`: Để phát triển local, khởi động hạ tầng nền tảng từ `deployments/local/`: ```bash # Navigate to deployments directory cd deployments/local # Start platform services (PostgreSQL, Redis, Traefik, etc.) docker-compose up -d redis # Return to service directory cd ../../services/_template ``` **Note**: For full platform deployment with all services, see "Adding This Service to the Platform" section below. **Lưu ý**: Để triển khai nền tảng đầy đủ với tất cả services, xem phần "Thêm Service Vào Nền Tảng" bên dưới. 3. **Setup database**: ```bash pnpm prisma migrate dev pnpm prisma db seed ``` 4. **Start development server**: ```bash pnpm dev ``` 2. **Environment Setup / Thiết lập môi trường**: Environment variables are managed at the **platform level**, not per-service: Biến môi trường được quản lý ở **cấp độ nền tảng**, không phải mỗi service: ```bash # EN: Setup shared environment variables (from deployments/local/) # VI: Thiết lập biến môi trường chung (từ deployments/local/) cd deployments/local cp env.local.example .env.local # Edit .env.local with your values (JWT_SECRET, DATABASE_URL, etc.) ``` **Environment Variables / Biến Môi trường**: **Shared Variables** (in `deployments/local/.env.local`): - `JWT_SECRET`, `JWT_REFRESH_SECRET` - Must be same across all services - `REDIS_HOST`, `REDIS_PORT` - Shared Redis instance - `CORS_ORIGIN` - Allowed origins for all services - `NODE_ENV`, `LOG_LEVEL` - Common configuration **Service-Specific Variables** (in `docker-compose.yml`): - `PORT` - Unique port for each service - `DATABASE_URL` - Service's database connection - `SERVICE_NAME` - Service identifier **Key Environment Variables / Biến Môi Trường Chính**: | Variable / Biến | Description / Mô tả | Default / Mặc định | Required / Bắt buộc | |-----------------|---------------------|-------------------|---------------------| | `PORT` | Server port / Cổng server | `5000` | No / Không | | `NODE_ENV` | Environment mode / Chế độ môi trường | `development` | No / Không | | `API_VERSION` | API version prefix / Tiền tố phiên bản API | `v1` | No / Không | | `CORS_ORIGIN` | Allowed CORS origins (comma-separated) / Origins CORS được phép | `http://localhost:3000` | No / Không | | `SERVICE_NAME` | Service identifier / Mã định danh service | `microservice-template` | No / Không | | `DATABASE_URL` | PostgreSQL connection string / Chuỗi kết nối PostgreSQL | - | **Yes / Có** | | `REDIS_URL` | Redis connection URL / URL kết nối Redis | `redis://localhost:6379` | No / Không | | `JWT_SECRET` | JWT secret key for token signing and verification / Khóa bí mật JWT để ký và xác minh token | - | **Yes / Có** | | `TRACING_ENABLED` | Enable Jaeger tracing / Bật tracing Jaeger | `false` | No / Không | | `JAEGER_ENDPOINT` | Jaeger collector endpoint / Endpoint collector Jaeger | - | No / Không | **Environment Configuration Priority / Ưu tiên Cấu hình Môi trường**: 1. **Docker Compose environment** (in `deployments/local/docker-compose.yml`) - Highest priority 2. **Shared `.env.local`** (in `deployments/local/.env.local`) - Platform-level shared configs 3. **System environment variables** - OS-level environment 3. **Database Setup / Thiết lập Database**: **Prerequisites / Yêu cầu tiên quyết**: - PostgreSQL database running / Database PostgreSQL đang chạy - `DATABASE_URL` configured in `.env` / `DATABASE_URL` đã được cấu hình trong `.env` **Database Workflow / Quy trình Database**: ```bash # EN: Generate Prisma client / Tạo Prisma client pnpm prisma:generate # EN: Create and run initial migration / Tạo và chạy migration ban đầu pnpm prisma:migrate # EN: (Optional) Seed database with initial data / (Tùy chọn) Seed database với dữ liệu ban đầu pnpm prisma:seed ``` **Development Workflow / Quy trình Phát triển**: ```bash # EN: After schema changes, regenerate client / Sau khi thay đổi schema, tạo lại client pnpm prisma:generate # EN: Create new migration for schema changes / Tạo migration mới cho thay đổi schema pnpm prisma:migrate dev --name your-migration-name # EN: View database in Prisma Studio / Xem database trong Prisma Studio pnpm prisma:studio ``` **Production Deployment / Triển khai Production**: ```bash # EN: Deploy migrations to production / Triển khai migrations lên production pnpm prisma:migrate deploy # EN: Reset database (CAUTION: destroys all data) / Reset database (CẨN THẬN: xóa tất cả dữ liệu) pnpm prisma:migrate reset ``` 4. **Run Development / Chạy môi trường phát triển**: ```bash pnpm dev ``` 5. **Build & Start Production / Build và Chạy Production**: ```bash pnpm build pnpm start ``` ## Adding This Service to the Platform / Thêm Service Vào Nền Tảng This template represents a **single microservice**. To deploy it as part of the GoodGo microservices platform: Template này đại diện cho **một microservice đơn lẻ**. Để triển khai nó như một phần của nền tảng microservices GoodGo: ### 1. Register in Platform Compose File / Đăng Ký Trong Platform Compose File Add your service to `deployments/local/docker-compose.yml`: Thêm service của bạn vào `deployments/local/docker-compose.yml`: ```yaml services: your-service: build: context: ../.. dockerfile: services/your-service/Dockerfile container_name: your-service-local environment: - NODE_ENV=development - PORT=5002 - DATABASE_URL=${DATABASE_URL} - REDIS_HOST=redis - REDIS_PORT=6379 - JWT_SECRET=${JWT_SECRET} - SERVICE_NAME=your-service - API_VERSION=v1 - CORS_ORIGIN=http://localhost:3000,http://localhost:3001 depends_on: redis: condition: service_healthy networks: - microservices-network labels: # Enable Traefik service discovery - "traefik.enable=true" # Define routing rule (path-based routing) - "traefik.http.routers.your-service.rule=PathPrefix(`/api/v1/your-service`)" # Specify the service port - "traefik.http.services.your-service.loadbalancer.server.port=5002" # Health check configuration - "traefik.http.services.your-service.loadbalancer.healthcheck.path=/health/live" - "traefik.http.services.your-service.loadbalancer.healthcheck.interval=10s" ``` ### 2. Start the Platform / Khởi Động Nền Tảng ```bash # Navigate to deployments directory cd deployments/local # Start all services including your new service docker-compose up -d # View logs for your service docker-compose logs -f your-service ``` ### 3. Access Your Service / Truy Cập Service Của Bạn Once deployed, your service is accessible through Traefik: Sau khi triển khai, service của bạn có thể truy cập qua Traefik: - **API**: http://localhost/api/v1/your-service - **Health Check**: http://localhost/api/v1/your-service/health - **API Documentation**: http://localhost/api/v1/your-service/api-docs - **Traefik Dashboard**: http://localhost:8080 (view all registered services) ### 4. Traefik Configuration / Cấu Hình Traefik Traefik is configured at the platform level in `infra/traefik/`: Traefik được cấu hình ở cấp độ nền tảng trong `infra/traefik/`: - **Static Config**: `infra/traefik/traefik.yml` - Entry points, providers, dashboard - **Dynamic Config**: `infra/traefik/dynamic/` - Middlewares, routes, services - **Service Discovery**: Automatic via Docker labels (no manual route configuration needed) For advanced routing or middleware, add to `infra/traefik/dynamic/routes.yml`: Để định tuyến nâng cao hoặc middleware, thêm vào `infra/traefik/dynamic/routes.yml`: ```yaml http: routers: your-service: rule: "PathPrefix(`/api/v1/your-service`)" service: your-service middlewares: - secure-headers - cors - compress ``` ## Observability / Khả năng quan sát When deployed via the platform (`deployments/local/docker-compose.yml`), your service exposes: Khi triển khai qua nền tảng (`deployments/local/docker-compose.yml`), service của bạn expose: - **Metrics**: `http://localhost/api/v1/your-service/metrics` (Prometheus format via Traefik) - **Health Checks**: - Liveness: `http://localhost/api/v1/your-service/health/live` - Readiness: `http://localhost/api/v1/your-service/health/ready` - **API Documentation**: `http://localhost/api/v1/your-service/api-docs` (Swagger UI via Traefik) - **Tracing**: Jaeger integration (when `TRACING_ENABLED=true`) - **Correlation IDs**: Automatic request tracing with `x-correlation-id` headers - **Structured Logging**: Request/response logging with correlation context **Note**: For local development (without platform), replace `/api/v1/your-service` with `http://localhost:5000`. **Lưu ý**: Để phát triển local (không dùng platform), thay `/api/v1/your-service` bằng `http://localhost:5000`. ### Metrics / Metrics The service exposes comprehensive Prometheus metrics: - **Request Duration**: `http_request_duration_seconds` (histogram) - **Request Count**: `http_requests_total` (counter) - **Active Requests**: `http_active_requests` (gauge) - **Request Errors**: `http_request_errors_total` (counter) - **Payload Sizes**: Request/response payload size histograms - **Default Metrics**: Memory, CPU, event loop lag ### Correlation IDs / Correlation IDs Every request gets a correlation ID for tracing across services: - **Header**: `x-correlation-id` (propagated from upstream or auto-generated) - **Request ID**: `x-request-id` (unique per request) - **Logging**: All logs include correlation context - **Metrics**: Request metrics tagged with correlation ID ### Health Checks / Health Checks - **Liveness** (`/health/live`): Basic service availability - **Readiness** (`/health/ready`): Service ready to handle requests (includes DB connectivity) - **Metrics**: Health check results are tracked in Prometheus metrics ### Logging / Logging Structured logging with multiple levels: - **Request/Response**: Automatic logging with correlation IDs - **Errors**: Detailed error logging with stack traces - **Business Logic**: Custom logging with context - **Performance**: Request duration and resource usage ### API Documentation / Tài liệu API - **Swagger UI**: Interactive API documentation at `/api-docs` - **OpenAPI 3.0**: Complete API specification - **Request/Response Examples**: Real examples for all endpoints - **Authentication**: JWT Bearer token examples ## Authentication / Xác thực The service uses JWT (JSON Web Tokens) for authentication. Include the token in the `Authorization` header as `Bearer `. ### API Documentation / Tài liệu API #### Authentication Endpoints / Endpoints Xác thực **Get Current User Info / Lấy Thông tin Người dùng Hiện tại** ```http GET /auth/me Authorization: Bearer ``` #### Feature Management / Quản lý Feature **Base URL**: `http://localhost/api/v1/features` #### Create Feature / Tạo Feature ```http POST /api/v1/features Authorization: Bearer Content-Type: application/json { "name": "example-feature", "title": "Example Feature", "description": "An example feature for demonstration", "config": { "enabled": true, "priority": 1 }, "tags": ["example", "demo"] } ``` **Required Role:** `admin` #### Get All Features / Lấy Tất cả Features ```http GET /api/v1/features ``` #### Get Feature by ID / Lấy Feature theo ID ```http GET /api/v1/features/{id} ``` #### Update Feature / Cập nhật Feature ```http PUT /api/v1/features/{id} Content-Type: application/json { "title": "Updated Title", "enabled": false } ``` #### Delete Feature / Xóa Feature ```http DELETE /api/v1/features/{id} ``` #### Toggle Feature Status / Chuyển đổi Trạng thái Feature ```http PATCH /api/v1/features/{id}/toggle ``` ### Response Format / Định dạng Response All API responses follow this structure / Tất cả responses API tuân theo cấu trúc này: ```json { "success": true, "data": { ... }, "message": "Operation completed / Hoạt động hoàn thành", "timestamp": "2024-01-01T00:00:00.000Z" } ``` Error responses / Responses lỗi: ```json { "success": false, "error": { "code": "FEATURE_001", "message": "Error description / Mô tả lỗi" }, "timestamp": "2024-01-01T00:00:00.000Z" } ``` ## Troubleshooting / Khắc phục sự cố ### Common Issues / Vấn đề thường gặp #### Database Connection Issues / Vấn đề kết nối Database **Problem**: `Error: P1001: Can't reach database server` ```bash # EN: Check if PostgreSQL is running (from deployments/local/) # VI: Kiểm tra PostgreSQL có đang chạy (từ deployments/local/) cd deployments/local docker-compose ps # EN: Check database logs # VI: Kiểm tra logs database docker-compose logs postgres # EN: Restart database service # VI: Khởi động lại database service docker-compose restart postgres ``` **Problem**: `Error: P2002: Unique constraint failed` ```typescript // EN: This usually means you're trying to create a duplicate record // VI: Điều này thường có nghĩa là bạn đang cố tạo record trùng lặp // EN: Check your seed data or migration scripts // VI: Kiểm tra seed data hoặc migration scripts ``` #### Authentication Issues / Vấn đề Authentication **Problem**: `401 Unauthorized` ```bash # EN: Check JWT token format # VI: Kiểm tra định dạng JWT token curl -H "Authorization: Bearer YOUR_TOKEN" http://localhost/auth/me # EN: Verify JWT secret in environment # VI: Xác minh JWT secret trong environment echo $JWT_SECRET # EN: Check token expiration # VI: Kiểm tra token hết hạn # EN: Use https://jwt.io to decode your token ``` #### Port Already in Use / Port đã được sử dụng **Problem**: `Error: listen EADDRINUSE: address already in use` ```bash # EN: Find process using the port # VI: Tìm process đang sử dụng port lsof -i :5000 # EN: Kill the process # VI: Kill process kill -9 # EN: Or change port in .env # VI: Hoặc thay đổi port trong .env PORT=5001 ``` #### Docker Issues / Vấn đề Docker **Problem**: `ERROR: Couldn't connect to Docker daemon` ```bash # EN: Start Docker service # VI: Khởi động Docker service sudo systemctl start docker # EN: Add user to docker group (Linux) # VI: Thêm user vào docker group (Linux) sudo usermod -aG docker $USER ``` **Problem**: Container won't start ```bash # EN: Check container logs (from deployments/local/) # VI: Kiểm tra logs container (từ deployments/local/) cd deployments/local docker-compose logs your-service # EN: Check container health # VI: Kiểm tra health container docker-compose ps # EN: Rebuild without cache # VI: Rebuild không dùng cache docker-compose build --no-cache your-service docker-compose up -d your-service ``` #### Test Failures / Test thất bại **Problem**: Tests fail with database connection ```bash # EN: Ensure test database is running # VI: Đảm bảo test database đang chạy docker-compose -f docker-compose.test.yml up -d # EN: Run tests with verbose output # VI: Chạy tests với output verbose pnpm test -- --verbose # EN: Reset test database # VI: Reset test database docker-compose -f docker-compose.test.yml down -v ``` ### Debug Mode / Chế độ Debug ```bash # EN: Enable debug logging (local development) # VI: Bật debug logging (phát triển local) DEBUG=* pnpm dev # EN: Check application health (via platform) # VI: Kiểm tra health ứng dụng (qua platform) curl http://localhost/api/v1/your-service/health/ready # EN: View application logs (from deployments/local/) # VI: Xem logs ứng dụng (từ deployments/local/) cd deployments/local docker-compose logs -f your-service # EN: Monitor metrics (via platform) # VI: Monitor metrics (qua platform) curl http://localhost/api/v1/your-service/metrics ``` ### Performance Issues / Vấn đề Performance **Slow Requests**: - Check database query performance - Review middleware chain efficiency - Monitor Redis cache hit rates - Check for memory leaks **High Memory Usage**: ```bash # EN: Check memory usage # VI: Kiểm tra memory usage docker stats # EN: Monitor with Prometheus metrics # VI: Monitor với Prometheus metrics curl http://localhost/metrics | grep heap ``` ## Docker / Docker ### Docker Image / Docker Image This template includes a production-ready Dockerfile with: Template này bao gồm Dockerfile production-ready với: ```dockerfile # Multi-stage build for optimized image size FROM node:20-alpine AS base # ... dependency installation FROM base AS builder # ... build stage FROM node:20-alpine AS runner # ... production runtime ``` **Build the image:** ```bash docker build -t your-service:latest . ``` ### Docker Compose for Testing / Docker Compose Cho Testing - **`docker-compose.test.yml`**: Isolated test environment with test database and Redis **Run tests in Docker:** ```bash docker-compose -f docker-compose.test.yml up -d DATABASE_URL=postgresql://postgres:test_password@localhost:5433/microservice_test pnpm test docker-compose -f docker-compose.test.yml down -v ``` ### Production Deployment / Triển khai Production For production deployment, services are orchestrated via: Để triển khai production, các service được điều phối qua: - **Local/Dev**: `deployments/local/docker-compose.yml` - **Staging**: `deployments/staging/kubernetes/` (Kubernetes manifests) - **Production**: `deployments/production/kubernetes/` (Kubernetes manifests) **Build production image:** ```bash docker build -t your-service:v1.0.0 . docker tag your-service:v1.0.0 registry.example.com/your-service:v1.0.0 docker push registry.example.com/your-service:v1.0.0 ``` ### Docker Image Features / Tính năng Docker Image - **Multi-stage Build**: Optimized for small production images - **Security**: Non-root user, minimal attack surface - **Health Checks**: Built-in health check endpoints - **Signal Handling**: Proper signal handling with dumb-init - **Layer Caching**: Efficient Docker layer caching ### Environment Variables for Docker / Biến môi trường cho Docker When running in Docker, ensure these environment variables are set: ```bash # EN: Database connection # VI: Kết nối database DATABASE_URL=postgresql://postgres:password@postgres:5432/microservice_template # EN: Redis connection # VI: Kết nối Redis REDIS_URL=redis://redis:6379 # EN: JWT secret (change in production!) # VI: JWT secret (thay đổi trong production!) JWT_SECRET=your-production-jwt-secret ``` ## Testing / Kiểm thử ```bash # EN: Run all tests / Chạy tất cả tests pnpm test # EN: Run unit tests only / Chạy chỉ unit tests pnpm test:unit # EN: Run E2E tests only / Chạy chỉ E2E tests pnpm test:e2e # EN: Run tests with coverage / Chạy tests với coverage pnpm test:coverage # EN: Run tests in watch mode / Chạy tests ở chế độ watch pnpm test:watch # EN: Run tests in specific file / Chạy tests trong file cụ thể pnpm test src/modules/feature/__tests__/feature.service.test.ts # EN: Run tests matching pattern / Chạy tests khớp pattern pnpm test -- --testNamePattern="authentication" ``` ### Test Structure / Cấu trúc Test ``` src/ ├── middlewares/__tests__/ # Middleware unit tests ├── modules/ │ ├── feature/__tests__/ # Feature module tests │ └── health/__tests__/ # Health module tests ├── __tests__/ # E2E tests │ ├── health.e2e.ts # Health endpoint E2E │ └── feature.e2e.ts # Feature endpoint E2E └── config/__tests__/ # Configuration tests ``` ### Writing Tests / Viết Tests #### Unit Test Example / Ví dụ Unit Test ```typescript import { FeatureService } from '../feature.service'; import { featureRepository } from '../feature.repository'; jest.mock('../feature.repository'); describe('FeatureService', () => { let service: FeatureService; beforeEach(() => { service = new FeatureService(); }); it('should create feature successfully', async () => { const mockFeature = { id: '1', name: 'test', enabled: true }; (featureRepository.create as jest.Mock).mockResolvedValue(mockFeature); const result = await service.create({ name: 'test' }); expect(result).toEqual(mockFeature); }); }); ``` #### E2E Test Example / Ví dụ E2E Test ```typescript import request from 'supertest'; import express from 'express'; import { createRouter } from '../routes'; describe('Feature Endpoints E2E', () => { let app: express.Application; beforeAll(() => { app = express(); app.use(express.json()); app.use(createRouter()); }); it('should create feature successfully', async () => { const response = await request(app) .post('/api/v1/features') .send({ name: 'test-feature' }) .expect(201); expect(response.body.success).toBe(true); }); }); ``` ## Creating a New Service / Tạo Service Mới To create a new microservice from this template / Để tạo microservice mới từ template này: 1. **Copy Template / Sao chép Template**: ```bash # EN: Copy template to new service directory / Sao chép template vào thư mục service mới cp -r services/_template services/your-service-name cd services/your-service-name ``` 2. **Update Package Configuration / Cập nhật Cấu hình Package**: ```bash # EN: Update package.json name and description / Cập nhật tên và mô tả trong package.json # VI: Thay đổi "name", "description", và các thông tin khác ``` 3. **Configure Environment / Cấu hình Môi trường**: ```bash # EN: Set up shared environment variables at platform level # VI: Thiết lập biến môi trường chung ở cấp độ nền tảng cd ../../deployments/local cp env.local.example .env.local # EN: Edit .env.local with shared values (JWT_SECRET, DATABASE_URL, etc.) # VI: Chỉnh sửa .env.local với các giá trị chung (JWT_SECRET, DATABASE_URL, etc.) nano .env.local ``` 4. **Database Setup / Thiết lập Database**: ```bash # EN: Update Prisma schema with your models / Cập nhật schema Prisma với models của bạn # VI: Chỉnh sửa prisma/schema.prisma # EN: Generate and run migrations / Tạo và chạy migrations pnpm prisma:generate pnpm prisma:migrate ``` 5. **Implement Business Logic / Triển khai Logic Kinh doanh**: - Add your modules in `src/modules/` - Update routes in `src/routes/index.ts` - Add validation schemas and DTOs 6. **Testing / Kiểm thử**: ```bash # EN: Add tests for your new functionality / Thêm tests cho chức năng mới pnpm test ``` 7. **Documentation / Tài liệu**: - Update `README.md` with service-specific information - Update `ARCHITECTURE.md` if needed - Update OpenAPI documentation in route files ## Extending the Template / Mở rộng Template ### Adding a New Module / Thêm Module Mới 1. **Create Module Structure / Tạo cấu trúc Module**: ```bash mkdir -p src/modules/your-module/{__tests__} touch src/modules/your-module/your-module.{controller,service,repository,dto,module}.ts touch src/modules/your-module/__tests__/your-module.{service,controller}.test.ts ``` 2. **Implement Repository / Triển khai Repository**: ```typescript // src/modules/your-module/your-module.repository.ts import { BaseRepository } from '../common/repository'; import { prisma } from '../../config/database.config'; export class YourModuleRepository extends BaseRepository { constructor() { super(prisma, 'yourEntity'); } async findByCustomField(value: string): Promise { return this.prisma.yourEntity.findMany({ where: { customField: value }, }); } } export const yourModuleRepository = new YourModuleRepository(); ``` 3. **Implement Service / Triển khai Service**: ```typescript // src/modules/your-module/your-module.service.ts import { yourModuleRepository } from './your-module.repository'; import { CreateYourEntityDto, UpdateYourEntityDto } from './your-module.dto'; export class YourModuleService { async create(data: CreateYourEntityDto) { // Business logic return yourModuleRepository.create(data); } async findAll() { return yourModuleRepository.findAll(); } } ``` 4. **Implement Controller / Triển khai Controller**: ```typescript // src/modules/your-module/your-module.controller.ts import { Request, Response } from 'express'; import { asyncHandler } from '../../middlewares/error.middleware'; import { YourModuleService } from './your-module.service'; export class YourModuleController { private service = new YourModuleService(); create = asyncHandler(async (req: Request, res: Response) => { const result = await this.service.create(req.body); res.status(201).json({ success: true, data: result, message: 'Created successfully', timestamp: new Date().toISOString(), }); }); findAll = asyncHandler(async (req: Request, res: Response) => { const result = await this.service.findAll(); res.json({ success: true, data: result, message: 'Retrieved successfully', timestamp: new Date().toISOString(), }); }); } ``` 5. **Create Routes / Tạo Routes**: ```typescript // src/modules/your-module/your-module.module.ts import { Router } from 'express'; import { YourModuleController } from './your-module.controller'; import { validateDto } from '../../middlewares/validation.middleware'; export const createYourModuleRouter = (): Router => { const router = Router(); const controller = new YourModuleController(); router.post('/', validateDto(createYourEntitySchema), controller.create); router.get('/', controller.findAll); return router; }; ``` 6. **Register Routes / Đăng ký Routes**: ```typescript // src/routes/index.ts import { createYourModuleRouter } from '../modules/your-module/your-module.module'; router.use('/api/v1/your-entities', createYourModuleRouter()); ``` ### Adding Environment Variables / Thêm Biến Môi trường 1. **Update config schema / Cập nhật config schema**: ```typescript // src/config/app.config.ts const envSchema = z.object({ // ... existing fields YOUR_NEW_VARIABLE: z.string().default('default-value'), }); export const appConfig = { // ... existing config yourNewVariable: config.YOUR_NEW_VARIABLE, }; ``` 2. **Update .env files / Cập nhật file .env**: ```bash # .env.example YOUR_NEW_VARIABLE=your-default-value # .env.local.example YOUR_NEW_VARIABLE=your-local-value ``` ### Security Best Practices / Thực tiễn Bảo mật - **Input Validation**: Always validate and sanitize user inputs using Zod - **Authentication**: Use JWT tokens with reasonable expiration times - **Authorization**: Implement proper RBAC for your endpoints - **Rate Limiting**: Protect against abuse with distributed rate limiting - **HTTPS**: Always use HTTPS in production - **Secrets**: Never commit secrets to version control - **Dependencies**: Keep dependencies updated and audit regularly ### Performance Considerations / Lưu ý Performance - **Database Queries**: Use indexes for frequently queried fields - **Caching**: Implement Redis caching for expensive operations - **Connection Pooling**: Configure appropriate connection pool sizes - **Async Operations**: Use proper async/await patterns - **Memory Management**: Monitor memory usage and implement cleanup - **Metrics**: Monitor performance with built-in Prometheus metrics ## Development Guidelines / Hướng dẫn Phát triển ### Comments / Comment Code - Use bilingual comments for all public APIs and complex logic. - Format: `EN` first, then `VI`. - See `.cursor/skills/comment-code/SKILL.md` for details. ### Adding a Module / Thêm Module 1. Create `src/modules//`. 2. Implement `Controller`, `Service`. 3. Register routes in `src/routes/index.ts`. ### Code Style / Phong cách Code - Follow the established patterns in existing modules - Use TypeScript strictly with proper type annotations - Implement proper error handling with custom error classes - Add comprehensive tests for all new functionality