HAL module: consumes CloudEvents from AMQP and forwards as email notifications
25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.

85 satır
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. });