From d5533c0ff9de48f029270ff3ab5cac0b80658ccb Mon Sep 17 00:00:00 2001 From: David Fowler Date: Mon, 8 May 2023 01:44:51 -0700 Subject: [PATCH] Move the pic controller to a minimal API --- .../Web.Bff.Shopping/aggregator/Program.cs | 2 - src/Directory.Packages.props | 1 + src/Services/Basket/Basket.API/Program.cs | 2 - .../Catalog/Catalog.API/Apis/PicApi.cs | 42 +++++++++++++ .../Catalog.API/Controllers/PicController.cs | 61 ------------------- .../Catalog/Catalog.API/GlobalUsings.cs | 2 +- src/Services/Catalog/Catalog.API/Program.cs | 3 +- src/Services/Ordering/Ordering.API/Program.cs | 2 - .../Services.Common/CommonExtensions.cs | 8 ++- .../Services.Common/Services.Common.csproj | 1 + src/Services/Webhooks/Webhooks.API/Program.cs | 1 - 11 files changed, 53 insertions(+), 72 deletions(-) create mode 100644 src/Services/Catalog/Catalog.API/Apis/PicApi.cs delete mode 100644 src/Services/Catalog/Catalog.API/Controllers/PicController.cs diff --git a/src/ApiGateways/Web.Bff.Shopping/aggregator/Program.cs b/src/ApiGateways/Web.Bff.Shopping/aggregator/Program.cs index b50806c94..6bb3a0d3b 100644 --- a/src/ApiGateways/Web.Bff.Shopping/aggregator/Program.cs +++ b/src/ApiGateways/Web.Bff.Shopping/aggregator/Program.cs @@ -32,8 +32,6 @@ app.UseCors("CorsPolicy"); app.UseAuthentication(); app.UseAuthorization(); -app.MapGet("/", () => Results.Redirect("/swagger")); - app.MapControllers(); app.MapReverseProxy(); diff --git a/src/Directory.Packages.props b/src/Directory.Packages.props index b48ea8c13..9a7ce49ec 100644 --- a/src/Directory.Packages.props +++ b/src/Directory.Packages.props @@ -49,6 +49,7 @@ + diff --git a/src/Services/Basket/Basket.API/Program.cs b/src/Services/Basket/Basket.API/Program.cs index 7ea0fd8ce..28f3b1b1e 100644 --- a/src/Services/Basket/Basket.API/Program.cs +++ b/src/Services/Basket/Basket.API/Program.cs @@ -19,8 +19,6 @@ var app = builder.Build(); app.UseServiceDefaults(); -app.MapGet("/", () => Results.Redirect("/swagger")); - app.MapGrpcService(); app.MapControllers(); diff --git a/src/Services/Catalog/Catalog.API/Apis/PicApi.cs b/src/Services/Catalog/Catalog.API/Apis/PicApi.cs new file mode 100644 index 000000000..277b718a7 --- /dev/null +++ b/src/Services/Catalog/Catalog.API/Apis/PicApi.cs @@ -0,0 +1,42 @@ +using Microsoft.AspNetCore.Routing; + +namespace Catalog.API.Apis; + +public static class PicApi +{ + public static IEndpointConventionBuilder MapPicApi(this IEndpointRouteBuilder routes) + { + return routes.MapGet("api/v1/catalog/items/{catalogItemId:int}/pic", + async (int catalogItemId, CatalogContext db, IWebHostEnvironment environment) => + { + var item = await db.CatalogItems.FindAsync(catalogItemId); + + if (item is null) + { + return Results.NotFound(); + } + + var path = Path.Combine(environment.ContentRootPath, "Pics", item.PictureFileName); + + string imageFileExtension = Path.GetExtension(item.PictureFileName); + string mimetype = GetImageMimeTypeFromImageFileExtension(imageFileExtension); + + return Results.File(path, mimetype); + }) + .WithTags("Pic") + .Produces(404); + + static string GetImageMimeTypeFromImageFileExtension(string extension) => extension switch + { + ".png" => "image/png", + ".gif" => "image/gif", + ".jpg" or ".jpeg" => "image/jpeg", + ".bmp" => "image/bmp", + ".tiff" => "image/tiff", + ".wmf" => "image/wmf", + ".jp2" => "image/jp2", + ".svg" => "image/svg+xml", + _ => "application/octet-stream", + }; + } +} diff --git a/src/Services/Catalog/Catalog.API/Controllers/PicController.cs b/src/Services/Catalog/Catalog.API/Controllers/PicController.cs deleted file mode 100644 index f4dd6504d..000000000 --- a/src/Services/Catalog/Catalog.API/Controllers/PicController.cs +++ /dev/null @@ -1,61 +0,0 @@ -// For more information on enabling MVC for empty projects, visit http://go.microsoft.com/fwlink/?LinkID=397860 -namespace Microsoft.eShopOnContainers.Services.Catalog.API.Controllers; - -[ApiController] -public class PicController : ControllerBase -{ - private readonly IWebHostEnvironment _env; - private readonly CatalogContext _catalogContext; - - public PicController(IWebHostEnvironment env, - CatalogContext catalogContext) - { - _env = env; - _catalogContext = catalogContext; - } - - [HttpGet] - [Route("api/v1/catalog/items/{catalogItemId:int}/pic")] - [ProducesResponseType((int)HttpStatusCode.NotFound)] - [ProducesResponseType((int)HttpStatusCode.BadRequest)] - // GET: // - public async Task GetImageAsync(int catalogItemId) - { - if (catalogItemId <= 0) - { - return BadRequest(); - } - - var item = await _catalogContext.CatalogItems - .SingleOrDefaultAsync(ci => ci.Id == catalogItemId); - - if (item != null) - { - var path = Path.Combine(_env.ContentRootPath, "Pics", item.PictureFileName); - - string imageFileExtension = Path.GetExtension(item.PictureFileName); - string mimetype = GetImageMimeTypeFromImageFileExtension(imageFileExtension); - - return PhysicalFile(path, mimetype); - } - - return NotFound(); - } - - private string GetImageMimeTypeFromImageFileExtension(string extension) - { - string mimetype = extension switch - { - ".png" => "image/png", - ".gif" => "image/gif", - ".jpg" or ".jpeg" => "image/jpeg", - ".bmp" => "image/bmp", - ".tiff" => "image/tiff", - ".wmf" => "image/wmf", - ".jp2" => "image/jp2", - ".svg" => "image/svg+xml", - _ => "application/octet-stream", - }; - return mimetype; - } -} diff --git a/src/Services/Catalog/Catalog.API/GlobalUsings.cs b/src/Services/Catalog/Catalog.API/GlobalUsings.cs index cc82d36bd..e521114b2 100644 --- a/src/Services/Catalog/Catalog.API/GlobalUsings.cs +++ b/src/Services/Catalog/Catalog.API/GlobalUsings.cs @@ -35,9 +35,9 @@ global using Microsoft.eShopOnContainers.Services.Catalog.API.Model; global using Microsoft.eShopOnContainers.Services.Catalog.API.ViewModel; global using Microsoft.Extensions.Configuration; global using Microsoft.Extensions.DependencyInjection; -global using Microsoft.Extensions.FileProviders; global using Microsoft.Extensions.Logging; global using Microsoft.Extensions.Options; global using Polly; global using Polly.Retry; global using Services.Common; +global using Catalog.API.Apis; diff --git a/src/Services/Catalog/Catalog.API/Program.cs b/src/Services/Catalog/Catalog.API/Program.cs index d450b022a..695ea9197 100644 --- a/src/Services/Catalog/Catalog.API/Program.cs +++ b/src/Services/Catalog/Catalog.API/Program.cs @@ -18,8 +18,7 @@ var app = builder.Build(); app.UseServiceDefaults(); -app.MapGet("/", () => Results.Redirect("/swagger")); - +app.MapPicApi(); app.MapControllers(); app.MapGrpcService(); diff --git a/src/Services/Ordering/Ordering.API/Program.cs b/src/Services/Ordering/Ordering.API/Program.cs index 6b8dce4c2..56d76de33 100644 --- a/src/Services/Ordering/Ordering.API/Program.cs +++ b/src/Services/Ordering/Ordering.API/Program.cs @@ -44,8 +44,6 @@ var app = builder.Build(); app.UseServiceDefaults(); -app.MapGet("/", () => Results.Redirect("/swagger")); - app.MapGrpcService(); app.MapControllers(); diff --git a/src/Services/Services.Common/CommonExtensions.cs b/src/Services/Services.Common/CommonExtensions.cs index 104a66e3b..1d666edd2 100644 --- a/src/Services/Services.Common/CommonExtensions.cs +++ b/src/Services/Services.Common/CommonExtensions.cs @@ -4,6 +4,7 @@ using HealthChecks.UI.Client; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Diagnostics.HealthChecks; using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Routing; using Microsoft.eShopOnContainers.BuildingBlocks.EventBus; using Microsoft.eShopOnContainers.BuildingBlocks.EventBus.Abstractions; @@ -100,7 +101,7 @@ public static class CommonExtensions return true; } - public static IApplicationBuilder UseDefaultOpenApi(this IApplicationBuilder app, IConfiguration configuration) + public static IApplicationBuilder UseDefaultOpenApi(this WebApplication app, IConfiguration configuration) { var openApiSection = configuration.GetSection("OpenApi"); @@ -139,6 +140,9 @@ public static class CommonExtensions } }); + // Add a redirect from the root of the app to the swagger endpoint + app.MapGet("/", () => Results.Redirect("/swagger")).ExcludeFromDescription(); + return app; } @@ -151,6 +155,8 @@ public static class CommonExtensions return services; } + services.AddEndpointsApiExplorer(); + return services.AddSwaggerGen(options => { /// { diff --git a/src/Services/Services.Common/Services.Common.csproj b/src/Services/Services.Common/Services.Common.csproj index 5f45aac7b..8e73f0143 100644 --- a/src/Services/Services.Common/Services.Common.csproj +++ b/src/Services/Services.Common/Services.Common.csproj @@ -29,6 +29,7 @@ + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/Services/Webhooks/Webhooks.API/Program.cs b/src/Services/Webhooks/Webhooks.API/Program.cs index ad227b906..bb1e49190 100644 --- a/src/Services/Webhooks/Webhooks.API/Program.cs +++ b/src/Services/Webhooks/Webhooks.API/Program.cs @@ -21,7 +21,6 @@ var app = builder.Build(); app.UseServiceDefaults(); -app.MapGet("/", () => Results.Redirect("/swagger")); app.MapControllers(); var eventBus = app.Services.GetRequiredService();