using Budget.Api.Data; using Budget.Api.Services; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.Diagnostics.HealthChecks; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Diagnostics.HealthChecks; using Microsoft.IdentityModel.Tokens; var builder = WebApplication.CreateBuilder(args); var connStr = builder.Configuration.GetConnectionString("DefaultConnection") ?? $"Host={builder.Configuration["POSTGRES_HOST"] ?? "localhost"};" + $"Port={builder.Configuration["POSTGRES_PORT"] ?? "5432"};" + $"Database={builder.Configuration["POSTGRES_DB"] ?? "budget"};" + $"Username={builder.Configuration["POSTGRES_USER"] ?? "budget"};" + $"Password={builder.Configuration["POSTGRES_PASSWORD"] ?? "changeme"}"; builder.Services.AddDbContext(opt => opt.UseNpgsql(connStr)); builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.Authority = builder.Configuration["AUTH__AUTHORITY"]; options.Audience = builder.Configuration["AUTH__AUDIENCE"]; options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, }; }); builder.Services.AddAuthorization(); builder.Services.AddScoped(); builder.Services.AddControllers(); builder.Services.AddHealthChecks() .AddDbContextCheck(); var app = builder.Build(); // Apply EF migrations automatically on startup using (var scope = app.Services.CreateScope()) { var db = scope.ServiceProvider.GetRequiredService(); await db.Database.MigrateAsync(); } app.UseDefaultFiles(); app.UseStaticFiles(); app.UseAuthentication(); app.UseAuthorization(); app.UseMiddleware(); app.MapControllers(); app.MapHealthChecks("/healthz", new HealthCheckOptions { ResultStatusCodes = { [HealthStatus.Healthy] = StatusCodes.Status200OK, [HealthStatus.Degraded] = StatusCodes.Status200OK, [HealthStatus.Unhealthy] = StatusCodes.Status503ServiceUnavailable, } }); app.MapFallbackToFile("index.html"); app.Run();