From 0fcdf899e67bd93d418a9d87fe70917ce7b175a9 Mon Sep 17 00:00:00 2001 From: dmolinari Date: Thu, 12 Feb 2026 11:07:43 -0300 Subject: [PATCH] =?UTF-8?q?Revert=20"Feat:=20Reforma=20de=20unificaci?= =?UTF-8?q?=C3=B3n=20de=20bases=20de=20datos."?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 32cf2ba74a9ff1f85cccb1e9e49033750ccdc23b. # Conflicts: # Backend/MotoresArgentinosV2.API/Program.cs --- Backend/MotoresArgentinosV2.API/Program.cs | 21 ++++------- .../Data/InternetDbContext.cs | 36 +++++++++++++++++++ .../Services/AvisosLegacyService.cs | 4 +-- .../Services/LegacyPaymentService.cs | 2 +- .../Services/UsuariosLegacyService.cs | 4 +-- 5 files changed, 47 insertions(+), 20 deletions(-) create mode 100644 Backend/MotoresArgentinosV2.Infrastructure/Data/InternetDbContext.cs diff --git a/Backend/MotoresArgentinosV2.API/Program.cs b/Backend/MotoresArgentinosV2.API/Program.cs index 453ff19..a86808a 100644 --- a/Backend/MotoresArgentinosV2.API/Program.cs +++ b/Backend/MotoresArgentinosV2.API/Program.cs @@ -39,8 +39,6 @@ builder.Services.AddCors(options => }); // FORWARDED HEADERS (CRÍTICO PARA DOCKER/NGINX) -// Por defecto, .NET solo confía en localhost. En Docker, Nginx tiene otra IP. -// Debemos limpiar las redes conocidas para que confíe en el proxy interno de Docker. builder.Services.Configure(options => { options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto; @@ -55,18 +53,15 @@ builder.Services.AddRateLimiter(options => options.GlobalLimiter = PartitionedRateLimiter.Create(context => { - // En producción detrás de Nginx, RemoteIpAddress será la IP real del usuario. - // Si por alguna razón falla (ej: conexión directa local), usamos "unknown". var remoteIp = context.Connection.RemoteIpAddress?.ToString() ?? "unknown"; - // Si es Loopback (localhost), sin límites (útil para dev) if (System.Net.IPAddress.IsLoopback(context.Connection.RemoteIpAddress!)) { return RateLimitPartition.GetNoLimiter("loopback"); } return RateLimitPartition.GetFixedWindowLimiter( - partitionKey: remoteIp, // Clave correcta: IP del usuario + partitionKey: remoteIp, factory: _ => new FixedWindowRateLimiterOptions { AutoReplenishment = true, @@ -78,7 +73,6 @@ builder.Services.AddRateLimiter(options => options.AddPolicy("AuthPolicy", context => { - // Si es localhost, SIN LÍMITES (Evita auto-bloqueo en desarrollo) var remoteIp = context.Connection.RemoteIpAddress; if (remoteIp != null && System.Net.IPAddress.IsLoopback(remoteIp)) { @@ -100,9 +94,13 @@ builder.Services.Configure(options => options.BackgroundServiceExceptionBehavior = BackgroundServiceExceptionBehavior.Ignore; }); -// DB CONTEXTS (Legacy unificado en eldia) +// DB CONTEXTS +builder.Services.AddDbContext(options => + options.UseSqlServer(builder.Configuration.GetConnectionString("Internet"))); + builder.Services.AddDbContext(options => options.UseSqlServer(builder.Configuration.GetConnectionString("eldia"))); + builder.Services.AddDbContext(options => options.UseSqlServer(builder.Configuration.GetConnectionString("MotoresV2"), sqlOptions => sqlOptions.EnableRetryOnFailure())); @@ -144,7 +142,6 @@ builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) { OnMessageReceived = context => { - // Buscar el token en la cookie llamada "accessToken" var accessToken = context.Request.Cookies["accessToken"]; if (!string.IsNullOrEmpty(accessToken)) { @@ -175,11 +172,7 @@ app.Use(async (context, next) => context.Response.Headers.Append("X-Content-Type-Options", "nosniff"); context.Response.Headers.Append("Referrer-Policy", "strict-origin-when-cross-origin"); context.Response.Headers.Append("X-XSS-Protection", "1; mode=block"); - - // Permissions-Policy: Bloquear funcionalidades sensibles del navegador no usadas context.Response.Headers.Append("Permissions-Policy", "accelerometer=(), camera=(), geolocation=(), gyroscope=(), magnetometer=(), microphone=(), payment=(), usb=()"); - - // CSP adaptada para permitir pagos en Payway y WebSockets de Vite string csp = "default-src 'self'; " + "img-src 'self' data: https: blob:; " + "script-src 'self' 'unsafe-inline'; " + @@ -190,7 +183,6 @@ app.Use(async (context, next) => "form-action 'self' https://developers-ventasonline.payway.com.ar; " + "frame-ancestors 'none';"; context.Response.Headers.Append("Content-Security-Policy", csp); - context.Response.Headers.Remove("Server"); context.Response.Headers.Remove("X-Powered-By"); await next(); @@ -204,7 +196,6 @@ if (app.Environment.IsDevelopment()) } else { - // 🔒 HSTS en Producción app.UseHsts(); } diff --git a/Backend/MotoresArgentinosV2.Infrastructure/Data/InternetDbContext.cs b/Backend/MotoresArgentinosV2.Infrastructure/Data/InternetDbContext.cs new file mode 100644 index 0000000..599204b --- /dev/null +++ b/Backend/MotoresArgentinosV2.Infrastructure/Data/InternetDbContext.cs @@ -0,0 +1,36 @@ +// Backend/MotoresArgentinosV2.Infrastructure/Data/InternetDbContext.cs +using Microsoft.EntityFrameworkCore; +using MotoresArgentinosV2.Core.DTOs; + +namespace MotoresArgentinosV2.Infrastructure.Data; + +/// +/// Contexto de Entity Framework para la base de datos Internet (legacy) +/// Servidor: ... +/// Base de Datos: internet +/// Propósito: Acceso a datos de avisos web +/// +public class InternetDbContext : DbContext +{ + public InternetDbContext(DbContextOptions options) : base(options) + { + } + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + base.OnModelCreating(modelBuilder); + + // Registrar el DTO como entidad sin llave (Keyless) para que SqlQueryRaw funcione bien + modelBuilder.Entity(e => + { + e.HasNoKey(); + e.ToView(null); // No mapea a tabla + + // Configurar precisión de decimales para silenciar warnings + e.Property(p => p.ImporteSiniva).HasColumnType("decimal(18,2)"); + e.Property(p => p.ImporteTotsiniva).HasColumnType("decimal(18,2)"); + e.Property(p => p.PorcentajeCombinado).HasColumnType("decimal(18,2)"); + e.Property(p => p.Centimetros).HasColumnType("decimal(18,2)"); + }); + } +} diff --git a/Backend/MotoresArgentinosV2.Infrastructure/Services/AvisosLegacyService.cs b/Backend/MotoresArgentinosV2.Infrastructure/Services/AvisosLegacyService.cs index 5556d15..c6ae707 100644 --- a/Backend/MotoresArgentinosV2.Infrastructure/Services/AvisosLegacyService.cs +++ b/Backend/MotoresArgentinosV2.Infrastructure/Services/AvisosLegacyService.cs @@ -10,10 +10,10 @@ namespace MotoresArgentinosV2.Infrastructure.Services; public class AvisosLegacyService : IAvisosLegacyService { - private readonly EldiaDbContext _context; + private readonly InternetDbContext _context; private readonly ILogger _logger; - public AvisosLegacyService(EldiaDbContext context, ILogger logger) + public AvisosLegacyService(InternetDbContext context, ILogger logger) { _context = context; _logger = logger; diff --git a/Backend/MotoresArgentinosV2.Infrastructure/Services/LegacyPaymentService.cs b/Backend/MotoresArgentinosV2.Infrastructure/Services/LegacyPaymentService.cs index b7cad17..d5d3f51 100644 --- a/Backend/MotoresArgentinosV2.Infrastructure/Services/LegacyPaymentService.cs +++ b/Backend/MotoresArgentinosV2.Infrastructure/Services/LegacyPaymentService.cs @@ -20,7 +20,7 @@ public class LegacyPaymentService : ILegacyPaymentService public LegacyPaymentService(IConfiguration config, MotoresV2DbContext v2Context, ILogger logger) { - _internetConn = config.GetConnectionString("eldia") ?? ""; + _internetConn = config.GetConnectionString("Internet") ?? ""; _v2Context = v2Context; _config = config; _logger = logger; diff --git a/Backend/MotoresArgentinosV2.Infrastructure/Services/UsuariosLegacyService.cs b/Backend/MotoresArgentinosV2.Infrastructure/Services/UsuariosLegacyService.cs index 8ff5896..8e38960 100644 --- a/Backend/MotoresArgentinosV2.Infrastructure/Services/UsuariosLegacyService.cs +++ b/Backend/MotoresArgentinosV2.Infrastructure/Services/UsuariosLegacyService.cs @@ -9,10 +9,10 @@ namespace MotoresArgentinosV2.Infrastructure.Services; public class UsuariosLegacyService : IUsuariosLegacyService { - private readonly EldiaDbContext _context; + private readonly InternetDbContext _context; private readonly ILogger _logger; - public UsuariosLegacyService(EldiaDbContext context, ILogger logger) + public UsuariosLegacyService(InternetDbContext context, ILogger logger) { _context = context; _logger = logger;