diff --git a/services/Directory/FilterLists.Directory.Api/CorsConfiguration.cs b/services/Directory/FilterLists.Directory.Api/CorsConfiguration.cs new file mode 100644 index 000000000..1ad50b57e --- /dev/null +++ b/services/Directory/FilterLists.Directory.Api/CorsConfiguration.cs @@ -0,0 +1,23 @@ +using Microsoft.AspNetCore.Cors.Infrastructure; + +namespace FilterLists.Directory.Api; + +internal static class CorsConfiguration +{ + private const string ProductionClientOrigin = "https://filterlists.com"; + private const string StagingClientOriginStart = "https://nice-water-05873140f"; + private const string StagingClientOriginEnd = ".eastus2.5.azurestaticapps.net"; + private const string LocalClientOrigin = "http://localhost:3000"; + + internal static readonly Action SetupAction = options => options.AddDefaultPolicy(policy => + { + policy.SetIsOriginAllowed(origin => origin switch + { + ProductionClientOrigin or LocalClientOrigin => true, + _ => origin.StartsWith(StagingClientOriginStart, StringComparison.InvariantCulture) && + origin.EndsWith(StagingClientOriginEnd, StringComparison.InvariantCulture) + }) + .WithMethods("GET") + .AllowAnyHeader(); + }); +} \ No newline at end of file diff --git a/services/Directory/FilterLists.Directory.Api/OpenApi/OpenApiConfigurationExtension.cs b/services/Directory/FilterLists.Directory.Api/OpenApi/OpenApiConfigurationExtension.cs deleted file mode 100644 index fb1a53721..000000000 --- a/services/Directory/FilterLists.Directory.Api/OpenApi/OpenApiConfigurationExtension.cs +++ /dev/null @@ -1,52 +0,0 @@ -using Microsoft.OpenApi.Models; -using ConfigurationExtensions = FilterLists.Directory.Application.ConfigurationExtensions; - -namespace FilterLists.Directory.Api.OpenApi; - -internal static class OpenApiConfigurationExtensions -{ - internal static void AddOpenApiGen(this IServiceCollection services) - { - services.AddEndpointsApiExplorer(); - services.AddSwaggerGen(options => - { - options.SwaggerDoc( - "v1", - new OpenApiInfo - { - Title = "FilterLists Directory API", - Description = "An ASP.NET Core API serving the core FilterList information.", - Version = "v1", - TermsOfService = - new Uri("https://github.com/collinbarrett/FilterLists/blob/main/.github/CODE_OF_CONDUCT.md"), - Contact = new OpenApiContact { Name = "FilterLists", Url = new Uri("https://filterlists.com") }, - License = new OpenApiLicense - { - Name = "MIT License", - Url = new Uri("https://github.com/collinbarrett/FilterLists/blob/main/LICENSE") - } - }); - - // include view model xml comments - var xmlFilename = $"{typeof(ConfigurationExtensions).Assembly.GetName().Name}.xml"; - options.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, xmlFilename)); - - // include OpenApiTag Description and ExternalDocs - options.DocumentFilter(); - - // allow re-using simple type names like "Response" - options.CustomSchemaIds(s => s.FullName?.Replace("+", ".")); - }); - } - - internal static void UseSwaggerCustom(this IApplicationBuilder app) - { - app.UseSwagger(o => o.RouteTemplate = "{documentName}/openapi.json"); - app.UseSwaggerUI(options => - { - options.DocumentTitle = "FilterLists API"; - options.SwaggerEndpoint("/v1/openapi.json", "FilterLists Directory API v1"); - options.RoutePrefix = string.Empty; - }); - } -} \ No newline at end of file diff --git a/services/Directory/FilterLists.Directory.Api/OpenApi/OpenApiGenConfiguration.cs b/services/Directory/FilterLists.Directory.Api/OpenApi/OpenApiGenConfiguration.cs new file mode 100644 index 000000000..65fa574d1 --- /dev/null +++ b/services/Directory/FilterLists.Directory.Api/OpenApi/OpenApiGenConfiguration.cs @@ -0,0 +1,38 @@ +using Microsoft.OpenApi.Models; +using Swashbuckle.AspNetCore.SwaggerGen; +using ConfigurationExtensions = FilterLists.Directory.Application.ConfigurationExtensions; + +namespace FilterLists.Directory.Api.OpenApi; + +internal static class OpenApiGenConfiguration +{ + internal static readonly Action SetupAction = options => + { + options.SwaggerDoc( + "v1", + new OpenApiInfo + { + Title = "FilterLists Directory API", + Description = "An ASP.NET Core API serving the core FilterList information.", + Version = "v1", + TermsOfService = + new Uri("https://github.com/collinbarrett/FilterLists/blob/main/.github/CODE_OF_CONDUCT.md"), + Contact = new OpenApiContact { Name = "FilterLists", Url = new Uri("https://filterlists.com") }, + License = new OpenApiLicense + { + Name = "MIT License", + Url = new Uri("https://github.com/collinbarrett/FilterLists/blob/main/LICENSE") + } + }); + + // include view model xml comments + var xmlFilename = $"{typeof(ConfigurationExtensions).Assembly.GetName().Name}.xml"; + options.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, xmlFilename)); + + // include OpenApiTag Description and ExternalDocs + options.DocumentFilter(); + + // allow re-using simple type names like "Response" + options.CustomSchemaIds(s => s.FullName?.Replace("+", ".")); + }; +} \ No newline at end of file diff --git a/services/Directory/FilterLists.Directory.Api/OpenApi/SwaggerUiConfiguration.cs b/services/Directory/FilterLists.Directory.Api/OpenApi/SwaggerUiConfiguration.cs new file mode 100644 index 000000000..6a9a12dc0 --- /dev/null +++ b/services/Directory/FilterLists.Directory.Api/OpenApi/SwaggerUiConfiguration.cs @@ -0,0 +1,13 @@ +using Swashbuckle.AspNetCore.SwaggerUI; + +namespace FilterLists.Directory.Api.OpenApi; + +internal static class SwaggerUiConfiguration +{ + internal static readonly Action SetupAction = options => + { + options.DocumentTitle = "FilterLists API"; + options.SwaggerEndpoint("/v1/openapi.json", "FilterLists Directory API v1"); + options.RoutePrefix = string.Empty; + }; +} \ No newline at end of file diff --git a/services/Directory/FilterLists.Directory.Api/Program.cs b/services/Directory/FilterLists.Directory.Api/Program.cs index 29fa13e38..5182d8778 100644 --- a/services/Directory/FilterLists.Directory.Api/Program.cs +++ b/services/Directory/FilterLists.Directory.Api/Program.cs @@ -4,21 +4,12 @@ var builder = WebApplication.CreateBuilder(args); -builder.Services.AddCors(options => options.AddDefaultPolicy(policy => -{ - policy.SetIsOriginAllowed(origin => - { - if (origin == "https://filterlists.com") return true; - return origin.StartsWith("https://nice-water-05873140f", StringComparison.InvariantCulture) && - origin.EndsWith(".eastus2.5.azurestaticapps.net", StringComparison.InvariantCulture); - }) - .WithMethods("GET") - .AllowAnyHeader(); -})); builder.WebHost.ConfigureKestrel(serverOptions => serverOptions.AddServerHeader = false); builder.AddServiceDefaults(); +builder.Services.AddCors(CorsConfiguration.SetupAction); builder.Services.AddProblemDetails(); -builder.Services.AddOpenApiGen(); +builder.Services.AddEndpointsApiExplorer(); +builder.Services.AddSwaggerGen(OpenApiGenConfiguration.SetupAction); builder.AddApplication(); var app = builder.Build(); @@ -27,6 +18,7 @@ app.UseCors(); app.MapEndpoints(); app.MapDefaultEndpoints(); -app.UseSwaggerCustom(); +app.UseSwagger(o => o.RouteTemplate = "{documentName}/openapi.json"); +app.UseSwaggerUI(SwaggerUiConfiguration.SetupAction); app.Run(); \ No newline at end of file