diff --git a/docker-compose.override.yml b/docker-compose.override.yml index 1ec7879b3..5de42f78b 100644 --- a/docker-compose.override.yml +++ b/docker-compose.override.yml @@ -327,6 +327,20 @@ services: ports: - "5112:80" + basket.signalrhub: + environment: + - ASPNETCORE_ENVIRONMENT=Development + - ASPNETCORE_URLS=http://0.0.0.0:80 + - EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq} + - EventBusUserName=${ESHOP_SERVICE_BUS_USERNAME} + - EventBusPassword=${ESHOP_SERVICE_BUS_PASSWORD} + - AzureServiceBusEnabled=False + - ApplicationInsights__InstrumentationKey=${INSTRUMENTATION_KEY} + - OrchestratorType=${ORCHESTRATOR_TYPE} + - identityUrl=http://identity.api + ports: + - "5115:80" + webstatus: environment: - ASPNETCORE_ENVIRONMENT=Production @@ -365,6 +379,8 @@ services: - HealthChecksUI__HealthChecks__15__Uri=http://payment.api/hc - HealthChecksUI__HealthChecks__16__Name=Ordering SignalRHub HTTP Check - HealthChecksUI__HealthChecks__16__Uri=http://ordering.signalrhub/hc + - HealthChecksUI__HealthChecks__17__Name=Basket SignalRHub HTTP Check + - HealthChecksUI__HealthChecks__17__Uri=http://basket.signalrhub/hc - OrderingBackgroundTasksUrl=http://ordering.backgroundtasks/hc - ApplicationInsights__InstrumentationKey=${INSTRUMENTATION_KEY} - OrchestratorType=${ORCHESTRATOR_TYPE} diff --git a/docker-compose.yml b/docker-compose.yml index 6094f2ca2..d4e7ad28d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -203,6 +203,21 @@ services: - catalog.api - basket.api + basket.signalrhub: + image: ${REGISTRY:-eshop}/basket.signalrhub:${PLATFORM:-linux}-${TAG:-latest} + build: + context: . + dockerfile: src/Services/Basket/Basket.SignalrHub/Dockerfile + depends_on: + - nosql.data + - sql.data + - identity.api + - rabbitmq + - ordering.api + - marketing.api + - catalog.api + - basket.api + webstatus: image: ${REGISTRY:-eshop}/webstatus:${PLATFORM:-linux}-${TAG:-latest} build: diff --git a/eShopOnContainers-ServicesAndWebApps.sln b/eShopOnContainers-ServicesAndWebApps.sln index 882bca09f..a941215b2 100644 --- a/eShopOnContainers-ServicesAndWebApps.sln +++ b/eShopOnContainers-ServicesAndWebApps.sln @@ -148,7 +148,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WebhookClient", "src\Web\We EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Devspace.Support", "Devspace.Support", "{68F5041D-51F2-4630-94B6-B49789F5E51A}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Devspaces.Support", "src\BuildingBlocks\Devspaces.Support\Devspaces.Support.csproj", "{56C2EF0B-6BF2-41D9-BE07-6E6D08D06B35}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Devspaces.Support", "src\BuildingBlocks\Devspaces.Support\Devspaces.Support.csproj", "{56C2EF0B-6BF2-41D9-BE07-6E6D08D06B35}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Basket.SignalrHub", "src\Services\Basket\Basket.SignalrHub\Basket.SignalrHub.csproj", "{876DA73D-BAFD-41EB-B6BF-21253DAE33AA}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -1796,6 +1798,54 @@ Global {56C2EF0B-6BF2-41D9-BE07-6E6D08D06B35}.Release|x64.Build.0 = Release|Any CPU {56C2EF0B-6BF2-41D9-BE07-6E6D08D06B35}.Release|x86.ActiveCfg = Release|Any CPU {56C2EF0B-6BF2-41D9-BE07-6E6D08D06B35}.Release|x86.Build.0 = Release|Any CPU + {876DA73D-BAFD-41EB-B6BF-21253DAE33AA}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU + {876DA73D-BAFD-41EB-B6BF-21253DAE33AA}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU + {876DA73D-BAFD-41EB-B6BF-21253DAE33AA}.Ad-Hoc|ARM.ActiveCfg = Debug|Any CPU + {876DA73D-BAFD-41EB-B6BF-21253DAE33AA}.Ad-Hoc|ARM.Build.0 = Debug|Any CPU + {876DA73D-BAFD-41EB-B6BF-21253DAE33AA}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU + {876DA73D-BAFD-41EB-B6BF-21253DAE33AA}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU + {876DA73D-BAFD-41EB-B6BF-21253DAE33AA}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {876DA73D-BAFD-41EB-B6BF-21253DAE33AA}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU + {876DA73D-BAFD-41EB-B6BF-21253DAE33AA}.Ad-Hoc|x64.ActiveCfg = Debug|Any CPU + {876DA73D-BAFD-41EB-B6BF-21253DAE33AA}.Ad-Hoc|x64.Build.0 = Debug|Any CPU + {876DA73D-BAFD-41EB-B6BF-21253DAE33AA}.Ad-Hoc|x86.ActiveCfg = Debug|Any CPU + {876DA73D-BAFD-41EB-B6BF-21253DAE33AA}.Ad-Hoc|x86.Build.0 = Debug|Any CPU + {876DA73D-BAFD-41EB-B6BF-21253DAE33AA}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU + {876DA73D-BAFD-41EB-B6BF-21253DAE33AA}.AppStore|Any CPU.Build.0 = Debug|Any CPU + {876DA73D-BAFD-41EB-B6BF-21253DAE33AA}.AppStore|ARM.ActiveCfg = Debug|Any CPU + {876DA73D-BAFD-41EB-B6BF-21253DAE33AA}.AppStore|ARM.Build.0 = Debug|Any CPU + {876DA73D-BAFD-41EB-B6BF-21253DAE33AA}.AppStore|iPhone.ActiveCfg = Debug|Any CPU + {876DA73D-BAFD-41EB-B6BF-21253DAE33AA}.AppStore|iPhone.Build.0 = Debug|Any CPU + {876DA73D-BAFD-41EB-B6BF-21253DAE33AA}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {876DA73D-BAFD-41EB-B6BF-21253DAE33AA}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU + {876DA73D-BAFD-41EB-B6BF-21253DAE33AA}.AppStore|x64.ActiveCfg = Debug|Any CPU + {876DA73D-BAFD-41EB-B6BF-21253DAE33AA}.AppStore|x64.Build.0 = Debug|Any CPU + {876DA73D-BAFD-41EB-B6BF-21253DAE33AA}.AppStore|x86.ActiveCfg = Debug|Any CPU + {876DA73D-BAFD-41EB-B6BF-21253DAE33AA}.AppStore|x86.Build.0 = Debug|Any CPU + {876DA73D-BAFD-41EB-B6BF-21253DAE33AA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {876DA73D-BAFD-41EB-B6BF-21253DAE33AA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {876DA73D-BAFD-41EB-B6BF-21253DAE33AA}.Debug|ARM.ActiveCfg = Debug|Any CPU + {876DA73D-BAFD-41EB-B6BF-21253DAE33AA}.Debug|ARM.Build.0 = Debug|Any CPU + {876DA73D-BAFD-41EB-B6BF-21253DAE33AA}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {876DA73D-BAFD-41EB-B6BF-21253DAE33AA}.Debug|iPhone.Build.0 = Debug|Any CPU + {876DA73D-BAFD-41EB-B6BF-21253DAE33AA}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {876DA73D-BAFD-41EB-B6BF-21253DAE33AA}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {876DA73D-BAFD-41EB-B6BF-21253DAE33AA}.Debug|x64.ActiveCfg = Debug|Any CPU + {876DA73D-BAFD-41EB-B6BF-21253DAE33AA}.Debug|x64.Build.0 = Debug|Any CPU + {876DA73D-BAFD-41EB-B6BF-21253DAE33AA}.Debug|x86.ActiveCfg = Debug|Any CPU + {876DA73D-BAFD-41EB-B6BF-21253DAE33AA}.Debug|x86.Build.0 = Debug|Any CPU + {876DA73D-BAFD-41EB-B6BF-21253DAE33AA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {876DA73D-BAFD-41EB-B6BF-21253DAE33AA}.Release|Any CPU.Build.0 = Release|Any CPU + {876DA73D-BAFD-41EB-B6BF-21253DAE33AA}.Release|ARM.ActiveCfg = Release|Any CPU + {876DA73D-BAFD-41EB-B6BF-21253DAE33AA}.Release|ARM.Build.0 = Release|Any CPU + {876DA73D-BAFD-41EB-B6BF-21253DAE33AA}.Release|iPhone.ActiveCfg = Release|Any CPU + {876DA73D-BAFD-41EB-B6BF-21253DAE33AA}.Release|iPhone.Build.0 = Release|Any CPU + {876DA73D-BAFD-41EB-B6BF-21253DAE33AA}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {876DA73D-BAFD-41EB-B6BF-21253DAE33AA}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {876DA73D-BAFD-41EB-B6BF-21253DAE33AA}.Release|x64.ActiveCfg = Release|Any CPU + {876DA73D-BAFD-41EB-B6BF-21253DAE33AA}.Release|x64.Build.0 = Release|Any CPU + {876DA73D-BAFD-41EB-B6BF-21253DAE33AA}.Release|x86.ActiveCfg = Release|Any CPU + {876DA73D-BAFD-41EB-B6BF-21253DAE33AA}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -1862,6 +1912,7 @@ Global {766D7E92-6AF0-476C-ADD5-282BF4D8C576} = {E279BF0F-7F66-4F3A-A3AB-2CDA66C1CD04} {68F5041D-51F2-4630-94B6-B49789F5E51A} = {DB0EFB20-B024-4E5E-A75C-52143C131D25} {56C2EF0B-6BF2-41D9-BE07-6E6D08D06B35} = {68F5041D-51F2-4630-94B6-B49789F5E51A} + {876DA73D-BAFD-41EB-B6BF-21253DAE33AA} = {BF3EF4F3-E4F5-41DA-9D2D-57223687D1A8} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {25728519-5F0F-4973-8A64-0A81EB4EA8D9} diff --git a/src/ApiGateways/ApiGw-Base/Dockerfile b/src/ApiGateways/ApiGw-Base/Dockerfile index d1b50b231..68eec7f13 100644 --- a/src/ApiGateways/ApiGw-Base/Dockerfile +++ b/src/ApiGateways/ApiGw-Base/Dockerfile @@ -21,6 +21,7 @@ COPY src/BuildingBlocks/WebHostCustomization/WebHost.Customization/WebHost.Custo COPY src/Services/Basket/Basket.API/Basket.API.csproj src/Services/Basket/Basket.API/ COPY src/Services/Basket/Basket.FunctionalTests/Basket.FunctionalTests.csproj src/Services/Basket/Basket.FunctionalTests/ COPY src/Services/Basket/Basket.UnitTests/Basket.UnitTests.csproj src/Services/Basket/Basket.UnitTests/ +COPY src/Services/Basket/Basket.SignalrHub/Basket.SignalrHub.csproj src/Services/Basket/Basket.SignalrHub/ COPY src/Services/Catalog/Catalog.API/Catalog.API.csproj src/Services/Catalog/Catalog.API/ COPY src/Services/Catalog/Catalog.FunctionalTests/Catalog.FunctionalTests.csproj src/Services/Catalog/Catalog.FunctionalTests/ COPY src/Services/Catalog/Catalog.UnitTests/Catalog.UnitTests.csproj src/Services/Catalog/Catalog.UnitTests/ diff --git a/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Dockerfile b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Dockerfile index 7eb78458e..0f92f04f0 100644 --- a/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Dockerfile +++ b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Dockerfile @@ -21,6 +21,7 @@ COPY src/BuildingBlocks/WebHostCustomization/WebHost.Customization/WebHost.Custo COPY src/Services/Basket/Basket.API/Basket.API.csproj src/Services/Basket/Basket.API/ COPY src/Services/Basket/Basket.FunctionalTests/Basket.FunctionalTests.csproj src/Services/Basket/Basket.FunctionalTests/ COPY src/Services/Basket/Basket.UnitTests/Basket.UnitTests.csproj src/Services/Basket/Basket.UnitTests/ +COPY src/Services/Basket/Basket.SignalrHub/Basket.SignalrHub.csproj src/Services/Basket/Basket.SignalrHub/ COPY src/Services/Catalog/Catalog.API/Catalog.API.csproj src/Services/Catalog/Catalog.API/ COPY src/Services/Catalog/Catalog.FunctionalTests/Catalog.FunctionalTests.csproj src/Services/Catalog/Catalog.FunctionalTests/ COPY src/Services/Catalog/Catalog.UnitTests/Catalog.UnitTests.csproj src/Services/Catalog/Catalog.UnitTests/ diff --git a/src/ApiGateways/Web.Bff.Shopping/aggregator/Dockerfile b/src/ApiGateways/Web.Bff.Shopping/aggregator/Dockerfile index e97db900b..e30bbfcbe 100644 --- a/src/ApiGateways/Web.Bff.Shopping/aggregator/Dockerfile +++ b/src/ApiGateways/Web.Bff.Shopping/aggregator/Dockerfile @@ -21,6 +21,7 @@ COPY src/BuildingBlocks/WebHostCustomization/WebHost.Customization/WebHost.Custo COPY src/Services/Basket/Basket.API/Basket.API.csproj src/Services/Basket/Basket.API/ COPY src/Services/Basket/Basket.FunctionalTests/Basket.FunctionalTests.csproj src/Services/Basket/Basket.FunctionalTests/ COPY src/Services/Basket/Basket.UnitTests/Basket.UnitTests.csproj src/Services/Basket/Basket.UnitTests/ +COPY src/Services/Basket/Basket.SignalrHub/Basket.SignalrHub.csproj src/Services/Basket/Basket.SignalrHub/ COPY src/Services/Catalog/Catalog.API/Catalog.API.csproj src/Services/Catalog/Catalog.API/ COPY src/Services/Catalog/Catalog.FunctionalTests/Catalog.FunctionalTests.csproj src/Services/Catalog/Catalog.FunctionalTests/ COPY src/Services/Catalog/Catalog.UnitTests/Catalog.UnitTests.csproj src/Services/Catalog/Catalog.UnitTests/ diff --git a/src/Services/Basket/Basket.API/Dockerfile b/src/Services/Basket/Basket.API/Dockerfile index 6fb28f69a..20d5e8986 100644 --- a/src/Services/Basket/Basket.API/Dockerfile +++ b/src/Services/Basket/Basket.API/Dockerfile @@ -21,6 +21,7 @@ COPY src/BuildingBlocks/WebHostCustomization/WebHost.Customization/WebHost.Custo COPY src/Services/Basket/Basket.API/Basket.API.csproj src/Services/Basket/Basket.API/ COPY src/Services/Basket/Basket.FunctionalTests/Basket.FunctionalTests.csproj src/Services/Basket/Basket.FunctionalTests/ COPY src/Services/Basket/Basket.UnitTests/Basket.UnitTests.csproj src/Services/Basket/Basket.UnitTests/ +COPY src/Services/Basket/Basket.SignalrHub/Basket.SignalrHub.csproj src/Services/Basket/Basket.SignalrHub/ COPY src/Services/Catalog/Catalog.API/Catalog.API.csproj src/Services/Catalog/Catalog.API/ COPY src/Services/Catalog/Catalog.FunctionalTests/Catalog.FunctionalTests.csproj src/Services/Catalog/Catalog.FunctionalTests/ COPY src/Services/Catalog/Catalog.UnitTests/Catalog.UnitTests.csproj src/Services/Catalog/Catalog.UnitTests/ diff --git a/src/Services/Basket/Basket.SignalrHub/AutofacModules/ApplicationModule.cs b/src/Services/Basket/Basket.SignalrHub/AutofacModules/ApplicationModule.cs new file mode 100644 index 000000000..d344abcaa --- /dev/null +++ b/src/Services/Basket/Basket.SignalrHub/AutofacModules/ApplicationModule.cs @@ -0,0 +1,29 @@ +using Autofac; +using Microsoft.eShopOnContainers.BuildingBlocks.EventBus.Abstractions; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Threading.Tasks; + +namespace Basket.SignalrHub.AutofacModules +{ + public class ApplicationModule + : Autofac.Module + { + + public string QueriesConnectionString { get; } + + public ApplicationModule() + { + } + + protected override void Load(ContainerBuilder builder) + { + // New integration event registrations go here + + // builder.RegisterAssemblyTypes(typeof(NewIntegrationEvent).GetTypeInfo().Assembly) + // .AsClosedTypesOf(typeof(IIntegrationEventHandler<>)); + } + } +} diff --git a/src/Services/Basket/Basket.SignalrHub/Basket.SignalrHub.csproj b/src/Services/Basket/Basket.SignalrHub/Basket.SignalrHub.csproj new file mode 100644 index 000000000..485dd9c85 --- /dev/null +++ b/src/Services/Basket/Basket.SignalrHub/Basket.SignalrHub.csproj @@ -0,0 +1,44 @@ + + + + netcoreapp2.2 + ..\..\..\..\docker-compose.dcproj + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Services/Basket/Basket.SignalrHub/Dockerfile b/src/Services/Basket/Basket.SignalrHub/Dockerfile new file mode 100644 index 000000000..41cfb25f5 --- /dev/null +++ b/src/Services/Basket/Basket.SignalrHub/Dockerfile @@ -0,0 +1,60 @@ +FROM mcr.microsoft.com/dotnet/core/aspnet:2.2 AS base +WORKDIR /app +EXPOSE 80 + +FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS build +WORKDIR /src + +# Keep the project list and command dotnet restore identical in all Dockfiles to maximize image cache utilization +COPY eShopOnContainers-ServicesAndWebApps.sln . +COPY docker-compose.dcproj /src/ +COPY src/ApiGateways/ApiGw-Base/OcelotApiGw.csproj src/ApiGateways/ApiGw-Base/ +COPY src/ApiGateways/Mobile.Bff.Shopping/aggregator/Mobile.Shopping.HttpAggregator.csproj src/ApiGateways/Mobile.Bff.Shopping/aggregator/ +COPY src/ApiGateways/Web.Bff.Shopping/aggregator/Web.Shopping.HttpAggregator.csproj src/ApiGateways/Web.Bff.Shopping/aggregator/ +COPY src/BuildingBlocks/Devspaces.Support/Devspaces.Support.csproj src/BuildingBlocks/Devspaces.Support/ +COPY src/BuildingBlocks/EventBus/EventBus/EventBus.csproj src/BuildingBlocks/EventBus/EventBus/ +COPY src/BuildingBlocks/EventBus/EventBus.Tests/EventBus.Tests.csproj src/BuildingBlocks/EventBus/EventBus.Tests/ +COPY src/BuildingBlocks/EventBus/EventBusRabbitMQ/EventBusRabbitMQ.csproj src/BuildingBlocks/EventBus/EventBusRabbitMQ/ +COPY src/BuildingBlocks/EventBus/EventBusServiceBus/EventBusServiceBus.csproj src/BuildingBlocks/EventBus/EventBusServiceBus/ +COPY src/BuildingBlocks/EventBus/IntegrationEventLogEF/IntegrationEventLogEF.csproj src/BuildingBlocks/EventBus/IntegrationEventLogEF/ +COPY src/BuildingBlocks/WebHostCustomization/WebHost.Customization/WebHost.Customization.csproj src/BuildingBlocks/WebHostCustomization/WebHost.Customization/ +COPY src/Services/Basket/Basket.API/Basket.API.csproj src/Services/Basket/Basket.API/ +COPY src/Services/Basket/Basket.FunctionalTests/Basket.FunctionalTests.csproj src/Services/Basket/Basket.FunctionalTests/ +COPY src/Services/Basket/Basket.UnitTests/Basket.UnitTests.csproj src/Services/Basket/Basket.UnitTests/ +COPY src/Services/Basket/Basket.SignalrHub/Basket.SignalrHub.csproj src/Services/Basket/Basket.SignalrHub/ +COPY src/Services/Catalog/Catalog.API/Catalog.API.csproj src/Services/Catalog/Catalog.API/ +COPY src/Services/Catalog/Catalog.FunctionalTests/Catalog.FunctionalTests.csproj src/Services/Catalog/Catalog.FunctionalTests/ +COPY src/Services/Catalog/Catalog.UnitTests/Catalog.UnitTests.csproj src/Services/Catalog/Catalog.UnitTests/ +COPY src/Services/Identity/Identity.API/Identity.API.csproj src/Services/Identity/Identity.API/ +COPY src/Services/Location/Locations.API/Locations.API.csproj src/Services/Location/Locations.API/ +COPY src/Services/Location/Locations.FunctionalTests/Locations.FunctionalTests.csproj src/Services/Location/Locations.FunctionalTests/ +COPY src/Services/Marketing/Marketing.API/Marketing.API.csproj src/Services/Marketing/Marketing.API/ +COPY src/Services/Marketing/Marketing.FunctionalTests/Marketing.FunctionalTests.csproj src/Services/Marketing/Marketing.FunctionalTests/ +COPY src/Services/Ordering/Ordering.API/Ordering.API.csproj src/Services/Ordering/Ordering.API/ +COPY src/Services/Ordering/Ordering.BackgroundTasks/Ordering.BackgroundTasks.csproj src/Services/Ordering/Ordering.BackgroundTasks/ +COPY src/Services/Ordering/Ordering.Domain/Ordering.Domain.csproj src/Services/Ordering/Ordering.Domain/ +COPY src/Services/Ordering/Ordering.FunctionalTests/Ordering.FunctionalTests.csproj src/Services/Ordering/Ordering.FunctionalTests/ +COPY src/Services/Ordering/Ordering.Infrastructure/Ordering.Infrastructure.csproj src/Services/Ordering/Ordering.Infrastructure/ +COPY src/Services/Ordering/Ordering.SignalrHub/Ordering.SignalrHub.csproj src/Services/Ordering/Ordering.SignalrHub/ +COPY src/Services/Ordering/Ordering.UnitTests/Ordering.UnitTests.csproj src/Services/Ordering/Ordering.UnitTests/ +COPY src/Services/Payment/Payment.API/Payment.API.csproj src/Services/Payment/Payment.API/ +COPY src/Services/Webhooks/Webhooks.API/Webhooks.API.csproj src/Services/Webhooks/Webhooks.API/ +COPY src/Web/WebhookClient/WebhookClient.csproj src/Web/WebhookClient/ +COPY src/Web/WebMVC/WebMVC.csproj src/Web/WebMVC/ +COPY src/Web/WebSPA/WebSPA.csproj src/Web/WebSPA/ +COPY src/Web/WebStatus/WebStatus.csproj src/Web/WebStatus/ +COPY test/ServicesTests/Application.FunctionalTests/Application.FunctionalTests.csproj test/ServicesTests/Application.FunctionalTests/ +COPY test/ServicesTests/LoadTest/LoadTest.csproj test/ServicesTests/LoadTest/ + +RUN dotnet restore eShopOnContainers-ServicesAndWebApps.sln + +COPY . . +WORKDIR /src/src/Services/Basket/Basket.SignalrHub +RUN dotnet publish --no-restore -c Release -o /app + +FROM build AS publish + +FROM base AS final +WORKDIR /app +COPY --from=publish /app . +ENTRYPOINT ["dotnet", "Basket.SignalrHub.dll"] diff --git a/src/Services/Basket/Basket.SignalrHub/Dockerfile.develop b/src/Services/Basket/Basket.SignalrHub/Dockerfile.develop new file mode 100644 index 000000000..4f7794496 --- /dev/null +++ b/src/Services/Basket/Basket.SignalrHub/Dockerfile.develop @@ -0,0 +1,18 @@ +FROM microsoft/dotnet:2.2-sdk +ARG BUILD_CONFIGURATION=Debug +ENV ASPNETCORE_ENVIRONMENT=Development +ENV DOTNET_USE_POLLING_FILE_WATCHER=true +EXPOSE 80 + +WORKDIR /src +COPY ["src/BuildingBlocks/EventBus/EventBus/EventBus.csproj", "src/BuildingBlocks/EventBus/EventBus/"] +COPY ["src/BuildingBlocks/EventBus/EventBusRabbitMQ/EventBusRabbitMQ.csproj", "src/BuildingBlocks/EventBus/EventBusRabbitMQ/"] +COPY ["src/BuildingBlocks/EventBus/EventBusServiceBus/EventBusServiceBus.csproj", "src/BuildingBlocks/EventBus/EventBusServiceBus/"] +COPY ["src/Services/Basket/Basket.SignalrHub/Basket.SignalrHub.csproj", "src/Services/Basket/Basket.SignalrHub/"] + +RUN dotnet restore src/Services/Basket/Basket.SignalrHub/Basket.SignalrHub.csproj +COPY . . +WORKDIR /src/src/Services/Basket/Basket.SignalrHub +RUN dotnet build --no-restore -c $BUILD_CONFIGURATION + +ENTRYPOINT ["dotnet", "run", "--no-build", "--no-launch-profile", "-c", "$BUILD_CONFIGURATION", "--"] \ No newline at end of file diff --git a/src/Services/Basket/Basket.SignalrHub/NotificationHub.cs b/src/Services/Basket/Basket.SignalrHub/NotificationHub.cs new file mode 100644 index 000000000..de64b3dc8 --- /dev/null +++ b/src/Services/Basket/Basket.SignalrHub/NotificationHub.cs @@ -0,0 +1,26 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.SignalR; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace Basket.SignalrHub +{ + [Authorize] + public class NotificationsHub : Hub + { + + public override async Task OnConnectedAsync() + { + await Groups.AddToGroupAsync(Context.ConnectionId, Context.User.Identity.Name); + await base.OnConnectedAsync(); + } + + public override async Task OnDisconnectedAsync(Exception ex) + { + await Groups.RemoveFromGroupAsync(Context.ConnectionId, Context.User.Identity.Name); + await base.OnDisconnectedAsync(ex); + } + } +} diff --git a/src/Services/Basket/Basket.SignalrHub/Program.cs b/src/Services/Basket/Basket.SignalrHub/Program.cs new file mode 100644 index 000000000..1903ffb96 --- /dev/null +++ b/src/Services/Basket/Basket.SignalrHub/Program.cs @@ -0,0 +1,80 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Logging; +using Serilog; + +namespace Basket.SignalrHub +{ + public class Program + { + public static readonly string Namespace = typeof(Program).Namespace; + public static readonly string AppName = Namespace; + + public static int Main(string[] args) + { + var configuration = GetConfiguration(); + + Log.Logger = CreateSerilogLogger(configuration); + + try + { + Log.Information("Configuring web host ({ApplicationContext})...", AppName); + var host = BuildWebHost(configuration, args); + + Log.Information("Starting web host ({ApplicationContext})...", AppName); + host.Run(); + + return 0; + } + catch (Exception ex) + { + Log.Fatal(ex, "Program terminated unexpectedly ({ApplicationContext})!", AppName); + return 1; + } + finally + { + Log.CloseAndFlush(); + } + } + + private static IWebHost BuildWebHost(IConfiguration configuration, string[] args) => + WebHost.CreateDefaultBuilder(args) + .CaptureStartupErrors(false) + .UseStartup() + .UseConfiguration(configuration) + .UseSerilog() + .Build(); + + private static Serilog.ILogger CreateSerilogLogger(IConfiguration configuration) + { + var seqServerUrl = configuration["Serilog:SeqServerUrl"]; + var logstashUrl = configuration["Serilog:LogstashgUrl"]; + return new LoggerConfiguration() + .MinimumLevel.Verbose() + .Enrich.WithProperty("ApplicationContext", AppName) + .Enrich.FromLogContext() + .WriteTo.Console() + .WriteTo.Seq(string.IsNullOrWhiteSpace(seqServerUrl) ? "http://seq" : seqServerUrl) + .WriteTo.Http(string.IsNullOrWhiteSpace(logstashUrl) ? "http://logstash:8080" : logstashUrl) + .ReadFrom.Configuration(configuration) + .CreateLogger(); + } + + private static IConfiguration GetConfiguration() + { + var builder = new ConfigurationBuilder() + .SetBasePath(Directory.GetCurrentDirectory()) + .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) + .AddEnvironmentVariables(); + + return builder.Build(); + } + + } +} diff --git a/src/Services/Basket/Basket.SignalrHub/Properties/launchSettings.json b/src/Services/Basket/Basket.SignalrHub/Properties/launchSettings.json new file mode 100644 index 000000000..1fd7a11f0 --- /dev/null +++ b/src/Services/Basket/Basket.SignalrHub/Properties/launchSettings.json @@ -0,0 +1,27 @@ +{ + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:51313/", + "sslPort": 0 + } + }, + "profiles": { + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "Basket.SignalrHub": { + "commandName": "Project", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "applicationUrl": "http://localhost:51314/" + } + } +} diff --git a/src/Services/Basket/Basket.SignalrHub/Startup.cs b/src/Services/Basket/Basket.SignalrHub/Startup.cs new file mode 100644 index 000000000..877c30722 --- /dev/null +++ b/src/Services/Basket/Basket.SignalrHub/Startup.cs @@ -0,0 +1,254 @@ +using Autofac; +using Autofac.Extensions.DependencyInjection; +using Microsoft.AspNetCore.Authentication.JwtBearer; +using Microsoft.AspNetCore.Builder; +using Microsoft.Azure.ServiceBus; +using Microsoft.eShopOnContainers.BuildingBlocks.EventBus; +using Microsoft.eShopOnContainers.BuildingBlocks.EventBus.Abstractions; +using Microsoft.eShopOnContainers.BuildingBlocks.EventBusRabbitMQ; +using Microsoft.eShopOnContainers.BuildingBlocks.EventBusServiceBus; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using RabbitMQ.Client; +using System; +using System.IdentityModel.Tokens.Jwt; +using HealthChecks.UI.Client; +using Microsoft.AspNetCore.Diagnostics.HealthChecks; +using Microsoft.Extensions.Diagnostics.HealthChecks; +using Basket.SignalrHub.AutofacModules; + +namespace Basket.SignalrHub +{ + 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. + // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940 + public IServiceProvider ConfigureServices(IServiceCollection services) + { + services + .AddCustomHealthCheck(Configuration) + .AddCors(options => + { + options.AddPolicy("CorsPolicy", + builder => builder + .AllowAnyMethod() + .AllowAnyHeader() + .SetIsOriginAllowed((host) => true) + .AllowCredentials()); + }); + + if (Configuration.GetValue("IsClusterEnv") == bool.TrueString) + { + services + .AddSignalR() + .AddRedis(Configuration["SignalrStoreConnectionString"]); + } + else + { + services.AddSignalR(); + } + + if (Configuration.GetValue("AzureServiceBusEnabled")) + { + services.AddSingleton(sp => + { + var logger = sp.GetRequiredService>(); + + var serviceBusConnectionString = Configuration["EventBusConnection"]; + var serviceBusConnection = new ServiceBusConnectionStringBuilder(serviceBusConnectionString); + + return new DefaultServiceBusPersisterConnection(serviceBusConnection, logger); + }); + } + else + { + services.AddSingleton(sp => + { + var logger = sp.GetRequiredService>(); + + + var factory = new ConnectionFactory() + { + HostName = Configuration["EventBusConnection"], + DispatchConsumersAsync = true + }; + + if (!string.IsNullOrEmpty(Configuration["EventBusUserName"])) + { + factory.UserName = Configuration["EventBusUserName"]; + } + + if (!string.IsNullOrEmpty(Configuration["EventBusPassword"])) + { + factory.Password = Configuration["EventBusPassword"]; + } + + var retryCount = 5; + if (!string.IsNullOrEmpty(Configuration["EventBusRetryCount"])) + { + retryCount = int.Parse(Configuration["EventBusRetryCount"]); + } + + return new DefaultRabbitMQPersistentConnection(factory, logger, retryCount); + }); + } + + ConfigureAuthService(services); + + RegisterEventBus(services); + + services.AddOptions(); + + //configure autofac + var container = new ContainerBuilder(); + container.RegisterModule(new ApplicationModule()); + container.Populate(services); + + return new AutofacServiceProvider(container.Build()); + } + + // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. + public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory) + { + //loggerFactory.AddConsole(Configuration.GetSection("Logging")); + //loggerFactory.AddDebug(); + //loggerFactory.AddAzureWebAppDiagnostics(); + //loggerFactory.AddApplicationInsights(app.ApplicationServices, LogLevel.Trace); + + var pathBase = Configuration["PATH_BASE"]; + if (!string.IsNullOrEmpty(pathBase)) + { + loggerFactory.CreateLogger().LogDebug("Using PATH BASE '{pathBase}'", pathBase); + app.UsePathBase(pathBase); + } + + app.UseHealthChecks("/hc", new HealthCheckOptions() + { + Predicate = _ => true, + ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse + }); + + app.UseHealthChecks("/liveness", new HealthCheckOptions + { + Predicate = r => r.Name.Contains("self") + }); + + app.UseCors("CorsPolicy"); + + app.UseAuthentication(); + + app.UseSignalR(routes => + { + routes.MapHub("/notificationhub", options => + options.Transports = Microsoft.AspNetCore.Http.Connections.HttpTransports.All); + }); + + ConfigureEventBus(app); + } + + private void ConfigureEventBus(IApplicationBuilder app) + { + var eventBus = app.ApplicationServices.GetRequiredService(); + + // Event bus subscribe events goes here + // eventBus.Subscribe(); + } + + private void ConfigureAuthService(IServiceCollection services) + { + // prevent from mapping "sub" claim to nameidentifier. + JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Remove("sub"); + + var identityUrl = Configuration.GetValue("IdentityUrl"); + + services.AddAuthentication(options => + { + options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; + options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; + + }).AddJwtBearer(options => + { + options.Authority = identityUrl; + options.RequireHttpsMetadata = false; + options.Audience = "basket.signalrhub"; + }); + } + + private void RegisterEventBus(IServiceCollection services) + { + var subscriptionClientName = Configuration["SubscriptionClientName"]; + + if (Configuration.GetValue("AzureServiceBusEnabled")) + { + services.AddSingleton(sp => + { + var serviceBusPersisterConnection = sp.GetRequiredService(); + var iLifetimeScope = sp.GetRequiredService(); + var logger = sp.GetRequiredService>(); + var eventBusSubcriptionsManager = sp.GetRequiredService(); + + return new EventBusServiceBus(serviceBusPersisterConnection, logger, + eventBusSubcriptionsManager, subscriptionClientName, iLifetimeScope); + }); + } + else + { + services.AddSingleton(sp => + { + var rabbitMQPersistentConnection = sp.GetRequiredService(); + var iLifetimeScope = sp.GetRequiredService(); + var logger = sp.GetRequiredService>(); + var eventBusSubcriptionsManager = sp.GetRequiredService(); + + var retryCount = 5; + if (!string.IsNullOrEmpty(Configuration["EventBusRetryCount"])) + { + retryCount = int.Parse(Configuration["EventBusRetryCount"]); + } + + return new EventBusRabbitMQ(rabbitMQPersistentConnection, logger, iLifetimeScope, eventBusSubcriptionsManager, subscriptionClientName, retryCount); + }); + } + + services.AddSingleton(); + } + } + + public static class CustomExtensionMethods + { + public static IServiceCollection AddCustomHealthCheck(this IServiceCollection services, IConfiguration configuration) + { + var hcBuilder = services.AddHealthChecks(); + + hcBuilder.AddCheck("self", () => HealthCheckResult.Healthy()); + + if (configuration.GetValue("AzureServiceBusEnabled")) + { + hcBuilder + .AddAzureServiceBusTopic( + configuration["EventBusConnection"], + topicName: "eshop_event_bus", + name: "signalr-servicebus-check", + tags: new string[] { "servicebus" }); + } + else + { + hcBuilder + .AddRabbitMQ( + $"amqp://{configuration["EventBusConnection"]}", + name: "signalr-rabbitmqbus-check", + tags: new string[] { "rabbitmqbus" }); + } + + return services; + } + } +} diff --git a/src/Services/Basket/Basket.SignalrHub/appsettings.json b/src/Services/Basket/Basket.SignalrHub/appsettings.json new file mode 100644 index 000000000..df95c2972 --- /dev/null +++ b/src/Services/Basket/Basket.SignalrHub/appsettings.json @@ -0,0 +1,19 @@ +{ + "IdentityUrl": "http://localhost:5105", + "Serilog": { + "SeqServerUrl": null, + "LogstashgUrl": null, + "MinimumLevel": { + "Default": "Information", + "Override": { + "Microsoft": "Warning", + "Microsoft.eShopOnContainers": "Information", + "System": "Warning" + } + } + }, + "AzureServiceBusEnabled": false, + "SubscriptionClientName": "Basket.signalrhub", + "EventBusRetryCount": 5, + "EventBusConnection": "localhost" +} \ No newline at end of file diff --git a/src/Services/Basket/Basket.SignalrHub/azds.yaml b/src/Services/Basket/Basket.SignalrHub/azds.yaml new file mode 100644 index 000000000..5461573ea --- /dev/null +++ b/src/Services/Basket/Basket.SignalrHub/azds.yaml @@ -0,0 +1,56 @@ +kind: helm-release +apiVersion: 1.1 +build: + context: ..\..\..\.. + dockerfile: Dockerfile +install: + chart: ../../../../k8s/helm/basket-signalrhub + set: + replicaCount: 1 + image: + tag: $(tag) + pullPolicy: Never + ingress: + annotations: + kubernetes.io/ingress.class: traefik-azds + hosts: + - $(spacePrefix)eshop$(hostSuffix) + inf: + k8s: + dns: $(spacePrefix)eshop$(hostSuffix) + values: + - values.dev.yaml? + - secrets.dev.yaml? + - inf.yaml + - app.yaml +configurations: + develop: + build: + useGitIgnore: true + dockerfile: Dockerfile.develop + args: + BUILD_CONFIGURATION: ${BUILD_CONFIGURATION:-Debug} + container: + sync: + - '**/Pages/**' + - '**/Views/**' + - '**/wwwroot/**' + - '!**/*.{sln,csproj}' + command: + - dotnet + - run + - --no-restore + - --no-build + - --no-launch-profile + - -c + - ${BUILD_CONFIGURATION:-Debug} + iterate: + processesToKill: + - dotnet + - vsdbg + buildCommands: + - - dotnet + - build + - --no-restore + - -c + - ${BUILD_CONFIGURATION:-Debug} diff --git a/src/Services/Catalog/Catalog.API/Dockerfile b/src/Services/Catalog/Catalog.API/Dockerfile index 13559672b..3f7479fac 100644 --- a/src/Services/Catalog/Catalog.API/Dockerfile +++ b/src/Services/Catalog/Catalog.API/Dockerfile @@ -21,6 +21,7 @@ COPY src/BuildingBlocks/WebHostCustomization/WebHost.Customization/WebHost.Custo COPY src/Services/Basket/Basket.API/Basket.API.csproj src/Services/Basket/Basket.API/ COPY src/Services/Basket/Basket.FunctionalTests/Basket.FunctionalTests.csproj src/Services/Basket/Basket.FunctionalTests/ COPY src/Services/Basket/Basket.UnitTests/Basket.UnitTests.csproj src/Services/Basket/Basket.UnitTests/ +COPY src/Services/Basket/Basket.SignalrHub/Basket.SignalrHub.csproj src/Services/Basket/Basket.SignalrHub/ COPY src/Services/Catalog/Catalog.API/Catalog.API.csproj src/Services/Catalog/Catalog.API/ COPY src/Services/Catalog/Catalog.FunctionalTests/Catalog.FunctionalTests.csproj src/Services/Catalog/Catalog.FunctionalTests/ COPY src/Services/Catalog/Catalog.UnitTests/Catalog.UnitTests.csproj src/Services/Catalog/Catalog.UnitTests/ diff --git a/src/Services/Identity/Identity.API/Configuration/Config.cs b/src/Services/Identity/Identity.API/Configuration/Config.cs index dcb3a8c7a..653936ebe 100644 --- a/src/Services/Identity/Identity.API/Configuration/Config.cs +++ b/src/Services/Identity/Identity.API/Configuration/Config.cs @@ -18,6 +18,7 @@ namespace Microsoft.eShopOnContainers.Services.Identity.API.Configuration new ApiResource("mobileshoppingagg", "Mobile Shopping Aggregator"), new ApiResource("webshoppingagg", "Web Shopping Aggregator"), new ApiResource("orders.signalrhub", "Ordering Signalr Hub"), + new ApiResource("basket.signalrhub", "Basket Signalr Hub"), new ApiResource("webhooks", "Webhooks registration Service"), }; } @@ -59,6 +60,7 @@ namespace Microsoft.eShopOnContainers.Services.Identity.API.Configuration "marketing", "webshoppingagg", "orders.signalrhub", + "basket.signalrhub", "webhooks" }, }, @@ -126,6 +128,7 @@ namespace Microsoft.eShopOnContainers.Services.Identity.API.Configuration "marketing", "webshoppingagg", "orders.signalrhub", + "basket.signalrhub", "webhooks" }, AccessTokenLifetime = 60*60*2, // 2 hours diff --git a/src/Services/Identity/Identity.API/Dockerfile b/src/Services/Identity/Identity.API/Dockerfile index bb7fed9ec..5cf4f0bc7 100644 --- a/src/Services/Identity/Identity.API/Dockerfile +++ b/src/Services/Identity/Identity.API/Dockerfile @@ -21,6 +21,7 @@ COPY src/BuildingBlocks/WebHostCustomization/WebHost.Customization/WebHost.Custo COPY src/Services/Basket/Basket.API/Basket.API.csproj src/Services/Basket/Basket.API/ COPY src/Services/Basket/Basket.FunctionalTests/Basket.FunctionalTests.csproj src/Services/Basket/Basket.FunctionalTests/ COPY src/Services/Basket/Basket.UnitTests/Basket.UnitTests.csproj src/Services/Basket/Basket.UnitTests/ +COPY src/Services/Basket/Basket.SignalrHub/Basket.SignalrHub.csproj src/Services/Basket/Basket.SignalrHub/ COPY src/Services/Catalog/Catalog.API/Catalog.API.csproj src/Services/Catalog/Catalog.API/ COPY src/Services/Catalog/Catalog.FunctionalTests/Catalog.FunctionalTests.csproj src/Services/Catalog/Catalog.FunctionalTests/ COPY src/Services/Catalog/Catalog.UnitTests/Catalog.UnitTests.csproj src/Services/Catalog/Catalog.UnitTests/ diff --git a/src/Services/Location/Locations.API/Dockerfile b/src/Services/Location/Locations.API/Dockerfile index 3a3e54261..1ff2d4ab7 100644 --- a/src/Services/Location/Locations.API/Dockerfile +++ b/src/Services/Location/Locations.API/Dockerfile @@ -21,6 +21,7 @@ COPY src/BuildingBlocks/WebHostCustomization/WebHost.Customization/WebHost.Custo COPY src/Services/Basket/Basket.API/Basket.API.csproj src/Services/Basket/Basket.API/ COPY src/Services/Basket/Basket.FunctionalTests/Basket.FunctionalTests.csproj src/Services/Basket/Basket.FunctionalTests/ COPY src/Services/Basket/Basket.UnitTests/Basket.UnitTests.csproj src/Services/Basket/Basket.UnitTests/ +COPY src/Services/Basket/Basket.SignalrHub/Basket.SignalrHub.csproj src/Services/Basket/Basket.SignalrHub/ COPY src/Services/Catalog/Catalog.API/Catalog.API.csproj src/Services/Catalog/Catalog.API/ COPY src/Services/Catalog/Catalog.FunctionalTests/Catalog.FunctionalTests.csproj src/Services/Catalog/Catalog.FunctionalTests/ COPY src/Services/Catalog/Catalog.UnitTests/Catalog.UnitTests.csproj src/Services/Catalog/Catalog.UnitTests/ diff --git a/src/Services/Marketing/Marketing.API/Dockerfile b/src/Services/Marketing/Marketing.API/Dockerfile index 34724a5f8..9e9b4f9d2 100644 --- a/src/Services/Marketing/Marketing.API/Dockerfile +++ b/src/Services/Marketing/Marketing.API/Dockerfile @@ -21,6 +21,7 @@ COPY src/BuildingBlocks/WebHostCustomization/WebHost.Customization/WebHost.Custo COPY src/Services/Basket/Basket.API/Basket.API.csproj src/Services/Basket/Basket.API/ COPY src/Services/Basket/Basket.FunctionalTests/Basket.FunctionalTests.csproj src/Services/Basket/Basket.FunctionalTests/ COPY src/Services/Basket/Basket.UnitTests/Basket.UnitTests.csproj src/Services/Basket/Basket.UnitTests/ +COPY src/Services/Basket/Basket.SignalrHub/Basket.SignalrHub.csproj src/Services/Basket/Basket.SignalrHub/ COPY src/Services/Catalog/Catalog.API/Catalog.API.csproj src/Services/Catalog/Catalog.API/ COPY src/Services/Catalog/Catalog.FunctionalTests/Catalog.FunctionalTests.csproj src/Services/Catalog/Catalog.FunctionalTests/ COPY src/Services/Catalog/Catalog.UnitTests/Catalog.UnitTests.csproj src/Services/Catalog/Catalog.UnitTests/ diff --git a/src/Services/Ordering/Ordering.API/Dockerfile b/src/Services/Ordering/Ordering.API/Dockerfile index cec7cde61..37fb6b9dd 100644 --- a/src/Services/Ordering/Ordering.API/Dockerfile +++ b/src/Services/Ordering/Ordering.API/Dockerfile @@ -21,6 +21,7 @@ COPY src/BuildingBlocks/WebHostCustomization/WebHost.Customization/WebHost.Custo COPY src/Services/Basket/Basket.API/Basket.API.csproj src/Services/Basket/Basket.API/ COPY src/Services/Basket/Basket.FunctionalTests/Basket.FunctionalTests.csproj src/Services/Basket/Basket.FunctionalTests/ COPY src/Services/Basket/Basket.UnitTests/Basket.UnitTests.csproj src/Services/Basket/Basket.UnitTests/ +COPY src/Services/Basket/Basket.SignalrHub/Basket.SignalrHub.csproj src/Services/Basket/Basket.SignalrHub/ COPY src/Services/Catalog/Catalog.API/Catalog.API.csproj src/Services/Catalog/Catalog.API/ COPY src/Services/Catalog/Catalog.FunctionalTests/Catalog.FunctionalTests.csproj src/Services/Catalog/Catalog.FunctionalTests/ COPY src/Services/Catalog/Catalog.UnitTests/Catalog.UnitTests.csproj src/Services/Catalog/Catalog.UnitTests/ diff --git a/src/Services/Ordering/Ordering.BackgroundTasks/Dockerfile b/src/Services/Ordering/Ordering.BackgroundTasks/Dockerfile index ce0aeacde..78455985d 100644 --- a/src/Services/Ordering/Ordering.BackgroundTasks/Dockerfile +++ b/src/Services/Ordering/Ordering.BackgroundTasks/Dockerfile @@ -21,6 +21,7 @@ COPY src/BuildingBlocks/WebHostCustomization/WebHost.Customization/WebHost.Custo COPY src/Services/Basket/Basket.API/Basket.API.csproj src/Services/Basket/Basket.API/ COPY src/Services/Basket/Basket.FunctionalTests/Basket.FunctionalTests.csproj src/Services/Basket/Basket.FunctionalTests/ COPY src/Services/Basket/Basket.UnitTests/Basket.UnitTests.csproj src/Services/Basket/Basket.UnitTests/ +COPY src/Services/Basket/Basket.SignalrHub/Basket.SignalrHub.csproj src/Services/Basket/Basket.SignalrHub/ COPY src/Services/Catalog/Catalog.API/Catalog.API.csproj src/Services/Catalog/Catalog.API/ COPY src/Services/Catalog/Catalog.FunctionalTests/Catalog.FunctionalTests.csproj src/Services/Catalog/Catalog.FunctionalTests/ COPY src/Services/Catalog/Catalog.UnitTests/Catalog.UnitTests.csproj src/Services/Catalog/Catalog.UnitTests/ diff --git a/src/Services/Ordering/Ordering.SignalrHub/Dockerfile b/src/Services/Ordering/Ordering.SignalrHub/Dockerfile index 49e882921..a4396a96b 100644 --- a/src/Services/Ordering/Ordering.SignalrHub/Dockerfile +++ b/src/Services/Ordering/Ordering.SignalrHub/Dockerfile @@ -21,6 +21,7 @@ COPY src/BuildingBlocks/WebHostCustomization/WebHost.Customization/WebHost.Custo COPY src/Services/Basket/Basket.API/Basket.API.csproj src/Services/Basket/Basket.API/ COPY src/Services/Basket/Basket.FunctionalTests/Basket.FunctionalTests.csproj src/Services/Basket/Basket.FunctionalTests/ COPY src/Services/Basket/Basket.UnitTests/Basket.UnitTests.csproj src/Services/Basket/Basket.UnitTests/ +COPY src/Services/Basket/Basket.SignalrHub/Basket.SignalrHub.csproj src/Services/Basket/Basket.SignalrHub/ COPY src/Services/Catalog/Catalog.API/Catalog.API.csproj src/Services/Catalog/Catalog.API/ COPY src/Services/Catalog/Catalog.FunctionalTests/Catalog.FunctionalTests.csproj src/Services/Catalog/Catalog.FunctionalTests/ COPY src/Services/Catalog/Catalog.UnitTests/Catalog.UnitTests.csproj src/Services/Catalog/Catalog.UnitTests/ diff --git a/src/Services/Payment/Payment.API/Dockerfile b/src/Services/Payment/Payment.API/Dockerfile index 724077312..1859a0ae3 100644 --- a/src/Services/Payment/Payment.API/Dockerfile +++ b/src/Services/Payment/Payment.API/Dockerfile @@ -21,6 +21,7 @@ COPY src/BuildingBlocks/WebHostCustomization/WebHost.Customization/WebHost.Custo COPY src/Services/Basket/Basket.API/Basket.API.csproj src/Services/Basket/Basket.API/ COPY src/Services/Basket/Basket.FunctionalTests/Basket.FunctionalTests.csproj src/Services/Basket/Basket.FunctionalTests/ COPY src/Services/Basket/Basket.UnitTests/Basket.UnitTests.csproj src/Services/Basket/Basket.UnitTests/ +COPY src/Services/Basket/Basket.SignalrHub/Basket.SignalrHub.csproj src/Services/Basket/Basket.SignalrHub/ COPY src/Services/Catalog/Catalog.API/Catalog.API.csproj src/Services/Catalog/Catalog.API/ COPY src/Services/Catalog/Catalog.FunctionalTests/Catalog.FunctionalTests.csproj src/Services/Catalog/Catalog.FunctionalTests/ COPY src/Services/Catalog/Catalog.UnitTests/Catalog.UnitTests.csproj src/Services/Catalog/Catalog.UnitTests/ diff --git a/src/Services/Webhooks/Webhooks.API/Dockerfile b/src/Services/Webhooks/Webhooks.API/Dockerfile index 5f306dae4..75236a636 100644 --- a/src/Services/Webhooks/Webhooks.API/Dockerfile +++ b/src/Services/Webhooks/Webhooks.API/Dockerfile @@ -21,6 +21,7 @@ COPY src/BuildingBlocks/WebHostCustomization/WebHost.Customization/WebHost.Custo COPY src/Services/Basket/Basket.API/Basket.API.csproj src/Services/Basket/Basket.API/ COPY src/Services/Basket/Basket.FunctionalTests/Basket.FunctionalTests.csproj src/Services/Basket/Basket.FunctionalTests/ COPY src/Services/Basket/Basket.UnitTests/Basket.UnitTests.csproj src/Services/Basket/Basket.UnitTests/ +COPY src/Services/Basket/Basket.SignalrHub/Basket.SignalrHub.csproj src/Services/Basket/Basket.SignalrHub/ COPY src/Services/Catalog/Catalog.API/Catalog.API.csproj src/Services/Catalog/Catalog.API/ COPY src/Services/Catalog/Catalog.FunctionalTests/Catalog.FunctionalTests.csproj src/Services/Catalog/Catalog.FunctionalTests/ COPY src/Services/Catalog/Catalog.UnitTests/Catalog.UnitTests.csproj src/Services/Catalog/Catalog.UnitTests/ diff --git a/src/Web/WebMVC/Dockerfile b/src/Web/WebMVC/Dockerfile index 989d89b16..abf6ea638 100644 --- a/src/Web/WebMVC/Dockerfile +++ b/src/Web/WebMVC/Dockerfile @@ -21,6 +21,7 @@ COPY src/BuildingBlocks/WebHostCustomization/WebHost.Customization/WebHost.Custo COPY src/Services/Basket/Basket.API/Basket.API.csproj src/Services/Basket/Basket.API/ COPY src/Services/Basket/Basket.FunctionalTests/Basket.FunctionalTests.csproj src/Services/Basket/Basket.FunctionalTests/ COPY src/Services/Basket/Basket.UnitTests/Basket.UnitTests.csproj src/Services/Basket/Basket.UnitTests/ +COPY src/Services/Basket/Basket.SignalrHub/Basket.SignalrHub.csproj src/Services/Basket/Basket.SignalrHub/ COPY src/Services/Catalog/Catalog.API/Catalog.API.csproj src/Services/Catalog/Catalog.API/ COPY src/Services/Catalog/Catalog.FunctionalTests/Catalog.FunctionalTests.csproj src/Services/Catalog/Catalog.FunctionalTests/ COPY src/Services/Catalog/Catalog.UnitTests/Catalog.UnitTests.csproj src/Services/Catalog/Catalog.UnitTests/ diff --git a/src/Web/WebSPA/Dockerfile b/src/Web/WebSPA/Dockerfile index 99d99a0bc..38de810af 100644 --- a/src/Web/WebSPA/Dockerfile +++ b/src/Web/WebSPA/Dockerfile @@ -28,6 +28,7 @@ COPY src/BuildingBlocks/WebHostCustomization/WebHost.Customization/WebHost.Custo COPY src/Services/Basket/Basket.API/Basket.API.csproj src/Services/Basket/Basket.API/ COPY src/Services/Basket/Basket.FunctionalTests/Basket.FunctionalTests.csproj src/Services/Basket/Basket.FunctionalTests/ COPY src/Services/Basket/Basket.UnitTests/Basket.UnitTests.csproj src/Services/Basket/Basket.UnitTests/ +COPY src/Services/Basket/Basket.SignalrHub/Basket.SignalrHub.csproj src/Services/Basket/Basket.SignalrHub/ COPY src/Services/Catalog/Catalog.API/Catalog.API.csproj src/Services/Catalog/Catalog.API/ COPY src/Services/Catalog/Catalog.FunctionalTests/Catalog.FunctionalTests.csproj src/Services/Catalog/Catalog.FunctionalTests/ COPY src/Services/Catalog/Catalog.UnitTests/Catalog.UnitTests.csproj src/Services/Catalog/Catalog.UnitTests/ diff --git a/src/Web/WebStatus/Dockerfile b/src/Web/WebStatus/Dockerfile index df4314def..5130555d7 100644 --- a/src/Web/WebStatus/Dockerfile +++ b/src/Web/WebStatus/Dockerfile @@ -21,6 +21,7 @@ COPY src/BuildingBlocks/WebHostCustomization/WebHost.Customization/WebHost.Custo COPY src/Services/Basket/Basket.API/Basket.API.csproj src/Services/Basket/Basket.API/ COPY src/Services/Basket/Basket.FunctionalTests/Basket.FunctionalTests.csproj src/Services/Basket/Basket.FunctionalTests/ COPY src/Services/Basket/Basket.UnitTests/Basket.UnitTests.csproj src/Services/Basket/Basket.UnitTests/ +COPY src/Services/Basket/Basket.SignalrHub/Basket.SignalrHub.csproj src/Services/Basket/Basket.SignalrHub/ COPY src/Services/Catalog/Catalog.API/Catalog.API.csproj src/Services/Catalog/Catalog.API/ COPY src/Services/Catalog/Catalog.FunctionalTests/Catalog.FunctionalTests.csproj src/Services/Catalog/Catalog.FunctionalTests/ COPY src/Services/Catalog/Catalog.UnitTests/Catalog.UnitTests.csproj src/Services/Catalog/Catalog.UnitTests/ diff --git a/src/Web/WebStatus/appsettings.Development.json b/src/Web/WebStatus/appsettings.Development.json index 9e0cea9d0..07e93752f 100644 --- a/src/Web/WebStatus/appsettings.Development.json +++ b/src/Web/WebStatus/appsettings.Development.json @@ -42,9 +42,13 @@ "Uri": "http://localhost:5104/hc" }, { - "Name": "SignalR HTTP Check", + "Name": "Ordering SignalR HTTP Check", "Uri": "http://localhost:5112/hc" }, + { + "Name": "Basket SignalR HTTP Check", + "Uri": "http://localhost:5115/hc" + }, { "Name": "Mobile Shopping API GW HTTP Check", "Uri": "http://localhost:5200/hc" diff --git a/src/Web/WebStatus/appsettings.json b/src/Web/WebStatus/appsettings.json index d826db8d7..f8a1dbf16 100644 --- a/src/Web/WebStatus/appsettings.json +++ b/src/Web/WebStatus/appsettings.json @@ -42,9 +42,13 @@ "Uri": "http://localhost:5104/hc" }, { - "Name": "SignalR HTTP Check", + "Name": "Ordering SignalR HTTP Check", "Uri": "http://localhost:5112/hc" }, + { + "Name": "Basket SignalR HTTP Check", + "Uri": "http://localhost:5115/hc" + }, { "Name": "Mobile Shopping API GW HTTP Check", "Uri": "http://localhost:5200/hc" diff --git a/src/Web/WebhookClient/Dockerfile b/src/Web/WebhookClient/Dockerfile index 8711bf0c2..b4bb6d49d 100644 --- a/src/Web/WebhookClient/Dockerfile +++ b/src/Web/WebhookClient/Dockerfile @@ -22,6 +22,7 @@ COPY src/BuildingBlocks/WebHostCustomization/WebHost.Customization/WebHost.Custo COPY src/Services/Basket/Basket.API/Basket.API.csproj src/Services/Basket/Basket.API/ COPY src/Services/Basket/Basket.FunctionalTests/Basket.FunctionalTests.csproj src/Services/Basket/Basket.FunctionalTests/ COPY src/Services/Basket/Basket.UnitTests/Basket.UnitTests.csproj src/Services/Basket/Basket.UnitTests/ +COPY src/Services/Basket/Basket.SignalrHub/Basket.SignalrHub.csproj src/Services/Basket/Basket.SignalrHub/ COPY src/Services/Catalog/Catalog.API/Catalog.API.csproj src/Services/Catalog/Catalog.API/ COPY src/Services/Catalog/Catalog.FunctionalTests/Catalog.FunctionalTests.csproj src/Services/Catalog/Catalog.FunctionalTests/ COPY src/Services/Catalog/Catalog.UnitTests/Catalog.UnitTests.csproj src/Services/Catalog/Catalog.UnitTests/