# Template Architecture Analysis ## Overview / Tổng quan **Service**: `_template` - Standard Microservice Template **TypeScript Files**: 38 files **Last Updated**: Dec 27, 2024 ## Module Structure / Cấu trúc Module ### Core Modules (4 modules) ``` src/modules/ ├── common/ # Shared utilities, base classes ├── feature/ # Example feature module (for demonstration) ├── health/ # Health check endpoints └── metrics/ # Prometheus metrics ``` ### Module Breakdown #### 1. Common Module **Purpose**: Shared utilities and base classes for all modules **Key Files**: - `repository.ts` - Base repository pattern with Prisma - `types.ts` - Shared TypeScript types #### 2. Feature Module (Example) **Purpose**: Demonstrates standard module structure **Key Files**: - `feature.controller.ts` - Express route handlers - `feature.service.ts` - Business logic layer - `feature.repository.ts` - Data access via Prisma - `feature.dto.ts` - Zod validation schemas - `feature.module.ts` - Module wiring and router export - `__tests__/` - Unit and E2E tests **Pattern**: ``` Controller → Service → Repository → Prisma → PostgreSQL ``` #### 3. Health Module **Purpose**: Kubernetes liveness/readiness probes **Endpoints**: - `GET /health` - Overall health check - `GET /health/live` - Liveness probe (is process running?) - `GET /health/ready` - Readiness probe (can serve traffic?) #### 4. Metrics Module **Purpose**: Prometheus metrics exposure **Endpoint**: - `GET /metrics` - Prometheus format metrics **Metrics**: - HTTP request duration (histogram) - HTTP request count (counter) - Active requests (gauge) - Error count (counter) ## Middleware Stack / Stack Middleware ```typescript // Execution Order (from main.ts) 1. Correlation ID Middleware // Generate/propagate correlation IDs 2. Request Logger Middleware // Log incoming requests 3. Metrics Middleware // Track request metrics 4. Error Handler Middleware // Global error handling (LAST) ``` **Key Middlewares**: - `correlation.middleware.ts` - Request tracing with x-correlation-id - `logger.middleware.ts` - Structured logging with Winston - `metrics.middleware.ts` - Prometheus instrumentation - `error.middleware.ts` - Centralized error handling ## Configuration / Cấu hình **Config Files** (with Zod validation): - `app.config.ts` - App-level config (PORT, NODE_ENV, API_VERSION) - `database.config.ts` - Prisma database configuration - `redis.config.ts` - Redis cache configuration **Environment Variables**: | Variable | Required | Description | |----------|----------|-------------| | `PORT` | No | Server port (default: 5000) | | `NODE_ENV` | No | Environment (default: development) | | `DATABASE_URL` | **Yes** | PostgreSQL connection string | | `REDIS_URL` | No | Redis connection (default: redis://localhost:6379) | | `SERVICE_NAME` | No | Service identifier | | `API_VERSION` | No | API version (default: v1) | ## Database Layer / Tầng Database **ORM**: Prisma **Database**: PostgreSQL **Pattern**: Repository Pattern with Base Repository **Example Model** (from prisma/schema.prisma): ```prisma model Feature { id String @id @default(cuid()) name String @unique description String? enabled Boolean @default(true) config Json? tags String[] createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@map("features") } ``` ## API Routes / Routes API **Base Path**: `/api/v1` **Routing Strategy**: ```typescript // src/routes/index.ts /api/v1 ├── /features → Feature Module ├── /health → Health Module └── /metrics → Metrics Module ``` ## Testing Strategy / Chiến lược Testing **Test Structure**: ``` src/ ├── modules/ │ └── feature/ │ └── __tests__/ │ ├── feature.service.test.ts # Unit tests │ └── feature.e2e.test.ts # E2E tests └── __tests__/ └── setupTests.ts # Test configuration ``` **Testing Stack**: - **Framework**: Jest - **E2E**: Supertest - **Coverage**: 70%+ requirement ## Observability / Khả năng quan sát ### Logging - **Library**: Winston - **Format**: Structured JSON - **Levels**: error, warn, info, debug - **Context**: Correlation IDs in every log ### Metrics - **Library**: prom-client (Prometheus) - **Endpoint**: `/metrics` - **Types**: Counter, Gauge, Histogram ### Tracing - **Library**: OpenTelemetry (planned) - **Backend**: Jaeger (optional) - **Env Var**: `TRACING_ENABLED` ## Docker Support / Hỗ trợ Docker **Dockerfile Features**: - Multi-stage build (builder → runner) - Non-root user (node:node) - Production dependencies only - Health check support **Image Size**: ~200MB (optimized) ## Key Patterns Demonstrated / Patterns Chính 1. **Controller-Service-Repository Pattern** - Clear separation of concerns - Testable layers 2. **Dependency Injection via Constructor** - Easy mocking for tests - Clear dependencies 3. **Zod Validation** - Runtime type safety - Environment validation 4. **Error Handling** - Custom error classes - Global error middleware 5. **Correlation IDs** - Request tracing - Distributed debugging ## Security Features / Tính năng Bảo mật - **Helmet**: HTTP security headers - **CORS**: Configurable CORS - **Input Validation**: Zod schemas - **SQL Injection Prevention**: Prisma ORM (parameterized queries) ## Deployment Ready / Sẵn sàng Deploy - ✅ Dockerfile with multi-stage build - ✅ Health check endpoints (K8s compatible) - ✅ Prometheus metrics - ✅ Structured logging - ✅ Graceful shutdown - ✅ Connection pooling (Prisma) ## Gaps / Điểm còn thiếu Compared to full production service (iam-service): - ❌ No caching layer (no Redis integration shown) - ❌ No authentication middleware - ❌ No rate limiting - ❌ No circuit breaker pattern - ❌ No event sourcing - ❌ No advanced RBAC **Note**: These are intentionally omitted to keep template simple. They are demonstrated in `iam-service`. ## Summary / Tóm tắt `_template` is a **minimal, production-ready microservice template** that demonstrates: - Clean architecture (Controller-Service-Repository) - TypeScript best practices - Testing setup - Basic observability (logging, metrics, health checks) - Docker deployment It serves as a **starting point** for new services, with `iam-service` showing how to expand into a full production service with advanced features.