Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
89 changes: 66 additions & 23 deletions src/api/integrations/channel/meta/whatsapp.business.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -131,9 +131,20 @@ export class BusinessStartupService extends ChannelStartupService {
try {
this.loadChatwoot();

this.eventHandler(content);
// Determinar o phoneNumber baseado no tipo de conteΓΊdo recebido
if (content.messages && content.messages.length > 0) {
this.phoneNumber = createJid(content.messages[0].from);
} else if (content.message_echoes && content.message_echoes.length > 0) {
// message_echoes sΓ£o ecos das mensagens enviadas pelo prΓ³prio nΓΊmero
this.phoneNumber = createJid(content.message_echoes[0].to);
} else if (content.statuses && content.statuses.length > 0) {
this.phoneNumber = createJid(content.statuses[0].recipient_id);
} else {
this.logger.warn('Nenhuma mensagem, status ou echo encontrado no conteΓΊdo recebido');
return;
}

this.phoneNumber = createJid(content.messages ? content.messages[0].from : content.statuses[0]?.recipient_id);
this.eventHandler(content);
} catch (error) {
this.logger.error(error);
throw new InternalServerErrorException(error?.toString());
Expand Down Expand Up @@ -385,17 +396,34 @@ export class BusinessStartupService extends ChannelStartupService {
protected async messageHandle(received: any, database: Database, settings: any) {
try {
let messageRaw: any;
let pushName: any;

if (received.contacts) pushName = received.contacts[0].profile.name;
const firstMessage = received.messages?.[0];
const firstContact = received.contacts?.[0];
const contactPhone =
firstContact?.profile?.phone ?? firstContact?.wa_id ?? firstContact?.phone ?? firstContact?.input;
const messageRemoteJid = received.isEcho ? firstMessage?.to : firstMessage?.from;
const remoteJidSource = messageRemoteJid || contactPhone;
const remoteJid = remoteJidSource ? createJid(remoteJidSource) : this.phoneNumber;
const pushName =
firstContact?.profile?.name ?? firstContact?.name ?? firstContact?.formatted_name ?? firstContact?.pushName;

if (!remoteJid && received.messages) {
this.logger.warn('Unable to identify remoteJid for received message');
return;
}

if (received.messages) {
const message = received.messages[0]; // AΓ±adir esta lΓ­nea para definir message

// Determinar fromMe: true se Γ© um echo ou se from == phone_number_id ou display_phone_number
const isFromMe =
received.isEcho === true ||
message.from === received.metadata?.phone_number_id ||
message.from === received.metadata?.display_phone_number;

const key = {
id: message.id,
remoteJid: this.phoneNumber,
fromMe: message.from === received.metadata.phone_number_id,
remoteJid,
fromMe: isFromMe,
};

if (message.type === 'sticker') {
Expand Down Expand Up @@ -697,29 +725,21 @@ export class BusinessStartupService extends ChannelStartupService {
});
}

const contact = await this.prismaRepository.contact.findFirst({
where: { instanceId: this.instanceId, remoteJid: key.remoteJid },
});

const contactRaw: any = {
remoteJid: received.contacts[0].profile.phone,
pushName,
// profilePicUrl: '',
remoteJid: key.remoteJid,
instanceId: this.instanceId,
};
if (pushName) contactRaw.pushName = pushName;

if (contactRaw.remoteJid === 'status@broadcast') {
return;
}

if (contact) {
const contactRaw: any = {
remoteJid: received.contacts[0].profile.phone,
pushName,
// profilePicUrl: '',
instanceId: this.instanceId,
};
const contact = await this.prismaRepository.contact.findFirst({
where: { instanceId: this.instanceId, remoteJid: contactRaw.remoteJid },
});

if (contact) {
this.sendDataWebhook(Events.CONTACTS_UPDATE, contactRaw);

if (this.configService.get<Chatwoot>('CHATWOOT').ENABLED && this.localChatwoot?.enabled) {
Expand Down Expand Up @@ -926,11 +946,34 @@ export class BusinessStartupService extends ChannelStartupService {
} else {
this.logger.warn(`Tipo de mensaje no reconocido: ${message.type}`);
}
} else if (content.statuses) {
} else if (content.message_echoes && content.message_echoes.length > 0) {
// message_echoes sΓ£o ecos das mensagens enviadas pelo prΓ³prio nΓΊmero
// Converter message_echoes para o formato de messages para processamento
const echoMessage = content.message_echoes[0];
this.logger.log(`Processando message_echo do tipo: ${echoMessage.type}`);

// Criar estrutura compatΓ­vel com o formato esperado
// Adicionar flag isEcho para que messageHandle saiba que fromMe = true
const convertedContent = {
...content,
isEcho: true, // Flag para indicar que Γ© um echo (mensagem enviada pelo prΓ³prio nΓΊmero)
messages: content.message_echoes.map((echo: any) => ({
...echo,
from: echo.from,
id: echo.id,
timestamp: echo.timestamp,
type: echo.type,
text: echo.text,
})),
};

// Processar como mensagem enviada (fromMe = true)
this.messageHandle(convertedContent, database, settings);
} else if (content.statuses && content.statuses.length > 0) {
// Procesar actualizaciones de estado
this.messageHandle(content, database, settings);
} else {
this.logger.warn('No se encontraron mensajes ni estados en el contenido recibido');
this.logger.warn('No se encontraron mensajes, message_echoes ni estados en el contenido recibido');
}
} catch (error) {
this.logger.error('Error en eventHandler:');
Expand Down
20 changes: 20 additions & 0 deletions src/api/middleware/requestLogger.middleware.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { Logger } from '@config/logger.config';
import { NextFunction, Request, Response } from 'express';

const logger = new Logger('HTTP');

export function requestLogger(req: Request, res: Response, next: NextFunction): void {
const start = Date.now();
const ip = req.ip || req.socket?.remoteAddress || '-';

res.on('finish', () => {
const duration = Date.now() - start;
logger.info(`${req.method} ${req.originalUrl} - ${res.statusCode} - ${duration}ms - ip: ${ip}`);

if (req.originalUrl.startsWith('/webhook/meta') && req.body && Object.keys(req.body).length > 0) {
logger.warn(`[body] ${req.method} ${req.originalUrl}: ${JSON.stringify(req.body)}`);
}
});

next();
}
3 changes: 3 additions & 0 deletions src/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
import '@utils/instrumentSentry';

// Now import other modules
import { requestLogger } from '@api/middleware/requestLogger.middleware';
import { ProviderFiles } from '@api/provider/sessions';
import { PrismaRepository } from '@api/repository/repository.service';
import { HttpStatus, router } from '@api/routes/index.router';
Expand Down Expand Up @@ -44,6 +45,8 @@ async function bootstrap() {
const prismaRepository = new PrismaRepository(configService);
await prismaRepository.onModuleInit();

app.use(requestLogger);

app.use(
cors({
origin(requestOrigin, callback) {
Expand Down