Use WebApplicationBuilder in Mobile.Shopping.HttpAggregator
This commit is contained in:
		
							parent
							
								
									f8abb36bc6
								
							
						
					
					
						commit
						e2d8590a26
					
				| @ -2,7 +2,6 @@ | |||||||
| 
 | 
 | ||||||
| public class UpdateBasketItemsRequest | public class UpdateBasketItemsRequest | ||||||
| { | { | ||||||
| 
 |  | ||||||
|     public string BasketId { get; set; } |     public string BasketId { get; set; } | ||||||
| 
 | 
 | ||||||
|     public ICollection<UpdateBasketItemData> Updates { get; set; } |     public ICollection<UpdateBasketItemData> Updates { get; set; } | ||||||
|  | |||||||
| @ -1,16 +1,146 @@ | |||||||
| await BuildWebHost(args).RunAsync(); | var builder = WebApplication.CreateBuilder(args); | ||||||
| IWebHost BuildWebHost(string[] args) => | 
 | ||||||
|     WebHost | builder.Services.AddHealthChecks() | ||||||
|         .CreateDefaultBuilder(args) |     .AddCheck("self", () => HealthCheckResult.Healthy()) | ||||||
|         .ConfigureAppConfiguration(cb => |     .AddUrlGroup(new Uri(builder.Configuration["CatalogUrlHC"]), name: "catalogapi-check", tags: new string[] { "catalogapi" }) | ||||||
|  |     .AddUrlGroup(new Uri(builder.Configuration["OrderingUrlHC"]), name: "orderingapi-check", tags: new string[] { "orderingapi" }) | ||||||
|  |     .AddUrlGroup(new Uri(builder.Configuration["BasketUrlHC"]), name: "basketapi-check", tags: new string[] { "basketapi" }) | ||||||
|  |     .AddUrlGroup(new Uri(builder.Configuration["IdentityUrlHC"]), name: "identityapi-check", tags: new string[] { "identityapi" }) | ||||||
|  |     .AddUrlGroup(new Uri(builder.Configuration["PaymentUrlHC"]), name: "paymentapi-check", tags: new string[] { "paymentapi" }); | ||||||
|  | 
 | ||||||
|  | builder.Services.Configure<UrlsConfig>(builder.Configuration.GetSection("urls")); | ||||||
|  | 
 | ||||||
|  | builder.Services.AddControllers() | ||||||
|  |         .AddJsonOptions(options => options.JsonSerializerOptions.WriteIndented = true); | ||||||
|  | 
 | ||||||
|  | builder.Services.AddSwaggerGen(options => | ||||||
| { | { | ||||||
|             var sources = cb.Sources; |     //options.DescribeAllEnumsAsStrings(); | ||||||
|             sources.Insert(3, new Microsoft.Extensions.Configuration.Json.JsonConfigurationSource() |     options.SwaggerDoc("v1", new OpenApiInfo | ||||||
|     { |     { | ||||||
|                 Optional = true, |         Title = "Shopping Aggregator for Mobile Clients", | ||||||
|                 Path = "appsettings.localhost.json", |         Version = "v1", | ||||||
|                 ReloadOnChange = false |         Description = "Shopping Aggregator for Mobile Clients" | ||||||
|     }); |     }); | ||||||
|  |     var identityUrl = builder.Configuration.GetSection("Identity").GetValue<string>("ExternalUrl"); | ||||||
|  |     options.AddSecurityDefinition("oauth2", new OpenApiSecurityScheme | ||||||
|  |     { | ||||||
|  |         Type = SecuritySchemeType.OAuth2, | ||||||
|  |         Flows = new OpenApiOAuthFlows() | ||||||
|  |         { | ||||||
|  |             Implicit = new OpenApiOAuthFlow() | ||||||
|  |             { | ||||||
|  |                 AuthorizationUrl = new Uri($"{identityUrl}/connect/authorize"), | ||||||
|  |                 TokenUrl = new Uri($"{identityUrl}/connect/token"), | ||||||
|  | 
 | ||||||
|  |                 Scopes = new Dictionary<string, string>() | ||||||
|  |                 { | ||||||
|  |                     { "mobileshoppingagg", "Shopping Aggregator for Mobile Clients" } | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     }); | ||||||
|  | 
 | ||||||
|  |     options.OperationFilter<AuthorizeCheckOperationFilter>(); | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | builder.Services.AddCors(options => | ||||||
|  | { | ||||||
|  |     options.AddPolicy("CorsPolicy", | ||||||
|  |         builder => builder | ||||||
|  |         .AllowAnyMethod() | ||||||
|  |         .AllowAnyHeader() | ||||||
|  |         .SetIsOriginAllowed((host) => true) | ||||||
|  |         .AllowCredentials()); | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Remove("sub"); | ||||||
|  | 
 | ||||||
|  | var identityUrl = builder.Configuration.GetValue<string>("urls:identity"); | ||||||
|  | 
 | ||||||
|  | builder.Services.AddAuthentication(options => | ||||||
|  | { | ||||||
|  |     options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; | ||||||
|  |     options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; | ||||||
|  | 
 | ||||||
| }) | }) | ||||||
|         .UseStartup<Startup>() | .AddJwtBearer(options => | ||||||
|         .Build(); | { | ||||||
|  |     options.Authority = identityUrl; | ||||||
|  |     options.RequireHttpsMetadata = false; | ||||||
|  |     options.Audience = "mobileshoppingagg"; | ||||||
|  |     options.TokenValidationParameters = new TokenValidationParameters | ||||||
|  |     { | ||||||
|  |         ValidateAudience = false | ||||||
|  |     }; | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | builder.Services.AddAuthorization(options => | ||||||
|  | { | ||||||
|  |     options.AddPolicy("ApiScope", policy => | ||||||
|  |     { | ||||||
|  |         policy.RequireAuthenticatedUser(); | ||||||
|  |         policy.RequireClaim("scope", "mobileshoppingagg"); | ||||||
|  |     }); | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | builder.Services.AddTransient<HttpClientAuthorizationDelegatingHandler>(); | ||||||
|  | builder.Services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); | ||||||
|  | builder.Services.AddHttpClient<IOrderApiClient, OrderApiClient>(); | ||||||
|  | 
 | ||||||
|  | builder.Services.AddTransient<GrpcExceptionInterceptor>(); | ||||||
|  | builder.Services.AddScoped<IBasketService, BasketService>(); | ||||||
|  | builder.Services.AddGrpcClient<Basket.BasketClient>((services, options) => | ||||||
|  | { | ||||||
|  |     var basketApi = services.GetRequiredService<IOptions<UrlsConfig>>().Value.GrpcBasket; | ||||||
|  |     options.Address = new Uri(basketApi); | ||||||
|  | }).AddInterceptor<GrpcExceptionInterceptor>(); | ||||||
|  | builder.Services.AddScoped<ICatalogService, CatalogService>(); | ||||||
|  | builder.Services.AddGrpcClient<Catalog.CatalogClient>((services, options) => | ||||||
|  | { | ||||||
|  |     var catalogApi = services.GetRequiredService<IOptions<UrlsConfig>>().Value.GrpcCatalog; | ||||||
|  |     options.Address = new Uri(catalogApi); | ||||||
|  | }).AddInterceptor<GrpcExceptionInterceptor>(); | ||||||
|  | builder.Services.AddScoped<IOrderingService, OrderingService>(); | ||||||
|  | builder.Services.AddGrpcClient<GrpcOrdering.OrderingGrpc.OrderingGrpcClient>((services, options) => | ||||||
|  | { | ||||||
|  |     var orderingApi = services.GetRequiredService<IOptions<UrlsConfig>>().Value.GrpcOrdering; | ||||||
|  |     options.Address = new Uri(orderingApi); | ||||||
|  | }).AddInterceptor<GrpcExceptionInterceptor>(); | ||||||
|  | 
 | ||||||
|  | var app = builder.Build(); | ||||||
|  | 
 | ||||||
|  | var pathBase = app.Configuration["PATH_BASE"]; | ||||||
|  | 
 | ||||||
|  | if (!string.IsNullOrEmpty(pathBase)) | ||||||
|  | { | ||||||
|  |     app.UsePathBase(pathBase); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | app.UseSwagger().UseSwaggerUI(c => | ||||||
|  | { | ||||||
|  |     c.SwaggerEndpoint($"{(!string.IsNullOrEmpty(pathBase) ? pathBase : string.Empty)}/swagger/v1/swagger.json", "Purchase BFF V1"); | ||||||
|  | 
 | ||||||
|  |     c.OAuthClientId("mobileshoppingaggswaggerui"); | ||||||
|  |     c.OAuthClientSecret(string.Empty); | ||||||
|  |     c.OAuthRealm(string.Empty); | ||||||
|  |     c.OAuthAppName("Purchase BFF Swagger UI"); | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | app.UseRouting(); | ||||||
|  | app.UseCors("CorsPolicy"); | ||||||
|  | app.UseAuthentication(); | ||||||
|  | app.UseAuthorization(); | ||||||
|  | app.MapDefaultControllerRoute(); | ||||||
|  | app.MapControllers(); | ||||||
|  | app.MapHealthChecks("/hc", new HealthCheckOptions() | ||||||
|  | { | ||||||
|  |     Predicate = _ => true, | ||||||
|  |     ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse | ||||||
|  | }); | ||||||
|  | app.MapHealthChecks("/liveness", new HealthCheckOptions | ||||||
|  | { | ||||||
|  |     Predicate = r => r.Name.Contains("self") | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | await app.RunAsync(); | ||||||
|  | |||||||
| @ -5,5 +5,4 @@ public interface IBasketService | |||||||
|     Task<BasketData> GetByIdAsync(string id); |     Task<BasketData> GetByIdAsync(string id); | ||||||
| 
 | 
 | ||||||
|     Task UpdateAsync(BasketData currentBasket); |     Task UpdateAsync(BasketData currentBasket); | ||||||
| 
 |  | ||||||
| } | } | ||||||
|  | |||||||
| @ -1,211 +0,0 @@ | |||||||
| namespace Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator; |  | ||||||
| 
 |  | ||||||
| public class Startup |  | ||||||
| { |  | ||||||
|     public Startup(IConfiguration configuration) |  | ||||||
|     { |  | ||||||
|         Configuration = configuration; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     public IConfiguration Configuration { get; } |  | ||||||
| 
 |  | ||||||
|     // This method gets called by the runtime. Use this method to add services to the container. |  | ||||||
|     public void ConfigureServices(IServiceCollection services) |  | ||||||
|     { |  | ||||||
|         services.AddHealthChecks() |  | ||||||
|             .AddCheck("self", () => HealthCheckResult.Healthy()) |  | ||||||
|             .AddUrlGroup(new Uri(Configuration["CatalogUrlHC"]), name: "catalogapi-check", tags: new string[] { "catalogapi" }) |  | ||||||
|             .AddUrlGroup(new Uri(Configuration["OrderingUrlHC"]), name: "orderingapi-check", tags: new string[] { "orderingapi" }) |  | ||||||
|             .AddUrlGroup(new Uri(Configuration["BasketUrlHC"]), name: "basketapi-check", tags: new string[] { "basketapi" }) |  | ||||||
|             .AddUrlGroup(new Uri(Configuration["IdentityUrlHC"]), name: "identityapi-check", tags: new string[] { "identityapi" }) |  | ||||||
|             .AddUrlGroup(new Uri(Configuration["PaymentUrlHC"]), name: "paymentapi-check", tags: new string[] { "paymentapi" }); |  | ||||||
| 
 |  | ||||||
|         services.AddCustomMvc(Configuration) |  | ||||||
|                 .AddCustomAuthentication(Configuration) |  | ||||||
|                 .AddHttpServices() |  | ||||||
|                 .AddGrpcServices(); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. |  | ||||||
|     public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory) |  | ||||||
|     { |  | ||||||
|         var pathBase = Configuration["PATH_BASE"]; |  | ||||||
| 
 |  | ||||||
|         if (!string.IsNullOrEmpty(pathBase)) |  | ||||||
|         { |  | ||||||
|             loggerFactory.CreateLogger<Startup>().LogDebug("Using PATH BASE '{pathBase}'", pathBase); |  | ||||||
|             app.UsePathBase(pathBase); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         if (env.IsDevelopment()) |  | ||||||
|         { |  | ||||||
|             app.UseDeveloperExceptionPage(); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         app.UseSwagger().UseSwaggerUI(c => |  | ||||||
|         { |  | ||||||
|             c.SwaggerEndpoint($"{(!string.IsNullOrEmpty(pathBase) ? pathBase : string.Empty)}/swagger/v1/swagger.json", "Purchase BFF V1"); |  | ||||||
| 
 |  | ||||||
|             c.OAuthClientId("mobileshoppingaggswaggerui"); |  | ||||||
|             c.OAuthClientSecret(string.Empty); |  | ||||||
|             c.OAuthRealm(string.Empty); |  | ||||||
|             c.OAuthAppName("Purchase BFF Swagger UI"); |  | ||||||
|         }); |  | ||||||
| 
 |  | ||||||
|         app.UseRouting(); |  | ||||||
|         app.UseCors("CorsPolicy"); |  | ||||||
|         app.UseAuthentication(); |  | ||||||
|         app.UseAuthorization(); |  | ||||||
|         app.UseEndpoints(endpoints => |  | ||||||
|         { |  | ||||||
|             endpoints.MapDefaultControllerRoute(); |  | ||||||
|             endpoints.MapControllers(); |  | ||||||
|             endpoints.MapHealthChecks("/hc", new HealthCheckOptions() |  | ||||||
|             { |  | ||||||
|                 Predicate = _ => true, |  | ||||||
|                 ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse |  | ||||||
|             }); |  | ||||||
|             endpoints.MapHealthChecks("/liveness", new HealthCheckOptions |  | ||||||
|             { |  | ||||||
|                 Predicate = r => r.Name.Contains("self") |  | ||||||
|             }); |  | ||||||
|         }); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| public static class ServiceCollectionExtensions |  | ||||||
| { |  | ||||||
|     public static IServiceCollection AddCustomMvc(this IServiceCollection services, IConfiguration configuration) |  | ||||||
|     { |  | ||||||
|         services.AddOptions(); |  | ||||||
|         services.Configure<UrlsConfig>(configuration.GetSection("urls")); |  | ||||||
| 
 |  | ||||||
|         services.AddControllers() |  | ||||||
|                 .AddJsonOptions(options => options.JsonSerializerOptions.WriteIndented = true); |  | ||||||
| 
 |  | ||||||
|         services.AddSwaggerGen(options => |  | ||||||
|         { |  | ||||||
|             //options.DescribeAllEnumsAsStrings(); |  | ||||||
|             options.SwaggerDoc("v1", new OpenApiInfo |  | ||||||
|             { |  | ||||||
|                 Title = "Shopping Aggregator for Mobile Clients", |  | ||||||
|                 Version = "v1", |  | ||||||
|                 Description = "Shopping Aggregator for Mobile Clients" |  | ||||||
|             }); |  | ||||||
|             var identityUrl = configuration.GetSection("Identity").GetValue<string>("ExternalUrl"); |  | ||||||
|             options.AddSecurityDefinition("oauth2", new OpenApiSecurityScheme |  | ||||||
|             { |  | ||||||
|                 Type = SecuritySchemeType.OAuth2, |  | ||||||
|                 Flows = new OpenApiOAuthFlows() |  | ||||||
|                 { |  | ||||||
|                     Implicit = new OpenApiOAuthFlow() |  | ||||||
|                     { |  | ||||||
|                         AuthorizationUrl = new Uri($"{identityUrl}/connect/authorize"), |  | ||||||
|                         TokenUrl = new Uri($"{identityUrl}/connect/token"), |  | ||||||
| 
 |  | ||||||
|                         Scopes = new Dictionary<string, string>() |  | ||||||
|                         { |  | ||||||
|                             { "mobileshoppingagg", "Shopping Aggregator for Mobile Clients" } |  | ||||||
|                         } |  | ||||||
|                     } |  | ||||||
|                 } |  | ||||||
|             }); |  | ||||||
| 
 |  | ||||||
|             options.OperationFilter<AuthorizeCheckOperationFilter>(); |  | ||||||
|         }); |  | ||||||
| 
 |  | ||||||
|         services.AddCors(options => |  | ||||||
|         { |  | ||||||
|             options.AddPolicy("CorsPolicy", |  | ||||||
|                 builder => builder |  | ||||||
|                 .AllowAnyMethod() |  | ||||||
|                 .AllowAnyHeader() |  | ||||||
|                 .SetIsOriginAllowed((host) => true) |  | ||||||
|                 .AllowCredentials()); |  | ||||||
|         }); |  | ||||||
| 
 |  | ||||||
|         return services; |  | ||||||
|     } |  | ||||||
|     public static IServiceCollection AddCustomAuthentication(this IServiceCollection services, IConfiguration configuration) |  | ||||||
|     { |  | ||||||
|         JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Remove("sub"); |  | ||||||
| 
 |  | ||||||
|         var identityUrl = configuration.GetValue<string>("urls:identity"); |  | ||||||
| 
 |  | ||||||
|         services.AddAuthentication(options => |  | ||||||
|         { |  | ||||||
|             options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; |  | ||||||
|             options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; |  | ||||||
| 
 |  | ||||||
|         }) |  | ||||||
|         .AddJwtBearer(options => |  | ||||||
|         { |  | ||||||
|             options.Authority = identityUrl; |  | ||||||
|             options.RequireHttpsMetadata = false; |  | ||||||
|             options.Audience = "mobileshoppingagg"; |  | ||||||
|             options.TokenValidationParameters = new TokenValidationParameters |  | ||||||
|             { |  | ||||||
|                 ValidateAudience = false |  | ||||||
|             }; |  | ||||||
|         }); |  | ||||||
| 
 |  | ||||||
|         return services; |  | ||||||
|     } |  | ||||||
|     public static IServiceCollection AddCustomAuthorization(this IServiceCollection services, IConfiguration configuration) |  | ||||||
|     { |  | ||||||
|         services.AddAuthorization(options => |  | ||||||
|         { |  | ||||||
|             options.AddPolicy("ApiScope", policy => |  | ||||||
|             { |  | ||||||
|                 policy.RequireAuthenticatedUser(); |  | ||||||
|                 policy.RequireClaim("scope", "mobileshoppingagg"); |  | ||||||
|             }); |  | ||||||
|         }); |  | ||||||
|         return services; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     public static IServiceCollection AddHttpServices(this IServiceCollection services) |  | ||||||
|     { |  | ||||||
|         //register delegating handlers |  | ||||||
|         services.AddTransient<HttpClientAuthorizationDelegatingHandler>(); |  | ||||||
|         services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); |  | ||||||
| 
 |  | ||||||
|         //register http services |  | ||||||
| 
 |  | ||||||
|         services.AddHttpClient<IOrderApiClient, OrderApiClient>(); |  | ||||||
| 
 |  | ||||||
|         return services; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     public static IServiceCollection AddGrpcServices(this IServiceCollection services) |  | ||||||
|     { |  | ||||||
|         services.AddTransient<GrpcExceptionInterceptor>(); |  | ||||||
| 
 |  | ||||||
|         services.AddScoped<IBasketService, BasketService>(); |  | ||||||
| 
 |  | ||||||
|         services.AddGrpcClient<Basket.BasketClient>((services, options) => |  | ||||||
|         { |  | ||||||
|             var basketApi = services.GetRequiredService<IOptions<UrlsConfig>>().Value.GrpcBasket; |  | ||||||
|             options.Address = new Uri(basketApi); |  | ||||||
|         }).AddInterceptor<GrpcExceptionInterceptor>(); |  | ||||||
| 
 |  | ||||||
|         services.AddScoped<ICatalogService, CatalogService>(); |  | ||||||
| 
 |  | ||||||
|         services.AddGrpcClient<Catalog.CatalogClient>((services, options) => |  | ||||||
|         { |  | ||||||
|             var catalogApi = services.GetRequiredService<IOptions<UrlsConfig>>().Value.GrpcCatalog; |  | ||||||
|             options.Address = new Uri(catalogApi); |  | ||||||
|         }).AddInterceptor<GrpcExceptionInterceptor>(); |  | ||||||
| 
 |  | ||||||
|         services.AddScoped<IOrderingService, OrderingService>(); |  | ||||||
| 
 |  | ||||||
|         services.AddGrpcClient<GrpcOrdering.OrderingGrpc.OrderingGrpcClient>((services, options) => |  | ||||||
|         { |  | ||||||
|             var orderingApi = services.GetRequiredService<IOptions<UrlsConfig>>().Value.GrpcOrdering; |  | ||||||
|             options.Address = new Uri(orderingApi); |  | ||||||
|         }).AddInterceptor<GrpcExceptionInterceptor>(); |  | ||||||
| 
 |  | ||||||
|         return services; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
| } |  | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user