fix(history): salva mediaPayload em processHistoryBatch + recupera msgs antigas
processHistoryBatch não incluía mediaPayload no createMany, tornando impossível o re-download de mídias recebidas via history sync (que é a maioria das mensagens ao reconectar a sessão). 1. Inclui mediaPayload no objeto de cada row para mensagens de mídia. 2. Após o createMany, dispara updateMany para preencher mediaPayload em registros que já existiam no DB com o campo null (mensagens antigas recebidas antes desta correção), sem bloquear o event loop. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -372,6 +372,7 @@ export class MessageHandler {
|
|||||||
null
|
null
|
||||||
|
|
||||||
const isGroup = jid.endsWith('@g.us')
|
const isGroup = jid.endsWith('@g.us')
|
||||||
|
const isMed = this.isMediaMessage(contentType)
|
||||||
return [{
|
return [{
|
||||||
tenantId: this.tenantId,
|
tenantId: this.tenantId,
|
||||||
instanceId: this.instanceId,
|
instanceId: this.instanceId,
|
||||||
@@ -387,12 +388,33 @@ export class MessageHandler {
|
|||||||
senderJid: isGroup ? (key.participant ?? null) : null,
|
senderJid: isGroup ? (key.participant ?? null) : null,
|
||||||
status: 'READ' as const, // históricas são consideradas já lidas
|
status: 'READ' as const, // históricas são consideradas já lidas
|
||||||
timestamp: ts,
|
timestamp: ts,
|
||||||
|
// Salva payload para permitir re-download posterior via /redownload-media
|
||||||
|
...(isMed ? { mediaPayload: this.buildMediaPayload(key, message) as any } : {}),
|
||||||
}]
|
}]
|
||||||
})
|
})
|
||||||
|
|
||||||
if (rows.length > 0) {
|
if (rows.length > 0) {
|
||||||
const { count } = await prisma.message.createMany({ data: rows, skipDuplicates: true })
|
const { count } = await prisma.message.createMany({ data: rows, skipDuplicates: true })
|
||||||
totalSaved += count
|
totalSaved += count
|
||||||
|
|
||||||
|
// Recupera mediaPayload para mensagens de mídia que já existiam no DB
|
||||||
|
// sem esse campo (criadas antes desta correção ou via path antigo).
|
||||||
|
// Roda em paralelo sem bloquear o loop principal.
|
||||||
|
const mediaRows = rows.filter(r => r.mediaPayload != null)
|
||||||
|
if (mediaRows.length > 0) {
|
||||||
|
Promise.all(
|
||||||
|
mediaRows.map(r =>
|
||||||
|
prisma.message.updateMany({
|
||||||
|
where: {
|
||||||
|
instanceId: this.instanceId,
|
||||||
|
messageId: r.messageId,
|
||||||
|
mediaPayload: null,
|
||||||
|
},
|
||||||
|
data: { mediaPayload: r.mediaPayload },
|
||||||
|
}).catch(() => {})
|
||||||
|
)
|
||||||
|
).catch(() => {})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
logger.error({ err, jid }, '[History] Erro ao salvar mensagens do chat')
|
logger.error({ err, jid }, '[History] Erro ao salvar mensagens do chat')
|
||||||
|
|||||||
Reference in New Issue
Block a user