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();