From 5fad42ba1fc6abf039790fd79c5a4a6f8301af6a Mon Sep 17 00:00:00 2001 From: "Collin M. Barrett" Date: Wed, 3 Nov 2021 17:32:17 -0500 Subject: [PATCH] =?UTF-8?q?feat(apis):=20=E2=9C=A8=20supply=20basic/consis?= =?UTF-8?q?tent=20error=20response?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/ErrorController.cs | 31 +++++++++++++++++++ .../FilterLists.Archival.Api/Startup.cs | 9 ++---- .../Controllers/ErrorController.cs | 31 +++++++++++++++++++ .../FilterLists.Directory.Api/Startup.cs | 9 ++---- 4 files changed, 66 insertions(+), 14 deletions(-) create mode 100644 services/Archival/FilterLists.Archival.Api/Controllers/ErrorController.cs create mode 100644 services/Directory/FilterLists.Directory.Api/Controllers/ErrorController.cs diff --git a/services/Archival/FilterLists.Archival.Api/Controllers/ErrorController.cs b/services/Archival/FilterLists.Archival.Api/Controllers/ErrorController.cs new file mode 100644 index 000000000..a4d53ae97 --- /dev/null +++ b/services/Archival/FilterLists.Archival.Api/Controllers/ErrorController.cs @@ -0,0 +1,31 @@ +using System; +using Microsoft.AspNetCore.Diagnostics; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Mvc; + +namespace FilterLists.Archival.Api.Controllers +{ + [ApiController] + [ApiExplorerSettings(IgnoreApi = true)] + // TODO: de-duplicate into SharedKernel + public class ErrorController : ControllerBase + { + [Route("/error-local-development")] + public IActionResult ErrorLocalDevelopment([FromServices] IWebHostEnvironment webHostEnvironment) + { + if (webHostEnvironment.EnvironmentName != "Development") + { + throw new InvalidOperationException("This shouldn't be invoked in non-development environments."); + } + + var context = HttpContext.Features.Get(); + return Problem(context.Error.StackTrace, title: context.Error.Message); + } + + [Route("/error")] + public IActionResult Error() + { + return Problem(); + } + } +} diff --git a/services/Archival/FilterLists.Archival.Api/Startup.cs b/services/Archival/FilterLists.Archival.Api/Startup.cs index 5d1368f80..b966a4ac5 100644 --- a/services/Archival/FilterLists.Archival.Api/Startup.cs +++ b/services/Archival/FilterLists.Archival.Api/Startup.cs @@ -19,8 +19,7 @@ public Startup(IConfiguration configuration) public void ConfigureServices(IServiceCollection services) { services.AddRouting(o => o.LowercaseUrls = true); - services.AddControllers() - .AddJsonOptions(o => o.JsonSerializerOptions.IgnoreNullValues = true); + services.AddControllers().AddJsonOptions(o => o.JsonSerializerOptions.IgnoreNullValues = true); services.AddSwaggerGen(); services.AddApplicationServices(Configuration); } @@ -28,11 +27,7 @@ public void ConfigureServices(IServiceCollection services) public static void Configure(IApplicationBuilder app, IWebHostEnvironment env) { app.UseApplication(); - if (env.IsDevelopment()) - { - app.UseDeveloperExceptionPage(); - } - + app.UseExceptionHandler(env.IsDevelopment() ? "/error-local-development" : "/error"); app.UseRouting(); app.UseEndpoints(e => e.MapControllers()); app.UseSwagger(); diff --git a/services/Directory/FilterLists.Directory.Api/Controllers/ErrorController.cs b/services/Directory/FilterLists.Directory.Api/Controllers/ErrorController.cs new file mode 100644 index 000000000..c3ff4cce6 --- /dev/null +++ b/services/Directory/FilterLists.Directory.Api/Controllers/ErrorController.cs @@ -0,0 +1,31 @@ +using System; +using Microsoft.AspNetCore.Diagnostics; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Mvc; + +namespace FilterLists.Directory.Api.Controllers +{ + [ApiController] + [ApiExplorerSettings(IgnoreApi = true)] + // TODO: de-duplicate into SharedKernel + public class ErrorController : ControllerBase + { + [Route("/error-local-development")] + public IActionResult ErrorLocalDevelopment([FromServices] IWebHostEnvironment webHostEnvironment) + { + if (webHostEnvironment.EnvironmentName != "Development") + { + throw new InvalidOperationException("This shouldn't be invoked in non-development environments."); + } + + var context = HttpContext.Features.Get(); + return Problem(context.Error.StackTrace, title: context.Error.Message); + } + + [Route("/error")] + public IActionResult Error() + { + return Problem(); + } + } +} diff --git a/services/Directory/FilterLists.Directory.Api/Startup.cs b/services/Directory/FilterLists.Directory.Api/Startup.cs index 741f561cc..95a7c3c50 100644 --- a/services/Directory/FilterLists.Directory.Api/Startup.cs +++ b/services/Directory/FilterLists.Directory.Api/Startup.cs @@ -20,8 +20,7 @@ public void ConfigureServices(IServiceCollection services) { services.AddMemoryCache(); services.AddRouting(o => o.LowercaseUrls = true); - services.AddControllers() - .AddJsonOptions(o => o.JsonSerializerOptions.IgnoreNullValues = true); + services.AddControllers().AddJsonOptions(o => o.JsonSerializerOptions.IgnoreNullValues = true); services.AddSwaggerGen(); services.AddApplicationServices(Configuration); } @@ -29,11 +28,7 @@ public void ConfigureServices(IServiceCollection services) public static void Configure(IApplicationBuilder app, IWebHostEnvironment env) { app.UseApplication(); - if (env.IsDevelopment()) - { - app.UseDeveloperExceptionPage(); - } - + app.UseExceptionHandler(env.IsDevelopment() ? "/error-local-development" : "/error"); app.UseRouting(); app.UseEndpoints(e => e.MapControllers()); app.UseSwagger();