using CH.Api; using CH.Dal; using FluentValidation.AspNetCore; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.HttpOverrides; using Microsoft.AspNetCore.Routing; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using Microsoft.OpenApi.Models; using Npgsql; using OpenHarbor.CQRS; using OpenHarbor.CQRS.AspNetCore.Mvc; using OpenHarbor.CQRS.DynamicQuery.AspNetCore; using PoweredSoft.Data; using PoweredSoft.Data.EntityFrameworkCore; using PoweredSoft.DynamicQuery; using PoweredSoft.Module.Abstractions; using System.Text.Json.Serialization; var builder = WebApplication.CreateBuilder(args); builder.Services.Configure(options => { options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto | ForwardedHeaders.XForwardedHost; options.KnownNetworks.Clear(); options.KnownProxies.Clear(); options.ForwardLimit = 2; }); builder.Services.AddHttpContextAccessor(); builder.Services.AddCors(); builder.Services.AddPoweredSoftDataServices(); builder.Services.AddPoweredSoftEntityFrameworkCoreDataServices(); builder.Services.AddPoweredSoftDynamicQuery(); builder.Services.AddDefaultCommandDiscovery(); builder.Services.AddDefaultQueryDiscovery(); builder.Services.AddFluentValidation(); builder.Services.AddModule(); builder.Services.AddDefaultCommandDiscovery(); builder.Services.AddDefaultQueryDiscovery(); if (builder.Configuration.GetValue("Swagger:Enable")) { builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(options => { options.SwaggerDoc("v1", new OpenApiInfo { Title = "Constellation Heating Api", Version = "0.1.0" }); options.AddSecurityDefinition("oauth2", new OpenApiSecurityScheme { Type = SecuritySchemeType.OAuth2, Flows = new OpenApiOAuthFlows { AuthorizationCode = new OpenApiOAuthFlow { AuthorizationUrl = new Uri(builder.Configuration["Swagger:AuthorizationUrl"]), TokenUrl = new Uri(builder.Configuration["Swagger:TokenUrl"]), Scopes = new Dictionary { { "email", "Email" } } } } }); options.AddSecurityRequirement(new OpenApiSecurityRequirement { { new OpenApiSecurityScheme { Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "oauth2" }, }, new[] { "email" } } }); }); } builder.Services .AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, options => { options.Authority = builder.Configuration["JwtBearer:Authority"]; // check how to set up AudienceValidator to whitelist sites using it options.TokenValidationParameters.ValidateAudience = false; }); builder.Services.AddAuthorization(); builder.Services.AddHttpClient(); builder.Services.AddMemoryCache(); var mvcBuilder = builder.Services .AddControllers() .AddJsonOptions(jsonOptions => { jsonOptions.JsonSerializerOptions.Converters.Insert(0, new JsonStringEnumConverter()); }); mvcBuilder .AddOpenHarborCommands(); mvcBuilder .AddOpenHarborQueries() .AddOpenHarborDynamicQueries(); var connectionString = builder.Configuration.GetSection("Database").GetValue("ConnectionString"); var dataSourceBuilder = new NpgsqlDataSourceBuilder(connectionString); var dataSource = dataSourceBuilder.Build(); builder.Services.AddDbContextPool(options => { options.UseNpgsql(dataSource); if (builder.Configuration.GetValue("Debug")) { AppContext.SetSwitch("Npgsql.EnableConnectionStringLogging", true); options .EnableSensitiveDataLogging() .EnableDetailedErrors(); } }); var app = builder.Build(); app.UseForwardedHeaders(); if (builder.Configuration.GetValue("Swagger:Enable")) { app.UseSwagger(); app.UseSwaggerUI(options => { options.OAuthClientId(builder.Configuration["Swagger:ClientId"]); options.OAuthClientSecret(builder.Configuration["Swagger:Secret"]); options.OAuthUsePkce(); }); } if (builder.Environment.IsDevelopment() == false) { app.UseHttpsRedirection(); } app.UseCors(options => { var origins = new List { "capacitor://localhost", "https://hoppscotch.io" }; if (builder.Environment.IsDevelopment()) { origins.Add("http://localhost:8100"); } options.WithOrigins(origins.ToArray()); options.AllowCredentials(); options.AllowAnyHeader(); options.AllowAnyMethod(); }); app.UseAuthentication(); app.UseAuthorization(); app.MapControllers(); app.Run();