diff --git a/backend/app/api/schemas/audit.py b/backend/app/api/schemas/audit.py index 2093051..1d31d0a 100644 --- a/backend/app/api/schemas/audit.py +++ b/backend/app/api/schemas/audit.py @@ -84,6 +84,7 @@ class AuditLogStats(BaseModel): total_actions: int = Field(description="Total de acciones registradas") actions_today: int = Field(description="Acciones en las ├║ltimas 24 horas") actions_this_week: int = Field(description="Acciones en los ├║ltimos 7 d├¡as") + critical_actions_today: int = Field(description="Acciones cr├¡ticas hoy (delete, cambios sensibles)") # Top acciones top_actions: Dict[str, int] = Field(description="Acciones m├ís frecuentes") diff --git a/backend/app/api/v1/endpoints/audit.py b/backend/app/api/v1/endpoints/audit.py index bb4bf14..3320d39 100644 --- a/backend/app/api/v1/endpoints/audit.py +++ b/backend/app/api/v1/endpoints/audit.py @@ -270,10 +270,27 @@ async def get_audit_stats( # En producci├│n podr├¡as hacer un join con users para obtener nombres top_users = {} # Placeholder - implementar con join si es necesario + # Acciones cr├¡ticas hoy (delete, update sensibles, etc.) + critical_actions_query = select(func.count()).select_from(AuditLog).where( + and_( + AuditLog.tenant_id == current_tenant.id, + AuditLog.created_at >= today_start, + or_( + AuditLog.action.like('%.delete'), + AuditLog.action.like('user.update'), + AuditLog.action.like('%.assign'), + AuditLog.action.in_(['user.login_failed', 'user.logout']) + ) + ) + ) + critical_result = await db.execute(critical_actions_query) + critical_actions_today = critical_result.scalar() or 0 + return AuditLogStats( total_actions=total_actions, actions_today=actions_today, actions_this_week=actions_this_week, + critical_actions_today=critical_actions_today, top_actions=top_actions, top_users=top_users, by_resource_type=by_resource_type diff --git a/frontend-internal/src/routes/audit/+page.svelte b/frontend-internal/src/routes/audit/+page.svelte index ac5fc65..5dc0ab3 100644 --- a/frontend-internal/src/routes/audit/+page.svelte +++ b/frontend-internal/src/routes/audit/+page.svelte @@ -193,6 +193,27 @@ loadLogs(); } + /** + * Filtrar por acciones críticas (vulnerabilidad) + */ + function filterCriticalActions() { + // Limpiar otros filtros + filterUserId = ''; + filterResourceType = ''; + + // Buscar acciones críticas: delete, update sensibles, etc. + searchText = 'delete'; + + // Cambiar a hoy para ver las del día + periodFilter = 'today'; + + // Expandir filtros avanzados para que el usuario vea lo aplicado + showAdvancedFilters = true; + + currentPage = 1; + loadLogs(); + } + /** * Cambiar página */ @@ -408,15 +429,28 @@