using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Server.IISIntegration; using Microsoft.EntityFrameworkCore; using MudBlazor.Services; using TrafagSalesExporter.Data; using TrafagSalesExporter.Models; using TrafagSalesExporter.Security; using TrafagSalesExporter.Services; using TrafagSalesExporter.Services.DataSources; var builder = WebApplication.CreateBuilder(args); builder.Logging.ClearProviders(); builder.Logging.AddConsole(); builder.Logging.AddDebug(); builder.Logging.AddFilter("Microsoft.EntityFrameworkCore.Database.Command", LogLevel.Warning); builder.Services.AddRazorComponents() .AddInteractiveServerComponents(); builder.Services.AddCascadingAuthenticationState(); builder.Services.AddHttpContextAccessor(); var securitySettings = builder.Configuration.GetSection(SecurityOptions.SectionName).Get() ?? new SecurityOptions(); var useDevelopmentAuthentication = builder.Environment.IsDevelopment() && securitySettings.DevelopmentBypass; if (useDevelopmentAuthentication) { builder.Services .AddAuthentication(DevelopmentAuthenticationHandler.SchemeName) .AddScheme( DevelopmentAuthenticationHandler.SchemeName, options => { }); } else { builder.Services.AddAuthentication(IISDefaults.AuthenticationScheme); } builder.Services.AddAuthorization(options => { options.FallbackPolicy = SecurityPolicyFactory.BuildAccessPolicy(securitySettings, useDevelopmentAuthentication); options.AddPolicy(SecurityPolicies.AdminOnly, SecurityPolicyFactory.BuildAdminPolicy(securitySettings, useDevelopmentAuthentication)); }); builder.Services.AddMudServices(); builder.Services.AddHttpClient(nameof(ExchangeRateImportService)); builder.Services.Configure(builder.Configuration.GetSection(HrKpiDataSourceOptions.SectionName)); builder.Services.Configure(builder.Configuration.GetSection(HrKpiAccessOptions.SectionName)); builder.Services.Configure(builder.Configuration.GetSection(FinanceCockpitAccessOptions.SectionName)); builder.Services.Configure(builder.Configuration.GetSection(AdminAccessOptions.SectionName)); builder.Services.AddDbContextFactory(options => options.UseSqlite("Data Source=trafag_exporter.db;Default Timeout=60")); // Stateless Infrastruktur- und Connector-Services: Singleton. 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(); 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(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); // Datenquellen-Adapter (Strategy per ConnectionKind). builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); // Orchestrator mit gemeinsamem Status ueber alle Circuits. builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddHostedService(sp => sp.GetRequiredService()); // UI-/Page-Services: Scoped = pro Blazor-Circuit. builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); var app = builder.Build(); var pathBase = app.Configuration["ASPNETCORE_PATHBASE"]; if (!string.IsNullOrWhiteSpace(pathBase)) { app.UsePathBase(pathBase.Trim()); } using (var scope = app.Services.CreateScope()) { var databaseInitialization = scope.ServiceProvider.GetRequiredService(); await databaseInitialization.InitializeAsync(); } if (!app.Environment.IsDevelopment()) { app.UseHsts(); } app.UseStaticFiles(); app.UseAuthentication(); app.UseAuthorization(); app.UseAntiforgery(); app.MapRazorComponents() .AddInteractiveServerRenderMode(); app.Run();