using System.Text.Json.Serialization; using Extensions.Hosting.AsyncInitialization; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.HttpOverrides; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.OpenApi; using Scalar.AspNetCore; using Tnsu.ApprovalRoute.Api.Auth; using Tnsu.ApprovalRoute.Api.Filters; using Tnsu.ApprovalRoute.Application; using Tnsu.ApprovalRoute.Application.Common.Interfaces; using Tnsu.ApprovalRoute.Infrastructure; const string CorsPolicyName = "Frontend"; var builder = WebApplication.CreateBuilder(args); builder.Services.Configure(options => { options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto; options.KnownNetworks.Clear(); options.KnownProxies.Clear(); }); var corsAllowedOrigins = builder.Configuration.GetSection("Cors:AllowedOrigins").Get() ?? []; builder.Services.AddCors(options => { options.AddPolicy(CorsPolicyName, policy => policy .WithOrigins(corsAllowedOrigins) .AllowAnyHeader() .AllowAnyMethod()); }); builder.Services.AddApprovalRouteInfrastructure(builder.Configuration); builder.Services.AddApprovalRouteApplication(); builder.Services.AddApprovalRouteAuth(builder.Configuration); builder.Services.AddScoped(); builder.Services.AddOpenApi(options => { options.AddDocumentTransformer((document, _, _) => { document.Components ??= new OpenApiComponents(); document.Components.SecuritySchemes ??= new Dictionary(); document.Components.SecuritySchemes["Bearer"] = new OpenApiSecurityScheme { Type = SecuritySchemeType.Http, Scheme = "bearer", BearerFormat = "JWT", Description = "Введите JWT токен" }; return Task.CompletedTask; }); options.AddOperationTransformer((operation, context, _) => { operation.Security = [ new OpenApiSecurityRequirement { [new OpenApiSecuritySchemeReference("Bearer", context.Document)] = [] } ]; return Task.CompletedTask; }); }); builder.Services.AddHealthChecks(); builder.Services.AddControllers(options => options.Filters.Add()) .AddJsonOptions(o => o.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter())); builder.Services.ConfigureHttpJsonOptions(o => o.SerializerOptions.Converters.Add(new JsonStringEnumConverter())); var app = builder.Build(); app.UseForwardedHeaders(); app.MapOpenApi(); app.MapScalarApiReference(options => { options .WithTitle("Tnsu Approval Route") .AddPreferredSecuritySchemes("Bearer") .AddHttpAuthentication("Bearer", _ => { }); }); app.MapHealthChecks("/health"); app.UseCors(CorsPolicyName); app.UseAuthentication(); app.UseAuthorization(); app.MapControllers(); await app.InitAndRunAsync(); public partial class Program;