using System.Text; using line_gestao_api.Data; using line_gestao_api.Models; using line_gestao_api.Services; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.Http.Features; using Microsoft.AspNetCore.Identity; using Microsoft.EntityFrameworkCore; using Microsoft.IdentityModel.Tokens; var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers(); builder.Services.Configure(o => { o.MultipartBodyLengthLimit = 50_000_000; }); var corsOrigins = builder.Configuration .GetSection("Cors:AllowedOrigins") .Get()? .Where(o => !string.IsNullOrWhiteSpace(o)) .Select(o => o.Trim()) .Distinct(StringComparer.OrdinalIgnoreCase) .ToArray() ?? []; if (corsOrigins.Length == 0) { corsOrigins = ["http://localhost:4200"]; } builder.Services.AddCors(options => { options.AddPolicy("Front", p => p.WithOrigins(corsOrigins) .AllowAnyHeader() .AllowAnyMethod() ); }); builder.Services.AddDbContext(options => options.UseNpgsql(builder.Configuration.GetConnectionString("Default")) ); builder.Services.AddHttpContextAccessor(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddIdentityCore(options => { options.Password.RequiredLength = 6; options.User.RequireUniqueEmail = false; }) .AddRoles>() .AddEntityFrameworkStores() .AddDefaultTokenProviders(); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); var jwtKey = builder.Configuration["Jwt:Key"]; if (string.IsNullOrWhiteSpace(jwtKey)) { throw new InvalidOperationException("Configuration 'Jwt:Key' is required."); } var issuer = builder.Configuration["Jwt:Issuer"]; var audience = builder.Configuration["Jwt:Audience"]; builder.Services .AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true, ValidIssuer = issuer, ValidAudience = audience, IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtKey)) }; }); builder.Services.AddAuthorization(); builder.Services.Configure(builder.Configuration.GetSection("Notifications")); builder.Services.AddHostedService(); builder.Services.Configure(builder.Configuration.GetSection("Seed")); var app = builder.Build(); if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } var useHttpsRedirection = builder.Configuration.GetValue("App:UseHttpsRedirection", !app.Environment.IsDevelopment()); if (useHttpsRedirection) { app.UseHttpsRedirection(); } app.UseCors("Front"); app.UseAuthentication(); app.UseMiddleware(); app.UseAuthorization(); await SeedData.EnsureSeedDataAsync(app.Services); app.MapControllers(); app.MapGet("/health", () => Results.Ok(new { status = "ok" })); app.Run();