diff --git a/src/whatsapp/models/message.model.ts b/src/whatsapp/models/message.model.ts index 395b100b..2b59f3a5 100644 --- a/src/whatsapp/models/message.model.ts +++ b/src/whatsapp/models/message.model.ts @@ -10,6 +10,12 @@ class Key { participant?: string; } +class ChatwootMessage { + messageId?: number; + inboxId?: number; + conversationId?: number; +} + export class MessageRaw { _id?: string; key?: Key; @@ -22,7 +28,7 @@ export class MessageRaw { source?: 'android' | 'web' | 'ios'; source_id?: string; source_reply_id?: string; - chatwootMessageId?: string; + chatwoot?: ChatwootMessage; } const messageSchema = new Schema({ @@ -40,10 +46,14 @@ const messageSchema = new Schema({ source: { type: String, minlength: 3, enum: ['android', 'web', 'ios'] }, messageTimestamp: { type: Number, required: true }, owner: { type: String, required: true, minlength: 1 }, - chatwootMessageId: { type: String, required: false }, + chatwoot: { + messageId: { type: Number }, + inboxId: { type: Number }, + conversationId: { type: Number }, + }, }); -messageSchema.index({ chatwootMessageId: 1, owner: 1 }); +messageSchema.index({ 'chatwoot.messageId': 1, owner: 1 }); messageSchema.index({ 'key.id': 1 }); messageSchema.index({ 'key.id': 1, owner: 1 }); messageSchema.index({ owner: 1 }); diff --git a/src/whatsapp/repository/message.repository.ts b/src/whatsapp/repository/message.repository.ts index e212ca3d..d7675977 100644 --- a/src/whatsapp/repository/message.repository.ts +++ b/src/whatsapp/repository/message.repository.ts @@ -91,11 +91,13 @@ export class MessageRepository extends Repository { this.logger.verbose('finding messages'); if (this.dbSettings.ENABLED) { this.logger.verbose('finding messages in db'); - if (query?.where?.key) { - for (const [k, v] of Object.entries(query.where.key)) { - query.where['key.' + k] = v; + for (const [o, p] of Object.entries(query?.where)) { + if (typeof p === 'object' && p !== null && !Array.isArray(p)) { + for (const [k, v] of Object.entries(p)) { + query.where[`${o}.${k}`] = v; + } + delete query.where[o]; } - delete query?.where?.key; } return await this.messageModel diff --git a/src/whatsapp/services/chatwoot.service.ts b/src/whatsapp/services/chatwoot.service.ts index ccd01347..26b0cce9 100644 --- a/src/whatsapp/services/chatwoot.service.ts +++ b/src/whatsapp/services/chatwoot.service.ts @@ -14,6 +14,7 @@ import { InstanceDto } from '../dto/instance.dto'; import { Options, Quoted, SendAudioDto, SendMediaDto, SendTextDto } from '../dto/sendMessage.dto'; import { MessageRaw } from '../models'; import { RepositoryBroker } from '../repository/repository.manager'; +import { Events } from '../types/wa.types'; import { WAMonitoringService } from './monitor.service'; export class ChatwootService { @@ -1036,7 +1037,9 @@ export class ChatwootService { const message = await this.repository.message.find({ where: { owner: instance.instanceName, - chatwootMessageId: body.id, + chatwoot: { + messageId: body.id, + }, }, limit: 1, }); @@ -1160,7 +1163,11 @@ export class ChatwootService { ...messageSent, owner: instance.instanceName, }, - body.id, + { + messageId: body.id, + inboxId: body.inbox?.id, + conversationId: body.conversation?.id, + }, instance, ); } @@ -1187,7 +1194,11 @@ export class ChatwootService { ...messageSent, owner: instance.instanceName, }, - body.id, + { + messageId: body.id, + inboxId: body.inbox?.id, + conversationId: body.conversation?.id, + }, instance, ); } @@ -1221,15 +1232,33 @@ export class ChatwootService { } } - private updateChatwootMessageId(message: MessageRaw, chatwootMessageId: string, instance: InstanceDto) { - if (!chatwootMessageId || !message?.key?.id) { + private updateChatwootMessageId( + message: MessageRaw, + chatwootMessageIds: MessageRaw['chatwoot'], + instance: InstanceDto, + ) { + if (!chatwootMessageIds.messageId || !message?.key?.id) { return; } - message.chatwootMessageId = chatwootMessageId; + message.chatwoot = chatwootMessageIds; this.repository.message.update([message], instance.instanceName, true); } + private async getMessageByKeyId(instance: InstanceDto, keyId: string): Promise { + const messages = await this.repository.message.find({ + where: { + key: { + id: keyId, + }, + owner: instance.instanceName, + }, + limit: 1, + }); + + return messages.length ? messages[0] : null; + } + private async getReplyToIds( msg: any, instance: InstanceDto, @@ -1240,17 +1269,9 @@ export class ChatwootService { if (msg) { inReplyToExternalId = msg.message?.extendedTextMessage?.contextInfo?.stanzaId; if (inReplyToExternalId) { - const message = await this.repository.message.find({ - where: { - key: { - id: inReplyToExternalId, - }, - owner: instance.instanceName, - }, - limit: 1, - }); - if (message.length && message[0]?.chatwootMessageId) { - inReplyTo = message[0].chatwootMessageId; + const message = await this.getMessageByKeyId(instance, inReplyToExternalId); + if (message?.chatwoot?.messageId) { + inReplyTo = message.chatwoot.messageId; } } } @@ -1265,7 +1286,9 @@ export class ChatwootService { if (msg?.content_attributes?.in_reply_to) { const message = await this.repository.message.find({ where: { - chatwootMessageId: msg?.content_attributes?.in_reply_to, + chatwoot: { + messageId: msg?.content_attributes?.in_reply_to, + }, owner: instance.instanceName, }, limit: 1, @@ -1757,6 +1780,25 @@ export class ChatwootService { } } + if (event === Events.MESSAGES_DELETE) { + this.logger.verbose('deleting message from instance: ' + instance.instanceName); + + if (!body?.key?.id) { + this.logger.warn('message id not found'); + return; + } + + const message = await this.getMessageByKeyId(instance, body.key.id); + if (message?.chatwoot?.messageId && message?.chatwoot?.conversationId) { + this.logger.verbose('deleting message in chatwoot. Message id: ' + body.key.id); + return await client.messages.delete({ + accountId: this.provider.account_id, + conversationId: message.chatwoot.conversationId, + messageId: message.chatwoot.messageId, + }); + } + } + if (event === 'status.instance') { this.logger.verbose('event status.instance'); const data = body; diff --git a/src/whatsapp/services/whatsapp.service.ts b/src/whatsapp/services/whatsapp.service.ts index 35c763bb..1e1d5b88 100644 --- a/src/whatsapp/services/whatsapp.service.ts +++ b/src/whatsapp/services/whatsapp.service.ts @@ -1798,7 +1798,11 @@ export class WAStartupService { ); if (chatwootSentMessage?.id) { - messageRaw.chatwootMessageId = chatwootSentMessage.id; + messageRaw.chatwoot = { + messageId: chatwootSentMessage.id, + inboxId: chatwootSentMessage.inbox_id, + conversationId: chatwootSentMessage.conversation_id, + }; } } @@ -1941,6 +1945,22 @@ export class WAStartupService { this.instance.name, database.SAVE_DATA.MESSAGE_UPDATE, ); + + if (this.localChatwoot.enabled) { + this.chatwootService.eventWhatsapp( + Events.MESSAGES_DELETE, + { instanceName: this.instance.name }, + { + key: { + remoteJid: key.remoteJid, + fromMe: key.fromMe, + id: key.id, + participant: key.participant, + }, + }, + ); + } + return; }