using System; using System.Net.Http; using FinlyticCore.Database; using FinlyticCore.Services; using FinlyticNotify.Database; using FinlyticNotify.Services; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; var builder = Host.CreateApplicationBuilder(args); // 1. Register DbContext & Settings Provider (Read-Only user/trade queries + dynamic settings) builder.Services.AddDbContext(options => options.UseNpgsql(builder.Configuration.GetConnectionString("DefaultConnection"))); builder.Services.AddScoped(sp => sp.GetRequiredService()); // 2. Register Core Services & Logger builder.Services.AddSingleton(); builder.Services.AddSingleton(typeof(IFinlyticLogger<>), typeof(FinlyticLogger<>)); // 3. Register In-Memory Cache builder.Services.AddMemoryCache(); // 4. Register HTTP Client & ntfy Push Client builder.Services.AddHttpClient() .ConfigureHttpClient(client => { client.Timeout = TimeSpan.FromSeconds(10); }); // 5. Register Domain Services builder.Services.AddSingleton(); builder.Services.AddSingleton(); // 6. Register MQTT Listener & Background Service builder.Services.AddSingleton(); builder.Services.AddHostedService(sp => sp.GetRequiredService()); var host = builder.Build(); using (var scope = host.Services.CreateScope()) { try { var context = scope.ServiceProvider.GetRequiredService(); var connStr = builder.Configuration.GetConnectionString("DefaultConnection") ?? ""; await context.MigrateWithBootstrapAsync(connStr); } catch (Exception ex) { var logger = scope.ServiceProvider.GetRequiredService>(); logger.LogError(ex, "An error occurred during database migration/seeding."); } } Console.WriteLine("================================================="); Console.WriteLine(" FinlyticNotify - Push Notification Service (ntfy)"); Console.WriteLine(" Listening exclusively to MQTT Trade Events"); Console.WriteLine("================================================="); await host.RunAsync();