using FinlyticCore.Clients; using FinlyticCore.Database; using FinlyticCore.Services; using FinlyticCore.Services.PlaywrightScrapper; using FinlyticCore.Services.TradeRepublic; using FinlyticCore.Services.Yahoo; using Microsoft.EntityFrameworkCore; using FinlyticFundamentals.Database; using FinlyticFundamentals.Services; using FinlyticFundamentals.Util; using Microsoft.EntityFrameworkCore.Diagnostics; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; var builder = Host.CreateApplicationBuilder(args); // Register DB Context & ISettingsDbContext builder.Services.AddDbContext(options => options.UseNpgsql(builder.Configuration.GetConnectionString("DefaultConnection")) .ConfigureWarnings(w => w.Ignore(RelationalEventId.PendingModelChangesWarning))); builder.Services.AddScoped(sp => sp.GetRequiredService()); // Register HTTP Clients builder.Services.AddHttpClient() .ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler { UseCookies = true, CookieContainer = new System.Net.CookieContainer(), AllowAutoRedirect = true }); builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddTransient(); // Register Application Services builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddSingleton(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddSingleton(); builder.Services.AddSingleton(typeof(IFinlyticLogger<>), typeof(FinlyticLogger<>)); // Register MQTT Client (as a Hosted Service) builder.Services.AddSingleton(); builder.Services.AddHostedService(sp => sp.GetRequiredService()); var host = builder.Build(); // Run startup database migrations using (var scope = host.Services.CreateScope()) { try { var context = scope.ServiceProvider.GetRequiredService(); await context.Database.MigrateAsync(); Console.WriteLine("Database migrations successfully executed for FinlyticFundamentals."); } catch (Exception ex) { var logger = scope.ServiceProvider.GetRequiredService>(); logger.LogError(ex, "[{Channel}] An error occurred during database migration on startup.", "FundamentalsChannel"); } } await host.RunAsync();