Controllers
Controllers in NestJS CRUD Automator are automatically generated based on your configuration. The @ApiController
decorator transforms a simple controller class into a fully functional CRUD API with all necessary endpoints, DTOs, and Swagger documentation.
Basic Controller Setup
The minimal controller configuration requires only an entity and service:
import { Controller } from "@nestjs/common";
import { ApiController, EApiRouteType } from "@elsikora/nestjs-crud-automator";
import { UserEntity } from "./user.entity";
import { UserService } from "./user.service";
@Controller("users")
@ApiController<UserEntity>({
entity: UserEntity,
name: "Users",
routes: {
[EApiRouteType.CREATE]: {},
[EApiRouteType.GET]: {},
[EApiRouteType.GET_LIST]: {},
[EApiRouteType.UPDATE]: {},
[EApiRouteType.DELETE]: {},
},
})
export class UserController {
constructor(public service: UserService) {}
}
This generates the following endpoints:
POST /users
- Create a new userGET /users/:id
- Get a user by IDGET /users
- Get a paginated list of usersPATCH /users/:id
- Update a userDELETE /users/:id
- Delete a user
Route Configuration
Enabling and Disabling Routes
Control which routes are available:
@ApiController<UserEntity>({
entity: UserEntity,
name: "Users",
routes: {
[EApiRouteType.CREATE]: {},
[EApiRouteType.GET]: {},
[EApiRouteType.GET_LIST]: {},
// UPDATE and DELETE routes are not configured, so they are disabled
},
})
Or explicitly disable a route:
routes: {
[EApiRouteType.DELETE]: {
isEnabled: false,
},
}
Custom Path
Override the default controller path:
@Controller("api/v1/users")
@ApiController<UserEntity>({
entity: UserEntity,
path: "api/v1/users", // Custom path
name: "Users",
routes: { /* ... */ },
})
Authentication and Authorization
Add authentication guards to specific routes:
import { JwtAuthGuard } from "../auth/guards/jwt-auth.guard";
@ApiController<UserEntity>({
entity: UserEntity,
name: "Users",
routes: {
[EApiRouteType.CREATE]: {
authentication: {
guard: JwtAuthGuard,
bearerStrategies: ["jwt"],
},
},
[EApiRouteType.UPDATE]: {
authentication: {
guard: JwtAuthGuard,
bearerStrategies: ["jwt"],
},
},
[EApiRouteType.DELETE]: {
authentication: {
guard: JwtAuthGuard,
bearerStrategies: ["jwt"],
},
},
[EApiRouteType.GET]: {}, // Public
[EApiRouteType.GET_LIST]: {}, // Public
},
})
Request Transformers
Automatically transform request data before processing:
import {
EApiControllerRequestTransformerType,
TRANSFORMER_VALUE_DTO_CONSTANT
} from "@elsikora/nestjs-crud-automator";
@ApiController<PostEntity>({
entity: PostEntity,
routes: {
[EApiRouteType.CREATE]: {
request: {
transformers: {
[EApiDtoType.BODY]: [
{
key: "authorId",
type: EApiControllerRequestTransformerType.DYNAMIC,
value: TRANSFORMER_VALUE_DTO_CONSTANT.AUTHORIZED_ENTITY,
shouldSetValueEvenIfMissing: true,
},
{
key: "createdAt",
type: EApiControllerRequestTransformerType.STATIC,
value: () => new Date(),
},
],
},
},
},
},
})
Transformer types:
STATIC
- Set a constant valueDYNAMIC
- Extract value from request context (authenticated user, headers, IP)
Response Transformers
Transform response data before returning to client:
routes: {
[EApiRouteType.GET]: {
response: {
transformers: [
{
key: "fullName",
value: (entity) => `${entity.firstName} ${entity.lastName}`,
},
],
},
},
}
Loading Relations
Configure automatic relation loading:
import { EApiControllerLoadRelationsStrategy } from "@elsikora/nestjs-crud-automator";
@ApiController<PostEntity>({
entity: PostEntity,
routes: {
[EApiRouteType.GET]: {
request: {
relations: {
shouldLoadRelations: true,
relationsLoadStrategy: EApiControllerLoadRelationsStrategy.AUTO,
servicesLoadStrategy: EApiControllerLoadRelationsStrategy.AUTO,
relationsToLoad: ["author", "comments"],
},
},
response: {
relations: ["author", "comments"],
},
},
},
})
export class PostController {
constructor(
public service: PostService,
// Inject related services for loading
public authorService: UserService,
public commentsService: CommentService,
) {}
}
Strategies:
AUTO
- Automatically detect and load relationsMANUAL
- Explicitly specify which relations to load
Custom DTOs
Replace auto-generated DTOs with custom ones:
import { CreateUserDto } from "./dto/create-user.dto";
import { UpdateUserDto } from "./dto/update-user.dto";
import { UserResponseDto } from "./dto/user-response.dto";
@ApiController<UserEntity>({
entity: UserEntity,
routes: {
[EApiRouteType.CREATE]: {
dto: {
body: CreateUserDto,
response: UserResponseDto,
},
},
[EApiRouteType.UPDATE]: {
dto: {
body: UpdateUserDto,
response: UserResponseDto,
},
},
},
})
Auto DTO Configuration
Customize auto-generated DTOs:
import {
AllOrNoneOfListedPropertiesValidator
} from "@elsikora/nestjs-crud-automator";
@ApiController<UserEntity>({
entity: UserEntity,
routes: {
[EApiRouteType.CREATE]: {
autoDto: {
[EApiDtoType.BODY]: {
validators: [
{
constraintClass: AllOrNoneOfListedPropertiesValidator,
options: ["firstName", "lastName"],
},
],
},
},
},
},
})
Request Validation
Add custom request validators:
routes: {
[EApiRouteType.CREATE]: {
request: {
validators: [
{
constraintClass: CustomValidator,
options: ["field1", "field2"],
},
],
},
},
}
Swagger Configuration
Customize Swagger documentation:
routes: {
[EApiRouteType.CREATE]: {
swagger: {
summary: "Create a new user",
description: "Creates a new user with the provided data",
tags: ["Users", "Admin"],
},
},
}
Custom Decorators
Add additional decorators to routes:
import { UseInterceptors } from "@nestjs/common";
import { FileInterceptor } from "@nestjs/platform-express";
routes: {
[EApiRouteType.CREATE]: {
decorators: [
UseInterceptors(FileInterceptor('avatar')),
],
},
}
Observable Controllers
Enable subscriber hooks by marking the controller as observable:
import {
ApiController,
ApiControllerObservable
} from "@elsikora/nestjs-crud-automator";
@Controller("posts")
@ApiController({ /* ... */ })
@ApiControllerObservable()
export class PostController {
constructor(public service: PostService) {}
}
Next Steps
- Services - Configure service layer
- DTOs - Understand DTO generation
- Authentication - Implement auth guards
- Subscriber System - Add hooks to intercept operations