Files
mercado.clube67.com/backend/controllers/webhookController.js
T

79 lines
3.1 KiB
JavaScript

'use strict'
const Order = require('../models/Order')
const Ticket = require('../models/Ticket')
const WhatsappCore = require('../services/whatsappService')
const ASAAS_WEBHOOK_TOKEN = process.env.ASAAS_WEBHOOK_TOKEN
const webhookController = {
async asaasWebhook(req, res) {
try {
if (!ASAAS_WEBHOOK_TOKEN) {
console.error('[Webhook Asaas] ASAAS_WEBHOOK_TOKEN não configurado')
return res.status(500).json({ error: 'Configuração incompleta' })
}
const incomingToken = req.headers['asaas-access-token']
if (!incomingToken || incomingToken !== ASAAS_WEBHOOK_TOKEN) {
console.warn('[Webhook Asaas] Token inválido rejeitado')
return res.status(401).json({ error: 'Não autorizado' })
}
const { event, payment } = req.body
if (!event || !payment) {
return res.status(400).json({ error: 'Payload inválido' })
}
console.log(`[Webhook Asaas] Recebido evento: ${event} para o pagamento ${payment.id}`)
if (event === 'PAYMENT_CONFIRMED' || event === 'PAYMENT_RECEIVED') {
const order = await Order.findByAsaasId(payment.id)
if (!order) {
console.error(`[Webhook Asaas] Pedido não encontrado para payment.id: ${payment.id}`)
return res.status(404).json({ error: 'Pedido não encontrado' })
}
if (order.status !== 'paid') {
await Order.updateStatus(order.id, 'paid')
await Ticket.confirmOrder(order.id)
// Fase 7: Dispara Confirmação de Compra pelo WhatsApp via BullMQ Fila
const getTickets = await Ticket.getByOrderId(order.id)
if (getTickets && getTickets.length > 0) {
const userPhone = getTickets[0].usuario_telefone
const numerosComprados = getTickets.map(t => t.numero).join(', ')
WhatsappCore.sendNotification({
userId: null,
phone: userPhone,
type: 'purchase_confirmed',
variables: {
numeros: numerosComprados,
valor: parseFloat(order.total_amount).toFixed(2),
link: `${process.env.APP_URL || 'http://alemaoconveniencias.local'}/meus-premios`
}
}).catch(console.error)
}
console.log(`[Webhook Asaas] Pagamento confirmado! Pedido ${order.id} status atualizado para 'paid' e tickets garantidos.`)
} else {
console.log(`[Webhook Asaas] Pedido ${order.id} já estava marcado como 'paid'.`)
}
} else if (event === 'PAYMENT_DELETED' || event === 'PAYMENT_OVERDUE') {
const order = await Order.findByAsaasId(payment.id)
if (order && order.status !== 'paid') {
await Order.updateStatus(order.id, event === 'PAYMENT_DELETED' ? 'canceled' : 'expired')
}
}
return res.json({ success: true })
} catch (error) {
console.error('[Webhook Asaas] Erro no processamento:', error)
return res.status(500).json({ error: 'Erro interno no processamento do webhook' })
}
}
}
module.exports = webhookController