HAL module: consumes CloudEvents from AMQP and forwards as email notifications
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

85 linhas
2.4KB

  1. const amqp = require("amqplib");
  2. const nodemailer = require("nodemailer");
  3. const {
  4. AMQP_URL,
  5. AMQP_EXCHANGE,
  6. AMQP_QUEUE = "email-forwarder",
  7. SMTP_HOST,
  8. SMTP_PORT = "587",
  9. SMTP_USER,
  10. SMTP_PASSWORD,
  11. NOTIFY_TO,
  12. NOTIFY_FROM,
  13. } = process.env;
  14. async function main() {
  15. console.log(`Connecting to AMQP: ${AMQP_URL?.replace(/\/\/.*@/, "//***@")}`);
  16. const conn = await amqp.connect(AMQP_URL);
  17. const ch = await conn.createChannel();
  18. await ch.assertQueue(AMQP_QUEUE, { durable: true });
  19. await ch.bindQueue(AMQP_QUEUE, AMQP_EXCHANGE, "");
  20. console.log(`Bound queue '${AMQP_QUEUE}' to exchange '${AMQP_EXCHANGE}'`);
  21. const transportOpts = {
  22. host: SMTP_HOST,
  23. port: parseInt(SMTP_PORT),
  24. secure: false,
  25. tls: { rejectUnauthorized: false },
  26. };
  27. if (SMTP_USER && SMTP_PASSWORD) {
  28. transportOpts.auth = { user: SMTP_USER, pass: SMTP_PASSWORD };
  29. }
  30. const transport = nodemailer.createTransport(transportOpts);
  31. console.log(`SMTP: ${SMTP_USER || "(no auth)"}@${SMTP_HOST}:${SMTP_PORT}`);
  32. console.log(`From: ${NOTIFY_FROM} → To: ${NOTIFY_TO}`);
  33. console.log("Waiting for messages...\n");
  34. ch.consume(AMQP_QUEUE, async (msg) => {
  35. if (!msg) return;
  36. try {
  37. const headers = {};
  38. for (const [k, v] of Object.entries(msg.properties.headers || {})) {
  39. headers[k] = Buffer.isBuffer(v) ? v.toString() : v;
  40. }
  41. const body = JSON.parse(msg.content.toString());
  42. const subjectType = headers.subjecttype || "unknown";
  43. const brandCode = body.brandCode || "unknown";
  44. const ref = body.transactionReference || "unknown";
  45. const subject = `[CloudEvent] ${subjectType} / ${brandCode} / ${ref}`;
  46. const html = `
  47. <h2>CloudEvent received</h2>
  48. <h3>Headers</h3>
  49. <pre>${JSON.stringify(headers, null, 2)}</pre>
  50. <h3>CDM Payload</h3>
  51. <pre>${JSON.stringify(body, null, 2)}</pre>
  52. <hr>
  53. <p><small>From: AH BE Task Connector → ${AMQP_EXCHANGE} → ${AMQP_QUEUE}</small></p>
  54. `;
  55. await transport.sendMail({
  56. from: NOTIFY_FROM,
  57. to: NOTIFY_TO,
  58. subject,
  59. html,
  60. });
  61. console.log(`Forwarded: ${subject} → ${NOTIFY_TO}`);
  62. ch.ack(msg);
  63. } catch (err) {
  64. console.error("Failed to process message:", err.message);
  65. ch.nack(msg, false, true);
  66. }
  67. });
  68. }
  69. main().catch((err) => {
  70. console.error("Fatal:", err);
  71. process.exit(1);
  72. });