From 3f800b74ac6974ccae37a40ad290a81f43607c46 Mon Sep 17 00:00:00 2001 From: Collin Barrett Date: Wed, 6 Jun 2018 18:30:49 -0500 Subject: [PATCH] use attribute routing for Swagger ref #131 --- .../Extensions/ConfigureServicesCollection.cs | 3 ++- src/FilterLists.Api/Startup.cs | 26 ++++++++++++------- .../V1/Controllers/BaseController.cs | 2 ++ .../V1/Controllers/ForksController.cs | 2 +- .../V1/Controllers/LanguagesController.cs | 2 +- .../V1/Controllers/LicensesController.cs | 2 +- .../V1/Controllers/ListsController.cs | 3 ++- .../Controllers/ListsLanguagesController.cs | 2 +- .../Controllers/ListsMaintainersController.cs | 2 +- .../V1/Controllers/MaintainersController.cs | 2 +- .../V1/Controllers/MergesController.cs | 2 +- .../V1/Controllers/SoftwareController.cs | 2 +- .../Controllers/SoftwareSyntaxesController.cs | 2 +- .../V1/Controllers/SyntaxesController.cs | 2 +- 14 files changed, 33 insertions(+), 21 deletions(-) diff --git a/src/FilterLists.Api/DependencyInjection/Extensions/ConfigureServicesCollection.cs b/src/FilterLists.Api/DependencyInjection/Extensions/ConfigureServicesCollection.cs index 8fc46712e..a3684f89c 100644 --- a/src/FilterLists.Api/DependencyInjection/Extensions/ConfigureServicesCollection.cs +++ b/src/FilterLists.Api/DependencyInjection/Extensions/ConfigureServicesCollection.cs @@ -10,7 +10,8 @@ public static class ConfigureServicesCollection { public static void AddFilterListsApi(this IServiceCollection services) { - services.AddMvc(); + services.AddRouting(options => options.LowercaseUrls = true); + services.AddMvcCore(); services.AddApiVersioning(); services.AddSwaggerGenCustom(); TelemetryDebugWriter.IsTracingDisabled = true; diff --git a/src/FilterLists.Api/Startup.cs b/src/FilterLists.Api/Startup.cs index dceffa3b5..cbdf9a8c1 100644 --- a/src/FilterLists.Api/Startup.cs +++ b/src/FilterLists.Api/Startup.cs @@ -1,4 +1,5 @@ -using FilterLists.Api.DependencyInjection.Extensions; +using System.Linq; +using FilterLists.Api.DependencyInjection.Extensions; using FilterLists.Data; using FilterLists.Data.Seed.Extensions; using FilterLists.Services.DependencyInjection.Extensions; @@ -11,6 +12,7 @@ using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; +using Swashbuckle.AspNetCore.Swagger; namespace FilterLists.Api { @@ -52,24 +54,30 @@ public void Configure(IApplicationBuilder app, IHostingEnvironment env) { ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto }); - app.UseSwagger(); + app.UseSwagger(UseLowercaseControllerNameInSwaggerHack); app.UseSwaggerUI(c => { - c.SwaggerEndpoint("/api/swagger/v1/swagger.json", "FilterLists API V1"); + c.SwaggerEndpoint("../swagger/v1/swagger.json", "FilterLists API V1"); c.RoutePrefix = "docs"; }); app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseCookiePolicy(); - app.UseMvc(routes => - { - routes.MapRoute("noAction", "v{version:apiVersion}/{controller}/{id:int}", - new {controller = "{controller}", action = "GetById", id = "{id}"}); - routes.MapRoute("default", "v{version:apiVersion}/{controller}/{action=Index}/{id:int?}"); - }); + app.UseMvc(); MigrateAndSeedDatabase(app); } + //https://github.com/domaindrivendev/Swashbuckle.AspNetCore/issues/74#issuecomment-386762178 + private static void UseLowercaseControllerNameInSwaggerHack(SwaggerOptions c) + { + c.PreSerializeFilters.Add((document, request) => + { + var paths = document.Paths.ToDictionary(item => item.Key.ToLowerInvariant(), item => item.Value); + document.Paths.Clear(); + foreach (var pathItem in paths) document.Paths.Add(pathItem.Key, pathItem.Value); + }); + } + private void MigrateAndSeedDatabase(IApplicationBuilder app) { var dataPath = Configuration.GetSection("DataDirectory").GetValue("Path"); diff --git a/src/FilterLists.Api/V1/Controllers/BaseController.cs b/src/FilterLists.Api/V1/Controllers/BaseController.cs index 9c65281d5..bdebc15d5 100644 --- a/src/FilterLists.Api/V1/Controllers/BaseController.cs +++ b/src/FilterLists.Api/V1/Controllers/BaseController.cs @@ -4,6 +4,8 @@ namespace FilterLists.Api.V1.Controllers { [ApiVersion("1.0")] + //https://github.com/domaindrivendev/Swashbuckle.AspNetCore/issues/370 + [Route("v{version:apiVersion}/[controller]")] public class BaseController : Controller { protected readonly SeedService SeedService; diff --git a/src/FilterLists.Api/V1/Controllers/ForksController.cs b/src/FilterLists.Api/V1/Controllers/ForksController.cs index edd908156..14d9ce143 100644 --- a/src/FilterLists.Api/V1/Controllers/ForksController.cs +++ b/src/FilterLists.Api/V1/Controllers/ForksController.cs @@ -12,7 +12,7 @@ public ForksController(SeedService seedService) : base(seedService) { } - [HttpGet] + [HttpGet("seed")] public async Task Seed() => Json(await SeedService.GetAllAsync( typeof(Fork).GetProperty("UpstreamFilterListId"), typeof(Fork).GetProperty("ForkFilterListId"))); } diff --git a/src/FilterLists.Api/V1/Controllers/LanguagesController.cs b/src/FilterLists.Api/V1/Controllers/LanguagesController.cs index 5ea6cf163..954d2bcde 100644 --- a/src/FilterLists.Api/V1/Controllers/LanguagesController.cs +++ b/src/FilterLists.Api/V1/Controllers/LanguagesController.cs @@ -12,7 +12,7 @@ public LanguagesController(SeedService seedService) : base(seedService) { } - [HttpGet] + [HttpGet("seed")] public async Task Seed() => Json(await SeedService.GetAllAsync()); } } \ No newline at end of file diff --git a/src/FilterLists.Api/V1/Controllers/LicensesController.cs b/src/FilterLists.Api/V1/Controllers/LicensesController.cs index 743466ba2..177208c7f 100644 --- a/src/FilterLists.Api/V1/Controllers/LicensesController.cs +++ b/src/FilterLists.Api/V1/Controllers/LicensesController.cs @@ -12,7 +12,7 @@ public LicensesController(SeedService seedService) : base(seedService) { } - [HttpGet] + [HttpGet("seed")] public async Task Seed() => Json(await SeedService.GetAllAsync()); } } \ No newline at end of file diff --git a/src/FilterLists.Api/V1/Controllers/ListsController.cs b/src/FilterLists.Api/V1/Controllers/ListsController.cs index f9477e0ae..95cf3d6a1 100644 --- a/src/FilterLists.Api/V1/Controllers/ListsController.cs +++ b/src/FilterLists.Api/V1/Controllers/ListsController.cs @@ -20,9 +20,10 @@ public ListsController(SeedService seedService, FilterListService filterListServ public async Task Index() => Json(await _filterListService.GetAllSummariesAsync()); [HttpGet] + [Route("{id}")] public async Task GetById(int id) => Json(await _filterListService.GetDetailsAsync(id)); - [HttpGet] + [HttpGet("seed")] public async Task Seed() => Json(await SeedService.GetAllAsync()); } } \ No newline at end of file diff --git a/src/FilterLists.Api/V1/Controllers/ListsLanguagesController.cs b/src/FilterLists.Api/V1/Controllers/ListsLanguagesController.cs index 79c7bdb61..822eec1b5 100644 --- a/src/FilterLists.Api/V1/Controllers/ListsLanguagesController.cs +++ b/src/FilterLists.Api/V1/Controllers/ListsLanguagesController.cs @@ -12,7 +12,7 @@ public ListsLanguagesController(SeedService seedService) : base(seedService) { } - [HttpGet] + [HttpGet("seed")] public async Task Seed() => Json(await SeedService.GetAllAsync( typeof(FilterListLanguage).GetProperty("FilterListId"), diff --git a/src/FilterLists.Api/V1/Controllers/ListsMaintainersController.cs b/src/FilterLists.Api/V1/Controllers/ListsMaintainersController.cs index 3e9e168da..5c0fc88e7 100644 --- a/src/FilterLists.Api/V1/Controllers/ListsMaintainersController.cs +++ b/src/FilterLists.Api/V1/Controllers/ListsMaintainersController.cs @@ -12,7 +12,7 @@ public ListsMaintainersController(SeedService seedService) : base(seedService) { } - [HttpGet] + [HttpGet("seed")] public async Task Seed() => Json( await SeedService.GetAllAsync( typeof(FilterListMaintainer).GetProperty("MaintainerId"), diff --git a/src/FilterLists.Api/V1/Controllers/MaintainersController.cs b/src/FilterLists.Api/V1/Controllers/MaintainersController.cs index fcca204ef..b259bb658 100644 --- a/src/FilterLists.Api/V1/Controllers/MaintainersController.cs +++ b/src/FilterLists.Api/V1/Controllers/MaintainersController.cs @@ -12,7 +12,7 @@ public MaintainersController(SeedService seedService) : base(seedService) { } - [HttpGet] + [HttpGet("seed")] public async Task Seed() => Json(await SeedService.GetAllAsync()); } } \ No newline at end of file diff --git a/src/FilterLists.Api/V1/Controllers/MergesController.cs b/src/FilterLists.Api/V1/Controllers/MergesController.cs index af82b85f2..5546c382a 100644 --- a/src/FilterLists.Api/V1/Controllers/MergesController.cs +++ b/src/FilterLists.Api/V1/Controllers/MergesController.cs @@ -12,7 +12,7 @@ public MergesController(SeedService seedService) : base(seedService) { } - [HttpGet] + [HttpGet("seed")] public async Task Seed() => Json(await SeedService.GetAllAsync( typeof(Merge).GetProperty("MergeFilterListId"), typeof(Merge).GetProperty("UpstreamFilterListId"))); } diff --git a/src/FilterLists.Api/V1/Controllers/SoftwareController.cs b/src/FilterLists.Api/V1/Controllers/SoftwareController.cs index 28462a216..97f5c6cf2 100644 --- a/src/FilterLists.Api/V1/Controllers/SoftwareController.cs +++ b/src/FilterLists.Api/V1/Controllers/SoftwareController.cs @@ -12,7 +12,7 @@ public SoftwareController(SeedService seedService) : base(seedService) { } - [HttpGet] + [HttpGet("seed")] public async Task Seed() => Json(await SeedService.GetAllAsync()); } } \ No newline at end of file diff --git a/src/FilterLists.Api/V1/Controllers/SoftwareSyntaxesController.cs b/src/FilterLists.Api/V1/Controllers/SoftwareSyntaxesController.cs index b042b1e13..8f18bc2e3 100644 --- a/src/FilterLists.Api/V1/Controllers/SoftwareSyntaxesController.cs +++ b/src/FilterLists.Api/V1/Controllers/SoftwareSyntaxesController.cs @@ -12,7 +12,7 @@ public SoftwareSyntaxesController(SeedService seedService) : base(seedService) { } - [HttpGet] + [HttpGet("seed")] public async Task Seed() => Json(await SeedService.GetAllAsync( typeof(SoftwareSyntax).GetProperty("SyntaxId"), typeof(SoftwareSyntax).GetProperty("SoftwareId"))); diff --git a/src/FilterLists.Api/V1/Controllers/SyntaxesController.cs b/src/FilterLists.Api/V1/Controllers/SyntaxesController.cs index 68d6fc4b9..9748cc8c3 100644 --- a/src/FilterLists.Api/V1/Controllers/SyntaxesController.cs +++ b/src/FilterLists.Api/V1/Controllers/SyntaxesController.cs @@ -12,7 +12,7 @@ public SyntaxesController(SeedService seedService) : base(seedService) { } - [HttpGet] + [HttpGet("seed")] public async Task Seed() => Json(await SeedService.GetAllAsync()); } } \ No newline at end of file