import { getDictLabel, statusDict } from "../../dictionaries"; import type { AuditEvent } from ".."; import { auditExportColumns } from "./auditExportColumns"; import { TEXT } from "../../locales"; export interface AuditExportRow { [key: string]: string; } const extractStatusLabel = (obj?: Record) => { if (!obj) return ""; if (obj.status) return getDictLabel(statusDict, obj.status) || obj.status; return ""; }; export const formatAuditRow = (event: AuditEvent): AuditExportRow => { const beforeStatus = extractStatusLabel(event.before); const afterStatus = extractStatusLabel(event.after); const descriptionParts: string[] = []; descriptionParts.push(`${event.actorName} ${event.actionText}`); if (event.targetTypeLabel || event.targetName || event.targetId) { const targetIdentifier = event.targetName || event.targetId; descriptionParts.push( `${TEXT.audit.objectLabel}${event.targetTypeLabel || ""}${ targetIdentifier ? `(${targetIdentifier})` : "" }` ); } if (event.diffText?.length) { descriptionParts.push(`${TEXT.audit.changeLabel}${event.diffText.join(";")}`); } return { timestamp: event.timestamp || "", actorName: event.actorName || "", actorId: event.actorId || "", actorRoleLabel: event.actorRoleLabel || "", eventLabel: event.eventLabel || "", targetTypeLabel: event.targetTypeLabel || "", targetIdentifier: event.targetName || event.targetId || "", description: descriptionParts.join(";"), beforeStatus, afterStatus, resultLabel: event.resultLabel || "", reason: event.reason || "", ip: event.clientIp || "", ipLocation: event.ipLocation || "", clientSource: event.clientSourceLabel || "", clientType: [event.clientType, event.clientVersion, event.clientPlatform].filter(Boolean).join("/") || "", userAgent: event.userAgent || "", remark: event.diffText?.join(";") || "", }; }; export const formatAuditRows = (events: AuditEvent[]): AuditExportRow[] => { return events.map((ev) => formatAuditRow(ev)).map((row) => { const ordered: AuditExportRow = {}; auditExportColumns.forEach((col) => { ordered[col.key] = row[col.key] ?? ""; }); return ordered; }); };