Files
leadradar/backend/app/services/webhook_service.py
T

64 lines
2.4 KiB
Python

from typing import Dict, Any, Tuple
from app.extensions import db
from app.models.lead import Lead
from app.models.lead_interacao import LeadInteracao
from app.utils.sanitizers import sanitize_phone
class WebhookService:
@staticmethod
def process_n8n_event(payload: Dict[str, Any]) -> Tuple[bool, str, Dict[str, Any]]:
"""
Processa eventos recebidos do n8n para atualizar leads e gerar logs de auditoria.
"""
if not payload:
return False, "Payload vazio.", {}
lead_id = payload.get('lead_id')
telefone = payload.get('telefone')
event_type = payload.get('event_type', 'webhook_n8n')
new_status = payload.get('new_status')
mensagem = payload.get('mensagem') or payload.get('descricao', 'Evento recebido via Webhook n8n')
lead = None
if lead_id:
lead = db.session.get(Lead, lead_id)
if not lead and telefone:
sanitized = sanitize_phone(telefone)
if sanitized:
lead = Lead.query.filter_by(telefone_sanitizado=sanitized).first()
if not lead:
return False, "Lead correspondente não foi localizado no banco.", {}
# Se houver atualização de status
if new_status and new_status in ['novo', 'contatado', 'respondeu', 'negociacao', 'ganho', 'perdido', 'opt_out']:
old_status = lead.status_funil
lead.status_funil = new_status
lead.atualizado_em = db.func.now()
interacao_status = LeadInteracao(
lead_id=lead.id,
tipo='status_change',
descricao=f'Status alterado via webhook n8n de "{old_status}" para "{new_status}".',
metadados={'origem': 'n8n', 'old_status': old_status, 'new_status': new_status}
)
db.session.add(interacao_status)
# Registra a interação principal do webhook
interacao_webhook = LeadInteracao(
lead_id=lead.id,
tipo='webhook_n8n',
descricao=f"Webhook [{event_type}]: {mensagem}",
metadados=payload
)
db.session.add(interacao_webhook)
db.session.commit()
return True, "Webhook processado com sucesso.", {
'lead_id': lead.id,
'lead_nome': lead.nome_empresa,
'status_atual': lead.status_funil
}