feat: auditoría (audit_log en SQLite, endpoint /api/audit y pantalla /admin/auditoria)

Registra sesiones, creaciones y modificaciones en SAP (solo nombres de campos), denegados y cambios de permisos.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
GeorgeandClaude Sonnet 5.5 committed 2026-10-16 12:35:46 -05:00
1 parent 4e9d6a757d
commit fe8c080471
26 files changed
+993 -28

No files matched your search

+32
View File
@@ -0,0 +1,32 @@
/** Hechos que registra la auditoría. */
export type AuditAction =
| 'login'
| 'login_failed'
| 'logout'
| 'sl_create'
| 'sl_update'
| 'sl_denied'
| 'permissions_set'
| 'permissions_remove';
export type AuditOutcome = 'ok' | 'error' | 'denied';
/** Una fila del registro de auditoría (`GET /api/audit`). */
export interface AuditRow {
id: number;
/** Momento (ISO 8601, UTC). */
ts: string;
webUser: string | null;
action: string;
resource: string | null;
key: string | null;
outcome: string;
ip: string | null;
/** Nombres de los campos tocados, motivo o mensaje de error; nunca valores. */
detail: Record<string, unknown> | null;
}
export interface AuditListResponse {
total: number;
rows: AuditRow[];
}
+1
View File
@@ -1,3 +1,4 @@
export * from './audit.js';
export * from './auth.js';
export * from './permissions.js';
export * from './sl.js';
+4 -1
View File
@@ -68,7 +68,10 @@ export const MENU: readonly MenuModule[] = [
id: 'admin',
label: 'Administración',
// Solo acceso total ("*"): el API de permisos exige ser administrador.
items: [{ path: '/admin/permisos', label: 'Permisos de menú' }],
items: [
{ path: '/admin/permisos', label: 'Permisos de menú' },
{ path: '/admin/auditoria', label: 'Auditoría' },
],
},
];