feat: implementado todo lo de auditoria tocaria testearlo nomás

This commit is contained in:
2025-01-27 20:13:15 -03:00
parent 7b1e70999f
commit 17fae0e777
20 changed files with 204 additions and 115 deletions

View File

@@ -0,0 +1,98 @@
using Entidades;
using Microsoft.EntityFrameworkCore;
namespace Modelo.Facade;
public class AuditoriaFacade {
private readonly AlquilaFacilContext _context;
private readonly FiltroCambios _filtradoDeCambios=new();
private readonly ValidadorDeCambios _validadorDeCambios=new();
private readonly PersistenciaLog _persistenciaDeLog=new();
public AuditoriaFacade(AlquilaFacilContext context) {
_context = context;
}
public void GenerarLog(long dniUsuario, string v) {
var cambios = _filtradoDeCambios.FiltrarCambios(_context.ChangeTracker.Entries());
var fechaActual = DateTime.Now;
var log = new Log{
Fecha = fechaActual,
Dniusuario = dniUsuario,
Accion = v
};
log.LogDetalles = ProcesarCambios(cambios, fechaActual, dniUsuario);
_persistenciaDeLog.GuardarLog(log, log.LogDetalles);
}
private List<LogDetalle> ProcesarCambios(IEnumerable<Microsoft.EntityFrameworkCore.ChangeTracking.EntityEntry> cambios,
DateTime fechaActual, long dniUsuario) {
var logDetalles = new List<LogDetalle>();
foreach (var cambio in cambios) {
var nombreTabla = cambio.Entity.GetType().Name;
Console.WriteLine($"Entidad: {cambio.Entity.GetType().Name}, Estado: {cambio.State}");
switch (cambio.State) {
case EntityState.Modified:
foreach (var propiedad in cambio.OriginalValues.Properties) {
if (propiedad.Name == "Token") break;
var valorAnterior = cambio.OriginalValues[propiedad]?.ToString();
var valorNuevo = cambio.CurrentValues[propiedad]?.ToString();
if (_validadorDeCambios.ValidarCambio(valorAnterior??"", valorNuevo??"")) {
logDetalles.Add(new LogDetalle {
Fecha = fechaActual,
Dniusuario = dniUsuario,
NombreTabla = nombreTabla,
Columna = propiedad.Name,
ValorAnterior = valorAnterior,
ValorNuevo = valorNuevo
});
}
}
break;
case EntityState.Added:
foreach (var propiedad in cambio.CurrentValues.Properties) {
if (propiedad.Name == "Token") break;
var valorNuevo = cambio.CurrentValues[propiedad]?.ToString();
logDetalles.Add(new LogDetalle {
Fecha = fechaActual,
Dniusuario = dniUsuario,
NombreTabla = nombreTabla,
Columna = propiedad.Name,
ValorAnterior = null,
ValorNuevo = valorNuevo
});
}
break;
case EntityState.Deleted:
foreach (var propiedad in cambio.OriginalValues.Properties) {
if (propiedad.Name == "Token") break;
var valorAnterior = cambio.OriginalValues[propiedad]?.ToString();
logDetalles.Add(new LogDetalle {
Fecha = fechaActual,
Dniusuario = dniUsuario,
NombreTabla = nombreTabla,
Columna = propiedad.Name,
ValorAnterior = valorAnterior,
ValorNuevo = null
});
}
break;
default:
Console.WriteLine($"Estado no manejado: {cambio.State}");
break;
}
}
return logDetalles;
}
}

View File

@@ -0,0 +1,6 @@
namespace Modelo.Facade;
public class FiltroCambios {
public IEnumerable<Microsoft.EntityFrameworkCore.ChangeTracking.EntityEntry> FiltrarCambios(IEnumerable<Microsoft.EntityFrameworkCore.ChangeTracking.EntityEntry> cambios) {
return cambios.Where(c => c.Entity.GetType().Name != "EntidadExcluida");
}
}

View File

@@ -0,0 +1,11 @@
using Entidades;
namespace Modelo.Facade;
public class PersistenciaLog {
private AlquilaFacilContext _context {get{return new AlquilaFacilContext();}}
public void GuardarLog(Log log, IEnumerable<LogDetalle> detalles) {
var con = _context;
con.Logs.Add(log);
con.LogDetalles.AddRange(detalles);
con.SaveChanges();
}
}

View File

@@ -0,0 +1,6 @@
namespace Modelo.Facade;
public class ValidadorDeCambios {
public bool ValidarCambio(string valorAnterior, string valorNuevo) {
return !string.IsNullOrEmpty(valorNuevo) && valorAnterior != valorNuevo;
}
}