From 072171da18a787505d5e723166548363880cfb6e Mon Sep 17 00:00:00 2001 From: jaison-x Date: Tue, 12 Mar 2024 11:56:14 -0300 Subject: [PATCH] feat(chatwoot): read last message on WhatsApp when a message is sent from Chatwoot --- Docker/.env.example | 2 ++ src/config/env.config.ts | 2 ++ src/dev-env.yml | 2 ++ src/whatsapp/models/message.model.ts | 5 +++- src/whatsapp/services/chatwoot.service.ts | 31 +++++++++++++++++++++++ 5 files changed, 41 insertions(+), 1 deletion(-) diff --git a/Docker/.env.example b/Docker/.env.example index 0d056dd58..18363c04a 100644 --- a/Docker/.env.example +++ b/Docker/.env.example @@ -122,6 +122,8 @@ TYPEBOT_KEEP_OPEN=false #Chatwoot # If you leave this option as false, when deleting the message for everyone on WhatsApp, it will not be deleted on Chatwoot. CHATWOOT_MESSAGE_DELETE=false # false | true +# If you leave this option as true, when sending a message in Chatwoot, the client's last message will be marked as read on WhatsApp. +CHATWOOT_MESSAGE_READ=false # false | true # This db connection is used to import messages from whatsapp to chatwoot database CHATWOOT_IMPORT_DATABASE_CONNECTION_URI=postgres://user:password@hostname:port/dbname CHATWOOT_IMPORT_DATABASE_PLACEHOLDER_MEDIA_MESSAGE=true diff --git a/src/config/env.config.ts b/src/config/env.config.ts index 1baac567d..5712ebdc4 100644 --- a/src/config/env.config.ts +++ b/src/config/env.config.ts @@ -164,6 +164,7 @@ export type QrCode = { LIMIT: number; COLOR: string }; export type Typebot = { API_VERSION: string; KEEP_OPEN: boolean }; export type Chatwoot = { MESSAGE_DELETE: boolean; + MESSAGE_READ: boolean; IMPORT: { DATABASE: { CONNECTION: { @@ -379,6 +380,7 @@ export class ConfigService { }, CHATWOOT: { MESSAGE_DELETE: process.env.CHATWOOT_MESSAGE_DELETE === 'false', + MESSAGE_READ: process.env.CHATWOOT_MESSAGE_READ === 'false', IMPORT: { DATABASE: { CONNECTION: { diff --git a/src/dev-env.yml b/src/dev-env.yml index 9f7a413fe..adc308e8a 100644 --- a/src/dev-env.yml +++ b/src/dev-env.yml @@ -166,6 +166,8 @@ TYPEBOT: CHATWOOT: # If you leave this option as false, when deleting the message for everyone on WhatsApp, it will not be deleted on Chatwoot. MESSAGE_DELETE: true # false | true + # If you leave this option as true, when sending a message in Chatwoot, the client's last message will be marked as read on WhatsApp. + MESSAGE_READ: false # false | true IMPORT: # This db connection is used to import messages from whatsapp to chatwoot database DATABASE: diff --git a/src/whatsapp/models/message.model.ts b/src/whatsapp/models/message.model.ts index 717ab67f9..893d1f2af 100644 --- a/src/whatsapp/models/message.model.ts +++ b/src/whatsapp/models/message.model.ts @@ -15,6 +15,7 @@ class ChatwootMessage { inboxId?: number; conversationId?: number; contactInbox?: { sourceId: string }; + isRead?: boolean; } export class MessageRaw { @@ -36,8 +37,9 @@ export class MessageRaw { type MessageRawBoolean = { [P in keyof T]?: 0 | 1; }; -export type MessageRawSelect = Omit, 'key'> & { +export type MessageRawSelect = Omit, 'key'>, 'chatwoot'> & { key?: MessageRawBoolean; + chatwoot?: MessageRawBoolean; }; const messageSchema = new Schema({ @@ -60,6 +62,7 @@ const messageSchema = new Schema({ inboxId: { type: Number }, conversationId: { type: Number }, contactInbox: { type: Object }, + isRead: { type: Boolean }, }, }); diff --git a/src/whatsapp/services/chatwoot.service.ts b/src/whatsapp/services/chatwoot.service.ts index 3f50f06dc..25004c0bd 100644 --- a/src/whatsapp/services/chatwoot.service.ts +++ b/src/whatsapp/services/chatwoot.service.ts @@ -1354,6 +1354,37 @@ export class ChatwootService { ); } } + + const chatwootRead = this.configService.get('CHATWOOT').MESSAGE_READ; + if (chatwootRead) { + const lastMessage = await this.repository.message.find({ + where: { + key: { + fromMe: false, + }, + owner: instance.instanceName, + }, + limit: 1, + }); + if (lastMessage.length > 0 && !lastMessage[0].chatwoot?.isRead) { + waInstance?.markMessageAsRead({ + read_messages: lastMessage.map((msg) => ({ + id: msg.key?.id, + fromMe: msg.key?.fromMe, + remoteJid: msg.key?.remoteJid, + })), + }); + const updateMessage = lastMessage.map((msg) => ({ + key: msg.key, + owner: msg.owner, + chatwoot: { + ...msg.chatwoot, + isRead: true, + }, + })); + this.repository.message.update(updateMessage, instance.instanceName, true); + } + } } if (body.message_type === 'template' && body.event === 'message_created') {