using System.Text.Encodings.Web; using System.Text.Unicode; using Kemkas.Web.Config; using Microsoft.EntityFrameworkCore; using Kemkas.Web.Db; using Kemkas.Web.Db.Models; using Kemkas.Web.Services.Character; using Kemkas.Web.Services.Identity; using Microsoft.AspNetCore.DataProtection; using Microsoft.AspNetCore.Identity.UI.Services; var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.Configure(builder.Configuration.GetSection(MailgunOptions.Section)); var connectionString = builder.Configuration.GetConnectionString("DefaultConnection") ?? throw new InvalidOperationException("Connection string 'DefaultConnection' not found."); builder.Services.AddDbContext( options => options.UseNpgsql(connectionString)); builder.Services.AddDataProtection() .SetApplicationName("kemkas") .PersistKeysToDbContext(); builder.Services.AddHttpClient(); builder.Services.AddSingleton(); builder.Services.AddDefaultIdentity(options => options.SignIn.RequireConfirmedAccount = true) .AddEntityFrameworkStores(); builder.Services.AddAuthentication(); builder.Services.AddControllersWithViews().AddJsonOptions(options => { options.JsonSerializerOptions.AllowTrailingCommas = true; options.JsonSerializerOptions.Encoder = JavaScriptEncoder.Create(UnicodeRanges.All); }); builder.Services.AddRazorPages(); builder.Services.AddCharacterServices(); var app = builder.Build(); // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { app.UseMigrationsEndPoint(); } else { // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. app.UseHsts(); // TODO: check if this should be handled by proxy } await using (var scope = app.Services.CreateAsyncScope()) { var db = scope.ServiceProvider.GetRequiredService(); await db.Database.MigrateAsync(); } app.UseForwardedHeaders(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); app.MapControllerRoute( name: "default", pattern: "/api/{controller}/{action=Index}/{id?}"); app.MapRazorPages(); app.MapFallbackToFile("index.html"); app.Run();