Audit activité utilisateurs

This commit is contained in:
2026-06-15 22:28:15 +02:00
parent f54d352b7f
commit a5b4f3e721
10 changed files with 528 additions and 21 deletions
+46
View File
@@ -0,0 +1,46 @@
/**
* 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);
}
}