> nestjs-controllers-services
Separate Controllers from Services and build Custom Decorators in NestJS. Use when defining NestJS controllers, services, or custom parameter decorators. (triggers: **/*.controller.ts, **/*.service.ts, Controller, Injectable, ExecutionContext, createParamDecorator)
curl "https://skillshub.wtf/HoangNguyen0403/agent-skills-standard/nestjs-controllers-services?format=md"NestJS Controllers & Services Standards
Priority: P0 (FOUNDATIONAL)
Layer separation standards and dependency injection patterns for NestJS applications.
Controllers
-
Role: Handler only. Delegate all logic to Services.
-
Context: Use
ExecutionContexthelpers (switchToHttp()) for platform-agnostic code. -
Custom Decorators:
- Avoid:
@Request() req->req.user(Not type-safe). - Pattern: Create typed decorators like
@CurrentUser(),@DeviceIp().
import { RequestWithUser } from 'src/common/interfaces/request.interface'; export const CurrentUser = createParamDecorator( (data: unknown, ctx: ExecutionContext): User => { const request = ctx.switchToHttp().getRequest<RequestWithUser>(); return request.user; }, ); - Avoid:
DTOs & Validation
- Strictness:
whitelist: true: Strip properties without decorators.- Critical:
forbidNonWhitelisted: true: Throw error if unknown properties exist.
- Transformation:
transform: true: Auto-convert primitives (String '1' -> Number 1) and instantiate DTO classes.
- Documentation:
- Automation: Use the
@nestjs/swaggerCLI plugin (nest-cli.json) to auto-detect DTO properties without manual@ApiProperty()tags.
- Automation: Use the
Interceptors (Response Mapping)
- Standardization: specific responses should be mapped in Interceptors, not Controllers.
- Use
map()to wrap success responses (e.g.{ data: T }). - Refer to API Standards for
PageDtoandApiResponse. - Use
catchError()to map low-level errors (DB constraints) toHttpException(e.g.ConflictException) before they hit the global filter.
- Use
Services & Business Logic
- Singleton: Default.
- Stateless: Do not store request-specific state in class properties unless identifying as
Scope.REQUEST.
Pipes & Validation
- Global: Register
ValidationPipeglobally. - Route Params: Fail fast. Always use
ParseIntPipe,ParseUUIDPipeon all ID parameters.
@Get(':id')
findOne(@Param('id', ParseIntPipe) id: number) { ... }
Lifecycle Events
- Init: Use
OnModuleInitfor connection setup. - Destroy: Use
OnApplicationShutdownfor cleanup. (RequiresenableShutdownHooks()).
Anti-Patterns
- No business logic in controllers: Delegate everything to Services; controllers only parse and respond.
- No req.user access: Create typed
@CurrentUser()decorator instead of accessing rawreq. - No REQUEST scope by default: Use SINGLETON; it makes the entire injection chain request-scoped.
> related_skills --same-repo
> common-store-changelog
Generate user-facing release notes for the Apple App Store and Google Play Store by collecting git history, triaging user-impacting changes, and drafting store-compliant changelogs. Enforces character limits (App Store ≤4000, Google Play ≤500), tone, and bullet format. Use when generating release notes, app store changelog, play store release, what's new, or version release notes for any mobile app. (triggers: generate changelog, app store notes, play store release, what's new, release notes, ve
> golang-tooling
Go developer toolchain — gopls LSP diagnostics, linting, formatting, and vet. Use when setting up Go tooling, running linters, or integrating gopls with Claude Code. (triggers: gopls, golangci-lint, golangci.yml, go vet, goimports, staticcheck, go tooling, go lint)
> common-ui-design
Design distinctive, production-grade frontend UI with bold aesthetic choices. Use when building web components, pages, interfaces, dashboards, or applications in any framework (React, Next.js, Angular, Vue, HTML/CSS). (triggers: build a page, create a component, design a dashboard, landing page, UI for, build a layout, make it look good, improve the design, build UI, create interface, design screen)
> common-owasp
OWASP Top 10 audit checklist for Web Applications (2021) and APIs (2023). Load during any security review, PR review, or codebase audit touching web, mobile backend, or API code. (triggers: security review, OWASP, broken access control, IDOR, BOLA, injection, broken auth, API review, authorization, access control)