diff --git a/backend/app.js b/backend/app.js index 9da6d7b..f6f128c 100644 --- a/backend/app.js +++ b/backend/app.js @@ -1,10 +1,12 @@ -const express = require("express"); -const cors = require("cors"); -const path = require("path"); -const User = require("./models/user.model"); - -const app = express(); -app.use(express.json()); +const express = require("express"); +const cors = require("cors"); +const path = require("path"); +const User = require("./models/user.model"); +const requestIdMiddleware = require("./middleware/request-id"); + +const app = express(); +app.use(requestIdMiddleware); +app.use(express.json()); // Serve static files from public directory app.use('/test', express.static(path.join(__dirname, 'public'))); @@ -54,4 +56,4 @@ app.use("/households", householdsRoutes); const storesRoutes = require("./routes/stores.routes"); app.use("/stores", storesRoutes); -module.exports = app; \ No newline at end of file +module.exports = app; diff --git a/backend/middleware/request-id.js b/backend/middleware/request-id.js new file mode 100644 index 0000000..970d3fa --- /dev/null +++ b/backend/middleware/request-id.js @@ -0,0 +1,37 @@ +const crypto = require("crypto"); + +function generateRequestId() { + if (typeof crypto.randomUUID === "function") { + return crypto.randomUUID(); + } + return crypto.randomBytes(16).toString("hex"); +} + +function isPlainObject(value) { + return ( + value !== null && + typeof value === "object" && + !Array.isArray(value) && + Object.prototype.toString.call(value) === "[object Object]" + ); +} + +function requestIdMiddleware(req, res, next) { + const requestId = generateRequestId(); + + req.request_id = requestId; + res.locals.request_id = requestId; + res.setHeader("X-Request-Id", requestId); + + const originalJson = res.json.bind(res); + res.json = (payload) => { + if (isPlainObject(payload) && payload.request_id === undefined) { + return originalJson({ ...payload, request_id: requestId }); + } + return originalJson(payload); + }; + + next(); +} + +module.exports = requestIdMiddleware;