106 lines
3.1 KiB
C#
106 lines
3.1 KiB
C#
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<OnlyPromptContext>(opts =>
|
|
{
|
|
opts.UseNpgsql(builder.Configuration.GetConnectionString("DefaultConnection"));
|
|
opts.UseLazyLoadingProxies();
|
|
});
|
|
|
|
builder.Services.AddSingleton<IPasswordHasher<UserModel>, PasswordHasher<UserModel>>();
|
|
builder.Services.AddSingleton<ITokenService, JwtTokenService>();
|
|
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<OnlyPromptContext>();
|
|
await db.Database.MigrateAsync();
|
|
|
|
app.Run();
|