using GmRelay.Bot.Features.Confirmation.HandleRsvp; using GmRelay.Bot.Features.Confirmation.SendConfirmation; using GmRelay.Bot.Features.Reminders.SendJoinLink; using GmRelay.Bot.Features.Sessions.CreateSession; using GmRelay.Bot.Features.Sessions.RescheduleSession; using GmRelay.Bot.Infrastructure.Database; using GmRelay.Bot.Infrastructure.Logging; using GmRelay.Bot.Infrastructure.Scheduling; using GmRelay.Bot.Infrastructure.Telegram; using Npgsql; using Telegram.Bot; [module: Dapper.DapperAot] var builder = Host.CreateApplicationBuilder(args); // ── Aspire service defaults (OpenTelemetry, health checks) ─────────── builder.AddServiceDefaults(); // ── PostgreSQL (ручная регистрация — AOT safe, без Aspire-магии) ───── builder.Services.AddSingleton(sp => { var config = sp.GetRequiredService(); var loggerFactory = sp.GetRequiredService(); var connectionString = config.GetConnectionString("gmrelaydb") ?? throw new InvalidOperationException( "ConnectionStrings:gmrelaydb is required. Set via environment variable ConnectionStrings__gmrelaydb."); var logger = loggerFactory.CreateLogger("GmRelay.Bot.Startup"); logger.LogInformation( "Configured PostgreSQL data source with connection string {ConnectionString}", SecretRedactor.RedactConnectionString(connectionString)); return NpgsqlDataSource.Create(connectionString); }); // ── Database migrations ────────────────────────────────────────────── builder.Services.AddSingleton(); // ── Telegram Bot Client ────────────────────────────────────────────── builder.Services.AddSingleton(sp => { var config = sp.GetRequiredService(); var token = config["Telegram:BotToken"] ?? throw new InvalidOperationException( "Telegram:BotToken is required. Set via environment variable Telegram__BotToken or appsettings.json."); return new TelegramBotClient(token); }); // ── Feature handlers (explicit registration — AOT safe) ────────────── builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); // ── Telegram infrastructure ────────────────────────────────────────── builder.Services.AddSingleton(); builder.Services.AddHostedService(); // ── Session scheduler ──────────────────────────────────────────────── builder.Services.AddHostedService(); var host = builder.Build(); // ── Run database migrations on startup ─────────────────────────────── var migrator = host.Services.GetRequiredService(); migrator.MigrateUp(); await host.RunAsync();