using System.Reflection; using Microsoft.EntityFrameworkCore; using PageFetcher.Data; using Api.Services; using PageFetcher.Models.Settings; using Serilog; using StartupHelpers; StartupExtensions.LoadDotEnvFile(); const string ServiceName = "page-fetcher-api"; var appVersion = StartupExtensions.GetApplicationVersion(Assembly.GetExecutingAssembly()); try { var builder = WebApplication.CreateBuilder(args); builder.ConfigureJsonSerilog(ServiceName, appVersion); Log.Information("Starting {Service} version {AppVersion}", ServiceName, appVersion); builder.AddAzureKeyVaultIfConfigured(); builder.Services.Configure(builder.Configuration.GetSection("PageFetcher")); builder.Services.AddDbContext(options => { var connectionString = builder.Services.GetConfiguredDbConnectionString(builder.Configuration); options.UseSqlServer(connectionString, sql => { sql.MigrationsHistoryTable(PageFetchDbContext.MigrationTableName, PageFetchDbContext.SchemaName); sql.MigrationsAssembly("page-fetcher-data"); }); }); // Playwright browser: singleton hosted service, shared across all requests builder.Services.AddSingleton(); builder.Services.AddHostedService(sp => sp.GetRequiredService()); builder.Services.AddScoped(); builder.Services.AddControllers(); builder.Services.AddSwaggerWithXmlComments(Assembly.GetExecutingAssembly(), "Page Fetcher API"); var app = builder.Build(); app.LogStartupDiagnostics(ServiceName); app.UseDefaultSerilogRequestLogging(); app.UseJsonExceptionHandler(ServiceName); app.UseInternalApiKeyProtection(); app.UseSwaggerInDevelopment("Page Fetcher API", "PageFetcherAPI"); app.UseRouting(); app.UseAuthorization(); app.MapControllers(); Log.Information("Running EF Core migrations if any"); using (var scope = app.Services.CreateScope()) { var db = scope.ServiceProvider.GetRequiredService(); db.Database.Migrate(); } Log.Information("{Service} startup complete. Listening for requests...", ServiceName); app.Run(); } catch (Exception ex) { Log.Fatal(ex, "{Service} terminated unexpectedly", ServiceName); } finally { Log.Information("Shutting down {Service}", ServiceName); Log.CloseAndFlush(); }