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.AddSingleton(new Services.AdminAuthService(
config.AdminLogin, config.AdminPasswordHash));
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.UseDefaultFiles(new DefaultFilesOptions { DefaultFileNames = { "admin/index.html" } });
app.UseStaticFiles();
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);
}
}