using DotNetEnv; using khmereid_backend.Data; using khmereid_backend.Services; using Microsoft.EntityFrameworkCore; using khmereid_backend.Integrations; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authentication; var builder = WebApplication.CreateBuilder(args); if (builder.Environment.IsDevelopment() && File.Exists("../.env")) { Env.Load("../.env"); } builder.Configuration .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) .AddJsonFile($"appsettings.{builder.Environment.EnvironmentName}.json", optional: false) .AddEnvironmentVariables(); var dbHost = builder.Configuration["DB_HOST"]; var dbPort = builder.Configuration["DB_PORT"]; var dbUser = builder.Configuration["DB_USER"]; var dbPass = builder.Configuration["DB_PASS"]; var dbName = builder.Configuration["DB_NAME"]; var dbSsl = builder.Configuration["DB_SSL_MODE"] ?? "Disable"; var connectionString = $"Host={dbHost};Port={dbPort};Username={dbUser};Password={dbPass};Database={dbName};Ssl Mode={dbSsl}"; builder.Services.AddDbContext(options => { options.UseNpgsql(connectionString).UseSnakeCaseNamingConvention(); }); builder.Services.AddSingleton(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddAuthentication(options => { options.DefaultAuthenticateScheme = "Kratos"; options.DefaultChallengeScheme = "Kratos"; options.DefaultScheme = "Kratos"; }).AddScheme("Kratos", _ => { }); builder.Services.AddAuthorizationBuilder() .SetFallbackPolicy(new AuthorizationPolicyBuilder() .RequireAuthenticatedUser() .Build()); builder.Services.AddControllers().AddJsonOptions(options => { options.JsonSerializerOptions.DefaultIgnoreCondition = System.Text.Json.Serialization.JsonIgnoreCondition.WhenWritingDefault; }); var app = builder.Build(); await using var scope = app.Services.CreateAsyncScope(); var db = scope.ServiceProvider.GetRequiredService(); var canConnect = await db.Database.CanConnectAsync(); app.Logger.LogInformation("Can connect to database: {CanConnect}", canConnect); app.MapGet("/health", () => Results.Ok("I'm good.")).AllowAnonymous().WithOpenApi(); app.UseAuthentication(); app.UseAuthorization(); app.MapControllers(); app.Run();