using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.Http.Features; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Rewrite; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.FileProviders; using Microsoft.Extensions.Options; using Microsoft.Identity.Web; using Microsoft.IdentityModel.Tokens; using OnlyPrompt.Backend.Database; using OnlyPrompt.Backend.Database.Models; using OnlyPrompt.Backend.Services.Jwt; using OnlyPrompt.Backend.Utils; using Scalar.AspNetCore; using System.Text; using System.Text.Json; var builder = WebApplication.CreateBuilder(args); var config = builder.Configuration; // Add services to the container. builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme); builder.Services.AddDbContext(opts => { opts.UseNpgsql(builder.Configuration.GetConnectionString("DefaultConnection")); opts.UseLazyLoadingProxies(); }); builder.Services.AddSingleton, PasswordHasher>(); builder.Services.AddSingleton(); builder.Services.AddAutoMapper(AutoMapperSetup.Setup); builder.Services.AddValidation(opts => { opts.MaxDepth = 10; }); builder.Services.AddAuthorization(); builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, opts => { opts.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true, ValidIssuer = config["Jwt:Issuer"], ValidAudience = config["Jwt:Audience"], IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(config["Jwt:Key"])) }; opts.Events = new JwtBearerEvents { OnMessageReceived = context => { if (context.Request.Cookies.ContainsKey("jwt")) context.Token = context.Request.Cookies["jwt"]; return Task.CompletedTask; } }; }); builder.Services.AddControllers().AddJsonOptions(jsonOpts => { jsonOpts.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase; }); builder.Services.AddOpenApi(opts => opts.AddScalarTransformers()); var app = builder.Build(); // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { app.MapOpenApi(); app.MapScalarApiReference(); } app.UseHttpsRedirection(); var rewrite = new RewriteOptions() .AddRewrite(@"^(?!scalar\/?|api\/?)([^.]+)$", "$1.html", skipRemainingRules: true); app.UseRewriter(rewrite); app.UseAuthorization(); if (app.Environment.IsDevelopment()) { var dir = Path.GetFullPath("./../OnlyPrompt.Frontend"); app.UseStaticFiles(new StaticFileOptions { FileProvider = new PhysicalFileProvider(dir), RedirectToAppendTrailingSlash = true, HttpsCompression = HttpsCompressionMode.Compress, }); } else { app.UseStaticFiles(); } app.MapControllers(); app.MapFallbackToFile("/login.html"); using var scope = app.Services.CreateScope(); var db = scope.ServiceProvider.GetRequiredService(); await db.Database.MigrateAsync(); app.Run();