A煤n no tienes acceso a esta clase

Crea una cuenta y contin煤a viendo este curso

Extendiendo la documentaci贸n

14/17
Recursos
// src/products/dtos/products.dtos.ts

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

import {
  IsString,
  IsNumber,
  IsUrl,
  IsNotEmpty,
  IsPositive,
} from 'class-validator';
import { PartialType, ApiProperty } from '@nestjs/swagger'; // 馃憟

export class CreateProductDto {
  @IsString()
  @IsNotEmpty()
  @ApiProperty({ description: `product's name` }) // 馃憟
  readonly name: string;

  @IsString()
  @IsNotEmpty()
  @ApiProperty() // 馃憟
  readonly description: string;

  @IsNumber()
  @IsNotEmpty()
  @IsPositive()
  @ApiProperty() // 馃憟
  readonly price: number;

  @IsNumber()
  @IsNotEmpty()
  @ApiProperty() // 馃憟
  readonly stock: number;

  @IsUrl()
  @IsNotEmpty()
  @ApiProperty() // 馃憟
  readonly image: string;
}

export class UpdateProductDto extends PartialType(CreateProductDto) {}
// src/products/controllers/products.controller.ts
import { ApiTags, ApiOperation } from '@nestjs/swagger'; // 馃憟

@ApiTags('products') // 馃憟
@Controller('products')
export class ProductsController {
  constructor(private productsService: ProductsService) {}

  @Get()
  @ApiOperation({ summary: 'List of products' }) // 馃憟
  getProducts(
    @Query('limit') limit = 100,
    @Query('offset') offset = 0,
    @Query('brand') brand: string,
  ) {
    // return {
    //   message: `products limit=> ${limit} offset=> ${offset} brand=> ${brand}`,
    // };
    return this.productsService.findAll();
  }
}
// src/products/controllers/brands.controller.ts
import { ApiTags } from '@nestjs/swagger';


@ApiTags('brands') // 馃憟
@Controller('brands')
export class BrandsController {
  ...
}

Aportes 2

Preguntas 1

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesi贸n.

Se puede extender la documentacion de swagger con muchos decoradores

https://docs.nestjs.com/openapi/introduction

Para los controladores se utiliza:

  • ApiTags: para agrupar los metodos de los controladores
  • ApiOperation para documentar que es lo que hace el metodo
  • Por cada metodo del controlador, se puede documentar las respuestas
  • ApiResponse: se le define el http code status y la descripcion description
    • Se puede extender con decoradores particulares para cada response que viene con su status:
      • ApiOkResponse: http code status 200
      • ApiBadRequestResponse http code status 400
      • ApiForbiddenResponse, http code 403
      • ApiUnauthorizedResponse, http code 401
      • ApiCreatedResponse, http code 201
      • ApiNotFoundResponse, http code 404

Se importa lo siguiente:

import {
  ApiTags,
  ApiOperation,
  ApiBadRequestResponse,
  ApiForbiddenResponse,
  ApiUnauthorizedResponse,
  ApiCreatedResponse,
  ApiNotFoundResponse,
  ApiOkResponse,
} from '@nestjs/swagger';

Y se implelementan los decoradores:

  • Para agrupar
@ApiTags('Users')
@Controller('users')
export class UsersController {
...
  • Para cada metodo, en este caso de un get, aparecia en swager el 200 y 404
@Get()
@ApiOkResponse()
@ApiNotFoundResponse()
findAll() {
  return this.usersService.findAll();
}
  • en el caso de un POST:
@Post()
@ApiOperation({ summary: 'Create user' })
@ApiUnauthorizedResponse({
  description: 'Not Authorized',
})
@ApiBadRequestResponse({
  description: 'bad request',
})
@ApiCreatedResponse({
  description: 'Product created',
})
@ApiForbiddenResponse()
create(@Body() payload: CreateUserDto) {
  return this.usersService.create(payload);
}

Para los DTOs:

Se importa PartialType y ApiProperty

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

export class CreateUserDto {
  @IsString()
  @IsEmail()
  @ApiProperty({ description: 'user email' })
  readonly email: string;

  @IsString()
  @IsNotEmpty()
  @Length(6)
	@ApiProperty({ description: 'password' })
  readonly password: string;

  @IsNotEmpty()
	@ApiProperty({ description: 'role' })
  readonly role: string;
}

export class UpdateUserDto extends PartialType(CreateUserDto) {}

Muy 煤til y me resulta f谩cil de implementar. Que buena manera de explicar!. Muchas gracias Nicolas