Move the pic controller to a minimal API
This commit is contained in:
		
							parent
							
								
									8debda5c67
								
							
						
					
					
						commit
						d5533c0ff9
					
				| @ -32,8 +32,6 @@ app.UseCors("CorsPolicy"); | |||||||
| app.UseAuthentication(); | app.UseAuthentication(); | ||||||
| app.UseAuthorization(); | app.UseAuthorization(); | ||||||
| 
 | 
 | ||||||
| app.MapGet("/", () => Results.Redirect("/swagger")); |  | ||||||
| 
 |  | ||||||
| app.MapControllers(); | app.MapControllers(); | ||||||
| app.MapReverseProxy(); | app.MapReverseProxy(); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -49,6 +49,7 @@ | |||||||
|     <PackageVersion Include="Microsoft.AspNetCore.Identity.UI" Version="7.0.3" /> |     <PackageVersion Include="Microsoft.AspNetCore.Identity.UI" Version="7.0.3" /> | ||||||
|     <PackageVersion Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="7.0.3" /> |     <PackageVersion Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="7.0.3" /> | ||||||
|     <PackageVersion Include="Microsoft.AspNetCore.Mvc.Testing" Version="7.0.3" /> |     <PackageVersion Include="Microsoft.AspNetCore.Mvc.Testing" Version="7.0.3" /> | ||||||
|  |     <PackageVersion Include="Microsoft.AspNetCore.OpenApi" Version="7.0.5" /> | ||||||
|     <PackageVersion Include="Microsoft.AspNetCore.SignalR.StackExchangeRedis" Version="7.0.3" /> |     <PackageVersion Include="Microsoft.AspNetCore.SignalR.StackExchangeRedis" Version="7.0.3" /> | ||||||
|     <PackageVersion Include="Microsoft.AspNetCore.SpaServices.Extensions" Version="7.0.3" /> |     <PackageVersion Include="Microsoft.AspNetCore.SpaServices.Extensions" Version="7.0.3" /> | ||||||
|     <PackageVersion Include="Microsoft.AspNetCore.TestHost" Version="7.0.3" /> |     <PackageVersion Include="Microsoft.AspNetCore.TestHost" Version="7.0.3" /> | ||||||
|  | |||||||
| @ -19,8 +19,6 @@ var app = builder.Build(); | |||||||
| 
 | 
 | ||||||
| app.UseServiceDefaults(); | app.UseServiceDefaults(); | ||||||
| 
 | 
 | ||||||
| app.MapGet("/", () => Results.Redirect("/swagger")); |  | ||||||
| 
 |  | ||||||
| app.MapGrpcService<BasketService>(); | app.MapGrpcService<BasketService>(); | ||||||
| app.MapControllers(); | app.MapControllers(); | ||||||
| 
 | 
 | ||||||
|  | |||||||
							
								
								
									
										42
									
								
								src/Services/Catalog/Catalog.API/Apis/PicApi.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								src/Services/Catalog/Catalog.API/Apis/PicApi.cs
									
									
									
									
									
										Normal file
									
								
							| @ -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", | ||||||
|  |         }; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -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: /<controller>/ |  | ||||||
|     public async Task<ActionResult> 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; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| @ -35,9 +35,9 @@ global using Microsoft.eShopOnContainers.Services.Catalog.API.Model; | |||||||
| global using Microsoft.eShopOnContainers.Services.Catalog.API.ViewModel; | global using Microsoft.eShopOnContainers.Services.Catalog.API.ViewModel; | ||||||
| global using Microsoft.Extensions.Configuration; | global using Microsoft.Extensions.Configuration; | ||||||
| global using Microsoft.Extensions.DependencyInjection; | global using Microsoft.Extensions.DependencyInjection; | ||||||
| global using Microsoft.Extensions.FileProviders; |  | ||||||
| global using Microsoft.Extensions.Logging; | global using Microsoft.Extensions.Logging; | ||||||
| global using Microsoft.Extensions.Options; | global using Microsoft.Extensions.Options; | ||||||
| global using Polly; | global using Polly; | ||||||
| global using Polly.Retry; | global using Polly.Retry; | ||||||
| global using Services.Common; | global using Services.Common; | ||||||
|  | global using Catalog.API.Apis; | ||||||
|  | |||||||
| @ -18,8 +18,7 @@ var app = builder.Build(); | |||||||
| 
 | 
 | ||||||
| app.UseServiceDefaults(); | app.UseServiceDefaults(); | ||||||
| 
 | 
 | ||||||
| app.MapGet("/", () => Results.Redirect("/swagger")); | app.MapPicApi(); | ||||||
| 
 |  | ||||||
| app.MapControllers(); | app.MapControllers(); | ||||||
| app.MapGrpcService<CatalogService>(); | app.MapGrpcService<CatalogService>(); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -44,8 +44,6 @@ var app = builder.Build(); | |||||||
| 
 | 
 | ||||||
| app.UseServiceDefaults(); | app.UseServiceDefaults(); | ||||||
| 
 | 
 | ||||||
| app.MapGet("/", () => Results.Redirect("/swagger")); |  | ||||||
| 
 |  | ||||||
| app.MapGrpcService<OrderingService>(); | app.MapGrpcService<OrderingService>(); | ||||||
| app.MapControllers(); | app.MapControllers(); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -4,6 +4,7 @@ using HealthChecks.UI.Client; | |||||||
| using Microsoft.AspNetCore.Builder; | using Microsoft.AspNetCore.Builder; | ||||||
| using Microsoft.AspNetCore.Diagnostics.HealthChecks; | using Microsoft.AspNetCore.Diagnostics.HealthChecks; | ||||||
| using Microsoft.AspNetCore.Hosting; | using Microsoft.AspNetCore.Hosting; | ||||||
|  | using Microsoft.AspNetCore.Http; | ||||||
| using Microsoft.AspNetCore.Routing; | using Microsoft.AspNetCore.Routing; | ||||||
| using Microsoft.eShopOnContainers.BuildingBlocks.EventBus; | using Microsoft.eShopOnContainers.BuildingBlocks.EventBus; | ||||||
| using Microsoft.eShopOnContainers.BuildingBlocks.EventBus.Abstractions; | using Microsoft.eShopOnContainers.BuildingBlocks.EventBus.Abstractions; | ||||||
| @ -100,7 +101,7 @@ public static class CommonExtensions | |||||||
|         return true; |         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"); |         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; |         return app; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| @ -151,6 +155,8 @@ public static class CommonExtensions | |||||||
|             return services; |             return services; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  |         services.AddEndpointsApiExplorer(); | ||||||
|  | 
 | ||||||
|         return services.AddSwaggerGen(options => |         return services.AddSwaggerGen(options => | ||||||
|         { |         { | ||||||
|             /// { |             /// { | ||||||
|  | |||||||
| @ -29,6 +29,7 @@ | |||||||
|     <PackageReference Include="Microsoft.AspNetCore.HealthChecks" /> |     <PackageReference Include="Microsoft.AspNetCore.HealthChecks" /> | ||||||
|     <PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" /> |     <PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" /> | ||||||
|     <PackageReference Include="Microsoft.AspNetCore.Identity.UI" /> |     <PackageReference Include="Microsoft.AspNetCore.Identity.UI" /> | ||||||
|  |     <PackageReference Include="Microsoft.AspNetCore.OpenApi" /> | ||||||
|     <PackageReference Include="Microsoft.EntityFrameworkCore.Design"> |     <PackageReference Include="Microsoft.EntityFrameworkCore.Design"> | ||||||
|       <PrivateAssets>all</PrivateAssets> |       <PrivateAssets>all</PrivateAssets> | ||||||
|       <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> |       <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> | ||||||
|  | |||||||
| @ -21,7 +21,6 @@ var app = builder.Build(); | |||||||
| 
 | 
 | ||||||
| app.UseServiceDefaults(); | app.UseServiceDefaults(); | ||||||
| 
 | 
 | ||||||
| app.MapGet("/", () => Results.Redirect("/swagger")); |  | ||||||
| app.MapControllers(); | app.MapControllers(); | ||||||
| 
 | 
 | ||||||
| var eventBus = app.Services.GetRequiredService<IEventBus>(); | var eventBus = app.Services.GetRequiredService<IEventBus>(); | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user