using HyperBooru.Server.Components; using HyperBooru.Services; using Microsoft.AspNetCore.Authentication.Cookies; using Microsoft.AspNetCore.DataProtection; using Microsoft.AspNetCore.Http.Json; using Microsoft.EntityFrameworkCore; using System.Text.Json.Serialization; namespace HyperBooru.Server; public class Program { public static void Main(string[] args) { var builder = WebApplication.CreateBuilder(args); builder.Services.AddHttpContextAccessor(); builder.Services.AddAuthentication( CookieAuthenticationDefaults.AuthenticationScheme).AddCookie(); builder.Services.AddAuthorization(); builder.Services.AddControllers().AddJsonOptions(o => { var converter = new JsonStringEnumConverter(); o.JsonSerializerOptions.Converters.Add(converter); }); builder.Services.Configure(o => { o.SerializerOptions.TypeInfoResolverChain.Insert(0, new ExceptionJsonResolver()); }); builder.Services.AddRazorComponents() .AddInteractiveWebAssemblyComponents(); // Add our custom services builder.Services.AddSingleton(); builder.Services.AddDbContextFactory(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddSingleton(); builder.Services.AddScoped(); builder.Services.AddHostedService(); // Ensure session keys are stored in a persistent location on all platforms builder.Services.AddDataProtection() .PersistKeysToFileSystem(new( builder.Services.BuildServiceProvider() .GetRequiredService() .KeyPath)); var app = builder.Build(); // Ensure database is created and it's schema is up to date using var scope = app.Services.CreateScope(); using var db = scope.ServiceProvider.GetRequiredService(); db.Database.Migrate(); app.UseAuthentication(); app.UseAuthorization(); if(app.Environment.IsDevelopment()) { app.UseWebAssemblyDebugging(); } else { app.UseExceptionHandler("/Error"); } app.UseStatusCodePagesWithReExecute("/not-found", createScopeForStatusCodePages: true); app.UseHsts(); app.UseHttpsRedirection(); app.MapStaticAssets(); app.UseMiddleware(); app.UseAntiforgery(); app.MapControllers(); app.MapRazorComponents() .AddInteractiveWebAssemblyRenderMode() .AddAdditionalAssemblies(typeof(Client._Imports).Assembly); app.Run(); } }