Поддерживает ли nestjs/swagger документацию по параметрам запроса, если они не используются отдельно?
Я определяю маршрут для получения результатов заказов с разбивкой на страницы в моем контроллере.
@Get()
async find(
@Query(new ValidationPipe({ whitelist: true }))
query: OrderQueryDto & PaginatedQueryDto,
) {
const builder = this.orderRepository
.createQueryBuilder('order')
.select('order.id')
.take(query.take)
.skip(query.skip)
.andWhere('order.status != "deleted"');
if (query.status) {
builder.andWhere('order.status = :status');
}
const [items, count] = await builder.getManyAndCount();
return { items, count };
}
Однако я хотел бы иметь некоторую документацию о параметрах запроса (типа OrderQueryDto & PaginatedQueryDto
). Я не обнаружил никакого декоратора, который создает документацию (и тестовые поля) для описания api, генерируемого модулем nest swagger.
Я думаю, что ищу что-то вроде @ApiImplicityQueryString({ type: OrderQueryDto & PaginatedQueryDto })
.
Я знаю, что есть способ задокументировать это так:
@Get()
@ApiImplicitQuery({
name: 'take',
required: false,
type: Number,
})
@ApiImplicitQuery({
name: 'skip',
required: false,
type: Number,
})
// And all the other decorators for the remaining properties on OrderQueryDto [...]
async find(
@Query(new ValidationPipe({ whitelist: true }))
query: OrderQueryDto & PaginatedQueryDto,
) {
const builder = this.orderRepository
.createQueryBuilder('order')
.select('order.id')
.take(query.take)
.skip(query.skip)
.andWhere('order.status != "deleted"');
if (query.status) {
builder.andWhere('order.status = :status');
}
const [items, count] = await builder.getManyAndCount();
return { items, count };
}
Кстати, DTO выглядят так
import { Transform } from 'class-transformer';
import { IsInt, IsOptional } from 'class-validator';
export class PaginatedQueryDto {
@IsInt()
@IsOptional()
@Transform(value => value && parseInt(value, 10))
take?: number;
@IsInt()
@IsOptional()
@Transform(value => value && parseInt(value, 10))
skip?: number;
}
import { IsInt, IsOptional, IsEnum } from 'class-validator';
import { Transform } from 'class-transformer';
import { OrderStatus } from './order.entity';
export class OrderQueryDto {
@IsInt()
@IsOptional()
@Transform(value => value && parseInt(value, 10))
reseller: number;
@IsInt()
@IsOptional()
@Transform(value => value && parseInt(value, 10))
customer: number;
@IsEnum(OrderStatus)
@IsOptional()
status: OrderStatus;
}
2 ответа
если вы хотите использовать параметр запроса DTO вnest.js, вам нужно будет определить его в контроллере как любимый.
@Get()
@ApiQuery({ type: YourDTO})
Добавлять
@ApiTags('ports')
к контроллеру. Наберите код
контролер
import { Body, Controller, Get, Param, Post, Query } from '@nestjs/common';
import { PaginationQuery } from './pagination-query.dto';
import {
ApiBearerAuth,
ApiConsumes,
ApiExtension,
ApiHeader,
ApiOperation,
ApiQuery,
ApiResponse,
ApiSecurity,
ApiTags
} from '@nestjs/swagger'
@ApiTags('ports')
@Controller('port')
export class PortController {
@Get()
findAll(@Query() paginationQuery: PaginationQuery) {}
}
PaginationQuery
import { ApiProperty } from '@nestjs/swagger';
export enum LettersEnum {
A = 'A',
B = 'B',
C = 'C'
}
export class PaginationQuery {
@ApiProperty({
minimum: 0,
maximum: 10000,
title: 'Page',
exclusiveMaximum: true,
exclusiveMinimum: true,
format: 'int32',
default: 0
})
page: number;
@ApiProperty({
name: '_sortBy'
})
sortBy: string[];
@ApiProperty()
limit: number;
@ApiProperty({
enum: LettersEnum,
enumName: 'LettersEnum'
})
enum: LettersEnum;
@ApiProperty({
enum: LettersEnum,
enumName: 'LettersEnum',
isArray: true
})
enumArr: LettersEnum;
@ApiProperty()
beforeDate: Date;
@ApiProperty({
type: 'object',
additionalProperties: true
})
filter: Record<string, any>;
static _OPENAPI_METADATA_FACTORY() {
return {
sortBy: { type: () => [String] }
};
}
}