47 lines
1.5 KiB
JavaScript
47 lines
1.5 KiB
JavaScript
/**
|
|
* 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);
|
|
}
|
|
}
|