es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

NestJS Swagger: Crear múltiples páginas Swagger de tipo ‘público’, ‘privado’, ‘interno’, etc.

Necesito crear múltiples lugares de Swagger para diferentes grupos. Me gustaría poder agregar un decorador a algunos puntos finales, como ‘@Private’, y luego incluir ese punto final en ese swagger específico.

Puedo hacer algo como ‘@ApiExcludeEndpoint()’ para puntos finales individuales, pero esto lo elimina de todos los documentos de Swagger creados.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para crear múltiples ubicaciones de Swagger para diferentes grupos y a la vez incluir selectivamente endpoints en documentos de Swagger específicos, puedes utilizar los decoradores de Swagger en NestJS, tales como @ApiTags() y @ApiOperation().

    Para lograr el resultado deseado, puedes crear un decorador personalizado, llamado @Private(), y aplicarlo a los endpoints que desees incluir en un documento de Swagger específico. Por ejemplo, puedes definir el decorador de la siguiente manera:

    export const Private = () => {
      return (target, key, descriptor) => {
        // Establecer metadatos para el endpoint privado
        ApiTags('Private')(target, key, descriptor);
        // También se pueden establecer otros metadatos utilizando otros decoradores, por ejemplo, @ApiBearerAuth()
        // por ejemplo, ApiBearerAuth('jwt')(target, key, descriptor);
      };
    };
    

    Luego, puedes utilizar este decorador en los métodos de los endpoints de tu controlador que deben ser incluidos en un documento de Swagger específico, de la siguiente manera:

    @Private()
    @Get('/private')
    async getPrivateData() {
      // ...
    }
    

    En el archivo swagger.module.ts, puedes definir diferentes opciones y configuraciones de Swagger para diferentes grupos, cada uno con sus respectivos endpoints decorados con @Private().

    Por ejemplo, puedes definir una configuración de módulo de Swagger para un grupo público con endpoints que son accesibles para todos los usuarios, y otra configuración de módulo de Swagger para un grupo privado con endpoints que requieren autenticación y control de acceso.

    @Module({
      imports: [SwaggerModule],
    })
    export class AppModule {
      // Definir opciones de Swagger para grupos público y privado
      const publicSwaggerOptions = new DocumentBuilder()
        .setTitle('API Pública')
        .build();
    
      const privateSwaggerOptions = new DocumentBuilder()
        .setTitle('API Privada')
        // También se pueden establecer otras opciones y personalizaciones, por ejemplo, addSecurity() para JWT
        // .addBearerAuth()
        .build();
    
      const publicSwaggerDoc = SwaggerModule.createDocument(app, publicSwaggerOptions, {
        include: [PublicController],
      });
    
      const privateSwaggerDoc = SwaggerModule.createDocument(app, privateSwaggerOptions, {
        include: [PrivateController],
      });
    
      // Crear diferentes endpoints de Swagger para diferentes grupos
      SwaggerModule.setup('public-docs', app, publicSwaggerDoc);
      SwaggerModule.setup('private-docs', app, privateSwaggerDoc);
    }
    

    Con esta configuración, los métodos de endpoint decorados con @Private() solo se incluirán en el PrivateController y el privateSwaggerDoc, mientras que los métodos de endpoint no decorados se incluirán en ambos documentos de Swagger.

    Luego, puedes acceder a los endpoints de Swagger para cada grupo utilizando sus respectivas URL, de la siguiente manera:

    • `http://localhost:3000/public-docs` para los documentos de Swagger públicos
    • `http://localhost:3000/private-docs` para los documentos de Swagger privados

    En resumen, para crear múltiples ubicaciones de Swagger para diferentes grupos y a la vez incluir selectivamente endpoints en documentos de Swagger específicos, puedes crear un decorador personalizado, aplicarlo a los endpoints que deseas incluir en un documento de Swagger específico y definir diferentes opciones y configuraciones de Swagger para diferentes grupos, cada uno con sus respectivos endpoints decorados con el decorador personalizado.

Comments are closed.