using System.Text; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.IdentityModel.Tokens; using SIGCM.Infrastructure; using SIGCM.Infrastructure.Data; using QuestPDF.Infrastructure; using FluentValidation; using FluentValidation.AspNetCore; using SIGCM.API.Middleware; var builder = WebApplication.CreateBuilder(args); QuestPDF.Settings.License = LicenseType.Community; // 1. Agregar servicios al contenedor. builder.Services.AddControllers(); builder.Services.AddFluentValidationAutoValidation() .AddFluentValidationClientsideAdapters(); // Registrar validadores manualmente si es necesario o por asamblea builder.Services.AddValidatorsFromAssemblyContaining(); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); builder.Services.AddControllers() .AddJsonOptions(options => { options.JsonSerializerOptions.PropertyNamingPolicy = System.Text.Json.JsonNamingPolicy.CamelCase; }); // 2. Configurar Autenticación JWT var key = Encoding.ASCII.GetBytes(builder.Configuration["Jwt:Key"]!); builder.Services.AddAuthentication(options => { options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; }) .AddJwtBearer(options => { options.RequireHttpsMetadata = false; options.SaveToken = true; options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuerSigningKey = true, IssuerSigningKey = new SymmetricSecurityKey(key), ValidateIssuer = true, ValidIssuer = builder.Configuration["Jwt:Issuer"], ValidateAudience = true, ValidAudience = builder.Configuration["Jwt:Audience"], ValidateLifetime = true, ClockSkew = TimeSpan.Zero }; }); // 3. Agregar Capa de Infraestructura builder.Services.AddInfrastructure(builder.Configuration); // 4. Configurar CORS builder.Services.AddCors(options => { options.AddPolicy("AllowFrontend", policy => { policy.WithOrigins( "http://localhost:5173", "http://localhost:5174", "http://localhost:5175", "http://localhost:5177") .AllowAnyHeader() .AllowAnyMethod(); }); }); var app = builder.Build(); // --- Configuración del Pipeline HTTP --- app.UseMiddleware(); app.UseMiddleware(); if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } app.UseHttpsRedirection(); app.UseStaticFiles(); // Para servir imágenes app.UseCors("AllowFrontend"); // IMPORTANTE: El orden importa aquí app.UseAuthentication(); // <- Esto faltaba app.UseAuthorization(); app.MapControllers(); // Inicializar BD using (var scope = app.Services.CreateScope()) { var initializer = scope.ServiceProvider.GetRequiredService(); await initializer.InitializeAsync(); } app.Run();