From 57d9baf106dedda48713b2feb52ec70969ad3048 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Fri, 5 May 2023 00:29:55 -0700 Subject: [PATCH] Make the payment API use the common code --- .../Payment/Payment.API/GlobalUsings.cs | 24 +-- .../Payment/Payment.API/Payment.API.csproj | 21 +-- src/Services/Payment/Payment.API/Program.cs | 154 +----------------- .../Payment/Payment.API/appsettings.json | 21 ++- .../Services.Common/CommonExtensions.cs | 8 +- 5 files changed, 32 insertions(+), 196 deletions(-) diff --git a/src/Services/Payment/Payment.API/GlobalUsings.cs b/src/Services/Payment/Payment.API/GlobalUsings.cs index 023296a1c..a29434a61 100644 --- a/src/Services/Payment/Payment.API/GlobalUsings.cs +++ b/src/Services/Payment/Payment.API/GlobalUsings.cs @@ -1,25 +1,11 @@ -global using Azure.Core; -global using Azure.Identity; -global using HealthChecks.UI.Client; -global using Microsoft.AspNetCore.Diagnostics.HealthChecks; +global using System.Threading.Tasks; global using Microsoft.AspNetCore.Builder; -global using Microsoft.AspNetCore; global using Microsoft.eShopOnContainers.BuildingBlocks.EventBus.Abstractions; global using Microsoft.eShopOnContainers.BuildingBlocks.EventBus.Events; -global using Microsoft.eShopOnContainers.BuildingBlocks.EventBus; -global using Microsoft.eShopOnContainers.BuildingBlocks.EventBusRabbitMQ; -global using Microsoft.eShopOnContainers.BuildingBlocks.EventBusServiceBus; +global using Microsoft.eShopOnContainers.Payment.API; +global using Microsoft.eShopOnContainers.Payment.API.IntegrationEvents.EventHandling; global using Microsoft.eShopOnContainers.Payment.API.IntegrationEvents.Events; -global using Microsoft.Extensions.Diagnostics.HealthChecks; -global using Microsoft.Extensions.Options; -global using Microsoft.Extensions.Configuration; global using Microsoft.Extensions.DependencyInjection; global using Microsoft.Extensions.Logging; -global using Microsoft.eShopOnContainers.Payment.API.IntegrationEvents.EventHandling; -global using Microsoft.eShopOnContainers.Payment.API; -global using RabbitMQ.Client; -global using System.Threading.Tasks; -global using System; -global using System.IO; -global using Microsoft.AspNetCore.Hosting; -global using Microsoft.Extensions.Hosting; +global using Microsoft.Extensions.Options; +global using Services.Common; diff --git a/src/Services/Payment/Payment.API/Payment.API.csproj b/src/Services/Payment/Payment.API/Payment.API.csproj index f6b9637f0..6dc523a2e 100644 --- a/src/Services/Payment/Payment.API/Payment.API.csproj +++ b/src/Services/Payment/Payment.API/Payment.API.csproj @@ -3,29 +3,10 @@ net7.0 ..\..\..\..\docker-compose.dcproj - $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; - false - true - - - - - - - - - - - - - - - - - + diff --git a/src/Services/Payment/Payment.API/Program.cs b/src/Services/Payment/Payment.API/Program.cs index c1d2fe5f1..89daeb463 100644 --- a/src/Services/Payment/Payment.API/Program.cs +++ b/src/Services/Payment/Payment.API/Program.cs @@ -1,158 +1,22 @@ var builder = WebApplication.CreateBuilder(args); -if (builder.Configuration.GetValue("UseVault", false)) -{ - TokenCredential credential = new ClientSecretCredential( - builder.Configuration["Vault:TenantId"], - builder.Configuration["Vault:ClientId"], - builder.Configuration["Vault:ClientSecret"]); - builder.Configuration.AddAzureKeyVault(new Uri($"https://{builder.Configuration["Vault:Name"]}.vault.azure.net/"), credential); -} -builder.Configuration.SetBasePath(Directory.GetCurrentDirectory()); -builder.Configuration.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true); -builder.Configuration.AddEnvironmentVariables(); -builder.WebHost.CaptureStartupErrors(false); -builder.Services - .AddCustomHealthCheck(builder.Configuration); -builder.Services.Configure(builder.Configuration); -builder.Services.AddApplicationInsightsTelemetry(builder.Configuration); -if (builder.Configuration.GetValue("AzureServiceBusEnabled")) -{ - builder.Services.AddSingleton(sp => - { - var serviceBusConnectionString = builder.Configuration["EventBusConnection"]; - var subscriptionClientName = builder.Configuration["SubscriptionClientName"]; - return new DefaultServiceBusPersisterConnection(serviceBusConnectionString); - }); -} -else -{ - builder.Services.AddSingleton(sp => - { - var logger = sp.GetRequiredService>(); - var factory = new ConnectionFactory() - { - HostName = builder.Configuration["EventBusConnection"], - DispatchConsumersAsync = true - }; +builder.AddServiceDefaults(); - if (!string.IsNullOrEmpty(builder.Configuration["EventBusUserName"])) - { - factory.UserName = builder.Configuration["EventBusUserName"]; - } - - if (!string.IsNullOrEmpty(builder.Configuration["EventBusPassword"])) - { - factory.Password = builder.Configuration["EventBusPassword"]; - } +builder.Services.Configure(builder.Configuration); - var retryCount = 5; - if (!string.IsNullOrEmpty(builder.Configuration["EventBusRetryCount"])) - { - retryCount = int.Parse(builder.Configuration["EventBusRetryCount"]); - } +builder.Services.AddTransient(); - return new DefaultRabbitMQPersistentConnection(factory, logger, retryCount); - }); -} -RegisterEventBus(builder.Services); var app = builder.Build(); -if (!app.Environment.IsDevelopment()) -{ - app.UseExceptionHandler("/Home/Error"); -} - -var pathBase = app.Configuration["PATH_BASE"]; -if (!string.IsNullOrEmpty(pathBase)) -{ - app.UsePathBase(pathBase); -} - -ConfigureEventBus(app); -app.UseRouting(); -app.MapHealthChecks("/hc", new HealthCheckOptions() +if (!await app.CheckHealthAsync()) { - Predicate = _ => true, - ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse -}); -app.MapHealthChecks("/liveness", new HealthCheckOptions -{ - Predicate = r => r.Name.Contains("self") -}); - -await app.RunAsync(); - -void RegisterEventBus(IServiceCollection services) -{ - if (builder.Configuration.GetValue("AzureServiceBusEnabled")) - { - services.AddSingleton(sp => - { - var serviceBusPersisterConnection = sp.GetRequiredService(); - var logger = sp.GetRequiredService>(); - var eventBusSubcriptionsManager = sp.GetRequiredService(); - string subscriptionName = builder.Configuration["SubscriptionClientName"]; - - return new EventBusServiceBus(serviceBusPersisterConnection, logger, - eventBusSubcriptionsManager, sp, subscriptionName); - }); - } - else - { - services.AddSingleton(sp => - { - var subscriptionClientName = builder.Configuration["SubscriptionClientName"]; - var rabbitMQPersistentConnection = sp.GetRequiredService(); - var logger = sp.GetRequiredService>(); - var eventBusSubcriptionsManager = sp.GetRequiredService(); - - var retryCount = 5; - if (!string.IsNullOrEmpty(builder.Configuration["EventBusRetryCount"])) - { - retryCount = int.Parse(builder.Configuration["EventBusRetryCount"]); - } - - return new EventBusRabbitMQ(rabbitMQPersistentConnection, logger, sp, eventBusSubcriptionsManager, subscriptionClientName, retryCount); - }); - } - - services.AddTransient(); - services.AddSingleton(); + return; } -void ConfigureEventBus(IApplicationBuilder app) -{ - var eventBus = app.ApplicationServices.GetRequiredService(); - eventBus.Subscribe(); -} +app.UseServiceDefaults(); -public static class CustomExtensionMethods -{ - public static IServiceCollection AddCustomHealthCheck(this IServiceCollection services, IConfiguration configuration) - { - var hcBuilder = services.AddHealthChecks(); +var eventBus = app.Services.GetRequiredService(); - hcBuilder.AddCheck("self", () => HealthCheckResult.Healthy()); +eventBus.Subscribe(); - if (configuration.GetValue("AzureServiceBusEnabled")) - { - hcBuilder - .AddAzureServiceBusTopic( - configuration["EventBusConnection"], - topicName: "eshop_event_bus", - name: "payment-servicebus-check", - tags: new string[] { "servicebus" }); - } - else - { - hcBuilder - .AddRabbitMQ( - $"amqp://{configuration["EventBusConnection"]}", - name: "payment-rabbitmqbus-check", - tags: new string[] { "rabbitmqbus" }); - } - - return services; - } -} +await app.RunAsync(); diff --git a/src/Services/Payment/Payment.API/appsettings.json b/src/Services/Payment/Payment.API/appsettings.json index 41de245fb..71e1aa6af 100644 --- a/src/Services/Payment/Payment.API/appsettings.json +++ b/src/Services/Payment/Payment.API/appsettings.json @@ -1,9 +1,16 @@ { - "PaymentSucceeded": true, - "AzureServiceBusEnabled": false, - "SubscriptionClientName": "Payment", - "ApplicationInsights": { - "InstrumentationKey": "" + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } }, - "EventBusRetryCount": 5 -} + "ConnectionStrings": { + "EventBus": "localhost" + }, + "EventBus": { + "SubscriptionClientName": "Payment", + "RetryCount": 5 + }, + "PaymentSucceeded": true +} \ No newline at end of file diff --git a/src/Services/Services.Common/CommonExtensions.cs b/src/Services/Services.Common/CommonExtensions.cs index c3b9672a5..b922d6cc4 100644 --- a/src/Services/Services.Common/CommonExtensions.cs +++ b/src/Services/Services.Common/CommonExtensions.cs @@ -289,23 +289,21 @@ public static class CommonExtensions // { // "EventBus": { // "ProviderName": "ServiceBus | RabbitMQ", - // } // } var eventBusSection = configuration.GetRequiredSection("EventBus"); - var eventBusConnectionString = configuration.GetRequiredConnectionString("EventBus"); return eventBusSection["ProviderName"]?.ToLowerInvariant() switch { "servicebus" => hcBuilder.AddAzureServiceBusTopic( - eventBusConnectionString, - topicName: "eshop_event_bus", + _ => configuration.GetRequiredConnectionString("EventBus"), + _ => "eshop_event_bus", name: "servicebus", tags: new string[] { "ready" }), _ => hcBuilder.AddRabbitMQ( - $"amqp://{eventBusConnectionString}", + _ => $"amqp://{configuration.GetRequiredConnectionString("EventBus")}", name: "rabbitmq", tags: new string[] { "ready" }) };