using Asp.Versioning.Builder; using k8s.Models; using LiteCharms.Features.Extensions; using LiteCharms.Features.Mediator; using LiteCharms.Features.MidrandBooks.Extensions; using MidrandBooksApi; using static LiteCharms.Features.Extensions.Quartz; var builder = WebApplication.CreateBuilder(args); builder.AddMonitoring(); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddEndpoints(Assembly.GetExecutingAssembly()); builder.Services.AddApiServices(builder.Configuration); builder.Services.AddAuthorization(); builder.Services.AddAuthentication(); builder.Services.AddMediator(); builder.Services.AddScoped(typeof(IPipelineBehavior<,>), typeof(TelemetryPipelineBehavior<,>)); builder.Services.AddScoped(typeof(IPipelineBehavior<,>), typeof(LoggingPipelineBehavior<,>)); builder.Services.AddQuartzSchedulerClient(MidrandShopSchedulerName, builder.Configuration); builder.Services.AddEmailServices(builder.Configuration); builder.Services.AddEmailServiceBus(); builder.Services.AddShopServices(); builder.Services.AddHashServices(builder.Configuration); builder.Services.AddMidrandShopDatabase(builder.Configuration); builder.Services.AddMidrandShopPostgresHealthCheck(); builder.Services.AddMidrandShopQuartzHealthCheck(); builder.Services.AddHealthChecksSupport(builder.Configuration); var app = builder.Build(); var schedulerFactory = app.Services.GetRequiredService(); var scheduler = await schedulerFactory.GetScheduler(MidrandShopSchedulerName); if (!scheduler!.IsStarted) await scheduler.Start(); app.UseHsts(); app.UseHttpsRedirection(); app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); ApiVersionSet versionSet = app.NewApiVersionSet("v1") .HasApiVersion(new ApiVersion(1)) .HasApiVersion(new ApiVersion(2)) .ReportApiVersions() .Build(); var versionGroups = new Dictionary { { 1, app.MapGroup("v{version:apiVersion}").WithApiVersionSet(versionSet) } }; app.MapEndpoints(versionGroups); app.UseHealthChecks("/health", new HealthCheckOptions { Predicate = _ => true, AllowCachingResponses = true, ResponseWriter = HealthChecks.UI.Client.UIResponseWriter.WriteHealthCheckUIResponse }); app.MapHealthChecksUI(options => { options.UIPath = "/healthui"; }); app.UseHealthChecks("/ready"); app.MapOpenApi(); var apiVersions = app.DescribeApiVersions() .OrderByDescending(o => o.ApiVersion.MajorVersion) .ToList(); foreach (var description in app.DescribeApiVersions().OrderByDescending(o => o.ApiVersion.MajorVersion)) app.MapScalarApiReference($"/openapi/{description.GroupName}", (options, context) => { options.AddServer(new ScalarServer($"https://{context.Request.Host}")); options.WithOpenApiRoutePattern($"/openapi/{description.GroupName}.json"); options.WithTheme(ScalarTheme.DeepSpace); options.Agent = new ScalarAgentOptions { Disabled = true }; options.Authentication = new ScalarAuthenticationOptions { PreferredSecuritySchemes = ["Bearer"] }; }); var latestVersionGroup = apiVersions.FirstOrDefault()?.GroupName ?? "v1"; app.MapGet("/", () => Results.Redirect($"/openapi/{latestVersionGroup}")) .ExcludeFromDescription(); if (!app.Environment.IsDevelopment()) app.UseExceptionHandler("/Error", createScopeForErrors: true); app.Run();