using Amazon.S3; using Amazon.SecretsManager; using Amazon.SQS; using FluentValidation; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.EntityFrameworkCore; using Microsoft.IdentityModel.Tokens; using ProposalSystem.Api.Middleware; using ProposalSystem.Api.Services; using ProposalSystem.Application.Interfaces; using ProposalSystem.Application.Validators; using ProposalSystem.Infrastructure.Data; using ProposalSystem.Infrastructure.Services; var builder = WebApplication.CreateBuilder(args); // AWS SDK clients builder.Services.AddDefaultAWSOptions(builder.Configuration.GetAWSOptions()); builder.Services.AddAWSService(); builder.Services.AddAWSService(); builder.Services.AddAWSService(); // Database var dbSecretArn = builder.Configuration["DB_SECRET_ARN"]; if (!string.IsNullOrEmpty(dbSecretArn)) { var smClient = new AmazonSecretsManagerClient(); var connectionString = SecretsManagerConnectionString.ResolveAsync(smClient, dbSecretArn).GetAwaiter().GetResult(); builder.Services.AddDbContext(options => options.UseNpgsql(connectionString)); } else { builder.Services.AddDbContext(options => options.UseNpgsql(builder.Configuration.GetConnectionString("DefaultConnection"))); } // Authentication var cognitoAuthority = builder.Configuration["Auth:Authority"]; if (!string.IsNullOrEmpty(cognitoAuthority)) { builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.Authority = cognitoAuthority; options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuerSigningKey = true, ValidateIssuer = true, ValidateAudience = false, ValidateLifetime = true, }; }); } else { builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(); } builder.Services.AddAuthorization(); // Services builder.Services.AddHttpContextAccessor(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(sp => { var sqsClient = sp.GetRequiredService(); var queueUrl = builder.Configuration["JOBS_QUEUE_URL"] ?? ""; return new SqsJobPublisher(sqsClient, queueUrl); }); // Validation builder.Services.AddValidatorsFromAssemblyContaining(); // Controllers builder.Services.AddControllers(options => { options.Filters.Add(); }); // Middleware builder.Services.AddTransient(); // Health checks builder.Services.AddHealthChecks() .AddDbContextCheck(); // CORS builder.Services.AddCors(options => { options.AddDefaultPolicy(policy => { policy.WithOrigins( "https://proposals.seahaven.com", "http://localhost:5173") .AllowAnyMethod() .AllowAnyHeader(); }); }); // Lambda hosting builder.Services.AddAWSLambdaHosting(LambdaEventSource.HttpApi); var app = builder.Build(); app.UseMiddleware(); app.UseCors(); app.UseAuthentication(); app.UseAuthorization(); app.MapControllers(); app.MapHealthChecks("/api/health"); app.Run();