using System; using System.Linq; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Cors.Infrastructure; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Serilog; using TakeoutSaaS.Application.App.Extensions; using TakeoutSaaS.Application.Identity.Extensions; using TakeoutSaaS.Application.Messaging.Extensions; using TakeoutSaaS.Application.Sms.Extensions; using TakeoutSaaS.Application.Storage.Extensions; using TakeoutSaaS.Infrastructure.App.Extensions; using TakeoutSaaS.Infrastructure.Identity.Extensions; using TakeoutSaaS.Module.Authorization.Extensions; using TakeoutSaaS.Module.Dictionary.Extensions; using TakeoutSaaS.Module.Messaging.Extensions; using TakeoutSaaS.Module.Scheduler.Extensions; using TakeoutSaaS.Module.Sms.Extensions; using TakeoutSaaS.Module.Storage.Extensions; using TakeoutSaaS.Module.Tenancy.Extensions; using TakeoutSaaS.Shared.Web.Extensions; using TakeoutSaaS.Shared.Web.Swagger; var builder = WebApplication.CreateBuilder(args); builder.Configuration .AddJsonFile("appsettings.Seed.json", optional: true, reloadOnChange: true) .AddJsonFile($"appsettings.Seed.{builder.Environment.EnvironmentName}.json", optional: true, reloadOnChange: true); builder.Host.UseSerilog((context, _, configuration) => { configuration .Enrich.FromLogContext() .Enrich.WithProperty("Service", "AdminApi") .WriteTo.Console(); }); builder.Services.AddSharedWebCore(); builder.Services.AddSharedSwagger(options => { options.Title = "外卖SaaS - 管理后台"; options.Description = "管理后台 API 文档"; options.EnableAuthorization = true; }); builder.Services.AddIdentityApplication(); builder.Services.AddIdentityInfrastructure(builder.Configuration, enableAdminSeed: true); builder.Services.AddAppInfrastructure(builder.Configuration); builder.Services.AddAppApplication(); builder.Services.AddJwtAuthentication(builder.Configuration); builder.Services.AddAuthorization(); builder.Services.AddPermissionAuthorization(); builder.Services.AddTenantResolution(builder.Configuration); builder.Services.AddDictionaryModule(builder.Configuration); builder.Services.AddStorageModule(builder.Configuration); builder.Services.AddStorageApplication(); builder.Services.AddSmsModule(builder.Configuration); builder.Services.AddSmsApplication(builder.Configuration); builder.Services.AddMessagingModule(builder.Configuration); builder.Services.AddMessagingApplication(); builder.Services.AddSchedulerModule(builder.Configuration); var adminOrigins = ResolveCorsOrigins(builder.Configuration, "Cors:Admin"); builder.Services.AddCors(options => { options.AddPolicy("AdminApiCors", policy => { ConfigureCorsPolicy(policy, adminOrigins); }); }); var app = builder.Build(); app.UseCors("AdminApiCors"); app.UseTenantResolution(); app.UseSharedWebCore(); app.UseAuthentication(); app.UseAuthorization(); app.UseSharedSwagger(); app.UseSchedulerDashboard(builder.Configuration); app.MapControllers(); app.Run(); static string[] ResolveCorsOrigins(IConfiguration configuration, string sectionKey) { var origins = configuration.GetSection(sectionKey).Get(); return origins? .Where(origin => !string.IsNullOrWhiteSpace(origin)) .Distinct(StringComparer.OrdinalIgnoreCase) .ToArray() ?? Array.Empty(); } static void ConfigureCorsPolicy(CorsPolicyBuilder policy, string[] origins) { if (origins.Length == 0) { policy.AllowAnyOrigin(); } else { policy.WithOrigins(origins) .AllowCredentials(); } policy .AllowAnyHeader() .AllowAnyMethod(); }