Skip to content

Commit 9ef14d1

Browse files
committed
feat: whatsapp cloud api webhooks
1 parent e753990 commit 9ef14d1

File tree

4 files changed

+36
-4
lines changed

4 files changed

+36
-4
lines changed

src/whatsapp/controllers/webhook.controller.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,13 @@ import { Logger } from '../../config/logger.config';
44
import { BadRequestException } from '../../exceptions';
55
import { InstanceDto } from '../dto/instance.dto';
66
import { WebhookDto } from '../dto/webhook.dto';
7+
import { WAMonitoringService } from '../services/monitor.service';
78
import { WebhookService } from '../services/webhook.service';
89

910
const logger = new Logger('WebhookController');
1011

1112
export class WebhookController {
12-
constructor(private readonly webhookService: WebhookService) {}
13+
constructor(private readonly webhookService: WebhookService, private readonly waMonitor: WAMonitoringService) {}
1314

1415
public async createWebhook(instance: InstanceDto, data: WebhookDto) {
1516
logger.verbose('requested createWebhook from ' + instance.instanceName + ' instance');
@@ -63,4 +64,9 @@ export class WebhookController {
6364
logger.verbose('requested findWebhook from ' + instance.instanceName + ' instance');
6465
return this.webhookService.find(instance);
6566
}
67+
68+
public async receiveWebhook(instance: InstanceDto, data: any) {
69+
logger.verbose('requested receiveWebhook from ' + instance.instanceName + ' instance');
70+
return await this.waMonitor.waInstances[instance.instanceName].connectToWhatsapp(data);
71+
}
6672
}

src/whatsapp/routers/index.router.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ router
5454
.use('/message', new MessageRouter(...guards).router)
5555
.use('/chat', new ChatRouter(...guards).router)
5656
.use('/group', new GroupRouter(...guards).router)
57-
.use('/webhook', new WebhookRouter(...guards).router)
57+
.use('/webhook', new WebhookRouter(configService, ...guards).router)
5858
.use('/chatwoot', new ChatwootRouter(...guards).router)
5959
.use('/settings', new SettingsRouter(...guards).router)
6060
.use('/websocket', new WebsocketRouter(...guards).router)

src/whatsapp/routers/webhook.router.ts

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { RequestHandler, Router } from 'express';
22

3+
import { ConfigService, WaBusiness } from '../../config/env.config';
34
import { Logger } from '../../config/logger.config';
45
import { instanceNameSchema, webhookSchema } from '../../validate/validate.schema';
56
import { RouterBroker } from '../abstract/abstract.router';
@@ -11,7 +12,7 @@ import { HttpStatus } from './index.router';
1112
const logger = new Logger('WebhookRouter');
1213

1314
export class WebhookRouter extends RouterBroker {
14-
constructor(...guards: RequestHandler[]) {
15+
constructor(readonly configService: ConfigService, ...guards: RequestHandler[]) {
1516
super();
1617
this.router
1718
.post(this.routerPath('set'), ...guards, async (req, res) => {
@@ -45,6 +46,31 @@ export class WebhookRouter extends RouterBroker {
4546
});
4647

4748
res.status(HttpStatus.OK).json(response);
49+
})
50+
.post(this.routerPath('whatsapp'), async (req, res) => {
51+
logger.verbose('request received in webhook');
52+
logger.verbose('request body: ');
53+
logger.verbose(req.body);
54+
55+
logger.verbose('request query: ');
56+
logger.verbose(req.query);
57+
const response = await this.dataValidate<InstanceDto>({
58+
request: req,
59+
schema: instanceNameSchema,
60+
ClassRef: InstanceDto,
61+
execute: (instance, data) => webhookController.receiveWebhook(instance, data),
62+
});
63+
64+
res.status(HttpStatus.OK).json(response);
65+
})
66+
.get(this.routerPath('whatsapp'), async (req, res) => {
67+
logger.verbose('request received in webhook');
68+
logger.verbose('request query: ');
69+
logger.verbose(req.query);
70+
if (req.query['hub.verify_token'] === this.configService.get<WaBusiness>('WA_BUSINESS').TOKEN_WEBHOOK)
71+
res.send(req.query['hub.challenge']);
72+
else res.send('Error, wrong validation token');
73+
logger.verbose('Error, wrong validation token');
4874
});
4975
}
5076

src/whatsapp/whatsapp.module.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ export const typebotController = new TypebotController(typebotService);
121121

122122
const webhookService = new WebhookService(waMonitor);
123123

124-
export const webhookController = new WebhookController(webhookService);
124+
export const webhookController = new WebhookController(webhookService, waMonitor);
125125

126126
const websocketService = new WebsocketService(waMonitor);
127127

0 commit comments

Comments
 (0)