Audit activité utilisateurs
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user