using System.Text.Json.Serialization; using ERPCore.Infra.Auth; using ERPCore.Infra.Persistence; using ERPCore.Infra.UoW; using ERPCore.Repositories; using ERPCore.Repositories.Interfaces; using ERPCore.Services; using ERPCore.Services.Interfaces; using ERPCore.System.Errors; using Microsoft.EntityFrameworkCore; using Microsoft.OpenApi; using Serilog; var builder = WebApplication.CreateBuilder(args); // Serilog (file sink) — reads levels from configuration, plus a rolling daily file. builder.Host.UseSerilog((ctx, cfg) => cfg .ReadFrom.Configuration(ctx.Configuration) .WriteTo.File("logs/erpcore-.log", rollingInterval: RollingInterval.Day)); // Controllers + JSON: serialize enums as their string names (docs/11 §8, camelCase). builder.Services.AddControllers() .AddJsonOptions(o => o.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter())); // EF Core + PostgreSQL builder.Services.AddDbContext(o => o.UseNpgsql(builder.Configuration.GetConnectionString("DefaultConnection"))); // ProblemDetails (RFC 7807) + domain-exception mapping builder.Services.AddProblemDetails(); builder.Services.AddExceptionHandler(); // JWT bearer auth (RBAC deferred; identity used only for the audit stamp) builder.Services.AddErpJwtAuth(builder.Configuration); // Current-user (audit actor) derived from token `sub` builder.Services.AddHttpContextAccessor(); builder.Services.AddScoped(); // Unit of work + generic repository base builder.Services.AddScoped(); builder.Services.AddScoped(typeof(IRepository<>), typeof(Repository<>)); // Master-data services (docs/11 §2) builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); // Health checks (EF Core DB) builder.Services.AddHealthChecks().AddDbContextCheck(); // Swagger / OpenAPI (Swashbuckle v10 → OpenAPI 3.1) builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(o => o.SwaggerDoc("v1", new OpenApiInfo { Title = "ERPCore API", Version = "v1" })); var app = builder.Build(); app.UseSerilogRequestLogging(); if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } app.UseExceptionHandler(); // -> DomainExceptionHandler / ProblemDetails app.UseAuthentication(); app.UseAuthorization(); app.MapControllers(); app.MapHealthChecks("/health"); app.Run();