From 9ef14d11f8984fe0dc05c066cc2f3704cfcbdc89 Mon Sep 17 00:00:00 2001 From: Davidson Gomes Date: Sat, 17 Feb 2024 18:02:00 -0300 Subject: [PATCH] feat: whatsapp cloud api webhooks --- .../controllers/webhook.controller.ts | 8 +++++- src/whatsapp/routers/index.router.ts | 2 +- src/whatsapp/routers/webhook.router.ts | 28 ++++++++++++++++++- src/whatsapp/whatsapp.module.ts | 2 +- 4 files changed, 36 insertions(+), 4 deletions(-) diff --git a/src/whatsapp/controllers/webhook.controller.ts b/src/whatsapp/controllers/webhook.controller.ts index 0b591cc3..660d9235 100644 --- a/src/whatsapp/controllers/webhook.controller.ts +++ b/src/whatsapp/controllers/webhook.controller.ts @@ -4,12 +4,13 @@ import { Logger } from '../../config/logger.config'; import { BadRequestException } from '../../exceptions'; import { InstanceDto } from '../dto/instance.dto'; import { WebhookDto } from '../dto/webhook.dto'; +import { WAMonitoringService } from '../services/monitor.service'; import { WebhookService } from '../services/webhook.service'; const logger = new Logger('WebhookController'); export class WebhookController { - constructor(private readonly webhookService: WebhookService) {} + constructor(private readonly webhookService: WebhookService, private readonly waMonitor: WAMonitoringService) {} public async createWebhook(instance: InstanceDto, data: WebhookDto) { logger.verbose('requested createWebhook from ' + instance.instanceName + ' instance'); @@ -63,4 +64,9 @@ export class WebhookController { logger.verbose('requested findWebhook from ' + instance.instanceName + ' instance'); return this.webhookService.find(instance); } + + public async receiveWebhook(instance: InstanceDto, data: any) { + logger.verbose('requested receiveWebhook from ' + instance.instanceName + ' instance'); + return await this.waMonitor.waInstances[instance.instanceName].connectToWhatsapp(data); + } } diff --git a/src/whatsapp/routers/index.router.ts b/src/whatsapp/routers/index.router.ts index 33cf94c9..51460339 100644 --- a/src/whatsapp/routers/index.router.ts +++ b/src/whatsapp/routers/index.router.ts @@ -54,7 +54,7 @@ router .use('/message', new MessageRouter(...guards).router) .use('/chat', new ChatRouter(...guards).router) .use('/group', new GroupRouter(...guards).router) - .use('/webhook', new WebhookRouter(...guards).router) + .use('/webhook', new WebhookRouter(configService, ...guards).router) .use('/chatwoot', new ChatwootRouter(...guards).router) .use('/settings', new SettingsRouter(...guards).router) .use('/websocket', new WebsocketRouter(...guards).router) diff --git a/src/whatsapp/routers/webhook.router.ts b/src/whatsapp/routers/webhook.router.ts index 835d6014..255b6ac5 100644 --- a/src/whatsapp/routers/webhook.router.ts +++ b/src/whatsapp/routers/webhook.router.ts @@ -1,5 +1,6 @@ import { RequestHandler, Router } from 'express'; +import { ConfigService, WaBusiness } from '../../config/env.config'; import { Logger } from '../../config/logger.config'; import { instanceNameSchema, webhookSchema } from '../../validate/validate.schema'; import { RouterBroker } from '../abstract/abstract.router'; @@ -11,7 +12,7 @@ import { HttpStatus } from './index.router'; const logger = new Logger('WebhookRouter'); export class WebhookRouter extends RouterBroker { - constructor(...guards: RequestHandler[]) { + constructor(readonly configService: ConfigService, ...guards: RequestHandler[]) { super(); this.router .post(this.routerPath('set'), ...guards, async (req, res) => { @@ -45,6 +46,31 @@ export class WebhookRouter extends RouterBroker { }); res.status(HttpStatus.OK).json(response); + }) + .post(this.routerPath('whatsapp'), async (req, res) => { + logger.verbose('request received in webhook'); + logger.verbose('request body: '); + logger.verbose(req.body); + + logger.verbose('request query: '); + logger.verbose(req.query); + const response = await this.dataValidate({ + request: req, + schema: instanceNameSchema, + ClassRef: InstanceDto, + execute: (instance, data) => webhookController.receiveWebhook(instance, data), + }); + + res.status(HttpStatus.OK).json(response); + }) + .get(this.routerPath('whatsapp'), async (req, res) => { + logger.verbose('request received in webhook'); + logger.verbose('request query: '); + logger.verbose(req.query); + if (req.query['hub.verify_token'] === this.configService.get('WA_BUSINESS').TOKEN_WEBHOOK) + res.send(req.query['hub.challenge']); + else res.send('Error, wrong validation token'); + logger.verbose('Error, wrong validation token'); }); } diff --git a/src/whatsapp/whatsapp.module.ts b/src/whatsapp/whatsapp.module.ts index 9fa18991..3b195524 100644 --- a/src/whatsapp/whatsapp.module.ts +++ b/src/whatsapp/whatsapp.module.ts @@ -121,7 +121,7 @@ export const typebotController = new TypebotController(typebotService); const webhookService = new WebhookService(waMonitor); -export const webhookController = new WebhookController(webhookService); +export const webhookController = new WebhookController(webhookService, waMonitor); const websocketService = new WebsocketService(waMonitor);