ZoeBuyCourses/api/routes/webhooks.js

51 lines
1.8 KiB
JavaScript

const express = require("express");
const router = express.Router();
const { getOrderById } = require("../services/tray_service");
/**
* Webhook de notificações de pedidos da Tray
* URL: POST /webhooks/tray/orders
*/
router.post("/tray/orders", async (req, res) => {
try {
const payload = req.body;
console.log("📩 Webhook Tray recebido:", JSON.stringify(payload, null, 2));
// Aqui depende de como a Tray manda o payload:
// vamos supor que venha algo como:
// { order_id: 123, status: 'paid', ... }
const orderId = payload.order_id || payload.id || null;
if (!orderId) {
console.warn("Webhook Tray sem order_id identificável");
// Mesmo assim respondemos 200 pra não gerar reenvio infinito
return res.status(200).json({ received: true, ignored: true });
}
// (Opcional) Buscar detalhes do pedido na Tray pra ter certeza do status atual
try {
const orderData = await getOrderById(orderId);
console.log("🔍 Detalhes do pedido na Tray:", JSON.stringify(orderData, null, 2));
// Aqui você decide o que fazer:
// - Se status for pago -> mandar e-mail
// - Gravar log em arquivo
// - No futuro: salvar em banco, liberar curso, etc.
} catch (err) {
console.error("Erro ao buscar pedido na Tray:", err.response?.data || err.message);
// Mesmo assim, respondemos 200 pra não ficar em loop de reenvio
}
// Sempre responde 200 pra dizer "recebido"
return res.status(200).json({ received: true });
} catch (err) {
console.error("Erro no webhook /webhooks/tray/orders:", err);
// Em webhook, na maioria dos casos ainda é melhor responder 200
// para não causar reenvios em massa
return res.status(200).json({ received: true, error: "internal error" });
}
});
module.exports = router;