using System.Net; 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); } internal void GenerarLogLogin(long dni, string v, IPAddress? remoteIpAddress) { var fechaActual = DateTime.Now; var log = new Log{ Fecha = fechaActual, Dniusuario = dni, Accion = v }; log.LogDetalles = new List([ new LogDetalle{ Id = 1, Dniusuario = dni, Fecha = fechaActual, NombreTabla = "Logs", Columna = "Login", ValorAnterior = "", ValorNuevo = $"Se Accedio con la direccion ip: {remoteIpAddress?.ToString() ?? "Desconocida"}", } ]); _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??"")) { 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; } }