From 0116bc4c9fb7c3107dba168426a6817c09014ca3 Mon Sep 17 00:00:00 2001 From: Josias Maceda Date: Tue, 9 Sep 2025 11:49:13 -0300 Subject: [PATCH 1/2] fix: integrate Typebot status change events for webhook in chatbot controller and service --- .../chatbot/base-chatbot.controller.ts | 27 ++++++++- .../typebot/services/typebot.service.ts | 55 ++++++++++++++++++- 2 files changed, 76 insertions(+), 6 deletions(-) diff --git a/src/api/integrations/chatbot/base-chatbot.controller.ts b/src/api/integrations/chatbot/base-chatbot.controller.ts index 3a472cd8..d6abfd8d 100644 --- a/src/api/integrations/chatbot/base-chatbot.controller.ts +++ b/src/api/integrations/chatbot/base-chatbot.controller.ts @@ -9,6 +9,7 @@ import { getConversationMessage } from '@utils/getConversationMessage'; import { BaseChatbotDto } from './base-chatbot.dto'; import { ChatbotController, ChatbotControllerInterface, EmitData } from './chatbot.controller'; +import { Events } from '@api/types/wa.types'; // Common settings interface for all chatbot integrations export interface ChatbotSettings { @@ -58,7 +59,7 @@ export abstract class BaseChatbotController { - private openaiService: OpenaiService; - + private openaiService: OpenaiService; + constructor( waMonitor: WAMonitoringService, configService: ConfigService, @@ -19,7 +20,7 @@ export class TypebotService extends BaseChatbotService { openaiService: OpenaiService, ) { super(waMonitor, prismaRepository, 'TypebotService', configService); - this.openaiService = openaiService; + this.openaiService = openaiService; } /** @@ -151,6 +152,14 @@ export class TypebotService extends BaseChatbotService { }, }); } + + const typebotData = { + remoteJid: data.remoteJid, + status: 'opened', + session, + }; + this.waMonitor.waInstances[instance.name].sendDataWebhook(Events.TYPEBOT_CHANGE_STATUS, typebotData); + return { ...request.data, session }; } catch (error) { this.logger.error(error); @@ -399,12 +408,14 @@ export class TypebotService extends BaseChatbotService { }, }); } else { + let statusChange = 'closed'; if (!settings?.keepOpen) { await prismaRepository.integrationSession.deleteMany({ where: { id: session.id, }, }); + statusChange = 'delete'; } else { await prismaRepository.integrationSession.update({ where: { @@ -415,6 +426,14 @@ export class TypebotService extends BaseChatbotService { }, }); } + + const typebotData = { + remoteJid: session.remoteJid, + status: statusChange, + session, + }; + instance.sendDataWebhook(Events.TYPEBOT_CHANGE_STATUS, typebotData); + } } @@ -639,6 +658,7 @@ export class TypebotService extends BaseChatbotService { } if (keywordFinish && content.toLowerCase() === keywordFinish.toLowerCase()) { + let statusChange = 'closed'; if (keepOpen) { await this.prismaRepository.integrationSession.update({ where: { @@ -649,6 +669,7 @@ export class TypebotService extends BaseChatbotService { }, }); } else { + statusChange = 'delete'; await this.prismaRepository.integrationSession.deleteMany({ where: { botId: findTypebot.id, @@ -656,6 +677,14 @@ export class TypebotService extends BaseChatbotService { }, }); } + + const typebotData = { + remoteJid: remoteJid, + status: statusChange, + session, + }; + waInstance.sendDataWebhook(Events.TYPEBOT_CHANGE_STATUS, typebotData); + return; } @@ -788,6 +817,7 @@ export class TypebotService extends BaseChatbotService { } if (keywordFinish && content.toLowerCase() === keywordFinish.toLowerCase()) { + let statusChange = 'closed'; if (keepOpen) { await this.prismaRepository.integrationSession.update({ where: { @@ -798,6 +828,7 @@ export class TypebotService extends BaseChatbotService { }, }); } else { + statusChange = 'delete'; await this.prismaRepository.integrationSession.deleteMany({ where: { botId: findTypebot.id, @@ -805,6 +836,13 @@ export class TypebotService extends BaseChatbotService { }, }); } + + const typebotData = { + remoteJid: remoteJid, + status: statusChange, + session, + }; + waInstance.sendDataWebhook(Events.TYPEBOT_CHANGE_STATUS, typebotData); return; } @@ -881,6 +919,7 @@ export class TypebotService extends BaseChatbotService { } if (keywordFinish && content.toLowerCase() === keywordFinish.toLowerCase()) { + let statusChange = 'closed'; if (keepOpen) { await this.prismaRepository.integrationSession.update({ where: { @@ -891,6 +930,7 @@ export class TypebotService extends BaseChatbotService { }, }); } else { + statusChange = 'delete'; await this.prismaRepository.integrationSession.deleteMany({ where: { botId: findTypebot.id, @@ -898,6 +938,15 @@ export class TypebotService extends BaseChatbotService { }, }); } + + const typebotData = { + remoteJid: remoteJid, + status: statusChange, + session, + }; + + waInstance.sendDataWebhook(Events.TYPEBOT_CHANGE_STATUS, typebotData); + return; } From b9ae40145de9235cf11694c13937e20600f8ee34 Mon Sep 17 00:00:00 2001 From: Josias Maceda Date: Tue, 9 Sep 2025 14:15:16 -0300 Subject: [PATCH 2/2] fix: the lint with npm run lint --- .../chatbot/base-chatbot.controller.ts | 12 +++---- .../typebot/services/typebot.service.ts | 35 +++++++++---------- 2 files changed, 23 insertions(+), 24 deletions(-) diff --git a/src/api/integrations/chatbot/base-chatbot.controller.ts b/src/api/integrations/chatbot/base-chatbot.controller.ts index d6abfd8d..80a9a588 100644 --- a/src/api/integrations/chatbot/base-chatbot.controller.ts +++ b/src/api/integrations/chatbot/base-chatbot.controller.ts @@ -2,6 +2,7 @@ import { IgnoreJidDto } from '@api/dto/chatbot.dto'; import { InstanceDto } from '@api/dto/instance.dto'; import { PrismaRepository } from '@api/repository/repository.service'; import { WAMonitoringService } from '@api/services/monitor.service'; +import { Events } from '@api/types/wa.types'; import { Logger } from '@config/logger.config'; import { BadRequestException } from '@exceptions'; import { TriggerOperator, TriggerType } from '@prisma/client'; @@ -9,7 +10,6 @@ import { getConversationMessage } from '@utils/getConversationMessage'; import { BaseChatbotDto } from './base-chatbot.dto'; import { ChatbotController, ChatbotControllerInterface, EmitData } from './chatbot.controller'; -import { Events } from '@api/types/wa.types'; // Common settings interface for all chatbot integrations export interface ChatbotSettings { @@ -59,7 +59,7 @@ export abstract class BaseChatbotController { - private openaiService: OpenaiService; - + private openaiService: OpenaiService; + constructor( waMonitor: WAMonitoringService, configService: ConfigService, @@ -20,7 +20,7 @@ export class TypebotService extends BaseChatbotService { openaiService: OpenaiService, ) { super(waMonitor, prismaRepository, 'TypebotService', configService); - this.openaiService = openaiService; + this.openaiService = openaiService; } /** @@ -154,11 +154,11 @@ export class TypebotService extends BaseChatbotService { } const typebotData = { - remoteJid: data.remoteJid, - status: 'opened', - session, + remoteJid: data.remoteJid, + status: 'opened', + session, }; - this.waMonitor.waInstances[instance.name].sendDataWebhook(Events.TYPEBOT_CHANGE_STATUS, typebotData); + this.waMonitor.waInstances[instance.name].sendDataWebhook(Events.TYPEBOT_CHANGE_STATUS, typebotData); return { ...request.data, session }; } catch (error) { @@ -433,7 +433,6 @@ export class TypebotService extends BaseChatbotService { session, }; instance.sendDataWebhook(Events.TYPEBOT_CHANGE_STATUS, typebotData); - } } @@ -677,13 +676,13 @@ export class TypebotService extends BaseChatbotService { }, }); } - + const typebotData = { remoteJid: remoteJid, status: statusChange, session, }; - waInstance.sendDataWebhook(Events.TYPEBOT_CHANGE_STATUS, typebotData); + waInstance.sendDataWebhook(Events.TYPEBOT_CHANGE_STATUS, typebotData); return; } @@ -836,13 +835,13 @@ export class TypebotService extends BaseChatbotService { }, }); } - + const typebotData = { - remoteJid: remoteJid, - status: statusChange, - session, - }; - waInstance.sendDataWebhook(Events.TYPEBOT_CHANGE_STATUS, typebotData); + remoteJid: remoteJid, + status: statusChange, + session, + }; + waInstance.sendDataWebhook(Events.TYPEBOT_CHANGE_STATUS, typebotData); return; } @@ -945,7 +944,7 @@ export class TypebotService extends BaseChatbotService { session, }; - waInstance.sendDataWebhook(Events.TYPEBOT_CHANGE_STATUS, typebotData); + waInstance.sendDataWebhook(Events.TYPEBOT_CHANGE_STATUS, typebotData); return; }