/** * audit.js — Helper d'enregistrement des événements d'audit. * * Usage : * import { audit } from '../utils/audit.js'; * audit(req, { action: 'login_success', category: 'auth', targetUserId: user.id }); */ import db from '../db/index.js'; /** * Enregistre un événement dans audit_logs. * * @param {import('express').Request} req — pour extraire IP + User-Agent * @param {{ * action: string, — identifiant court de l'action (ex: 'login_success') * category: string, — 'auth' | 'account' | 'role' | 'status' | '2fa' | 'invitation' * actorId?: number, — qui a effectué l'action (null = système/anonyme) * targetUserId?: number, — utilisateur concerné * details?: object, — données complémentaires libres * }} opts */ export function audit(req, { action, category, actorId = null, targetUserId = null, details = null }) { try { const ip = req?.headers?.['x-forwarded-for']?.split(',')[0]?.trim() || req?.socket?.remoteAddress || null; const ua = req?.headers?.['user-agent'] || null; db.prepare(` INSERT INTO audit_logs (actor_id, target_user_id, action, category, details, ip_address, user_agent) VALUES (?, ?, ?, ?, ?, ?, ?) `).run( actorId || null, targetUserId || null, action, category, details ? JSON.stringify(details) : null, ip, ua, ); } catch (e) { // Ne jamais bloquer une requête à cause d'un log console.error('[AUDIT] Erreur enregistrement:', e.message); } }