Awesome-omni-skill backend-dev-guidelines
Comprehensive backend development guide for Node.js/NestJS/TypeScript microservices. Use when creating controllers, services, database access, middleware, DTOs, or working with NestJS APIs, dependency injection, or async patterns. Covers layered architecture (controllers → services → dbservice), error handling, performance monitoring, testing strategies.
git clone https://github.com/diegosouzapw/awesome-omni-skill
T=$(mktemp -d) && git clone --depth=1 https://github.com/diegosouzapw/awesome-omni-skill "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/development/backend-dev-guidelines-medorion" ~/.claude/skills/diegosouzapw-awesome-omni-skill-backend-dev-guidelines-401538 && rm -rf "$T"
skills/development/backend-dev-guidelines-medorion/SKILL.mdBackend Development Guidelines
Purpose
Establish consistency and best practices across backend microservices (web-server) using modern Node.js/NestJS/TypeScript patterns.
When to Use
Auto-activates when working on:
- Creating or modifying routes, endpoints, APIs
- Building controllers, services, repositories
- Implementing middleware (auth, validation, error handling)
- DTOs with class-validator
- Database operations (via data-access-layer)
- Swagger documentation
- Authentication/authorization (login, logout, session management, RBAC)
- Guards and decorators (@Authorize, @IgnoreAuthorization)
- Logging and error handling
- Backend testing and refactoring
CRITICAL: Implementation Workflow
Before writing ANY code, you MUST:
- ✅ Read the relevant resource guides for your task (see Navigation Guide below)
- ✅ Use the "New Backend Feature Checklist" as your TODO list DO NOT:
- ❌ Start by reading existing implementations
- ❌ Copy-paste from existing files without reading the guides
- ❌ Create an abbreviated version of the checklist
Quick Start
New Backend Feature Checklist
- Dto: Create [Entity]Dto in packages/types/src/dto/[entity].dto.ts (see types-guide.md)
- Entity: Create [Entity] entity in packages/data-access-layer/src/features/[entity]/entities/[entity].entity.ts
- DbService: [Entity]DbService in packages/data-access-layer/src/features/[entity]/services/[entity]-db.service.ts (see database-patterns-guide.md)
- Controller: [Entity]Controller in apps/web-server/src/app/features/[entity]/[entity].controller.ts (see controllers-guide.md)
- Service: Create [Entity]Service in apps/web-server/src/app/features/[entity]/[entity].service.ts (see services-guide.md)
- Mapper: [Entity]Mapper in apps/web-server/src/app/features/[entity]/[entity].mapper.ts (see services-guide.md)
- Register: register new DbServices and Entities in
(see database-patterns-guide.md)data-access.module - Unit Tests: Write comprehensive unit tests for all components with business logic (see testing-guide.md)
- Verify Tests Pass: Run:
. 100% of tests should pass. If not fix until all passnpm run test - Code Coverage: Run:
. Review coverage report and write tests for any untested files with business logic. Achieve 80% coverage (statements, lines, branches 60%, functions 60%) (see code-coverage-guide.md)npm run test:coverage - API Documentation: Write API Endpoint documentation (see api-documentation-guide.md)
- Client API Generate: Run:
npm run gen-api-client - Verify Format: Run:
npm run format:fix - Verify Lint: Run:
npm run lint - Verify Build: Run:
npm run build
New Microservice Checklist
- Directory structure: Create feature modules pattern (see architecture-overview.md)
- App Module: Configure root module with imports, controllers, providers
- Data Access Module: Set up TypeORM connection and register entities
- Exception Filter: Register global
in main.tsAllExceptionsFilter - Logging: Configure
with proper log levelsnestjs-pino - Swagger: Set up OpenAPI documentation in main.ts
- Validation: Enable global
with class-validatorValidationPipe - Auth Guard: Configure
decorator and JWT validation@Authorize() - Testing: Set up Jest with test-setup.ts configuration
- Health Check: Add
endpoint for monitoring/health
Architecture
Layered Flow
HTTP Request → Controller → Service → DbService → TypeORM → Database
Key Principle: Each layer has ONE responsibility.
See architecture-overview.md for complete details.
Directory Structure
apps/web-server/src/ ├── app/ │ ├── auth/ # Authentication feature │ │ ├── auth.controller.ts # Auth endpoints (login, logout, etc.) │ │ ├── auth.service.ts # Auth business logic │ │ ├── auth-mapper.service.ts # DTO ↔ Entity mapping │ │ └── auth.module.ts # Auth module │ │ │ ├── features/ # Feature modules │ │ ├── user/ # User management feature │ │ │ ├── user.controller.ts # User CRUD endpoints │ │ │ ├── user.service.ts # User business logic │ │ │ ├── user.mapper.ts # User DTO ↔ Entity mapping │ │ │ └── user.module.ts # User module │ │ │ │ │ ├── example/ # Example feature (reference) │ │ │ ├── example.controller.ts │ │ │ ├── example.service.ts │ │ │ └── example.module.ts │ │ │ │ │ ├── sync-events/ # Server-Sent Events feature │ │ │ ├── sync-events.controller.ts │ │ │ └── sync-events.module.ts │ │ │ │ │ └── exceptions/ # Exception testing endpoints │ │ ├── exceptions.controller.ts │ │ └── exceptions.module.ts │ │ │ ├── health/ # Health check │ │ └── health.controller.ts # Health endpoint │ │ │ ├── app.module.ts # Root application module │ ├── app-initializer-service.ts # App initialization logic │ └── data-access.module.ts # Data access layer module setup │ ├── common/ # Shared utilities │ ├── base.mapper.ts # Base mapper class │ └── all-exceptions.filter.ts # Global exception filter │ ├── assets/ # Static assets │ ├── main.ts # Application entry point └── test-setup.ts # Jest test configuration
Naming Conventions:
- Files:
-kebab-case
,user.controller.ts
,user.service.tsuser.mapper.ts - Classes:
-PascalCase
,UserController
,UserServiceUserMapper
Core Principles (8 Key Rules)
1. Let Services Throw, Controllers Delegate
// ✅ Service throws business exceptions async findOne(id: string): Promise<ClientUserDto> { const user = await this.userDbService.findById(id); if (!user) { throw new NotFoundException(`User ${id} not found`); } return this.userMapper.toDto(user); } // ✅ Controller just delegates - no try/catch needed @Get(':id') async findOne(@Param('id') id: string): Promise<ClientUserDto> { return this.userService.findOne(id); }
Key points:
- ✅ Services throw
,NotFoundException
,ConflictExceptionBadRequestException - ✅ Controllers delegate to services - no try/catch blocks
- ✅ Global exception filter handles all errors automatically
- ❌ No manual
methods neededhandleError()
→ See services-guide.md and controllers-guide.md
2. Authorize requests using guard middleware
@Authorize(Role.Admin) async create(@Body(ValidationPipe) createUserDto: CreateUserDto): Promise<ClientUserDto> { return await this.userService.create(createUserDto); }
→ See auth-session-guide.md
3. Validate input using class-validator
async create(@Body(ValidationPipe) createUserDto: CreateUserDto): Promise<ClientUserDto> { return this.userService.create(createUserDto); }
→ See types-guide.md and controllers-guide.md
4. Use Swagger decorators for API documentation
@ApiOperation({ summary: 'Create user' }) @ApiResponse({ status: 201, type: ClientUserDto }) async create(@Body(ValidationPipe) createUserDto: CreateUserDto): Promise<ClientUserDto> { return this.userService.create(createUserDto); }
→ See api-documentation-guide.md
5. Use Mapper to transform an entity to DTO
In the service use toDto() to return a DTO object
async create(createUserDto: CreateUserDto): Promise<ClientUserDto> { // Create via DbService const user = await this.userDbService.create(createUserDto); // Map Entity → DTO return this.userMapper.toDto(user); }
→ See services-guide.md
6. Use DbService for database access
// ✅ ALWAYS const entity = await this.userDbService.create(createUserDto);
→ See database-patterns-guide.md
7. Constructor Conventions and Logger Setup
@Injectable() export class UserService { constructor( private readonly userDbService: UserDbService, private readonly userMapper: UserMapper, private readonly logger: PinoLogger, ) { this.logger.setContext(UserService.name); // REQUIRED } }
Key points:
- ✅ Use
for all injected dependenciesprivate readonly - ✅ Set logger context in constructor:
this.logger.setContext(ClassName.name) - ✅ Register providers in module's
arrayproviders
→ See services-guide.md and logging-guide.md
8. Generate API Client After Controller Changes
After modifying controllers, ALWAYS run:
npm run gen-api-client
What it does:
- Reads NestJS controllers and decorators
- Extracts HTTP methods, paths, parameters, return types
- Generates type-safe Angular services in
@ai-nx-starter/api-client - Ensures frontend always matches backend API contract
Example:
// Backend: UserController @Post() @ApiOperation({ summary: 'Create user' }) @ApiResponse({ status: 201, type: ClientUserDto }) async create(@Body() dto: CreateUserDto): Promise<ClientUserDto> { ... } // ↓ Auto-generates ↓ // Frontend: ApiUserService create(dto: CreateUserDto): Observable<ClientUserDto> { return this.http.post<ClientUserDto>(`${this.BASE_URL}/users`, dto); }
Why this matters:
- ✅ Type-safe API calls in Angular
- ✅ Breaking changes caught at compile time
- ✅ No manual HTTP service writing
- ❌ Never create manual HTTP services - always auto-generate
Navigation Guide
| Need to... | Read this |
|---|---|
| Understand architecture | architecture-overview.md |
| Types Package, DTOs, enums, constants | types-guide.md |
| Create controllers | controllers-guide.md |
| Organize business logic and exceptions | services-guide.md |
| Database access | database-patterns-guide.md |
| Authentication & authorization | auth-session-guide.md |
| Logging with Pino | logging-guide.md |
| Security best practices | security-guide.md |
| API Documentation | api-documentation-guide.md |
| Write tests | testing-guide.md |
| Coverage exclusions | code-coverage-guide.md |
Resource Files
architecture-overview.md
Layered architecture, request lifecycle, separation of concerns
types-guide.md
Types Package & DTOs - Complete guide for DTOs, enums, constants, validation, naming conventions, and organization
controllers-guide.md
Controller definitions, error handling, examples
services-guide.md
Service patterns, Mapper integration, error handling, async patterns
database-patterns-guide.md
DbService, TypeORM entities, MongoDB queries, data access patterns
auth-session-guide.md
Authentication, authorization, session management, RBAC, Redis sessions
logging-guide.md
Structured logging with Pino, PinoLogger usage, log levels, best practices
security-guide.md
Input validation, authorization, sensitive data protection, password security, CORS, rate limiting
api-documentation-guide.md
Swagger documentation guidelines for API endpoints
testing-guide.md
AI testing guidelines, coverage decisions, proactive test generation policy
code-coverage-guide.md
Coverage exclusion guidelines, decision framework, what to test vs exclude
Skill Status: COMPLETE ✅ Line Count: < 500 ✅ Progressive Disclosure: 11 resource files ✅