import { INestApplication } from '@nestjs/common'; import { DocumentBuilder, OpenAPIObject, SwaggerModule } from '@nestjs/swagger'; import { DECORATORS } from '@nestjs/swagger/dist/constants'; import { WhatsappConfigService } from '../config.service'; import { VERSION } from '../version'; export class SwaggerModuleCore { configure(app: INestApplication, webhooks: any[]) { const builder = new DocumentBuilder(); builder .setTitle('WAHA - WhatsApp HTTP API') .setDescription( 'WhatsApp HTTP API that you can run in a click!
' + '' + '
' + 'Support the project and get WAHA Plus version!' + '', ) .setExternalDoc('WAHA', 'https://waha.devlike.pro/') .setVersion(VERSION.version) .addTag('sessions', 'Control WhatsApp sessions') .addTag('auth', 'Authentication') .addTag('screenshot', 'Get screenshot of WhatsApp and show QR code') .addTag('chatting', 'Chatting methods') .addTag( 'status', 'Status (aka stories) methods. NOWEB engine only!', ) .addTag('chats', `Chats methods`) .addTag( 'contacts', `Contacts methods.
Use phone number (without +) or phone number and \`@c.us\` at the end as \`contactId\`.
'E.g: \`12312312310\` OR \`12312312310@c.us\`
`, ) .addTag('groups', `Groups methods.
`) .addTag('presence', `Presence information`) .addTag('other', 'Other methods') .addApiKey({ type: 'apiKey', description: 'Your secret api key', name: 'X-Api-Key', }); const config = app.get(WhatsappConfigService); if (config.getSwaggerAdvancedConfigEnabled()) { builder.addServer('{protocol}://{host}:{port}/{baseUrl}', '', { protocol: { default: 'http', enum: ['http', 'https'], description: 'The protocol used to access the server.', }, host: { default: config.hostname, description: 'The hostname or IP address of the server.', }, port: { default: config.port, description: 'The port number on which the server is listening for requests', }, baseUrl: { default: '', description: 'The base URL path for all API endpoints. This can be used to group related endpoints together under a common path.', }, }); } const swaggerDocumentConfig = builder.build(); const swaggerDocumentOptions = { extraModels: webhooks, }; let document = SwaggerModule.createDocument( app, swaggerDocumentConfig, swaggerDocumentOptions, ); document = this.configureWebhooks(document, webhooks); SwaggerModule.setup('', app, document, { customSiteTitle: 'WAHA - WhatsApp HTTP API', }); } private configureWebhooks(document: OpenAPIObject, supportedWebhooks) { document.openapi = '3.1.0'; const webhooks = {}; for (const webhook of supportedWebhooks) { const eventMetadata = Reflect.getMetadata( DECORATORS.API_MODEL_PROPERTIES, webhook.prototype, 'event', ); const event = new webhook().event; const schemaName = webhook.name; webhooks[event] = { post: { summary: eventMetadata.description, requestBody: { content: { 'application/json': { schema: { $ref: `#/components/schemas/${schemaName}`, }, }, }, }, responses: { '200': { description: 'Return a 200 status to indicate that the data was received successfully', }, }, }, }; } // @ts-ignore document.webhooks = webhooks; return document; } }