Files
AlquilaFacil/Modelo/Facade/AuditoriaFacade.cs
2025-02-03 02:03:31 -03:00

120 lines
5.1 KiB
C#

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??"")) {
if (!_context.LogDetalles.Any(ld =>
ld.Fecha == fechaActual &&
ld.Dniusuario == dniUsuario &&
ld.NombreTabla == nombreTabla &&
ld.Columna == propiedad.Name))
{
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();
if (!_context.LogDetalles.Any(ld =>
ld.Fecha == fechaActual &&
ld.Dniusuario == dniUsuario &&
ld.NombreTabla == nombreTabla &&
ld.Columna == propiedad.Name))
{
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();
if (!_context.LogDetalles.Any(ld =>
ld.Fecha == fechaActual &&
ld.Dniusuario == dniUsuario &&
ld.NombreTabla == nombreTabla &&
ld.Columna == propiedad.Name))
{
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;
}
}