using Serilog; using DocumentOperator.Infrastructure.Configuration; using DocumentOperator.Application; using DocumentOperator.Infrastructure; using DocumentOperator.API.Middleware; using DocumentOperator.API.Endpoints.v1; using DocumentOperator.API.Configuration; var builder = WebApplication.CreateBuilder(args); // ======================================== // 1. Serilog Configuration // ======================================== Log.Logger = new LoggerConfiguration() .ReadFrom.Configuration(builder.Configuration) .Enrich.FromLogContext() .Enrich.WithProperty("Application", "DocumentOperator") .CreateLogger(); builder.Host.UseSerilog(); Log.Information("Starting DocumentOperator API..."); try { // ======================================== // 2. Options Pattern Configuration // ======================================== builder.Services.Configure( builder.Configuration.GetSection(DocumentOperatorSettings.SectionName)); builder.Services.Configure( builder.Configuration.GetSection(RedisSettings.SectionName)); builder.Services.Configure( builder.Configuration.GetSection(ApiKeySettings.SectionName)); // ======================================== // 3. Services (Clean Architecture Layers) // ======================================== builder.Services.AddApplication(); // Application Layer (MediatR, FluentValidation, Behaviors) builder.Services.AddInfrastructure(); // Infrastructure Layer (DevExpress, Services) builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerDocumentation(); // ======================================== // 4. Build App // ======================================== var app = builder.Build(); // ======================================== // 5. Middleware Pipeline (Order matters!) // ======================================== // Exception Handling FIRST (catches all exceptions from subsequent middleware) app.UseMiddleware(); if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } app.UseSerilogRequestLogging(); // Log HTTP Requests app.UseHttpsRedirection(); // ======================================== // 6. Endpoints (Minimal API) // ======================================== app.MapDocumentEndpoints(); // POST /api/v1/documents/validate Log.Information("DocumentOperator API started successfully"); app.Run(); } catch (Exception ex) { Log.Fatal(ex, "Application startup failed"); throw; } finally { Log.CloseAndFlush(); } // Make Program class accessible for Integration Tests public partial class Program { }