feature/IO-3357-Reynolds-and-Reynolds-DMS-API-Integration - Checkpoint

This commit is contained in:
Dave
2025-10-07 16:45:06 -04:00
parent c149d457e7
commit 2ffc4b81f4
28 changed files with 2594 additions and 1642 deletions

View File

@@ -1,49 +1,50 @@
// -----------------------------------------------------------------------------
// Thin wrapper around the shared logger + a socket emitter,
// mirroring the Fortellis logger shape for parity.
//
// Emits: "rr-log-event" { level, message, txnDetails }
//
// NOTE: Keep this lightweight and side-effect free—downstream flows rely on it
// for both developer troubleshooting and UI progress messages.
// -----------------------------------------------------------------------------
/**
* @file rr-logger.js
* @description Centralized logger for Reynolds & Reynolds (RR) integrations.
* Emits logs to CloudWatch via logger util, and back to client sockets for live visibility.
*/
const logger = require("../utils/logger");
/**
* Emit a structured RR log event to both the central logger and (if present)
* over the current socket connection for real-time UI visibility.
* Create a structured RR log event.
*
* @param {Object} socket - A Socket.IO socket OR an Express req (when reused in REST).
* Expected fields if present:
* - socket.user?.email (used as the "actor" for audit trails)
* - socket.emit(...) method in live socket contexts
* @param {"SILLY"|"DEBUG"|"INFO"|"WARN"|"ERROR"} level - Log severity
* @param {string} message - Human readable message
* @param {Object} [txnDetails] - Optional structured metadata (ids, payload snippets, timings)
* @param {object} socket - The socket or Express request (both supported).
* @param {"debug"|"info"|"warn"|"error"} level - Log level.
* @param {string} message - Human-readable log message.
* @param {object} [txnDetails] - Optional additional details (payloads, responses, etc.)
*/
function CreateRRLogEvent(socket, level, message, txnDetails) {
const userEmail = socket?.user?.email || "unknown";
// 1) Centralized app logger (goes to your sinks: console, Datadog, etc.)
// Namespace: "rr-log-event" to keep provider logs grouped.
const RRLogger = (socket, level = "info", message, txnDetails = {}) => {
try {
logger.log("rr-log-event", level, userEmail, null, {
// Normalize level to uppercase for CloudWatch
const levelUpper = level.toUpperCase();
// Safe email and job correlation
const userEmail =
socket?.user?.email || socket?.request?.user?.email || socket?.handshake?.auth?.email || "unknown@user";
const jobid = socket?.JobData?.id || txnDetails?.jobid || null;
// Main logging entry (to CloudWatch / file)
logger.log("rr-log-event", levelUpper, userEmail, jobid, {
wsmessage: message,
txnDetails
});
} catch {
// Best-effort: never throw from logging
}
// 2) Realtime push to the UI if we're in a socket context
try {
if (typeof socket?.emit === "function") {
socket.emit("rr-log-event", { level, message, txnDetails });
// Emit to live Socket.IO client if available
if (typeof socket.emit === "function") {
socket.emit("rr-log-event", {
level: levelUpper,
message,
txnDetails,
timestamp: new Date().toISOString()
});
}
} catch {
// Best-effort: never throw from logging
} catch (err) {
// As a fallback, log directly to console
console.error("RRLogger internal error:", err);
console.error("Original message:", message, txnDetails);
}
}
};
module.exports = CreateRRLogEvent;
module.exports = RRLogger;