using FluentValidation; using Microsoft.AspNetCore.Localization; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Diagnostics; using MudBlazor.Services; using Somnia.GuestLog.Components; using Somnia.GuestLog.Infrastructure; using Somnia.GuestLog.Models.Configuration; using Somnia.GuestLog.Models.DTOs; using Somnia.GuestLog.Services; using Somnia.GuestLog.Services.AddressQuery; using Somnia.GuestLog.Services.Entity; using Somnia.GuestLog.Utils; using Somnia.GuestLog.Validators; var builder = WebApplication.CreateBuilder(args); var connectionStringGuestLog = builder.Configuration.GetConnectionString("DbSomniaGuestLog") ?? throw new InvalidOperationException("Connection string 'DbSomniaGuestLog' not found."); builder.Services.AddDbContextFactory(options => { options.UseNpgsql(connectionStringGuestLog) .UseLazyLoadingProxies() .ConfigureWarnings(w => w.Log((CoreEventId.NavigationLazyLoading, LogLevel.Warning))); // The following options help with debugging, but should // be changed or removed for production. if (builder.Environment.IsDevelopment()) { options.EnableSensitiveDataLogging() .EnableDetailedErrors(); } }); builder.Services.AddDatabaseDeveloperPageExceptionFilter(); // Add MudBlazor services builder.Services.AddMudServices(c => { c.SnackbarConfiguration.PositionClass = MudBlazor.Defaults.Classes.Position.TopCenter; c.SnackbarConfiguration.ShowTransitionDuration = 300; c.SnackbarConfiguration.HideTransitionDuration = 500; c.SnackbarConfiguration.VisibleStateDuration = 10000; }); // Add components services to the container. builder.Services.AddRazorComponents() .AddInteractiveServerComponents(); builder.Services.AddLocalization(); builder.Services.AddHttpClient(); // Add Validation Services builder.Services.AddSingleton, GuestDocumentDTOValidator>(); builder.Services.AddSingleton, GuestDocIdDTOValidator>(); builder.Services.AddSingleton, StayEntryDTOValidator>(); // Add Services builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddScoped(); // Add Factories (and it's services) builder.Services.AddFactoryDI(); // Add Options config builder.Services.AddOptions() .Bind(builder.Configuration.GetSection(AddressQueryConfig.SectionName)); var app = builder.Build(); // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { app.UseMigrationsEndPoint(); } else { app.UseExceptionHandler("/Error", createScopeForErrors: true); // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. app.UseHsts(); } app.UseStatusCodePagesWithReExecute("/not-found", createScopeForStatusCodePages: true); app.UseHttpsRedirection(); app.UseAntiforgery(); string[] supportedCultures = ["en-US", "es-ES"]; var localizationOptions = new RequestLocalizationOptions() .SetDefaultCulture(supportedCultures[0]) .AddSupportedCultures(supportedCultures) .AddSupportedUICultures(supportedCultures); localizationOptions.RequestCultureProviders = [ new QueryStringRequestCultureProvider(), new CookieRequestCultureProvider() ]; app.UseRequestLocalization(localizationOptions); app.MapStaticAssets(); app.MapRazorComponents() .AddInteractiveServerRenderMode(); app.Run();