Skip to content

Commit 64e276d

Browse files
fix(whatsapp): ensure audio messages always emit upsert events
1 parent cd800f2 commit 64e276d

File tree

1 file changed

+77
-43
lines changed

1 file changed

+77
-43
lines changed

src/api/integrations/channel/whatsapp/whatsapp.baileys.service.ts

Lines changed: 77 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1389,50 +1389,49 @@ export class BaileysStartupService extends ChannelStartupService {
13891389
try {
13901390
if (isVideo && !this.configService.get<S3>('S3').SAVE_VIDEO) {
13911391
this.logger.warn('Video upload is disabled. Skipping video upload.');
1392-
// Skip video upload by returning early from this block
1393-
return;
1394-
}
1395-
1396-
const message: any = received;
1397-
1398-
// Verificação adicional para garantir que há conteúdo de mídia real
1399-
const hasRealMedia = this.hasValidMediaContent(message);
1400-
1401-
if (!hasRealMedia) {
1402-
this.logger.warn('Message detected as media but contains no valid media content');
14031392
} else {
1404-
const media = await this.getBase64FromMediaMessage({ message }, true);
1405-
1406-
if (!media) {
1407-
this.logger.verbose('No valid media to upload (messageContextInfo only), skipping MinIO');
1408-
return;
1393+
const message: any = received;
1394+
1395+
// Verificação adicional para garantir que há conteúdo de mídia real
1396+
const hasRealMedia = this.hasValidMediaContent(message);
1397+
1398+
if (!hasRealMedia) {
1399+
this.logger.warn('Message detected as media but contains no valid media content');
1400+
} else {
1401+
const media = await this.getBase64FromMediaMessage({ message }, true);
1402+
1403+
if (!media) {
1404+
this.logger.verbose('No valid media to upload (messageContextInfo only), skipping MinIO');
1405+
} else {
1406+
const { buffer, mediaType, fileName, size } = media;
1407+
const mimetype = mimeTypes.lookup(fileName).toString();
1408+
const fullName = join(
1409+
`${this.instance.id}`,
1410+
received.key.remoteJid,
1411+
mediaType,
1412+
`${Date.now()}_${fileName}`,
1413+
);
1414+
await s3Service.uploadFile(fullName, buffer, size.fileLength?.low, {
1415+
'Content-Type': mimetype,
1416+
});
1417+
1418+
await this.prismaRepository.media.create({
1419+
data: {
1420+
messageId: msg.id,
1421+
instanceId: this.instanceId,
1422+
type: mediaType,
1423+
fileName: fullName,
1424+
mimetype,
1425+
},
1426+
});
1427+
1428+
const mediaUrl = await s3Service.getObjectUrl(fullName);
1429+
1430+
messageRaw.message.mediaUrl = mediaUrl;
1431+
1432+
await this.prismaRepository.message.update({ where: { id: msg.id }, data: messageRaw });
1433+
}
14091434
}
1410-
1411-
const { buffer, mediaType, fileName, size } = media;
1412-
const mimetype = mimeTypes.lookup(fileName).toString();
1413-
const fullName = join(
1414-
`${this.instance.id}`,
1415-
received.key.remoteJid,
1416-
mediaType,
1417-
`${Date.now()}_${fileName}`,
1418-
);
1419-
await s3Service.uploadFile(fullName, buffer, size.fileLength?.low, { 'Content-Type': mimetype });
1420-
1421-
await this.prismaRepository.media.create({
1422-
data: {
1423-
messageId: msg.id,
1424-
instanceId: this.instanceId,
1425-
type: mediaType,
1426-
fileName: fullName,
1427-
mimetype,
1428-
},
1429-
});
1430-
1431-
const mediaUrl = await s3Service.getObjectUrl(fullName);
1432-
1433-
messageRaw.message.mediaUrl = mediaUrl;
1434-
1435-
await this.prismaRepository.message.update({ where: { id: msg.id }, data: messageRaw });
14361435
}
14371436
} catch (error) {
14381437
this.logger.error(['Error on upload file to minio', error?.message, error?.stack]);
@@ -1480,7 +1479,11 @@ export class BaileysStartupService extends ChannelStartupService {
14801479
}
14811480
console.log(messageRaw);
14821481

1483-
this.sendDataWebhook(Events.MESSAGES_UPSERT, messageRaw);
1482+
await this.sendDataWebhook(Events.MESSAGES_UPSERT, messageRaw);
1483+
1484+
if (messageRaw.messageType === 'audioMessage' && !messageRaw.key.fromMe && messageRaw.key.id) {
1485+
await this.baileysCache.set(`upsert_emitted_${this.instanceId}_${messageRaw.key.id}`, true, 60 * 10);
1486+
}
14841487

14851488
await chatbotController.emit({
14861489
instance: { instanceName: this.instance.name, instanceId: this.instanceId },
@@ -1649,6 +1652,37 @@ export class BaileysStartupService extends ChannelStartupService {
16491652
this.logger.warn(`Original message not found for update. Skipping. Key: ${JSON.stringify(key)}`);
16501653
continue;
16511654
}
1655+
1656+
if (!key.fromMe && findMessage.messageType === 'audioMessage' && key.id) {
1657+
const upsertCacheKey = `upsert_emitted_${this.instanceId}_${key.id}`;
1658+
const alreadyEmitted = await this.baileysCache.get(upsertCacheKey);
1659+
1660+
if (!alreadyEmitted) {
1661+
const fallbackUpsertPayload = {
1662+
key: findMessage.key,
1663+
pushName: findMessage.pushName,
1664+
status: findMessage.status,
1665+
message: findMessage.message,
1666+
contextInfo: findMessage.contextInfo,
1667+
messageType: findMessage.messageType,
1668+
messageTimestamp: findMessage.messageTimestamp,
1669+
instanceId: findMessage.instanceId,
1670+
source: findMessage.source,
1671+
};
1672+
1673+
try {
1674+
await this.sendDataWebhook(Events.MESSAGES_UPSERT, fallbackUpsertPayload);
1675+
await this.baileysCache.set(upsertCacheKey, true, 60 * 10);
1676+
this.logger.warn(`Fallback messages.upsert emitted for audio message ${key.id}`);
1677+
} catch (error) {
1678+
this.logger.error([
1679+
`Failed to emit fallback messages.upsert for audio message ${key.id}`,
1680+
error?.message,
1681+
]);
1682+
}
1683+
}
1684+
}
1685+
16521686
message.messageId = findMessage.id;
16531687
}
16541688

0 commit comments

Comments
 (0)