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 ProcesarCambios(IEnumerable cambios, DateTime fechaActual, long dniUsuario) { var logDetalles = new List(); 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; } }