using Hangfire; using Hangfire.MemoryStorage; using HealthChecks.UI.Client; using Microsoft.AspNetCore.Diagnostics.HealthChecks; using Newsbot.Collector.Api.Startup; using Newsbot.Collector.Domain.Consts; using Newsbot.Collector.Domain.Models; using Newsbot.Collector.Domain.Models.Config; using Newsbot.Collector.Domain.Models.Config.Sources; using Serilog; using ILogger = Serilog.ILogger; var builder = WebApplication.CreateBuilder(args); // Define Logger builder.Host.UseSerilog(); // Build the config var config = GetConfiguration(); builder.Configuration.AddConfiguration(config); Log.Logger = GetLogger(config); Log.Information("Starting up"); // configure Entity Framework // Allow the controllers to access all the table repositories based on the interface DatabaseStartup.BuildDatabase(builder.Services, config); DatabaseStartup.InjectTableClasses(builder.Services); DatabaseStartup.InjectIdentityService(builder.Services); // Configure Hangfire builder.Services.AddHangfire(f => f.UseMemoryStorage()); builder.Services.AddHangfireServer(); GlobalConfiguration.Configuration.UseSerilogLogProvider(); // Build Health Checks builder.Services.AddHealthChecks() .AddNpgSql(config.GetValue(ConfigConst.ConnectionStringDatabase) ?? ""); builder.Services.AddControllers(); SwaggerStartup.ConfigureSwagger(builder.Services); builder.Services.Configure(config.GetSection("ConnectionStrings")); builder.Services.Configure(config.GetSection(ConfigSectionsConst.ConnectionStrings)); builder.Services.Configure(config.GetSection(ConfigSectionsConst.Rss)); builder.Services.Configure(config.GetSection(ConfigSectionsConst.Youtube)); IdentityStartup.DefineJwtRequirements(builder.Services, config); var app = builder.Build(); // Configure the HTTP request pipeline. // Enable Swagger if requested based on config if (config.GetValue(ConfigConst.EnableSwagger)) { app.UseSwagger(); app.UseSwaggerUI(); } app.UseHttpsRedirection(); // Enable Hangfire background jobs app.UseHangfireDashboard(); BackgroundJobs.SetupRecurringJobs(config); app.UseAuthorization(); app.UseAuthentication(); // Add middleware //app.UseMiddleware(); // Add HealthChecks app.MapHealthChecks("/health", new HealthCheckOptions { Predicate = _ => true, ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse }); app.MapControllers(); // Run Database Migrations if requested using var serviceScope = app.Services.CreateScope(); if (config.GetValue(ConfigConst.RunDatabaseMigrationsOnStartup)) { await DatabaseStartup.RunDatabaseMigrationsAsync(serviceScope); } else { Log.Warning("Database Migrations have been skipped. Make sure you run them on your own"); } // Inject the roles await DatabaseStartup.InjectIdentityRolesAsync(serviceScope); // Start the application app.Run(); static IConfiguration GetConfiguration() { return new ConfigurationBuilder() .AddJsonFile("appsettings.json", true) .AddJsonFile("config/appsettings.json", true) .AddEnvironmentVariables() .Build(); } static ILogger GetLogger(IConfiguration configuration) { var otel = configuration.GetValue(ConfigConst.ConnectionStringOpenTelemetry) ?? ""; if (otel == "") return Log.Logger = new LoggerConfiguration() .WriteTo.Console() .MinimumLevel.Information() .CreateLogger(); return Log.Logger = new LoggerConfiguration() .WriteTo.Console() .MinimumLevel.Information() .WriteTo.OpenTelemetry( otel, resourceAttributes: new Dictionary { { "Application", "newsbot-collector-api"}, { "service.name", "newsbot-collector-api" } }) .CreateLogger(); }