using Kit.Helpers.SqlHelperAbstract; using Microsoft.AspNetCore.Http.Json; using Server.WatchBody.Core.Dal.Ref.Repository; using Server.WatchBody.Core.Dal.Src.Repository; using Server.WatchBody.Web.Config; using Server.WatchBody.Web.Db; using Server.WatchBody.Web.Middleware; using Server.WatchBody.Web.Services; namespace Server.WatchBody.Web; /// /// Сборка приложения (общая для Program и интеграционных тестов): /// probe БД, bootstrap атлетов, DI, middleware и fluent-таблица /// маршрутов (Kit.Helpers.Routes — Config\RouteConfig.cs). /// public static class WebAppStartup { /// Тест подключения к БД — фатален при неудаче (spec 01). public static void ProbeDatabase(IConnectionString connectionString) { // через хранимую функцию: сырой SQL во fluent Kit.Helpers не передают new MigrationRepository(connectionString).Select("000_probe"); } public static WebApplication Build(WebApplicationBuilder builder, ServerConfig config, IConnectionString cs) { builder.Services.AddSingleton(cs); 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(); builder.Services.AddSingleton(config.Safety); builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(config.Progression); builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddControllersWithViews(o => { o.EnableEndpointRouting = false; }) // контроллеры живут в сборке Web — при хостинге из тестов входная // сборка другая, часть нужно указать явно .AddApplicationPart(typeof(WebAppStartup).Assembly) .AddJsonOptions(o => { o.JsonSerializerOptions.PropertyNamingPolicy = System.Text.Json.JsonNamingPolicy.CamelCase; o.JsonSerializerOptions.DefaultIgnoreCondition = System.Text.Json.Serialization.JsonIgnoreCondition.WhenWritingNull; }); var app = builder.Build(); app.UseMiddleware(); app.UseRouting(); app.UseMvc(routes => RouteConfig.Configure(routes)); return app; } /// Инициализация: probe БД + bootstrap атлетов (до старта Kestrel). public static void Initialize(IConnectionString cs, ServerConfig config) { ProbeDatabase(cs); AthleteBootstrap.Sync(cs, config.Athletes); } }