120 lines
5.1 KiB
C#
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;
|
|
}
|
|
}
|