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/