Поддерживает ли nestjs / swagger документирование параметров запроса, если они не используются отдельно? - PullRequest
0 голосов
/ 05 января 2020

Я определяю маршрут для получения постраничного результата заказов в моем контроллере.

@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, которое генерируется модулем swestger.

Я думаю, что ищу что-то вроде @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;
}
...