HotTRDealsBackend/services/audit.service.js
2026-02-04 06:39:10 +00:00

52 lines
1.7 KiB
JavaScript

const { queueAuditEvent } = require("./redis/dbSync.service")
function buildAuditMeta({ entityType, entityId, before = undefined, after = undefined, extra = undefined } = {}) {
const meta = {}
if (entityType) meta.entityType = entityType
if (entityId !== undefined) meta.entityId = entityId
if (before !== undefined) meta.before = before
if (after !== undefined) meta.after = after
if (extra !== undefined) meta.extra = extra
return meta
}
function normalizeAuditMeta(meta) {
if (!meta) return null
if (typeof meta !== "object") return buildAuditMeta({ extra: meta })
const entityType = meta.entityType
const entityId = Object.prototype.hasOwnProperty.call(meta, "entityId") ? meta.entityId : undefined
const before = Object.prototype.hasOwnProperty.call(meta, "before") ? meta.before : undefined
const after = Object.prototype.hasOwnProperty.call(meta, "after") ? meta.after : undefined
const extra = Object.prototype.hasOwnProperty.call(meta, "extra") ? meta.extra : undefined
return buildAuditMeta({ entityType, entityId, before, after, extra })
}
function enqueueAuditEvent({ userId, action, ip, userAgent, meta = null }) {
if (!userId || !action) return
const normalizedMeta = normalizeAuditMeta(meta)
queueAuditEvent({
userId: Number(userId),
action,
ip,
userAgent,
meta: normalizedMeta,
}).catch((err) => console.error("Audit enqueue failed:", err?.message || err))
}
function enqueueAuditFromRequest(req, action, meta = null) {
if (!req?.auth?.userId) return
enqueueAuditEvent({
userId: req.auth.userId,
action,
ip: req.ip,
userAgent: req.headers["user-agent"] || null,
meta,
})
}
module.exports = {
enqueueAuditEvent,
enqueueAuditFromRequest,
buildAuditMeta,
}