FIX: IDs no formato @c.us para compatibilidade com o frontend

O frontend exige IDs no formato 5511999@c.us (verifica includes('@')
antes de carregar mensagens e usa split('@')[0] para exibir o nome).
Adicionados helpers cleanPhone/toWaId: DB continua com números limpos,
interface pública expõe @c.us. Corrige mensagens não carregando ao
abrir um chat e socket real-time mapeando o contato correto.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Rafael Alves Lopes 2026-06-19 16:44:36 -03:00
parent 876ab6ec8b
commit 224594918d

View File

@ -55,14 +55,23 @@ export class WhatsappService {
return 'CONNECTED'; return 'CONNECTED';
} }
private cleanPhone(id: string): string {
return id.replace(/@c\.us$/, '');
}
private toWaId(phone: string): string {
return phone.includes('@') ? phone : `${phone}@c.us`;
}
async getChats() { async getChats() {
const rows = await this.mensagensRepository.findChats(); const rows = await this.mensagensRepository.findChats();
return Promise.all(rows.map(async (row: any) => { return Promise.all(rows.map(async (row: any) => {
const chatId = row.chat_id; const chatId = row.chat_id;
const waId = this.toWaId(chatId);
const assignment = await this.assignmentService.getAssignment(chatId); const assignment = await this.assignmentService.getAssignment(chatId);
const contactProfile = await this.getCustomerContact(chatId); const contactProfile = await this.getCustomerContact(chatId);
return { return {
id: { _serialized: chatId, user: chatId, server: 'c.us' }, id: { _serialized: waId, user: chatId, server: 'c.us' },
name: contactProfile?.name || row.sender_name || chatId, name: contactProfile?.name || row.sender_name || chatId,
preview: row.preview || '', preview: row.preview || '',
timestamp: Number(row.timestamp), timestamp: Number(row.timestamp),
@ -75,7 +84,8 @@ export class WhatsappService {
} }
async getChatMessages(chatId: string) { async getChatMessages(chatId: string) {
const rows = await this.mensagensRepository.findByChatId(chatId); const cleanId = this.cleanPhone(chatId);
const rows = await this.mensagensRepository.findByChatId(cleanId);
return rows.map((row: any) => ({ return rows.map((row: any) => ({
id: { _serialized: row.wamid, user: row.wamid, server: 'c.us' }, id: { _serialized: row.wamid, user: row.wamid, server: 'c.us' },
body: row.body ?? '', body: row.body ?? '',
@ -83,7 +93,7 @@ export class WhatsappService {
timestamp: Number(row.timestamp), timestamp: Number(row.timestamp),
hasMedia: row.type !== 'text', hasMedia: row.type !== 'text',
media: null, media: null,
chatId: row.chat_id, chatId: this.toWaId(row.chat_id),
status: row.status, status: row.status,
})); }));
} }
@ -112,6 +122,7 @@ export class WhatsappService {
} }
async sendMessage(to: string, message: string, _media?: { data: string; mimetype: string; filename?: string }, senderName?: string) { async sendMessage(to: string, message: string, _media?: { data: string; mimetype: string; filename?: string }, senderName?: string) {
const cleanTo = this.cleanPhone(to);
const token = process.env.META_ACCESS_TOKEN; const token = process.env.META_ACCESS_TOKEN;
const phoneNumberId = process.env.META_PHONE_NUMBER_ID; const phoneNumberId = process.env.META_PHONE_NUMBER_ID;
const apiVersion = process.env.META_API_VERSION || 'v25.0'; const apiVersion = process.env.META_API_VERSION || 'v25.0';
@ -133,7 +144,7 @@ export class WhatsappService {
body: JSON.stringify({ body: JSON.stringify({
messaging_product: 'whatsapp', messaging_product: 'whatsapp',
recipient_type: 'individual', recipient_type: 'individual',
to, to: cleanTo,
type: 'text', type: 'text',
text: { preview_url: false, body }, text: { preview_url: false, body },
}), }),
@ -142,18 +153,18 @@ export class WhatsappService {
if (!response.ok) { if (!response.ok) {
const error = await response.json().catch(() => ({})); const error = await response.json().catch(() => ({}));
this.logger.error(`[Meta] Falha ao enviar mensagem para ${to}:`, error); this.logger.error(`[Meta] Falha ao enviar mensagem para ${cleanTo}:`, error);
throw new Error(`Meta API erro ${response.status}: ${JSON.stringify(error)}`); throw new Error(`Meta API erro ${response.status}: ${JSON.stringify(error)}`);
} }
const result = await response.json() as any; const result = await response.json() as any;
const wamid = result?.messages?.[0]?.id; const wamid = result?.messages?.[0]?.id;
this.logger.log(`[Meta] Mensagem enviada para ${to}: ${wamid}`); this.logger.log(`[Meta] Mensagem enviada para ${cleanTo}: ${wamid}`);
if (wamid) { if (wamid) {
await this.mensagensRepository.save({ await this.mensagensRepository.save({
wamid, wamid,
chatId: to, chatId: cleanTo,
fromMe: true, fromMe: true,
type: 'text', type: 'text',
body: body, body: body,
@ -163,7 +174,7 @@ export class WhatsappService {
}); });
} }
await this.assignmentService.clearTransferNote(to); await this.assignmentService.clearTransferNote(cleanTo);
return result; return result;
} }
@ -257,7 +268,7 @@ export class WhatsappService {
}); });
this.gateway.emitNewMessage({ this.gateway.emitNewMessage({
from, from: this.toWaId(from),
body: messageBody, body: messageBody,
timestamp, timestamp,
isGroupMsg: false, isGroupMsg: false,