Есть ли способ скрыть все конечные точки в controller.ts с помощью одного декоратора?

#nestjs #nestjs-swagger

#nestjs #nestjs-развязность

Вопрос:

В настоящее время я использую @ApiExcludeEndpoint() ### поверх всех методов, чтобы скрыть конечную точку в пользовательском интерфейсе swagger, например:

 import { Controller, Get, Query, Param } from '@nestjs/common';
import { ResourceService } from './resource.service';
import { Auth } from 'src/auth/auth.decorator';
import {
  ApiTags,
  ApiSecurity,
  ApiOkResponse,
  ApiForbiddenResponse,
  ApiCreatedResponse,
  ApiExcludeEndpoint
} from '@nestjs/swagger';


@Controller()
@ApiTags('Resources')
@ApiSecurity('apiKey')
export class ResourceController {
  constructor(private readonly resourceService: ResourceService) {}

  @Get('get_url')
  @ApiExcludeEndpoint()
  @Get()
  @ApiOkResponse({
    description: 'Resources list has succesfully been returned',
  })
  @ApiForbiddenResponse({ description: 'You are not allowed' })
  @Auth(...common_privileges)
  findAll(@Query() query: any): any {
    ......
  }

  
  @Get('get_url/:id')
  @ApiExcludeEndpoint()
  @ApiOkResponse({ description: 'Resource has succesfully been returned' })
  @ApiForbiddenResponse({ description: 'You are not allowed' })
  @Auth(...common_privileges)
  findById(@Param('id') id: string, @Query() query: any): any {
    ......
  }

} 

Мне нужно знать, есть ли способ скрыть все конечные точки в контроллере с помощью одного декоратора, я проверил некоторые документы, в которых говорится об использовании @ApiIgnore() и @Hidden(), но я не могу найти их в nestjs-swagger. Пожалуйста, прокомментируйте это

Ответ №1:

Одна из возможностей — явно включить модули, которые вы хотели бы включить в документы swagger, вместо того, чтобы просто «включать все модули» по умолчанию. Пример:

   const options = new DocumentBuilder()
    .setTitle('Cats example')
    .setDescription('The cats API description')
    .setVersion('1.0')
    .addTag('cats')
    .build();

  const catDocument = SwaggerModule.createDocument(app, options, {
    include: [LionsModule, TigersModule], // don't include, say, BearsModule
  });
  SwaggerModule.setup('api/cats', app, catDocument);
 

Без явного include:[] свойства, LionsModule , TigersModule , и BearsModule будет автоматически включено.

Ответ №2:

Чтобы скрыть всю конечную точку в controller.ts, вы должны использовать ApiExcludeController вместо ApiExcludeEndpoint, как в примере.

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

 import { Controller, Get, Query, Param } from '@nestjs/common';
import { ResourceService } from './resource.service';
import { Auth } from 'src/auth/auth.decorator';
import {
  ApiTags,
  ApiSecurity,
  ApiOkResponse,
  ApiForbiddenResponse,
  ApiCreatedResponse,
  ApiExcludeController
  // ApiExcludeEndpoint
} from '@nestjs/swagger';


@Controller()
@ApiTags('Resources')
@ApiSecurity('apiKey')
@ApiExcludeController()
export class ResourceController {
  constructor(private readonly resourceService: ResourceService) {}

  @Get('get_url')
 // @ApiExcludeEndpoint()
  @Get()
  @ApiOkResponse({
    description: 'Resources list has succesfully been returned',
  })
  @ApiForbiddenResponse({ description: 'You are not allowed' })
  @Auth(...common_privileges)
  findAll(@Query() query: any): any {
    ......
  }

  
  @Get('get_url/:id')
 // @ApiExcludeEndpoint()
  @ApiOkResponse({ description: 'Resource has succesfully been returned' })
  @ApiForbiddenResponse({ description: 'You are not allowed' })
  @Auth(...common_privileges)
  findById(@Param('id') id: string, @Query() query: any): any {
    ......
  }

}