feat: add participantsData field maintaining backward

compatibility

  - Keep original participants array (string[]) for backward
  compatibility
  - Add new participantsData field with resolved phone numbers and
  metadata
  - Consumers can migrate gradually from participants to
  participantsData
  - No breaking changes to existing webhook integrations

  Payload structure:
  - participants: string[] (original JID strings)
  - participantsData: object[] (enhanced with phoneNumber, name,
  imgUrl)
This commit is contained in:
Spiller 2025-09-30 10:12:14 -03:00
parent 57ea6707bc
commit fb1fa4d91a

View File

@ -1596,30 +1596,57 @@ export class BaileysStartupService extends ChannelStartupService {
participants: string[]; participants: string[];
action: ParticipantAction; action: ParticipantAction;
}) => { }) => {
// ENHANCEMENT: Adds participantsData field while maintaining backward compatibility
// MAINTAINS: participants: string[] (original JID strings)
// ADDS: participantsData: { jid: string, phoneNumber: string, name?: string, imgUrl?: string }[]
// This enables LID to phoneNumber conversion without breaking existing webhook consumers
// Helper to normalize participantId as phone number
const normalizePhoneNumber = (id: string): string => {
// Remove @lid, @s.whatsapp.net suffixes and extract just the number part
return id.split('@')[0];
};
try { try {
// Usa o mesmo método que o endpoint /group/participants // Usa o mesmo método que o endpoint /group/participants
const groupParticipants = await this.findParticipants({ groupJid: participantsUpdate.id }); const groupParticipants = await this.findParticipants({ groupJid: participantsUpdate.id });
// Validação para garantir que temos dados válidos
if (!groupParticipants?.participants || !Array.isArray(groupParticipants.participants)) {
throw new Error('Invalid participant data received from findParticipants');
}
// Filtra apenas os participantes que estão no evento // Filtra apenas os participantes que estão no evento
const resolvedParticipants = participantsUpdate.participants.map((participantId) => { const resolvedParticipants = participantsUpdate.participants.map((participantId) => {
const participantData = groupParticipants.participants.find(p => p.id === participantId); const participantData = groupParticipants.participants.find(p => p.id === participantId);
let phoneNumber: string;
if (participantData?.phoneNumber) {
phoneNumber = participantData.phoneNumber;
} else {
phoneNumber = normalizePhoneNumber(participantId);
}
return { return {
jid: participantId, jid: participantId,
phoneNumber: participantData?.phoneNumber || participantId, phoneNumber,
name: participantData?.name, name: participantData?.name,
imgUrl: participantData?.imgUrl, imgUrl: participantData?.imgUrl,
}; };
}); });
// Mantém formato original + adiciona dados resolvidos
const enhancedParticipantsUpdate = { const enhancedParticipantsUpdate = {
...participantsUpdate, ...participantsUpdate,
participants: resolvedParticipants participants: participantsUpdate.participants, // Mantém array original de strings
participantsData: resolvedParticipants // Adiciona dados resolvidos em campo separado
}; };
this.sendDataWebhook(Events.GROUP_PARTICIPANTS_UPDATE, enhancedParticipantsUpdate); this.sendDataWebhook(Events.GROUP_PARTICIPANTS_UPDATE, enhancedParticipantsUpdate);
} catch (error) { } catch (error) {
console.log('Erro ao buscar dados dos participantes para webhook:', error); this.logger.error(
`Failed to resolve participant data for GROUP_PARTICIPANTS_UPDATE webhook: ${error.message} | Group: ${participantsUpdate.id} | Participants: ${participantsUpdate.participants.length}`
);
// Fallback - envia sem conversão // Fallback - envia sem conversão
this.sendDataWebhook(Events.GROUP_PARTICIPANTS_UPDATE, participantsUpdate); this.sendDataWebhook(Events.GROUP_PARTICIPANTS_UPDATE, participantsUpdate);
} }