import { AuditEvent, AuditFormatter as IAuditFormatter } from '../types'; export class AuditFormatter { static defaultFormatter: IAuditFormatter = { name: 'default', format: (event: AuditEvent) => event, }; static jsonFormatter: IAuditFormatter = { name: 'json', format: (event: AuditEvent) => { return { ...event, timestamp: event.timestamp.toISOString(), formatted: true, } as any; }, }; static humanReadableFormatter: IAuditFormatter = { name: 'human-readable', format: (event: AuditEvent) => { const formatted = { ...event }; // Format the action as human readable formatted.action = event.action .split('.') .map(part => part.charAt(0).toUpperCase() + part.slice(1)) .join(' '); return formatted; }, }; static privacyFormatter: IAuditFormatter = { name: 'privacy', format: (event: AuditEvent) => { const formatted = { ...event }; // Redact sensitive information if (formatted.actor.email) { const [localPart, domain] = formatted.actor.email.split('@'); formatted.actor.email = `${localPart.slice(0, 2)}***@${domain}`; } if (formatted.context?.ip) { const parts = formatted.context.ip.split('.'); formatted.context.ip = `${parts[0]}.${parts[1]}.xxx.xxx`; } return formatted; }, }; static compactFormatter: AuditFormatter = { name: 'compact', format: (event: AuditEvent) => { return { id: event.id, timestamp: event.timestamp, action: event.action, actor: event.actor.id, resource: `${event.resource.type}:${event.resource.id}`, result: event.result, } as any; }, }; }