Daniil Sinelnik
Daniil Sinelnik

Reputation: 314

How to avoid to write `@ApiProperty()` in each dto for NestJs-swagger

I'm researching the way on how to avoid to specify @ApiProperty() in each dto.

I know there is exist a way to create file nest-cli.json, and if you specify Promise<DTO> in your controller in nest-swagger it will produce the output dto from the route.

The structure looks like this:

nest-cli.json

{
  "collection": "@nestjs/schematics",
  "sourceRoot": "src",
  "compilerOptions": {
    "plugins": [
      {
        "name": "@nestjs/swagger",
        "options": {
          "introspectComments": true
        }
      }
    ]
  }
}

controller.ts

@Get()
  async getMonitors (): Promise<OutputMonitorsDto> { // <-- Here is my outputDto
    return this.monitorsService.getMonitors()
  }

And in swagger it shows something like this: enter image description here

However, is there any way to setup NestJs to have the same things with inputDTO and not to write in each dto @ApiProperty?

As in example below:

ExampleDto.ts

export class GetListUsersDto {
  @ApiProperty()
  @IsString()
  name: string
  @ApiProperty()
  @IsString()
  email: string
  @ApiProperty()
  @IsString()
  publicApiKey: string
  @ApiProperty()
  @IsBoolean()
  isAdmin: boolean
  @ApiProperty()
  @IsBoolean()
  isDesigner: boolean
  @ApiProperty()
  @IsBoolean()
  isEditor: boolean
  @ApiProperty()
  @IsBoolean()
  isEnabled: boolean
  @ApiProperty()
  @IsString()
  boughtProduct: string
}

And only after @ApiProperty it will show the structure as shown above for input in swagger.

Upvotes: 11

Views: 17390

Answers (5)

princecharmx
princecharmx

Reputation: 181

Simply adding this in your dto file will auto apply for all properties

import { ApiProperty } from '@nestjs/swagger';

Magic will happen to wherever you need it. Hope this helps.

Upvotes: -1

jmchey
jmchey

Reputation: 33

Note that using

Using the plugin resolved this issue for me, see https://docs.nestjs.com/openapi/cli-plugin#using-the-cli-plugin.

your DTO file should be named <my_dto_name>.dto.ts

Upvotes: 0

ttemple
ttemple

Reputation: 1985

Using the plugin resolved this issue for me, see https://docs.nestjs.com/openapi/cli-plugin#using-the-cli-plugin.

To enable the plugin, open nest-cli.json (if you use Nest CLI) and add the following plugins configuration:

{
  "collection": "@nestjs/schematics",
  "sourceRoot": "src",
  "compilerOptions": {
    "plugins": ["@nestjs/swagger"]
  }
}

Then this will automatically apply the @ApiProperty() without having to add it

export class CreateUserDto {
  email: string;
  password: string;
  roles: RoleEnum[] = [];
  @IsOptional()
  isEnabled?: boolean = true;
}

Upvotes: 8

Deivy Gutierrez
Deivy Gutierrez

Reputation: 71

If you are using cli-plugin you don't need to add @ApiProperty. Check docs openapi/cli-plugin

try this

export class CreateUserDto {
  email: string;
  password: string;
  roles: RoleEnum[] = [];
  @IsOptional()
  isEnabled?: boolean = true;
}

Upvotes: 7

Antoine Viscardi
Antoine Viscardi

Reputation: 890

There is no way around decorating your DTO properties. However, if your DTOs have a lot in common, you might be looking for mapped types. Documentation can be found here.

These essentially allow you to transform existing types to keep your DTOs DRY.

Upvotes: 7

Related Questions