From e72ada31fb758f843dfc298527fdcbbc06f956d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduard=20Tom=C3=A0s?= Date: Thu, 11 Jan 2018 11:20:38 +0100 Subject: [PATCH 01/78] Create Ocelot project --- docker-compose.override.yml | 9 +++- docker-compose.yml | 7 +++ eShopOnContainers-ServicesAndWebApps.sln | 54 +++++++++++++++++++ src/Apigw/OcelotApiGw/Dockerfile | 20 +++++++ src/Apigw/OcelotApiGw/OcelotApiGw.csproj | 15 ++++++ src/Apigw/OcelotApiGw/Program.cs | 25 +++++++++ .../Properties/launchSettings.json | 27 ++++++++++ src/Apigw/OcelotApiGw/Startup.cs | 34 ++++++++++++ 8 files changed, 190 insertions(+), 1 deletion(-) create mode 100644 src/Apigw/OcelotApiGw/Dockerfile create mode 100644 src/Apigw/OcelotApiGw/OcelotApiGw.csproj create mode 100644 src/Apigw/OcelotApiGw/Program.cs create mode 100644 src/Apigw/OcelotApiGw/Properties/launchSettings.json create mode 100644 src/Apigw/OcelotApiGw/Startup.cs diff --git a/docker-compose.override.yml b/docker-compose.override.yml index f0ead3653..a4f1eff0c 100644 --- a/docker-compose.override.yml +++ b/docker-compose.override.yml @@ -219,4 +219,11 @@ services: rabbitmq: ports: - "15672:15672" - - "5672:5672" \ No newline at end of file + - "5672:5672" + + ocelotapigw: + environment: + - ASPNETCORE_ENVIRONMENT=Development + ports: + - "80" + diff --git a/docker-compose.yml b/docker-compose.yml index 7489c941f..82b9b1670 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -107,3 +107,10 @@ services: rabbitmq: image: rabbitmq:3-management-alpine + + ocelotapigw: + image: ocelotapigw + build: + context: . + dockerfile: src/Apigw/OcelotApiGw/Dockerfile + diff --git a/eShopOnContainers-ServicesAndWebApps.sln b/eShopOnContainers-ServicesAndWebApps.sln index e4ddff1c2..4a07ad380 100644 --- a/eShopOnContainers-ServicesAndWebApps.sln +++ b/eShopOnContainers-ServicesAndWebApps.sln @@ -97,6 +97,10 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WebHost", "WebHost", "{1815 EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WebHost.Customization", "src\BuildingBlocks\WebHostCustomization\WebHost.Customization\WebHost.Customization.csproj", "{15F4B3AA-89B6-4A0D-9051-414305974781}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ApiGw", "ApiGw", "{7A58AA20-67F3-48F3-88C8-24EBFE621792}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OcelotApiGw", "src\Apigw\OcelotApiGw\OcelotApiGw.csproj", "{E0C5162E-DF26-4341-9E51-14AE800D7505}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Ad-Hoc|Any CPU = Ad-Hoc|Any CPU @@ -1311,6 +1315,54 @@ Global {15F4B3AA-89B6-4A0D-9051-414305974781}.Release|x64.Build.0 = Release|Any CPU {15F4B3AA-89B6-4A0D-9051-414305974781}.Release|x86.ActiveCfg = Release|Any CPU {15F4B3AA-89B6-4A0D-9051-414305974781}.Release|x86.Build.0 = Release|Any CPU + {E0C5162E-DF26-4341-9E51-14AE800D7505}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU + {E0C5162E-DF26-4341-9E51-14AE800D7505}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU + {E0C5162E-DF26-4341-9E51-14AE800D7505}.Ad-Hoc|ARM.ActiveCfg = Debug|Any CPU + {E0C5162E-DF26-4341-9E51-14AE800D7505}.Ad-Hoc|ARM.Build.0 = Debug|Any CPU + {E0C5162E-DF26-4341-9E51-14AE800D7505}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU + {E0C5162E-DF26-4341-9E51-14AE800D7505}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU + {E0C5162E-DF26-4341-9E51-14AE800D7505}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {E0C5162E-DF26-4341-9E51-14AE800D7505}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU + {E0C5162E-DF26-4341-9E51-14AE800D7505}.Ad-Hoc|x64.ActiveCfg = Debug|Any CPU + {E0C5162E-DF26-4341-9E51-14AE800D7505}.Ad-Hoc|x64.Build.0 = Debug|Any CPU + {E0C5162E-DF26-4341-9E51-14AE800D7505}.Ad-Hoc|x86.ActiveCfg = Debug|Any CPU + {E0C5162E-DF26-4341-9E51-14AE800D7505}.Ad-Hoc|x86.Build.0 = Debug|Any CPU + {E0C5162E-DF26-4341-9E51-14AE800D7505}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU + {E0C5162E-DF26-4341-9E51-14AE800D7505}.AppStore|Any CPU.Build.0 = Debug|Any CPU + {E0C5162E-DF26-4341-9E51-14AE800D7505}.AppStore|ARM.ActiveCfg = Debug|Any CPU + {E0C5162E-DF26-4341-9E51-14AE800D7505}.AppStore|ARM.Build.0 = Debug|Any CPU + {E0C5162E-DF26-4341-9E51-14AE800D7505}.AppStore|iPhone.ActiveCfg = Debug|Any CPU + {E0C5162E-DF26-4341-9E51-14AE800D7505}.AppStore|iPhone.Build.0 = Debug|Any CPU + {E0C5162E-DF26-4341-9E51-14AE800D7505}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {E0C5162E-DF26-4341-9E51-14AE800D7505}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU + {E0C5162E-DF26-4341-9E51-14AE800D7505}.AppStore|x64.ActiveCfg = Debug|Any CPU + {E0C5162E-DF26-4341-9E51-14AE800D7505}.AppStore|x64.Build.0 = Debug|Any CPU + {E0C5162E-DF26-4341-9E51-14AE800D7505}.AppStore|x86.ActiveCfg = Debug|Any CPU + {E0C5162E-DF26-4341-9E51-14AE800D7505}.AppStore|x86.Build.0 = Debug|Any CPU + {E0C5162E-DF26-4341-9E51-14AE800D7505}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E0C5162E-DF26-4341-9E51-14AE800D7505}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E0C5162E-DF26-4341-9E51-14AE800D7505}.Debug|ARM.ActiveCfg = Debug|Any CPU + {E0C5162E-DF26-4341-9E51-14AE800D7505}.Debug|ARM.Build.0 = Debug|Any CPU + {E0C5162E-DF26-4341-9E51-14AE800D7505}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {E0C5162E-DF26-4341-9E51-14AE800D7505}.Debug|iPhone.Build.0 = Debug|Any CPU + {E0C5162E-DF26-4341-9E51-14AE800D7505}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {E0C5162E-DF26-4341-9E51-14AE800D7505}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {E0C5162E-DF26-4341-9E51-14AE800D7505}.Debug|x64.ActiveCfg = Debug|Any CPU + {E0C5162E-DF26-4341-9E51-14AE800D7505}.Debug|x64.Build.0 = Debug|Any CPU + {E0C5162E-DF26-4341-9E51-14AE800D7505}.Debug|x86.ActiveCfg = Debug|Any CPU + {E0C5162E-DF26-4341-9E51-14AE800D7505}.Debug|x86.Build.0 = Debug|Any CPU + {E0C5162E-DF26-4341-9E51-14AE800D7505}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E0C5162E-DF26-4341-9E51-14AE800D7505}.Release|Any CPU.Build.0 = Release|Any CPU + {E0C5162E-DF26-4341-9E51-14AE800D7505}.Release|ARM.ActiveCfg = Release|Any CPU + {E0C5162E-DF26-4341-9E51-14AE800D7505}.Release|ARM.Build.0 = Release|Any CPU + {E0C5162E-DF26-4341-9E51-14AE800D7505}.Release|iPhone.ActiveCfg = Release|Any CPU + {E0C5162E-DF26-4341-9E51-14AE800D7505}.Release|iPhone.Build.0 = Release|Any CPU + {E0C5162E-DF26-4341-9E51-14AE800D7505}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {E0C5162E-DF26-4341-9E51-14AE800D7505}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {E0C5162E-DF26-4341-9E51-14AE800D7505}.Release|x64.ActiveCfg = Release|Any CPU + {E0C5162E-DF26-4341-9E51-14AE800D7505}.Release|x64.Build.0 = Release|Any CPU + {E0C5162E-DF26-4341-9E51-14AE800D7505}.Release|x86.ActiveCfg = Release|Any CPU + {E0C5162E-DF26-4341-9E51-14AE800D7505}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -1357,6 +1409,8 @@ Global {969E793C-C413-490E-9C9D-B2B46DA5AF32} = {EF0337F2-ED00-4643-89FD-EE10863F1870} {1815B651-941C-466B-AE33-D1D7EEB8F77F} = {DB0EFB20-B024-4E5E-A75C-52143C131D25} {15F4B3AA-89B6-4A0D-9051-414305974781} = {1815B651-941C-466B-AE33-D1D7EEB8F77F} + {7A58AA20-67F3-48F3-88C8-24EBFE621792} = {932D8224-11F6-4D07-B109-DA28AD288A63} + {E0C5162E-DF26-4341-9E51-14AE800D7505} = {7A58AA20-67F3-48F3-88C8-24EBFE621792} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {25728519-5F0F-4973-8A64-0A81EB4EA8D9} diff --git a/src/Apigw/OcelotApiGw/Dockerfile b/src/Apigw/OcelotApiGw/Dockerfile new file mode 100644 index 000000000..06b842479 --- /dev/null +++ b/src/Apigw/OcelotApiGw/Dockerfile @@ -0,0 +1,20 @@ +FROM microsoft/aspnetcore:2.0 AS base +WORKDIR /app +EXPOSE 80 + +FROM microsoft/aspnetcore-build:2.0 AS build +WORKDIR /src +COPY *.sln ./ +COPY src/Apigw/OcelotApiGw/OcelotApiGw.csproj src/Apigw/OcelotApiGw/ +RUN dotnet restore +COPY . . +WORKDIR /src/src/Apigw/OcelotApiGw +RUN dotnet build -c Release -o /app + +FROM build AS publish +RUN dotnet publish -c Release -o /app + +FROM base AS final +WORKDIR /app +COPY --from=publish /app . +ENTRYPOINT ["dotnet", "OcelotApiGw.dll"] diff --git a/src/Apigw/OcelotApiGw/OcelotApiGw.csproj b/src/Apigw/OcelotApiGw/OcelotApiGw.csproj new file mode 100644 index 000000000..2d176adde --- /dev/null +++ b/src/Apigw/OcelotApiGw/OcelotApiGw.csproj @@ -0,0 +1,15 @@ + + + + netcoreapp2.0 + + + + + + + + + + + diff --git a/src/Apigw/OcelotApiGw/Program.cs b/src/Apigw/OcelotApiGw/Program.cs new file mode 100644 index 000000000..43be3c57c --- /dev/null +++ b/src/Apigw/OcelotApiGw/Program.cs @@ -0,0 +1,25 @@ +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; + +namespace OcelotApiGw +{ + public class Program + { + public static void Main(string[] args) + { + BuildWebHost(args).Run(); + } + + public static IWebHost BuildWebHost(string[] args) => + WebHost.CreateDefaultBuilder(args) + .UseStartup() + .Build(); + } +} diff --git a/src/Apigw/OcelotApiGw/Properties/launchSettings.json b/src/Apigw/OcelotApiGw/Properties/launchSettings.json new file mode 100644 index 000000000..796011a33 --- /dev/null +++ b/src/Apigw/OcelotApiGw/Properties/launchSettings.json @@ -0,0 +1,27 @@ +{ + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:64020/", + "sslPort": 0 + } + }, + "profiles": { + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "OcelotApiGw": { + "commandName": "Project", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "applicationUrl": "http://localhost:64021/" + } + } +} diff --git a/src/Apigw/OcelotApiGw/Startup.cs b/src/Apigw/OcelotApiGw/Startup.cs new file mode 100644 index 000000000..671bb72aa --- /dev/null +++ b/src/Apigw/OcelotApiGw/Startup.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.DependencyInjection; + +namespace OcelotApiGw +{ + public class Startup + { + // 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 void ConfigureServices(IServiceCollection services) + { + } + + // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. + public void Configure(IApplicationBuilder app, IHostingEnvironment env) + { + if (env.IsDevelopment()) + { + app.UseDeveloperExceptionPage(); + } + + app.Run(async (context) => + { + await context.Response.WriteAsync("Hello World!"); + }); + } + } +} From ea4e0ed6e8d9f0254790db2c21a5f8d19deb7303 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduard=20Tom=C3=A0s?= Date: Thu, 11 Jan 2018 18:18:16 +0100 Subject: [PATCH 02/78] Deploying ocelot to k8s configuration to ocelot passed through a k8s volume --- docker-compose.override.yml | 4 +- docker-compose.yml | 5 +- k8s/deploy.ps1 | 10 +++- k8s/ingress.yaml | 10 ++-- k8s/ocelot/configuration.json | 58 +++++++++++++++++++ k8s/ocelot/deployment.yaml | 31 ++++++++++ k8s/ocelot/service.yaml | 13 +++++ src/Apigw/OcelotApiGw/Dockerfile | 3 +- src/Apigw/OcelotApiGw/OcelotApiGw.csproj | 1 + src/Apigw/OcelotApiGw/Program.cs | 1 + src/Apigw/OcelotApiGw/Startup.cs | 22 ++++--- .../configuration/configuration.json | 58 +++++++++++++++++++ xglobal.json | 5 ++ 13 files changed, 201 insertions(+), 20 deletions(-) create mode 100644 k8s/ocelot/configuration.json create mode 100644 k8s/ocelot/deployment.yaml create mode 100644 k8s/ocelot/service.yaml create mode 100644 src/Apigw/OcelotApiGw/configuration/configuration.json create mode 100644 xglobal.json diff --git a/docker-compose.override.yml b/docker-compose.override.yml index a4f1eff0c..c8b952af5 100644 --- a/docker-compose.override.yml +++ b/docker-compose.override.yml @@ -221,9 +221,9 @@ services: - "15672:15672" - "5672:5672" - ocelotapigw: + apigw: environment: - ASPNETCORE_ENVIRONMENT=Development ports: - - "80" + - "5200:80" diff --git a/docker-compose.yml b/docker-compose.yml index 82b9b1670..bda0acded 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -108,9 +108,8 @@ services: rabbitmq: image: rabbitmq:3-management-alpine - ocelotapigw: - image: ocelotapigw + apigw: + image: eshop/ocelotapigw build: context: . dockerfile: src/Apigw/OcelotApiGw/Dockerfile - diff --git a/k8s/deploy.ps1 b/k8s/deploy.ps1 index 42202f637..3372a5937 100644 --- a/k8s/deploy.ps1 +++ b/k8s/deploy.ps1 @@ -105,6 +105,7 @@ ExecKube -cmd 'delete deployments --all' ExecKube -cmd 'delete services --all' ExecKube -cmd 'delete configmap urls' ExecKube -cmd 'delete configmap externalcfg' +ExecKube -cmd 'delete configmap ocelot' # start sql, rabbitmq, frontend deployments if ($deployInfrastructure) { @@ -113,6 +114,12 @@ if ($deployInfrastructure) { } +Write-Host 'Deploying ocelot APIGW' -ForegroundColor Yellow + +ExecKube "create configmap ocelot --from-file=ocelot/configuration.json" +ExecKube -cmd "apply -f ocelot/deployment.yaml" +ExecKube -cmd "apply -f ocelot/service.yaml" + Write-Host 'Deploying code deployments (Web APIs, Web apps, ...)' -ForegroundColor Yellow ExecKube -cmd 'create -f services.yaml' @@ -154,7 +161,6 @@ ExecKube -cmd 'create configmap urls ` ExecKube -cmd 'label configmap urls app=eshop' Write-Host "Deploying configuration from $configFile" -ForegroundColor Yellow - ExecKube -cmd "create -f $configFile" Write-Host "Creating deployments..." -ForegroundColor Yellow @@ -178,6 +184,7 @@ ExecKube -cmd 'set image deployments/payment payment=${registryPath}${dockerOrg} ExecKube -cmd 'set image deployments/webmvc webmvc=${registryPath}${dockerOrg}/webmvc:$imageTag' ExecKube -cmd 'set image deployments/webstatus webstatus=${registryPath}${dockerOrg}/webstatus:$imageTag' ExecKube -cmd 'set image deployments/webspa webspa=${registryPath}${dockerOrg}/webspa:$imageTag' +ExecKube -cmd 'set image deployments/ocelot ocelot=${registryPath}${dockerOrg}/ocelotapigw:$imageTag' Write-Host "Execute rollout..." -ForegroundColor Yellow ExecKube -cmd 'rollout resume deployments/basket' @@ -190,6 +197,7 @@ ExecKube -cmd 'rollout resume deployments/payment' ExecKube -cmd 'rollout resume deployments/webmvc' ExecKube -cmd 'rollout resume deployments/webstatus' ExecKube -cmd 'rollout resume deployments/webspa' +ExecKube -cmd 'rollout resume deployments/ocelot' Write-Host "WebSPA is exposed at http://$externalDns, WebMVC at http://$externalDns/webmvc, WebStatus at http://$externalDns/webstatus" -ForegroundColor Yellow diff --git a/k8s/ingress.yaml b/k8s/ingress.yaml index 3c2fe8bad..813a88a36 100644 --- a/k8s/ingress.yaml +++ b/k8s/ingress.yaml @@ -13,11 +13,11 @@ spec: paths: - path: /basket-api backend: - serviceName: basket + serviceName: ocelot servicePort: 80 - path: /catalog-api backend: - serviceName: catalog + serviceName: ocelot servicePort: 80 - path: /identity backend: @@ -25,7 +25,7 @@ spec: servicePort: 80 - path: /ordering-api backend: - serviceName: ordering + serviceName: ocelot servicePort: 80 - path: /webmvc backend: @@ -41,11 +41,11 @@ spec: servicePort: 80 - path: /payment-api backend: - serviceName: payment + serviceName: ocelot servicePort: 80 - path: /locations-api backend: - serviceName: locations + serviceName: ocelot servicePort: 80 - path: / backend: diff --git a/k8s/ocelot/configuration.json b/k8s/ocelot/configuration.json new file mode 100644 index 000000000..7a94504c3 --- /dev/null +++ b/k8s/ocelot/configuration.json @@ -0,0 +1,58 @@ +{ + "ReRoutes": [ + { + "DownstreamPathTemplate": "/{everything}", + "DownstreamScheme": "http", + "DownstreamHost": "ordering", + "DownstreamPort": 80, + "UpstreamPathTemplate": "/ordering-api/{everything}", + "UpstreamHttpMethod": [] + }, + { + "DownstreamPathTemplate": "/{everything}", + "DownstreamScheme": "http", + "DownstreamHost": "basket", + "DownstreamPort": 80, + "UpstreamPathTemplate": "/basket-api/{everything}", + "UpstreamHttpMethod": [] + }, + { + "DownstreamPathTemplate": "/{everything}", + "DownstreamScheme": "http", + "DownstreamHost": "catalog", + "DownstreamPort": 80, + "UpstreamPathTemplate": "/catalog-api/{everything}", + "UpstreamHttpMethod": [] + }, + { + "DownstreamPathTemplate": "/{everything}", + "DownstreamScheme": "http", + "DownstreamHost": "marketing", + "DownstreamPort": 80, + "UpstreamPathTemplate": "/marketing-api/{everything}", + "UpstreamHttpMethod": [] + }, + { + "DownstreamPathTemplate": "/{everything}", + "DownstreamScheme": "http", + "DownstreamHost": "payment", + "DownstreamPort": 80, + "UpstreamPathTemplate": "/payment-api/{everything}", + "UpstreamHttpMethod": [] + }, + { + "DownstreamPathTemplate": "/{everything}", + "DownstreamScheme": "http", + "DownstreamHost": "locations", + "DownstreamPort": 80, + "UpstreamPathTemplate": "/location-api/{everything}", + "UpstreamHttpMethod": [] + } + + ], + "GlobalConfiguration": { + "RequestIdKey": "OcRequestId", + "AdministrationPath": "/administration" + } + } + \ No newline at end of file diff --git a/k8s/ocelot/deployment.yaml b/k8s/ocelot/deployment.yaml new file mode 100644 index 000000000..4800172e6 --- /dev/null +++ b/k8s/ocelot/deployment.yaml @@ -0,0 +1,31 @@ +apiVersion: extensions/v1beta1 +kind: Deployment +metadata: + name: ocelot +spec: + paused: true + template: + metadata: + labels: + app: eshop + component: ocelot + spec: + containers: + - name: ocelot + image: eshop/ocelotapigw + imagePullPolicy: Always + ports: + - containerPort: 80 + volumeMounts: + - name: config + mountPath: /app/configuration + volumes: + - name: config + configMap: + name: ocelot + items: + - key: configuration.json + path: configuration.json + imagePullSecrets: + - name: registry-key + diff --git a/k8s/ocelot/service.yaml b/k8s/ocelot/service.yaml new file mode 100644 index 000000000..6b376ca78 --- /dev/null +++ b/k8s/ocelot/service.yaml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: Service +metadata: + labels: + app: eshop + component: ocelot + name: ocelot +spec: + ports: + - port: 80 + selector: + app: eshop + component: ocelot diff --git a/src/Apigw/OcelotApiGw/Dockerfile b/src/Apigw/OcelotApiGw/Dockerfile index 06b842479..aec2dc4e3 100644 --- a/src/Apigw/OcelotApiGw/Dockerfile +++ b/src/Apigw/OcelotApiGw/Dockerfile @@ -4,9 +4,8 @@ EXPOSE 80 FROM microsoft/aspnetcore-build:2.0 AS build WORKDIR /src -COPY *.sln ./ COPY src/Apigw/OcelotApiGw/OcelotApiGw.csproj src/Apigw/OcelotApiGw/ -RUN dotnet restore +RUN dotnet restore src/Apigw/OcelotApiGw/ COPY . . WORKDIR /src/src/Apigw/OcelotApiGw RUN dotnet build -c Release -o /app diff --git a/src/Apigw/OcelotApiGw/OcelotApiGw.csproj b/src/Apigw/OcelotApiGw/OcelotApiGw.csproj index 2d176adde..4f6ce6e77 100644 --- a/src/Apigw/OcelotApiGw/OcelotApiGw.csproj +++ b/src/Apigw/OcelotApiGw/OcelotApiGw.csproj @@ -10,6 +10,7 @@ + diff --git a/src/Apigw/OcelotApiGw/Program.cs b/src/Apigw/OcelotApiGw/Program.cs index 43be3c57c..bd5230b96 100644 --- a/src/Apigw/OcelotApiGw/Program.cs +++ b/src/Apigw/OcelotApiGw/Program.cs @@ -19,6 +19,7 @@ namespace OcelotApiGw public static IWebHost BuildWebHost(string[] args) => WebHost.CreateDefaultBuilder(args) + .ConfigureAppConfiguration(ic => ic.AddJsonFile(Path.Combine("configuration", "configuration.json"))) .UseStartup() .Build(); } diff --git a/src/Apigw/OcelotApiGw/Startup.cs b/src/Apigw/OcelotApiGw/Startup.cs index 671bb72aa..8e99afaf2 100644 --- a/src/Apigw/OcelotApiGw/Startup.cs +++ b/src/Apigw/OcelotApiGw/Startup.cs @@ -2,22 +2,33 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using CacheManager.Core; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Ocelot.DependencyInjection; +using Ocelot.Middleware; namespace OcelotApiGw { public class Startup { - // 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 + + private readonly IConfiguration _cfg; + + public Startup(IConfiguration configuration) + { + _cfg = configuration; + } + public void ConfigureServices(IServiceCollection services) { + services.AddOcelot(_cfg); } - // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) @@ -25,10 +36,7 @@ namespace OcelotApiGw app.UseDeveloperExceptionPage(); } - app.Run(async (context) => - { - await context.Response.WriteAsync("Hello World!"); - }); + app.UseOcelot(); } } } diff --git a/src/Apigw/OcelotApiGw/configuration/configuration.json b/src/Apigw/OcelotApiGw/configuration/configuration.json new file mode 100644 index 000000000..6e9513993 --- /dev/null +++ b/src/Apigw/OcelotApiGw/configuration/configuration.json @@ -0,0 +1,58 @@ +{ + "ReRoutes": [ + { + "DownstreamPathTemplate": "/{everything}", + "DownstreamScheme": "http", + "DownstreamHost": "ordering.api", + "DownstreamPort": 80, + "UpstreamPathTemplate": "/orders-api/{everything}", + "UpstreamHttpMethod": [] + }, + { + "DownstreamPathTemplate": "/{everything}", + "DownstreamScheme": "http", + "DownstreamHost": "basket.api", + "DownstreamPort": 80, + "UpstreamPathTemplate": "/basket-api/{everything}", + "UpstreamHttpMethod": [] + }, + { + "DownstreamPathTemplate": "/{everything}", + "DownstreamScheme": "http", + "DownstreamHost": "catalog.api", + "DownstreamPort": 80, + "UpstreamPathTemplate": "/catalog-api/{everything}", + "UpstreamHttpMethod": [] + }, + { + "DownstreamPathTemplate": "/{everything}", + "DownstreamScheme": "http", + "DownstreamHost": "marketing.api", + "DownstreamPort": 80, + "UpstreamPathTemplate": "/marketing-api/{everything}", + "UpstreamHttpMethod": [] + }, + { + "DownstreamPathTemplate": "/{everything}", + "DownstreamScheme": "http", + "DownstreamHost": "payment.api", + "DownstreamPort": 80, + "UpstreamPathTemplate": "/payment-api/{everything}", + "UpstreamHttpMethod": [] + }, + { + "DownstreamPathTemplate": "/{everything}", + "DownstreamScheme": "http", + "DownstreamHost": "locations.api", + "DownstreamPort": 80, + "UpstreamPathTemplate": "/location-api/{everything}", + "UpstreamHttpMethod": [] + } + + ], + "GlobalConfiguration": { + "RequestIdKey": "OcRequestId", + "AdministrationPath": "/administration" + } + } + \ No newline at end of file diff --git a/xglobal.json b/xglobal.json new file mode 100644 index 000000000..2ab18dceb --- /dev/null +++ b/xglobal.json @@ -0,0 +1,5 @@ +{ + "sdk": { + "version":"2.1.2" + } +} \ No newline at end of file From 266ec51e54493c7b42a8619c5ebf89fdbfa2ae2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduard=20Tom=C3=A0s?= Date: Thu, 18 Jan 2018 14:45:46 +0100 Subject: [PATCH 03/78] updates to ocelot --- k8s/gen-k8s-env-aks.ps1 | 5 ++--- k8s/ingress.yaml | 8 ++++++-- src/Apigw/OcelotApiGw/Startup.cs | 6 ++++-- src/Apigw/OcelotApiGw/appsettings.json | 10 ++++++++++ 4 files changed, 22 insertions(+), 7 deletions(-) create mode 100644 src/Apigw/OcelotApiGw/appsettings.json diff --git a/k8s/gen-k8s-env-aks.ps1 b/k8s/gen-k8s-env-aks.ps1 index 6b8449565..1be5cd2c3 100644 --- a/k8s/gen-k8s-env-aks.ps1 +++ b/k8s/gen-k8s-env-aks.ps1 @@ -3,9 +3,8 @@ [parameter(Mandatory=$true)][string]$location, [parameter(Mandatory=$false)][string]$registryName, [parameter(Mandatory=$true)][string]$serviceName, - [parameter(Mandatory=$true)][string]$dnsName, [parameter(Mandatory=$true)][string]$createAcr=$true, - [parameter(Mandatory=$false)][int]$nodeCount=2, + [parameter(Mandatory=$false)][int]$nodeCount=3, [parameter(Mandatory=$false)][string]$nodeVMSize="Standard_D2_v2" ) @@ -21,7 +20,7 @@ if ($createAcr -eq $true) { # Create kubernetes orchestrator Write-Host "Creating kubernetes orchestrator..." -ForegroundColor Yellow -az aks create --resource-group=$resourceGroupName --name=$serviceName --dns-name-prefix=$dnsName --generate-ssh-keys --node-count=$nodeCount --node-vm-size=$nodeVMSize +az aks create --resource-group=$resourceGroupName --name=$serviceName --generate-ssh-keys --node-count=$nodeCount --node-vm-size=$nodeVMSize # Retrieve kubernetes cluster configuration and save it under ~/.kube/config az aks get-credentials --resource-group=$resourceGroupName --name=$serviceName diff --git a/k8s/ingress.yaml b/k8s/ingress.yaml index 813a88a36..59012bf26 100644 --- a/k8s/ingress.yaml +++ b/k8s/ingress.yaml @@ -37,7 +37,7 @@ spec: servicePort: 80 - path: /marketing-api backend: - serviceName: marketing + serviceName: ocelot servicePort: 80 - path: /payment-api backend: @@ -51,5 +51,9 @@ spec: backend: serviceName: webspa servicePort: 80 - + - path: /ocelot + backend: + serviceName: ocelot + servicePort: 80 + diff --git a/src/Apigw/OcelotApiGw/Startup.cs b/src/Apigw/OcelotApiGw/Startup.cs index 8e99afaf2..487793eda 100644 --- a/src/Apigw/OcelotApiGw/Startup.cs +++ b/src/Apigw/OcelotApiGw/Startup.cs @@ -29,14 +29,16 @@ namespace OcelotApiGw services.AddOcelot(_cfg); } - public void Configure(IApplicationBuilder app, IHostingEnvironment env) + public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } - app.UseOcelot(); + loggerFactory.AddConsole(_cfg.GetSection("Logging")); + + app.UseOcelot().Wait(); } } } diff --git a/src/Apigw/OcelotApiGw/appsettings.json b/src/Apigw/OcelotApiGw/appsettings.json new file mode 100644 index 000000000..426750e6a --- /dev/null +++ b/src/Apigw/OcelotApiGw/appsettings.json @@ -0,0 +1,10 @@ +{ + "Logging": { + "IncludeScopes": true, + "LogLevel": { + "Default": "Trace", + "System": "Information", + "Microsoft": "Information" + } + } +} \ No newline at end of file From b0e17c86a6675b8130f2054dd53e1ef215ee88a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduard=20Tom=C3=A0s?= Date: Wed, 24 Jan 2018 17:23:23 +0100 Subject: [PATCH 04/78] Updated deploy.ps1 --- k8s/deploy.ps1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/k8s/deploy.ps1 b/k8s/deploy.ps1 index 3372a5937..3d9c54b5c 100644 --- a/k8s/deploy.ps1 +++ b/k8s/deploy.ps1 @@ -65,7 +65,7 @@ if ($buildImages) { docker-compose -p .. -f ../docker-compose.yml build Write-Host "Pushing images to $registry/$dockerOrg..." -ForegroundColor Yellow - $services = ("basket.api", "catalog.api", "identity.api", "ordering.api", "marketing.api","payment.api","locations.api", "webmvc", "webspa", "webstatus") + $services = ("basket.api", "catalog.api", "identity.api", "ordering.api", "marketing.api","payment.api","locations.api", "webmvc", "webspa", "webstatus", "ocelotapigw") foreach ($service in $services) { $imageFqdn = if ($useDockerHub) {"$dockerOrg/${service}"} else {"$registry/$dockerOrg/${service}"} From c42a096ebbecb72b59d8e29bc8a263a1c34caa96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduard=20Tom=C3=A0s?= Date: Wed, 24 Jan 2018 17:24:03 +0100 Subject: [PATCH 05/78] Deleted frontend.yaml file as is no longer needed --- k8s/frontend.yaml | 47 ----------------------------------------------- 1 file changed, 47 deletions(-) delete mode 100644 k8s/frontend.yaml diff --git a/k8s/frontend.yaml b/k8s/frontend.yaml deleted file mode 100644 index 291542404..000000000 --- a/k8s/frontend.yaml +++ /dev/null @@ -1,47 +0,0 @@ -apiVersion: v1 -kind: Service -metadata: - labels: - app: eshop - component: frontend - name: frontend -spec: - ports: - - port: 80 - targetPort: 8080 - selector: - app: eshop - component: frontend - type: LoadBalancer ---- -apiVersion: extensions/v1beta1 -kind: Deployment -metadata: - name: frontend -spec: - template: - metadata: - labels: - app: eshop - component: frontend - spec: - containers: - - name: nginx - image: nginx:1.11.10-alpine - imagePullPolicy: IfNotPresent - ports: - - containerPort: 8080 - lifecycle: - preStop: - exec: - command: ["/usr/sbin/nginx","-s","quit"] - volumeMounts: - - name: config - mountPath: /etc/nginx - volumes: - - name: config - configMap: - name: config-files - items: - - key: nginx-conf - path: nginx.conf From 02f5e1158ad4eac44d481cab947d0ca5386106d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduard=20Tom=C3=A0s?= Date: Fri, 26 Jan 2018 16:09:36 +0000 Subject: [PATCH 06/78] Purchase BFF skeleton created --- docker-compose.dcproj | 1 + docker-compose.override.yml | 9 +- docker-compose.prod.yml | 1 + docker-compose.yml | 7 ++ eShopOnContainers-ServicesAndWebApps.sln | 56 ++++++++++- .../configuration/configuration.json | 8 ++ .../Controllers/BasketController.cs | 23 +++++ src/BFFs/PurchaseBff/Dockerfile | 18 ++++ .../Filters/AuthorizeCheckOperationFilter.cs | 33 +++++++ src/BFFs/PurchaseBff/Program.cs | 25 +++++ .../Properties/launchSettings.json | 29 ++++++ src/BFFs/PurchaseBff/PurchaseBff.csproj | 23 +++++ src/BFFs/PurchaseBff/Startup.cs | 96 +++++++++++++++++++ .../PurchaseBff/appsettings.Development.json | 10 ++ src/BFFs/PurchaseBff/appsettings.json | 15 +++ .../Basket.API/Properties/launchSettings.json | 2 +- .../Identity.API/Configuration/Config.cs | 31 +++++- .../Data/ConfigurationDbContextSeed.cs | 1 + .../Properties/launchSettings.json | 6 +- 19 files changed, 383 insertions(+), 11 deletions(-) create mode 100644 src/BFFs/PurchaseBff/Controllers/BasketController.cs create mode 100644 src/BFFs/PurchaseBff/Dockerfile create mode 100644 src/BFFs/PurchaseBff/Filters/AuthorizeCheckOperationFilter.cs create mode 100644 src/BFFs/PurchaseBff/Program.cs create mode 100644 src/BFFs/PurchaseBff/Properties/launchSettings.json create mode 100644 src/BFFs/PurchaseBff/PurchaseBff.csproj create mode 100644 src/BFFs/PurchaseBff/Startup.cs create mode 100644 src/BFFs/PurchaseBff/appsettings.Development.json create mode 100644 src/BFFs/PurchaseBff/appsettings.json diff --git a/docker-compose.dcproj b/docker-compose.dcproj index 5f12f7d62..d1f485b05 100644 --- a/docker-compose.dcproj +++ b/docker-compose.dcproj @@ -7,6 +7,7 @@ webmvc Linux 2.1 + LaunchBrowser diff --git a/docker-compose.override.yml b/docker-compose.override.yml index c8b952af5..93c9cde4b 100644 --- a/docker-compose.override.yml +++ b/docker-compose.override.yml @@ -57,6 +57,7 @@ services: - MarketingApiClient=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5110 - BasketApiClient=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5103 - OrderingApiClient=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5102 + - PurchaseBFFClient=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5120 - UseCustomizationData=True - ApplicationInsights__InstrumentationKey=${INSTRUMENTATION_KEY} - OrchestratorType=${ORCHESTRATOR_TYPE} @@ -203,7 +204,7 @@ services: sql.data: environment: - - sa_password=Pass@word + - SA_PASSWORD=Pass@word - ACCEPT_EULA=Y ports: - "5433:1433" @@ -227,3 +228,9 @@ services: ports: - "5200:80" + purchasebff: + environment: + - ASPNETCORE_ENVIRONMENT=Development + ports: + - "5120:80" + diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index 443f987f8..8c8d67b5d 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -64,6 +64,7 @@ services: - MarketingApiClient=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5110 - BasketApiClient=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5103 - OrderingApiClient=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5102 + - PurchaseBFFClient=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5120 - UseCustomizationData=True - ApplicationInsights__InstrumentationKey=${INSTRUMENTATION_KEY} - OrchestratorType=${ORCHESTRATOR_TYPE} diff --git a/docker-compose.yml b/docker-compose.yml index bda0acded..18a3273f8 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -113,3 +113,10 @@ services: build: context: . dockerfile: src/Apigw/OcelotApiGw/Dockerfile + + purchasebff: + image: eshop/purchasebff + build: + context: . + dockerfile: src/BFFs/PurchaseBff/Dockerfile + diff --git a/eShopOnContainers-ServicesAndWebApps.sln b/eShopOnContainers-ServicesAndWebApps.sln index 4a07ad380..7d25f9b3a 100644 --- a/eShopOnContainers-ServicesAndWebApps.sln +++ b/eShopOnContainers-ServicesAndWebApps.sln @@ -99,7 +99,11 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WebHost.Customization", "sr EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ApiGw", "ApiGw", "{7A58AA20-67F3-48F3-88C8-24EBFE621792}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OcelotApiGw", "src\Apigw\OcelotApiGw\OcelotApiGw.csproj", "{E0C5162E-DF26-4341-9E51-14AE800D7505}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OcelotApiGw", "src\Apigw\OcelotApiGw\OcelotApiGw.csproj", "{E0C5162E-DF26-4341-9E51-14AE800D7505}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "BFFs", "BFFs", "{EA378316-9D49-4A6B-858E-D4A25F948A74}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PurchaseBff", "src\BFFs\PurchaseBff\PurchaseBff.csproj", "{F77054A6-5808-45D7-88EB-CD92B3FDB889}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -1363,6 +1367,54 @@ Global {E0C5162E-DF26-4341-9E51-14AE800D7505}.Release|x64.Build.0 = Release|Any CPU {E0C5162E-DF26-4341-9E51-14AE800D7505}.Release|x86.ActiveCfg = Release|Any CPU {E0C5162E-DF26-4341-9E51-14AE800D7505}.Release|x86.Build.0 = Release|Any CPU + {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU + {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU + {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Ad-Hoc|ARM.ActiveCfg = Debug|Any CPU + {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Ad-Hoc|ARM.Build.0 = Debug|Any CPU + {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU + {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU + {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU + {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Ad-Hoc|x64.ActiveCfg = Debug|Any CPU + {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Ad-Hoc|x64.Build.0 = Debug|Any CPU + {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Ad-Hoc|x86.ActiveCfg = Debug|Any CPU + {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Ad-Hoc|x86.Build.0 = Debug|Any CPU + {F77054A6-5808-45D7-88EB-CD92B3FDB889}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU + {F77054A6-5808-45D7-88EB-CD92B3FDB889}.AppStore|Any CPU.Build.0 = Debug|Any CPU + {F77054A6-5808-45D7-88EB-CD92B3FDB889}.AppStore|ARM.ActiveCfg = Debug|Any CPU + {F77054A6-5808-45D7-88EB-CD92B3FDB889}.AppStore|ARM.Build.0 = Debug|Any CPU + {F77054A6-5808-45D7-88EB-CD92B3FDB889}.AppStore|iPhone.ActiveCfg = Debug|Any CPU + {F77054A6-5808-45D7-88EB-CD92B3FDB889}.AppStore|iPhone.Build.0 = Debug|Any CPU + {F77054A6-5808-45D7-88EB-CD92B3FDB889}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {F77054A6-5808-45D7-88EB-CD92B3FDB889}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU + {F77054A6-5808-45D7-88EB-CD92B3FDB889}.AppStore|x64.ActiveCfg = Debug|Any CPU + {F77054A6-5808-45D7-88EB-CD92B3FDB889}.AppStore|x64.Build.0 = Debug|Any CPU + {F77054A6-5808-45D7-88EB-CD92B3FDB889}.AppStore|x86.ActiveCfg = Debug|Any CPU + {F77054A6-5808-45D7-88EB-CD92B3FDB889}.AppStore|x86.Build.0 = Debug|Any CPU + {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Debug|ARM.ActiveCfg = Debug|Any CPU + {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Debug|ARM.Build.0 = Debug|Any CPU + {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Debug|iPhone.Build.0 = Debug|Any CPU + {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Debug|x64.ActiveCfg = Debug|Any CPU + {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Debug|x64.Build.0 = Debug|Any CPU + {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Debug|x86.ActiveCfg = Debug|Any CPU + {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Debug|x86.Build.0 = Debug|Any CPU + {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Release|Any CPU.Build.0 = Release|Any CPU + {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Release|ARM.ActiveCfg = Release|Any CPU + {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Release|ARM.Build.0 = Release|Any CPU + {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Release|iPhone.ActiveCfg = Release|Any CPU + {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Release|iPhone.Build.0 = Release|Any CPU + {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Release|x64.ActiveCfg = Release|Any CPU + {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Release|x64.Build.0 = Release|Any CPU + {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Release|x86.ActiveCfg = Release|Any CPU + {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -1411,6 +1463,8 @@ Global {15F4B3AA-89B6-4A0D-9051-414305974781} = {1815B651-941C-466B-AE33-D1D7EEB8F77F} {7A58AA20-67F3-48F3-88C8-24EBFE621792} = {932D8224-11F6-4D07-B109-DA28AD288A63} {E0C5162E-DF26-4341-9E51-14AE800D7505} = {7A58AA20-67F3-48F3-88C8-24EBFE621792} + {EA378316-9D49-4A6B-858E-D4A25F948A74} = {932D8224-11F6-4D07-B109-DA28AD288A63} + {F77054A6-5808-45D7-88EB-CD92B3FDB889} = {EA378316-9D49-4A6B-858E-D4A25F948A74} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {25728519-5F0F-4973-8A64-0A81EB4EA8D9} diff --git a/src/Apigw/OcelotApiGw/configuration/configuration.json b/src/Apigw/OcelotApiGw/configuration/configuration.json index 6e9513993..973f6874c 100644 --- a/src/Apigw/OcelotApiGw/configuration/configuration.json +++ b/src/Apigw/OcelotApiGw/configuration/configuration.json @@ -1,5 +1,13 @@ { "ReRoutes": [ + { + "DownstreamPathTemplate": "/{everything}", + "DownstreamScheme": "http", + "DownstreamHost": "catalog.api", + "DownstreamPort": 80, + "UpstreamPathTemplate": "/purchase-bff/catalog/{everything}", + "UpstreamHttpMethod": [ "GET" ] + }, { "DownstreamPathTemplate": "/{everything}", "DownstreamScheme": "http", diff --git a/src/BFFs/PurchaseBff/Controllers/BasketController.cs b/src/BFFs/PurchaseBff/Controllers/BasketController.cs new file mode 100644 index 000000000..7c875c9c4 --- /dev/null +++ b/src/BFFs/PurchaseBff/Controllers/BasketController.cs @@ -0,0 +1,23 @@ +using Microsoft.AspNetCore.Mvc; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace PurchaseBff.Controllers +{ + [Route("api/v1/[controller]")] + public class BasketController : Controller + { + [HttpPost("items/{catalogItemId}")] + public async Task AddBasketItem(int catalogItemId) + { + // Step 1: Get the item from catalog + // Step 2: Get current basket status + // Step 3: Merge current status with new product + // Step 4: Update basket + + return Ok(); + } + } +} diff --git a/src/BFFs/PurchaseBff/Dockerfile b/src/BFFs/PurchaseBff/Dockerfile new file mode 100644 index 000000000..500f8406f --- /dev/null +++ b/src/BFFs/PurchaseBff/Dockerfile @@ -0,0 +1,18 @@ +FROM microsoft/aspnetcore:2.0.5 AS base +WORKDIR /app +EXPOSE 80 + +FROM microsoft/aspnetcore-build:2.0 AS build +WORKDIR /src +COPY . . +RUN dotnet restore -nowarn:msb3202,nu1503 +WORKDIR /src/src/BFFs/PurchaseBff +RUN dotnet build --no-restore -c Release -o /app + +FROM build AS publish +RUN dotnet publish --no-restore -c Release -o /app + +FROM base AS final +WORKDIR /app +COPY --from=publish /app . +ENTRYPOINT ["dotnet", "PurchaseBff.dll"] diff --git a/src/BFFs/PurchaseBff/Filters/AuthorizeCheckOperationFilter.cs b/src/BFFs/PurchaseBff/Filters/AuthorizeCheckOperationFilter.cs new file mode 100644 index 000000000..31b5bf99e --- /dev/null +++ b/src/BFFs/PurchaseBff/Filters/AuthorizeCheckOperationFilter.cs @@ -0,0 +1,33 @@ +namespace PurchaseBff.Filters +{ + using Microsoft.AspNetCore.Authorization; + using Swashbuckle.AspNetCore.Swagger; + using Swashbuckle.AspNetCore.SwaggerGen; + using System.Collections.Generic; + using System.Linq; + + namespace Basket.API.Infrastructure.Filters + { + public class AuthorizeCheckOperationFilter : IOperationFilter + { + public void Apply(Operation operation, OperationFilterContext context) + { + // Check for authorize attribute + var hasAuthorize = context.ApiDescription.ControllerAttributes().OfType().Any() || + context.ApiDescription.ActionAttributes().OfType().Any(); + + if (hasAuthorize) + { + operation.Responses.Add("401", new Response { Description = "Unauthorized" }); + operation.Responses.Add("403", new Response { Description = "Forbidden" }); + + operation.Security = new List>>(); + operation.Security.Add(new Dictionary> + { + { "oauth2", new [] { "purchasebff" } } + }); + } + } + } + } +} diff --git a/src/BFFs/PurchaseBff/Program.cs b/src/BFFs/PurchaseBff/Program.cs new file mode 100644 index 000000000..fe7210968 --- /dev/null +++ b/src/BFFs/PurchaseBff/Program.cs @@ -0,0 +1,25 @@ +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; + +namespace PurchaseBff +{ + public class Program + { + public static void Main(string[] args) + { + BuildWebHost(args).Run(); + } + + public static IWebHost BuildWebHost(string[] args) => + WebHost.CreateDefaultBuilder(args) + .UseStartup() + .Build(); + } +} diff --git a/src/BFFs/PurchaseBff/Properties/launchSettings.json b/src/BFFs/PurchaseBff/Properties/launchSettings.json new file mode 100644 index 000000000..709d1b89a --- /dev/null +++ b/src/BFFs/PurchaseBff/Properties/launchSettings.json @@ -0,0 +1,29 @@ +{ + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:61631/", + "sslPort": 0 + } + }, + "profiles": { + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "api/values", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "PurchaseForMvc": { + "commandName": "Project", + "launchBrowser": true, + "launchUrl": "api/values", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "applicationUrl": "http://localhost:61632/" + } + } +} diff --git a/src/BFFs/PurchaseBff/PurchaseBff.csproj b/src/BFFs/PurchaseBff/PurchaseBff.csproj new file mode 100644 index 000000000..b986e743f --- /dev/null +++ b/src/BFFs/PurchaseBff/PurchaseBff.csproj @@ -0,0 +1,23 @@ + + + + netcoreapp2.0 + PurchaseBff + PurchaseBff + ..\..\..\docker-compose.dcproj + + + + + + + + + + + + + + + + diff --git a/src/BFFs/PurchaseBff/Startup.cs b/src/BFFs/PurchaseBff/Startup.cs new file mode 100644 index 000000000..e82ee91fd --- /dev/null +++ b/src/BFFs/PurchaseBff/Startup.cs @@ -0,0 +1,96 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using PurchaseBff.Filters.Basket.API.Infrastructure.Filters; +using Swashbuckle.AspNetCore.Swagger; + +namespace PurchaseBff +{ + public class Startup + { + public Startup(IConfiguration configuration) + { + Configuration = configuration; + } + + public IConfiguration Configuration { get; } + + // This method gets called by the runtime. Use this method to add services to the container. + public void ConfigureServices(IServiceCollection services) + { + services.AddMvc(); + + services.AddSwaggerGen(options => + { + options.DescribeAllEnumsAsStrings(); + options.SwaggerDoc("v1", new Swashbuckle.AspNetCore.Swagger.Info + { + Title = "Purchase BFF API Gateway", + Version = "v1", + Description = "BFF API Gateway for Purchase features", + TermsOfService = "Terms Of Service" + }); + + options.AddSecurityDefinition("oauth2", new OAuth2Scheme + { + Type = "oauth2", + Flow = "implicit", + AuthorizationUrl = $"{Configuration.GetValue("IdentityUrlExternal")}/connect/authorize", + TokenUrl = $"{Configuration.GetValue("IdentityUrlExternal")}/connect/token", + Scopes = new Dictionary() + { + { "purchasebff", "Purchase BFF API Gateway" } + } + }); + + options.OperationFilter(); + }); + + services.AddCors(options => + { + options.AddPolicy("CorsPolicy", + builder => builder.AllowAnyOrigin() + .AllowAnyMethod() + .AllowAnyHeader() + .AllowCredentials()); + }); + } + + // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. + public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) + { + + var pathBase = Configuration["PATH_BASE"]; + if (!string.IsNullOrEmpty(pathBase)) + { + loggerFactory.CreateLogger("init").LogDebug($"Using PATH BASE '{pathBase}'"); + app.UsePathBase(pathBase); + } + + app.UseCors("CorsPolicy"); + + if (env.IsDevelopment()) + { + app.UseDeveloperExceptionPage(); + } + + app.UseMvc(); + + app.UseSwagger().UseSwaggerUI(c => + { + c.SwaggerEndpoint($"{ (!string.IsNullOrEmpty(pathBase) ? pathBase : string.Empty) }/swagger/v1/swagger.json", "Purchase BFF V1"); + c.ConfigureOAuth2("purchasebffwaggerui", "", "", "Purchase BFF Swagger UI"); + }); + + + } + } +} diff --git a/src/BFFs/PurchaseBff/appsettings.Development.json b/src/BFFs/PurchaseBff/appsettings.Development.json new file mode 100644 index 000000000..fa8ce71a9 --- /dev/null +++ b/src/BFFs/PurchaseBff/appsettings.Development.json @@ -0,0 +1,10 @@ +{ + "Logging": { + "IncludeScopes": false, + "LogLevel": { + "Default": "Debug", + "System": "Information", + "Microsoft": "Information" + } + } +} diff --git a/src/BFFs/PurchaseBff/appsettings.json b/src/BFFs/PurchaseBff/appsettings.json new file mode 100644 index 000000000..26bb0ac7a --- /dev/null +++ b/src/BFFs/PurchaseBff/appsettings.json @@ -0,0 +1,15 @@ +{ + "Logging": { + "IncludeScopes": false, + "Debug": { + "LogLevel": { + "Default": "Warning" + } + }, + "Console": { + "LogLevel": { + "Default": "Warning" + } + } + } +} diff --git a/src/Services/Basket/Basket.API/Properties/launchSettings.json b/src/Services/Basket/Basket.API/Properties/launchSettings.json index 36effc287..a397c4eb3 100644 --- a/src/Services/Basket/Basket.API/Properties/launchSettings.json +++ b/src/Services/Basket/Basket.API/Properties/launchSettings.json @@ -3,7 +3,7 @@ "windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": { - "applicationUrl": "http://localhost:5103/", + "applicationUrl": "http://localhost:63335/", "sslPort": 0 } }, diff --git a/src/Services/Identity/Identity.API/Configuration/Config.cs b/src/Services/Identity/Identity.API/Configuration/Config.cs index 969b86aa1..9905a04d3 100644 --- a/src/Services/Identity/Identity.API/Configuration/Config.cs +++ b/src/Services/Identity/Identity.API/Configuration/Config.cs @@ -14,7 +14,8 @@ namespace Microsoft.eShopOnContainers.Services.Identity.API.Configuration new ApiResource("orders", "Orders Service"), new ApiResource("basket", "Basket Service"), new ApiResource("marketing", "Marketing Service"), - new ApiResource("locations", "Locations Service") + new ApiResource("locations", "Locations Service"), + new ApiResource("purchasebff", "Purchase BFF") }; } @@ -52,7 +53,8 @@ namespace Microsoft.eShopOnContainers.Services.Identity.API.Configuration "orders", "basket", "locations", - "marketing" + "marketing", + "purchasebff" } }, new Client @@ -78,7 +80,8 @@ namespace Microsoft.eShopOnContainers.Services.Identity.API.Configuration "orders", "basket", "locations", - "marketing" + "marketing", + "purchasebff" }, //Allow requesting refresh tokens for long lived API access AllowOfflineAccess = true, @@ -114,7 +117,8 @@ namespace Microsoft.eShopOnContainers.Services.Identity.API.Configuration "orders", "basket", "locations", - "marketing" + "marketing", + "purchasebff" }, }, new Client @@ -146,7 +150,8 @@ namespace Microsoft.eShopOnContainers.Services.Identity.API.Configuration "orders", "basket", "locations", - "marketing" + "marketing", + "purchasebff" }, }, new Client @@ -208,7 +213,23 @@ namespace Microsoft.eShopOnContainers.Services.Identity.API.Configuration { "orders" } + }, + new Client + { + ClientId = "purchasebffwaggerui", + ClientName = "Purchase BFF Swagger UI", + AllowedGrantTypes = GrantTypes.Implicit, + AllowAccessTokensViaBrowser = true, + + RedirectUris = { $"{clientsUrl["PurchaseBFF"]}/swagger/o2c.html" }, + PostLogoutRedirectUris = { $"{clientsUrl["PurchaseBFF"]}/swagger/" }, + + AllowedScopes = + { + "purchasebff" + } } + }; } } diff --git a/src/Services/Identity/Identity.API/Data/ConfigurationDbContextSeed.cs b/src/Services/Identity/Identity.API/Data/ConfigurationDbContextSeed.cs index bb41f0d0a..0875361be 100644 --- a/src/Services/Identity/Identity.API/Data/ConfigurationDbContextSeed.cs +++ b/src/Services/Identity/Identity.API/Data/ConfigurationDbContextSeed.cs @@ -23,6 +23,7 @@ namespace Microsoft.eShopOnContainers.Services.Identity.API.Data clientUrls.Add("MarketingApi", configuration.GetValue("MarketingApiClient")); clientUrls.Add("BasketApi", configuration.GetValue("BasketApiClient")); clientUrls.Add("OrderingApi", configuration.GetValue("OrderingApiClient")); + clientUrls.Add("PurchaseBFF", configuration.GetValue("PurchaseBFFClient")); if (!context.Clients.Any()) { diff --git a/src/Services/Payment/Payment.API/Properties/launchSettings.json b/src/Services/Payment/Payment.API/Properties/launchSettings.json index faf310f83..5eac4c092 100644 --- a/src/Services/Payment/Payment.API/Properties/launchSettings.json +++ b/src/Services/Payment/Payment.API/Properties/launchSettings.json @@ -1,9 +1,9 @@ -{ +{ "iisSettings": { "windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": { - "applicationUrl": "http://localhost:3330/", + "applicationUrl": "http://localhost:63336/", "sslPort": 0 } }, @@ -26,4 +26,4 @@ "applicationUrl": "http://localhost:3331" } } -} +} \ No newline at end of file From 47a33ddd05a4c5e00f311059a4a115899c7ce710 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduard=20Tom=C3=A0s?= Date: Mon, 29 Jan 2018 15:58:08 +0000 Subject: [PATCH 07/78] BFF Purchase - WIP --- .dockerignore | 3 +- docker-compose.override.yml | 2 ++ src/BFFs/PurchaseBff/Config/UrlsConfig.cs | 23 ++++++++++++ .../Controllers/BasketController.cs | 32 +++++++++++++++-- .../PurchaseBff/Controllers/HomeController.cs | 18 ++++++++++ .../Models/AddBasketItemRequest.cs | 20 +++++++++++ src/BFFs/PurchaseBff/Models/BasketData.cs | 31 ++++++++++++++++ src/BFFs/PurchaseBff/Models/CatalogItem.cs | 20 +++++++++++ src/BFFs/PurchaseBff/Program.cs | 4 +++ src/BFFs/PurchaseBff/PurchaseBff.csproj | 4 +++ .../PurchaseBff/Services/BasketService.cs | 34 ++++++++++++++++++ .../PurchaseBff/Services/CatalogService.cs | 35 +++++++++++++++++++ .../PurchaseBff/Services/IBasketService.cs | 13 +++++++ .../PurchaseBff/Services/ICatalogService.cs | 13 +++++++ src/BFFs/PurchaseBff/Startup.cs | 11 ++++++ .../PurchaseBff/appsettings.Development.json | 10 ------ .../PurchaseBff/appsettings.localhost.json | 6 ++++ .../Basket.API/Properties/launchSettings.json | 4 +-- .../Properties/launchSettings.json | 3 +- .../Properties/launchSettings.json | 2 +- 20 files changed, 271 insertions(+), 17 deletions(-) create mode 100644 src/BFFs/PurchaseBff/Config/UrlsConfig.cs create mode 100644 src/BFFs/PurchaseBff/Controllers/HomeController.cs create mode 100644 src/BFFs/PurchaseBff/Models/AddBasketItemRequest.cs create mode 100644 src/BFFs/PurchaseBff/Models/BasketData.cs create mode 100644 src/BFFs/PurchaseBff/Models/CatalogItem.cs create mode 100644 src/BFFs/PurchaseBff/Services/BasketService.cs create mode 100644 src/BFFs/PurchaseBff/Services/CatalogService.cs create mode 100644 src/BFFs/PurchaseBff/Services/IBasketService.cs create mode 100644 src/BFFs/PurchaseBff/Services/ICatalogService.cs delete mode 100644 src/BFFs/PurchaseBff/appsettings.Development.json create mode 100644 src/BFFs/PurchaseBff/appsettings.localhost.json diff --git a/.dockerignore b/.dockerignore index b5e7cb4f3..4c8d57b9a 100644 --- a/.dockerignore +++ b/.dockerignore @@ -29,4 +29,5 @@ cli-linux **/node_modules/ **/bower_components/ **/wwwroot/lib/ -global.json \ No newline at end of file +global.json +**/appsettings.localhost.json \ No newline at end of file diff --git a/docker-compose.override.yml b/docker-compose.override.yml index 93c9cde4b..c16d3d109 100644 --- a/docker-compose.override.yml +++ b/docker-compose.override.yml @@ -231,6 +231,8 @@ services: purchasebff: environment: - ASPNETCORE_ENVIRONMENT=Development + - urls__basket=http://basket.api + - urls__catalog=http://catalog.api ports: - "5120:80" diff --git a/src/BFFs/PurchaseBff/Config/UrlsConfig.cs b/src/BFFs/PurchaseBff/Config/UrlsConfig.cs new file mode 100644 index 000000000..5c43bdfa7 --- /dev/null +++ b/src/BFFs/PurchaseBff/Config/UrlsConfig.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace PurchaseBff.Config +{ + public class UrlsConfig + { + public class CatalogOperations + { + public static string GetItemById(int id) => $"/api/v1/catalog/items/{id}"; + } + + public class BasketOperations + { + public static string GetItemById(string id) => $"/api/v1/basket/{id}"; + } + + public string Basket { get; set; } + public string Catalog { get; set; } + } +} diff --git a/src/BFFs/PurchaseBff/Controllers/BasketController.cs b/src/BFFs/PurchaseBff/Controllers/BasketController.cs index 7c875c9c4..74d5bec66 100644 --- a/src/BFFs/PurchaseBff/Controllers/BasketController.cs +++ b/src/BFFs/PurchaseBff/Controllers/BasketController.cs @@ -1,4 +1,6 @@ using Microsoft.AspNetCore.Mvc; +using PurchaseBff.Models; +using PurchaseBff.Services; using System; using System.Collections.Generic; using System.Linq; @@ -9,12 +11,38 @@ namespace PurchaseBff.Controllers [Route("api/v1/[controller]")] public class BasketController : Controller { - [HttpPost("items/{catalogItemId}")] - public async Task AddBasketItem(int catalogItemId) + private readonly ICatalogService _catalog; + private readonly IBasketService _basket; + public BasketController(ICatalogService catalogService, IBasketService basketService) { + _catalog = catalogService; + _basket = basketService; + } + + [HttpPost("items")] + public async Task AddBasketItem([FromBody] AddBasketItemRequest data) + { + if (data == null || data.Quantity == 0) + { + return BadRequest("Invalid payload"); + } + // Step 1: Get the item from catalog + var item = await _catalog.GetCatalogItem(data.CatalogItemId); // Step 2: Get current basket status + var currentBasket = await _basket.GetById(data.BasketId); // Step 3: Merge current status with new product + currentBasket.Items.Add(new BasketDataItem() + { + OldUnitPrice = item.Price, + UnitPrice = item.Price, + PictureUrl = item.PictureUri, + ProductId = item.Id.ToString(), + ProductName = item.Name, + Quantity = data.Quantity, + Id = item.Id.ToString() + }); + // Step 4: Update basket return Ok(); diff --git a/src/BFFs/PurchaseBff/Controllers/HomeController.cs b/src/BFFs/PurchaseBff/Controllers/HomeController.cs new file mode 100644 index 000000000..f54ec94ad --- /dev/null +++ b/src/BFFs/PurchaseBff/Controllers/HomeController.cs @@ -0,0 +1,18 @@ +using Microsoft.AspNetCore.Mvc; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace PurchaseBff.Controllers +{ + [Route("")] + public class HomeController : Controller + { + [HttpGet()] + public IActionResult Index() + { + return new RedirectResult("~/swagger"); + } + } +} diff --git a/src/BFFs/PurchaseBff/Models/AddBasketItemRequest.cs b/src/BFFs/PurchaseBff/Models/AddBasketItemRequest.cs new file mode 100644 index 000000000..7c589a233 --- /dev/null +++ b/src/BFFs/PurchaseBff/Models/AddBasketItemRequest.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace PurchaseBff.Models +{ + public class AddBasketItemRequest + { + public int CatalogItemId { get; set; } + public string BasketId { get; set; } + + public int Quantity { get; set; } + + public AddBasketItemRequest() + { + Quantity = 1; + } + } +} diff --git a/src/BFFs/PurchaseBff/Models/BasketData.cs b/src/BFFs/PurchaseBff/Models/BasketData.cs new file mode 100644 index 000000000..3f14660a7 --- /dev/null +++ b/src/BFFs/PurchaseBff/Models/BasketData.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace PurchaseBff.Models +{ + public class BasketData + { + public string BuyerId { get; set; } + public List Items { get; set; } + + public BasketData(string buyerId) + { + BuyerId = buyerId; + Items = new List(); + } + } + + public class BasketDataItem + { + public string Id { get; set; } + public string ProductId { get; set; } + public string ProductName { get; set; } + public decimal UnitPrice { get; set; } + public decimal OldUnitPrice { get; set; } + public int Quantity { get; set; } + public string PictureUrl { get; set; } + + } +} diff --git a/src/BFFs/PurchaseBff/Models/CatalogItem.cs b/src/BFFs/PurchaseBff/Models/CatalogItem.cs new file mode 100644 index 000000000..13b0a65c0 --- /dev/null +++ b/src/BFFs/PurchaseBff/Models/CatalogItem.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace PurchaseBff.Models +{ + public class CatalogItem + { + public int Id { get; set; } + + public string Name { get; set; } + + public decimal Price { get; set; } + + + public string PictureUri { get; set; } + + } +} diff --git a/src/BFFs/PurchaseBff/Program.cs b/src/BFFs/PurchaseBff/Program.cs index fe7210968..1c5b19865 100644 --- a/src/BFFs/PurchaseBff/Program.cs +++ b/src/BFFs/PurchaseBff/Program.cs @@ -20,6 +20,10 @@ namespace PurchaseBff public static IWebHost BuildWebHost(string[] args) => WebHost.CreateDefaultBuilder(args) .UseStartup() + .ConfigureAppConfiguration(cb => + { + cb.AddJsonFile("appsettings.localhost.json", optional: true); + }) .Build(); } } diff --git a/src/BFFs/PurchaseBff/PurchaseBff.csproj b/src/BFFs/PurchaseBff/PurchaseBff.csproj index b986e743f..dd7a5909e 100644 --- a/src/BFFs/PurchaseBff/PurchaseBff.csproj +++ b/src/BFFs/PurchaseBff/PurchaseBff.csproj @@ -20,4 +20,8 @@ + + + + diff --git a/src/BFFs/PurchaseBff/Services/BasketService.cs b/src/BFFs/PurchaseBff/Services/BasketService.cs new file mode 100644 index 000000000..023f587aa --- /dev/null +++ b/src/BFFs/PurchaseBff/Services/BasketService.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.eShopOnContainers.BuildingBlocks.Resilience.Http; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Newtonsoft.Json; +using PurchaseBff.Config; +using PurchaseBff.Models; + +namespace PurchaseBff.Services +{ + public class BasketService : IBasketService + { + + private readonly IHttpClient _apiClient; + private readonly ILogger _logger; + private readonly UrlsConfig _urls; + public BasketService(IHttpClient httpClient, ILogger logger, IOptionsSnapshot config) + { + _apiClient = httpClient; + _logger = logger; + _urls = config.Value; + } + + public async Task GetById(string id) + { + var data = await _apiClient.GetStringAsync(_urls.Basket + UrlsConfig.BasketOperations.GetItemById(id)); + var basket = JsonConvert.DeserializeObject(data); + return basket; + } + } +} diff --git a/src/BFFs/PurchaseBff/Services/CatalogService.cs b/src/BFFs/PurchaseBff/Services/CatalogService.cs new file mode 100644 index 000000000..071c162b4 --- /dev/null +++ b/src/BFFs/PurchaseBff/Services/CatalogService.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.eShopOnContainers.BuildingBlocks.Resilience.Http; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Newtonsoft.Json; +using PurchaseBff.Config; +using PurchaseBff.Models; + +namespace PurchaseBff.Services +{ + public class CatalogService : ICatalogService + { + + private readonly IHttpClient _apiClient; + private readonly ILogger _logger; + private readonly UrlsConfig _urls; + + public CatalogService(IHttpClient httpClient, ILogger logger, IOptionsSnapshot config) + { + _apiClient = httpClient; + _logger = logger; + _urls = config.Value; + } + + public async Task GetCatalogItem(int id) + { + var data = await _apiClient.GetStringAsync(_urls.Catalog + UrlsConfig.CatalogOperations.GetItemById(id)); + var item = JsonConvert.DeserializeObject(data); + return item; + } + } +} diff --git a/src/BFFs/PurchaseBff/Services/IBasketService.cs b/src/BFFs/PurchaseBff/Services/IBasketService.cs new file mode 100644 index 000000000..b4bafc461 --- /dev/null +++ b/src/BFFs/PurchaseBff/Services/IBasketService.cs @@ -0,0 +1,13 @@ +using PurchaseBff.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace PurchaseBff.Services +{ + public interface IBasketService + { + Task GetById(string id); + } +} diff --git a/src/BFFs/PurchaseBff/Services/ICatalogService.cs b/src/BFFs/PurchaseBff/Services/ICatalogService.cs new file mode 100644 index 000000000..f7caaf6e3 --- /dev/null +++ b/src/BFFs/PurchaseBff/Services/ICatalogService.cs @@ -0,0 +1,13 @@ +using PurchaseBff.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace PurchaseBff.Services +{ + public interface ICatalogService + { + Task GetCatalogItem(int id); + } +} diff --git a/src/BFFs/PurchaseBff/Startup.cs b/src/BFFs/PurchaseBff/Startup.cs index e82ee91fd..689e2925e 100644 --- a/src/BFFs/PurchaseBff/Startup.cs +++ b/src/BFFs/PurchaseBff/Startup.cs @@ -5,11 +5,14 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; +using Microsoft.eShopOnContainers.BuildingBlocks.Resilience.Http; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; +using PurchaseBff.Config; using PurchaseBff.Filters.Basket.API.Infrastructure.Filters; +using PurchaseBff.Services; using Swashbuckle.AspNetCore.Swagger; namespace PurchaseBff @@ -26,6 +29,14 @@ namespace PurchaseBff // This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { + services.AddSingleton(); + services.AddSingleton(); + services.AddTransient(); + services.AddTransient(); + + services.AddOptions(); + services.Configure(Configuration.GetSection("urls")); + services.AddMvc(); services.AddSwaggerGen(options => diff --git a/src/BFFs/PurchaseBff/appsettings.Development.json b/src/BFFs/PurchaseBff/appsettings.Development.json deleted file mode 100644 index fa8ce71a9..000000000 --- a/src/BFFs/PurchaseBff/appsettings.Development.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "Logging": { - "IncludeScopes": false, - "LogLevel": { - "Default": "Debug", - "System": "Information", - "Microsoft": "Information" - } - } -} diff --git a/src/BFFs/PurchaseBff/appsettings.localhost.json b/src/BFFs/PurchaseBff/appsettings.localhost.json new file mode 100644 index 000000000..8267075d7 --- /dev/null +++ b/src/BFFs/PurchaseBff/appsettings.localhost.json @@ -0,0 +1,6 @@ +{ + "urls": { + "basket": "http://localhost:55105", + "catalog": "http://localhost:55101" + } +} diff --git a/src/Services/Basket/Basket.API/Properties/launchSettings.json b/src/Services/Basket/Basket.API/Properties/launchSettings.json index a397c4eb3..13aaf431f 100644 --- a/src/Services/Basket/Basket.API/Properties/launchSettings.json +++ b/src/Services/Basket/Basket.API/Properties/launchSettings.json @@ -3,7 +3,7 @@ "windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": { - "applicationUrl": "http://localhost:63335/", + "applicationUrl": "http://localhost:55105/", "sslPort": 0 } }, @@ -19,7 +19,7 @@ "Microsoft.eShopOnContainers.Services.Basket.API": { "commandName": "Project", "launchBrowser": true, - "launchUrl": "http://localhost:5000/swagger", + "launchUrl": "http://localhost:55105/", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } diff --git a/src/Services/Catalog/Catalog.API/Properties/launchSettings.json b/src/Services/Catalog/Catalog.API/Properties/launchSettings.json index 1bf8eb1f3..0357943bb 100644 --- a/src/Services/Catalog/Catalog.API/Properties/launchSettings.json +++ b/src/Services/Catalog/Catalog.API/Properties/launchSettings.json @@ -3,7 +3,7 @@ "windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": { - "applicationUrl": "http://localhost:5101", + "applicationUrl": "http://localhost:55101", "sslPort": 0 } }, @@ -19,6 +19,7 @@ "Microsoft.eShopOnContainers.Services.Catalog.API": { "commandName": "Project", "launchBrowser": true, + "launchUrl": "http://localhost:55101/", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } diff --git a/src/Services/Marketing/Marketing.API/Properties/launchSettings.json b/src/Services/Marketing/Marketing.API/Properties/launchSettings.json index e222e065d..dea046099 100644 --- a/src/Services/Marketing/Marketing.API/Properties/launchSettings.json +++ b/src/Services/Marketing/Marketing.API/Properties/launchSettings.json @@ -3,7 +3,7 @@ "windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": { - "applicationUrl": "http://localhost:5110", + "applicationUrl": "http://localhost:63455/", "sslPort": 0 } }, From dcb9b87361d062804bb67b535be2b46061d0187e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduard=20Tom=C3=A0s?= Date: Tue, 30 Jan 2018 08:50:44 +0000 Subject: [PATCH 08/78] --- docker-compose.override.yml | 2 + src/Apigw/OcelotApiGw/Startup.cs | 11 ++++ .../configuration/configuration.json | 12 ++++ src/BFFs/PurchaseBff/Startup.cs | 24 ++++++++ .../PurchaseBff/appsettings.localhost.json | 3 +- .../Basket.API/Properties/launchSettings.json | 4 +- .../Properties/launchSettings.json | 6 +- src/Web/WebMVC/Controllers/TestController.cs | 56 +++++++++++++++++++ 8 files changed, 112 insertions(+), 6 deletions(-) create mode 100644 src/Web/WebMVC/Controllers/TestController.cs diff --git a/docker-compose.override.yml b/docker-compose.override.yml index c16d3d109..7a27451e2 100644 --- a/docker-compose.override.yml +++ b/docker-compose.override.yml @@ -225,6 +225,7 @@ services: apigw: environment: - ASPNETCORE_ENVIRONMENT=Development + - identityUrl=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110. ports: - "5200:80" @@ -233,6 +234,7 @@ services: - ASPNETCORE_ENVIRONMENT=Development - urls__basket=http://basket.api - urls__catalog=http://catalog.api + - urls__identity=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110. ports: - "5120:80" diff --git a/src/Apigw/OcelotApiGw/Startup.cs b/src/Apigw/OcelotApiGw/Startup.cs index 487793eda..a7290c1bf 100644 --- a/src/Apigw/OcelotApiGw/Startup.cs +++ b/src/Apigw/OcelotApiGw/Startup.cs @@ -26,6 +26,17 @@ namespace OcelotApiGw public void ConfigureServices(IServiceCollection services) { + var identityUrl = _cfg.GetValue("IdentityUrl"); + var authenticationProviderKey = "IdentityApiKey"; + + services.AddAuthentication() + .AddJwtBearer(authenticationProviderKey, x => + { + x.Authority = identityUrl; + x.RequireHttpsMetadata = false; + x.Audience = "ocelot"; + }); + services.AddOcelot(_cfg); } diff --git a/src/Apigw/OcelotApiGw/configuration/configuration.json b/src/Apigw/OcelotApiGw/configuration/configuration.json index 973f6874c..5d17e6ee3 100644 --- a/src/Apigw/OcelotApiGw/configuration/configuration.json +++ b/src/Apigw/OcelotApiGw/configuration/configuration.json @@ -8,6 +8,18 @@ "UpstreamPathTemplate": "/purchase-bff/catalog/{everything}", "UpstreamHttpMethod": [ "GET" ] }, + { + "DownstreamPathTemplate": "/{everything}", + "DownstreamScheme": "http", + "DownstreamHost": "purchase-bff", + "DownstreamPort": 80, + "UpstreamPathTemplate": "/purchase-bff/{everything}", + "UpstreamHttpMethod": [], + "AuthenticationOptions": { + "AuthenticationProviderKey": "IdentityApiKey", + "AllowedScopes": [] + } + }, { "DownstreamPathTemplate": "/{everything}", "DownstreamScheme": "http", diff --git a/src/BFFs/PurchaseBff/Startup.cs b/src/BFFs/PurchaseBff/Startup.cs index 689e2925e..491fc7d87 100644 --- a/src/BFFs/PurchaseBff/Startup.cs +++ b/src/BFFs/PurchaseBff/Startup.cs @@ -1,7 +1,9 @@ using System; using System.Collections.Generic; +using System.IdentityModel.Tokens.Jwt; using System.Linq; using System.Threading.Tasks; +using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; @@ -73,6 +75,28 @@ namespace PurchaseBff .AllowAnyHeader() .AllowCredentials()); }); + + + JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear(); + var identityUrl = Configuration.GetValue("urls:identity"); + services.AddAuthentication(options => + { + options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; + options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; + + }).AddJwtBearer(options => + { + options.Authority = identityUrl; + options.RequireHttpsMetadata = false; + options.Audience = "ocelot"; + options.Events = new JwtBearerEvents() + { + OnAuthenticationFailed = async ctx => + { + int i = 0; + } + }; + }); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. diff --git a/src/BFFs/PurchaseBff/appsettings.localhost.json b/src/BFFs/PurchaseBff/appsettings.localhost.json index 8267075d7..a8c119c93 100644 --- a/src/BFFs/PurchaseBff/appsettings.localhost.json +++ b/src/BFFs/PurchaseBff/appsettings.localhost.json @@ -1,6 +1,7 @@ { "urls": { "basket": "http://localhost:55105", - "catalog": "http://localhost:55101" + "catalog": "http://localhost:55101", + "identity": "http://localhost:55105" } } diff --git a/src/Services/Basket/Basket.API/Properties/launchSettings.json b/src/Services/Basket/Basket.API/Properties/launchSettings.json index 13aaf431f..a63a615ad 100644 --- a/src/Services/Basket/Basket.API/Properties/launchSettings.json +++ b/src/Services/Basket/Basket.API/Properties/launchSettings.json @@ -3,7 +3,7 @@ "windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": { - "applicationUrl": "http://localhost:55105/", + "applicationUrl": "http://localhost:55103/", "sslPort": 0 } }, @@ -19,7 +19,7 @@ "Microsoft.eShopOnContainers.Services.Basket.API": { "commandName": "Project", "launchBrowser": true, - "launchUrl": "http://localhost:55105/", + "launchUrl": "http://localhost:55103/", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } diff --git a/src/Services/Identity/Identity.API/Properties/launchSettings.json b/src/Services/Identity/Identity.API/Properties/launchSettings.json index 91f06fd57..c20d94307 100644 --- a/src/Services/Identity/Identity.API/Properties/launchSettings.json +++ b/src/Services/Identity/Identity.API/Properties/launchSettings.json @@ -3,7 +3,7 @@ "windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": { - "applicationUrl": "http://localhost:5105", + "applicationUrl": "http://localhost:55105", "sslPort": 0 } }, @@ -11,7 +11,7 @@ "IIS Express": { "commandName": "IISExpress", "launchBrowser": true, - "launchUrl": "http://localhost:5105", + "launchUrl": "http://localhost:55105", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } @@ -19,7 +19,7 @@ "eShopOnContainers.Identity": { "commandName": "Project", "launchBrowser": true, - "launchUrl": "http://localhost:5000", + "launchUrl": "http://localhost:55105", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } diff --git a/src/Web/WebMVC/Controllers/TestController.cs b/src/Web/WebMVC/Controllers/TestController.cs new file mode 100644 index 000000000..7a2140ea8 --- /dev/null +++ b/src/Web/WebMVC/Controllers/TestController.cs @@ -0,0 +1,56 @@ +using Microsoft.AspNetCore.Authentication; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.eShopOnContainers.BuildingBlocks.Resilience.Http; +using Microsoft.eShopOnContainers.WebMVC.Services; +using Microsoft.eShopOnContainers.WebMVC.ViewModels; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace WebMVC.Controllers +{ + class TestPayload + { + public int CatalogItemId { get; set; } + public string BasketId { get; set; } + + public int Quantity { get; set; } + } + + [Authorize] + public class TestController : Controller + { + private readonly IHttpClient _client; + private readonly IIdentityParser _appUserParser; + public TestController(IHttpClient client, IIdentityParser identityParser) + { + _client = client; + _appUserParser = identityParser; + } + + public async Task Ocelot() + { + var url = "http://apigw/purchase-bff/api/v1/basket/items"; + var payload = new TestPayload() + { + CatalogItemId = 1, + Quantity = 1, + BasketId = _appUserParser.Parse(User).Id + }; + var token = await HttpContext.GetTokenAsync("access_token"); + var response = await _client.PostAsync(url, payload, token); + + if (response.IsSuccessStatusCode) + { + var str = await response.Content.ReadAsStringAsync(); + return Ok(str); + } + else + { + return Ok(new { response.StatusCode, response.ReasonPhrase }); + } + } + } +} From e59829e96b90cd45ac3fa1148506f371f65e6f35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduard=20Tom=C3=A0s?= Date: Tue, 30 Jan 2018 17:42:00 +0000 Subject: [PATCH 09/78] WIP on Ocelot: Change routing and config errors. --- src/Apigw/OcelotApiGw/Startup.cs | 12 +++++++++++- .../OcelotApiGw/configuration/configuration.json | 2 +- .../PurchaseBff/Controllers/BasketController.cs | 4 +++- src/BFFs/PurchaseBff/Program.cs | 13 ++++++++++--- src/BFFs/PurchaseBff/Startup.cs | 2 +- .../Basket.API/Properties/launchSettings.json | 2 +- 6 files changed, 27 insertions(+), 8 deletions(-) diff --git a/src/Apigw/OcelotApiGw/Startup.cs b/src/Apigw/OcelotApiGw/Startup.cs index a7290c1bf..fa20572b2 100644 --- a/src/Apigw/OcelotApiGw/Startup.cs +++ b/src/Apigw/OcelotApiGw/Startup.cs @@ -34,7 +34,17 @@ namespace OcelotApiGw { x.Authority = identityUrl; x.RequireHttpsMetadata = false; - x.Audience = "ocelot"; + x.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters() + { + ValidAudiences = new[] { "orders", "basket", "locations", "marketing", "purchasebff" } + }; + x.Events = new Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerEvents() + { + OnAuthenticationFailed = async ctx => + { + int i = 0; + } + }; }); services.AddOcelot(_cfg); diff --git a/src/Apigw/OcelotApiGw/configuration/configuration.json b/src/Apigw/OcelotApiGw/configuration/configuration.json index 5d17e6ee3..4aa756512 100644 --- a/src/Apigw/OcelotApiGw/configuration/configuration.json +++ b/src/Apigw/OcelotApiGw/configuration/configuration.json @@ -11,7 +11,7 @@ { "DownstreamPathTemplate": "/{everything}", "DownstreamScheme": "http", - "DownstreamHost": "purchase-bff", + "DownstreamHost": "purchasebff", "DownstreamPort": 80, "UpstreamPathTemplate": "/purchase-bff/{everything}", "UpstreamHttpMethod": [], diff --git a/src/BFFs/PurchaseBff/Controllers/BasketController.cs b/src/BFFs/PurchaseBff/Controllers/BasketController.cs index 74d5bec66..6886ec806 100644 --- a/src/BFFs/PurchaseBff/Controllers/BasketController.cs +++ b/src/BFFs/PurchaseBff/Controllers/BasketController.cs @@ -1,4 +1,5 @@ -using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; using PurchaseBff.Models; using PurchaseBff.Services; using System; @@ -9,6 +10,7 @@ using System.Threading.Tasks; namespace PurchaseBff.Controllers { [Route("api/v1/[controller]")] + [Authorize] public class BasketController : Controller { private readonly ICatalogService _catalog; diff --git a/src/BFFs/PurchaseBff/Program.cs b/src/BFFs/PurchaseBff/Program.cs index 1c5b19865..7c6110260 100644 --- a/src/BFFs/PurchaseBff/Program.cs +++ b/src/BFFs/PurchaseBff/Program.cs @@ -18,12 +18,19 @@ namespace PurchaseBff } public static IWebHost BuildWebHost(string[] args) => - WebHost.CreateDefaultBuilder(args) - .UseStartup() + WebHost + .CreateDefaultBuilder(args) .ConfigureAppConfiguration(cb => { - cb.AddJsonFile("appsettings.localhost.json", optional: true); + var sources = cb.Sources; + sources.Insert(3, new Microsoft.Extensions.Configuration.Json.JsonConfigurationSource() + { + Optional = true, + Path = "appsettings.localhost.json", + ReloadOnChange = false + }); }) + .UseStartup() .Build(); } } diff --git a/src/BFFs/PurchaseBff/Startup.cs b/src/BFFs/PurchaseBff/Startup.cs index 491fc7d87..07a3f4f71 100644 --- a/src/BFFs/PurchaseBff/Startup.cs +++ b/src/BFFs/PurchaseBff/Startup.cs @@ -88,7 +88,7 @@ namespace PurchaseBff { options.Authority = identityUrl; options.RequireHttpsMetadata = false; - options.Audience = "ocelot"; + options.Audience = "purchasebff"; options.Events = new JwtBearerEvents() { OnAuthenticationFailed = async ctx => diff --git a/src/Services/Basket/Basket.API/Properties/launchSettings.json b/src/Services/Basket/Basket.API/Properties/launchSettings.json index a63a615ad..e42e4f7d1 100644 --- a/src/Services/Basket/Basket.API/Properties/launchSettings.json +++ b/src/Services/Basket/Basket.API/Properties/launchSettings.json @@ -3,7 +3,7 @@ "windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": { - "applicationUrl": "http://localhost:55103/", + "applicationUrl": "http://localhost:51078/", "sslPort": 0 } }, From 1c6431d5032e798701dc90190b8ae1d259bed397 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduard=20Tom=C3=A0s?= Date: Wed, 31 Jan 2018 15:35:40 +0000 Subject: [PATCH 10/78] Moved "AddItemToBasket" from MVC Client to a single call in PurchaseBFF --- docker-compose.override.yml | 1 + .../Properties/launchSettings.json | 4 +-- src/Apigw/OcelotApiGw/Startup.cs | 9 +++++ .../configuration/configuration.json | 14 +++++++- src/BFFs/PurchaseBff/Config/UrlsConfig.cs | 1 + .../Controllers/BasketController.cs | 7 ++-- .../PurchaseBff/Services/BasketService.cs | 23 +++++++++++-- .../PurchaseBff/Services/IBasketService.cs | 1 + src/BFFs/PurchaseBff/Startup.cs | 6 ++++ .../Basket.API/Properties/launchSettings.json | 2 +- .../Properties/launchSettings.json | 2 +- .../Properties/launchSettings.json | 6 ++-- src/Web/WebMVC/AppSettings.cs | 2 ++ src/Web/WebMVC/Controllers/CartController.cs | 14 ++------ src/Web/WebMVC/Infrastructure/API.cs | 31 ++++++----------- src/Web/WebMVC/Services/BasketService.cs | 34 ++++++++++--------- src/Web/WebMVC/Services/IBasketService.cs | 2 +- src/Web/WebMVC/Startup.cs | 1 + src/Web/WebMVC/ViewModels/CatalogItem.cs | 2 +- src/Web/WebMVC/Views/Catalog/_product.cshtml | 8 ----- src/Web/WebSPA/Properties/launchSettings.json | 2 +- .../Basket/Application/CartControllerTest.cs | 4 +-- .../Application/CatalogControllerTest.cs | 6 ++-- 23 files changed, 106 insertions(+), 76 deletions(-) diff --git a/docker-compose.override.yml b/docker-compose.override.yml index 7a27451e2..4b4e3469b 100644 --- a/docker-compose.override.yml +++ b/docker-compose.override.yml @@ -137,6 +137,7 @@ services: - CatalogUrl=http://catalog.api - OrderingUrl=http://ordering.api - BasketUrl=http://basket.api + - PurchaseUrl=http://apigw/purchase-bff - LocationsUrl=http://locations.api - IdentityUrl=http://10.0.75.1:5105 # Local Mac: Use http://docker.for.mac.localhost:5105 || Local Windows: Use 10.0.75.1 in a "Docker for Windows" environment, if using "localhost" from browser. || #Remote access: Use ${ESHOP_EXTERNAL_DNS_NAME_OR_IP} if using external IP or DNS name from browser. - MarketingUrl=http://marketing.api diff --git a/src/Apigw/OcelotApiGw/Properties/launchSettings.json b/src/Apigw/OcelotApiGw/Properties/launchSettings.json index 796011a33..2308ca466 100644 --- a/src/Apigw/OcelotApiGw/Properties/launchSettings.json +++ b/src/Apigw/OcelotApiGw/Properties/launchSettings.json @@ -3,7 +3,7 @@ "windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": { - "applicationUrl": "http://localhost:64020/", + "applicationUrl": "http://localhost:56755/", "sslPort": 0 } }, @@ -24,4 +24,4 @@ "applicationUrl": "http://localhost:64021/" } } -} +} \ No newline at end of file diff --git a/src/Apigw/OcelotApiGw/Startup.cs b/src/Apigw/OcelotApiGw/Startup.cs index fa20572b2..9c7eb18ef 100644 --- a/src/Apigw/OcelotApiGw/Startup.cs +++ b/src/Apigw/OcelotApiGw/Startup.cs @@ -41,6 +41,15 @@ namespace OcelotApiGw x.Events = new Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerEvents() { OnAuthenticationFailed = async ctx => + { + int i = 0; + }, + OnTokenValidated = async ctx => + { + int i = 0; + }, + + OnMessageReceived = async ctx => { int i = 0; } diff --git a/src/Apigw/OcelotApiGw/configuration/configuration.json b/src/Apigw/OcelotApiGw/configuration/configuration.json index 4aa756512..2e95c8843 100644 --- a/src/Apigw/OcelotApiGw/configuration/configuration.json +++ b/src/Apigw/OcelotApiGw/configuration/configuration.json @@ -8,13 +8,25 @@ "UpstreamPathTemplate": "/purchase-bff/catalog/{everything}", "UpstreamHttpMethod": [ "GET" ] }, + { + "DownstreamPathTemplate": "/{everything}", + "DownstreamScheme": "http", + "DownstreamHost": "basket.api", + "DownstreamPort": 80, + "UpstreamPathTemplate": "/purchase-bff/basket/{everything}", + "UpstreamHttpMethod": [ "GET" ], + "AuthenticationOptions": { + "AuthenticationProviderKey": "IdentityApiKey", + "AllowedScopes": [] + } + }, { "DownstreamPathTemplate": "/{everything}", "DownstreamScheme": "http", "DownstreamHost": "purchasebff", "DownstreamPort": 80, "UpstreamPathTemplate": "/purchase-bff/{everything}", - "UpstreamHttpMethod": [], + "UpstreamHttpMethod": ["POST"], "AuthenticationOptions": { "AuthenticationProviderKey": "IdentityApiKey", "AllowedScopes": [] diff --git a/src/BFFs/PurchaseBff/Config/UrlsConfig.cs b/src/BFFs/PurchaseBff/Config/UrlsConfig.cs index 5c43bdfa7..2079a4615 100644 --- a/src/BFFs/PurchaseBff/Config/UrlsConfig.cs +++ b/src/BFFs/PurchaseBff/Config/UrlsConfig.cs @@ -15,6 +15,7 @@ namespace PurchaseBff.Config public class BasketOperations { public static string GetItemById(string id) => $"/api/v1/basket/{id}"; + public static string UpdateBasket() => $"/api/v1/basket"; } public string Basket { get; set; } diff --git a/src/BFFs/PurchaseBff/Controllers/BasketController.cs b/src/BFFs/PurchaseBff/Controllers/BasketController.cs index 6886ec806..6030dfadb 100644 --- a/src/BFFs/PurchaseBff/Controllers/BasketController.cs +++ b/src/BFFs/PurchaseBff/Controllers/BasketController.cs @@ -32,20 +32,21 @@ namespace PurchaseBff.Controllers // Step 1: Get the item from catalog var item = await _catalog.GetCatalogItem(data.CatalogItemId); // Step 2: Get current basket status - var currentBasket = await _basket.GetById(data.BasketId); + var currentBasket = (await _basket.GetById(data.BasketId)) ?? new BasketData(data.BasketId); // Step 3: Merge current status with new product currentBasket.Items.Add(new BasketDataItem() { - OldUnitPrice = item.Price, UnitPrice = item.Price, PictureUrl = item.PictureUri, ProductId = item.Id.ToString(), ProductName = item.Name, Quantity = data.Quantity, - Id = item.Id.ToString() + Id = Guid.NewGuid().ToString() }); // Step 4: Update basket + await _basket.Update(currentBasket); + return Ok(); } diff --git a/src/BFFs/PurchaseBff/Services/BasketService.cs b/src/BFFs/PurchaseBff/Services/BasketService.cs index 023f587aa..881718baf 100644 --- a/src/BFFs/PurchaseBff/Services/BasketService.cs +++ b/src/BFFs/PurchaseBff/Services/BasketService.cs @@ -2,6 +2,8 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using Microsoft.AspNetCore.Authentication; +using Microsoft.AspNetCore.Http; using Microsoft.eShopOnContainers.BuildingBlocks.Resilience.Http; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; @@ -17,18 +19,35 @@ namespace PurchaseBff.Services private readonly IHttpClient _apiClient; private readonly ILogger _logger; private readonly UrlsConfig _urls; - public BasketService(IHttpClient httpClient, ILogger logger, IOptionsSnapshot config) + private readonly IHttpContextAccessor _httpContextAccessor; + + public BasketService(IHttpClient httpClient, IHttpContextAccessor httpContextAccessor, ILogger logger, IOptionsSnapshot config) { _apiClient = httpClient; _logger = logger; _urls = config.Value; + _httpContextAccessor = httpContextAccessor; } public async Task GetById(string id) { - var data = await _apiClient.GetStringAsync(_urls.Basket + UrlsConfig.BasketOperations.GetItemById(id)); + var token = await GetUserTokenAsync(); + var data = await _apiClient.GetStringAsync(_urls.Basket + UrlsConfig.BasketOperations.GetItemById(id), token); var basket = JsonConvert.DeserializeObject(data); return basket; } + + public async Task Update(BasketData currentBasket) + { + var token = await GetUserTokenAsync(); + var data = await _apiClient.PostAsync(_urls.Basket + UrlsConfig.BasketOperations.UpdateBasket(), currentBasket, token); + int i = 0; + } + + async Task GetUserTokenAsync() + { + var context = _httpContextAccessor.HttpContext; + return await context.GetTokenAsync("access_token"); + } } } diff --git a/src/BFFs/PurchaseBff/Services/IBasketService.cs b/src/BFFs/PurchaseBff/Services/IBasketService.cs index b4bafc461..0c33c5c41 100644 --- a/src/BFFs/PurchaseBff/Services/IBasketService.cs +++ b/src/BFFs/PurchaseBff/Services/IBasketService.cs @@ -9,5 +9,6 @@ namespace PurchaseBff.Services public interface IBasketService { Task GetById(string id); + Task Update(BasketData currentBasket); } } diff --git a/src/BFFs/PurchaseBff/Startup.cs b/src/BFFs/PurchaseBff/Startup.cs index 07a3f4f71..13fdcc269 100644 --- a/src/BFFs/PurchaseBff/Startup.cs +++ b/src/BFFs/PurchaseBff/Startup.cs @@ -92,6 +92,10 @@ namespace PurchaseBff options.Events = new JwtBearerEvents() { OnAuthenticationFailed = async ctx => + { + int i = 0; + }, + OnTokenValidated = async ctx => { int i = 0; } @@ -117,6 +121,8 @@ namespace PurchaseBff app.UseDeveloperExceptionPage(); } + app.UseAuthentication(); + app.UseMvc(); app.UseSwagger().UseSwaggerUI(c => diff --git a/src/Services/Basket/Basket.API/Properties/launchSettings.json b/src/Services/Basket/Basket.API/Properties/launchSettings.json index e42e4f7d1..0045edd47 100644 --- a/src/Services/Basket/Basket.API/Properties/launchSettings.json +++ b/src/Services/Basket/Basket.API/Properties/launchSettings.json @@ -3,7 +3,7 @@ "windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": { - "applicationUrl": "http://localhost:51078/", + "applicationUrl": "http://localhost:56695/", "sslPort": 0 } }, diff --git a/src/Services/Catalog/Catalog.API/Properties/launchSettings.json b/src/Services/Catalog/Catalog.API/Properties/launchSettings.json index 0357943bb..28f08bad2 100644 --- a/src/Services/Catalog/Catalog.API/Properties/launchSettings.json +++ b/src/Services/Catalog/Catalog.API/Properties/launchSettings.json @@ -3,7 +3,7 @@ "windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": { - "applicationUrl": "http://localhost:55101", + "applicationUrl": "http://localhost:56698/", "sslPort": 0 } }, diff --git a/src/Services/Location/Locations.API/Properties/launchSettings.json b/src/Services/Location/Locations.API/Properties/launchSettings.json index 45b637914..6401e4bbe 100644 --- a/src/Services/Location/Locations.API/Properties/launchSettings.json +++ b/src/Services/Location/Locations.API/Properties/launchSettings.json @@ -1,9 +1,9 @@ -{ +{ "iisSettings": { "windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": { - "applicationUrl": "http://localhost:3278/", + "applicationUrl": "http://localhost:53933/", "sslPort": 0 } }, @@ -26,4 +26,4 @@ "applicationUrl": "http://localhost:3279" } } -} +} \ No newline at end of file diff --git a/src/Web/WebMVC/AppSettings.cs b/src/Web/WebMVC/AppSettings.cs index 42100ab62..18db7d4bf 100644 --- a/src/Web/WebMVC/AppSettings.cs +++ b/src/Web/WebMVC/AppSettings.cs @@ -13,6 +13,8 @@ namespace Microsoft.eShopOnContainers.WebMVC public string BasketUrl { get; set; } public string MarketingUrl { get; set; } public string LocationsUrl { get; set; } + + public string PurchaseUrl { get; set; } public bool ActivateCampaignDetailFunction { get; set; } public Logging Logging { get; set; } public bool UseCustomizationData { get; set; } diff --git a/src/Web/WebMVC/Controllers/CartController.cs b/src/Web/WebMVC/Controllers/CartController.cs index 8b41c5320..94f50a2de 100644 --- a/src/Web/WebMVC/Controllers/CartController.cs +++ b/src/Web/WebMVC/Controllers/CartController.cs @@ -70,19 +70,11 @@ namespace Microsoft.eShopOnContainers.WebMVC.Controllers { try { - if (productDetails.Id != null) + if (productDetails?.Id != null) { var user = _appUserParser.Parse(HttpContext.User); - var product = new BasketItem() - { - Id = Guid.NewGuid().ToString(), - Quantity = 1, - ProductName = productDetails.Name, - PictureUrl = productDetails.PictureUri, - UnitPrice = productDetails.Price, - ProductId = productDetails.Id - }; - await _basketSvc.AddItemToBasket(user, product); + await _basketSvc.AddItemToBasket(user, productDetails.Id); + //await _basketSvc.AddItemToBasket(user, product); } return RedirectToAction("Index", "Catalog"); } diff --git a/src/Web/WebMVC/Infrastructure/API.cs b/src/Web/WebMVC/Infrastructure/API.cs index edb2c5ed5..b59183512 100644 --- a/src/Web/WebMVC/Infrastructure/API.cs +++ b/src/Web/WebMVC/Infrastructure/API.cs @@ -4,27 +4,18 @@ namespace WebMVC.Infrastructure { public static class API { - public static class Basket - { - public static string GetBasket(string baseUri, string basketId) - { - return $"{baseUri}/{basketId}"; - } - public static string UpdateBasket(string baseUri) - { - return baseUri; - } - - public static string CheckoutBasket(string baseUri) - { - return $"{baseUri}/checkout"; - } + public static class Purchase + { + public static string AddItemToBasket(string baseUri) => $"{baseUri}/basket/items"; + } - public static string CleanBasket(string baseUri, string basketId) - { - return $"{baseUri}/{basketId}"; - } + public static class Basket + { + public static string GetBasket(string baseUri, string basketId) => $"{baseUri}/{basketId}"; + public static string UpdateBasket(string baseUri) => baseUri; + public static string CheckoutBasket(string baseUri) => $"{baseUri}/checkout"; + public static string CleanBasket(string baseUri, string basketId) => $"{baseUri}/{basketId}"; } public static class Order @@ -100,7 +91,7 @@ namespace WebMVC.Infrastructure public static string CreateOrUpdateUserLocation(string baseUri) { return baseUri; - } + } } } } \ No newline at end of file diff --git a/src/Web/WebMVC/Services/BasketService.cs b/src/Web/WebMVC/Services/BasketService.cs index 6c8524800..e167f73cc 100644 --- a/src/Web/WebMVC/Services/BasketService.cs +++ b/src/Web/WebMVC/Services/BasketService.cs @@ -14,14 +14,19 @@ namespace Microsoft.eShopOnContainers.WebMVC.Services public class BasketService : IBasketService { private readonly IOptionsSnapshot _settings; - private IHttpClient _apiClient; + private readonly IHttpClient _apiClient; private readonly string _remoteServiceBaseUrl; - private IHttpContextAccessor _httpContextAccesor; + private readonly string _purchaseUrl; + private readonly IHttpContextAccessor _httpContextAccesor; - public BasketService(IOptionsSnapshot settings, IHttpContextAccessor httpContextAccesor, IHttpClient httpClient) + private readonly string _bffUrl; + + public BasketService(IOptionsSnapshot settings, + IHttpContextAccessor httpContextAccesor, IHttpClient httpClient) { _settings = settings; _remoteServiceBaseUrl = $"{_settings.Value.BasketUrl}/api/v1/basket"; + _purchaseUrl = $"{_settings.Value.PurchaseUrl}/api/v1"; _httpContextAccesor = httpContextAccesor; _apiClient = httpClient; } @@ -104,23 +109,20 @@ namespace Microsoft.eShopOnContainers.WebMVC.Services return order; } - public async Task AddItemToBasket(ApplicationUser user, BasketItem product) + public async Task AddItemToBasket(ApplicationUser user, int productId) { - var basket = await GetBasket(user); + var token = await GetUserTokenAsync(); + var updateBasketUri = API.Purchase.AddItemToBasket(_purchaseUrl); + var userId = user.Id; - if (basket == null) + var response = await _apiClient.PostAsync(updateBasketUri, new { - basket = new Basket() - { - BuyerId = user.Id, - Items = new List() - }; - } - - basket.Items.Add(product); + CatalogItemId = productId, + BasketId = userId, + Quantity = 1 + }, token); - await UpdateBasket(basket); - } + } async Task GetUserTokenAsync() { diff --git a/src/Web/WebMVC/Services/IBasketService.cs b/src/Web/WebMVC/Services/IBasketService.cs index 13921909a..78898de7d 100644 --- a/src/Web/WebMVC/Services/IBasketService.cs +++ b/src/Web/WebMVC/Services/IBasketService.cs @@ -10,7 +10,7 @@ namespace Microsoft.eShopOnContainers.WebMVC.Services public interface IBasketService { Task GetBasket(ApplicationUser user); - Task AddItemToBasket(ApplicationUser user, BasketItem product); + Task AddItemToBasket(ApplicationUser user, int productId); Task UpdateBasket(Basket basket); Task Checkout(BasketDTO basket); Task SetQuantities(ApplicationUser user, Dictionary quantities); diff --git a/src/Web/WebMVC/Startup.cs b/src/Web/WebMVC/Startup.cs index ced47ea67..e9e86d1cd 100644 --- a/src/Web/WebMVC/Startup.cs +++ b/src/Web/WebMVC/Startup.cs @@ -130,6 +130,7 @@ namespace Microsoft.eShopOnContainers.WebMVC options.Scope.Add("basket"); options.Scope.Add("marketing"); options.Scope.Add("locations"); + options.Scope.Add("purchasebff"); }); } diff --git a/src/Web/WebMVC/ViewModels/CatalogItem.cs b/src/Web/WebMVC/ViewModels/CatalogItem.cs index 6dd216d1d..c869b7382 100644 --- a/src/Web/WebMVC/ViewModels/CatalogItem.cs +++ b/src/Web/WebMVC/ViewModels/CatalogItem.cs @@ -4,7 +4,7 @@ namespace Microsoft.eShopOnContainers.WebMVC.ViewModels { public class CatalogItem { - public string Id { get; set; } + public int Id { get; set; } public string Name { get; set; } public string Description { get; set; } public decimal Price { get; set; } diff --git a/src/Web/WebMVC/Views/Catalog/_product.cshtml b/src/Web/WebMVC/Views/Catalog/_product.cshtml index 11138b55d..0fb1c39c4 100644 --- a/src/Web/WebMVC/Views/Catalog/_product.cshtml +++ b/src/Web/WebMVC/Views/Catalog/_product.cshtml @@ -12,13 +12,5 @@
@Model.Price.ToString("N2")
- - - - - - - - diff --git a/src/Web/WebSPA/Properties/launchSettings.json b/src/Web/WebSPA/Properties/launchSettings.json index fd33f59ec..9be3bf34a 100644 --- a/src/Web/WebSPA/Properties/launchSettings.json +++ b/src/Web/WebSPA/Properties/launchSettings.json @@ -3,7 +3,7 @@ "windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": { - "applicationUrl": "http://localhost:5104/", + "applicationUrl": "http://localhost:56727/", "sslPort": 0 } }, diff --git a/test/Services/UnitTest/Basket/Application/CartControllerTest.cs b/test/Services/UnitTest/Basket/Application/CartControllerTest.cs index 6bdd2c43c..63f74cf35 100644 --- a/test/Services/UnitTest/Basket/Application/CartControllerTest.cs +++ b/test/Services/UnitTest/Basket/Application/CartControllerTest.cs @@ -92,7 +92,7 @@ namespace UnitTest.Basket.Application //Arrange var fakeCatalogItem = GetFakeCatalogItem(); - _basketServiceMock.Setup(x => x.AddItemToBasket(It.IsAny(), It.IsAny())) + _basketServiceMock.Setup(x => x.AddItemToBasket(It.IsAny(), It.IsAny())) .Returns(Task.FromResult(1)); //Act @@ -118,7 +118,7 @@ namespace UnitTest.Basket.Application { return new CatalogItem() { - Id = "1", + Id = 1, Name = "fakeName", CatalogBrand = "fakeBrand", CatalogType = "fakeType", diff --git a/test/Services/UnitTest/Catalog/Application/CatalogControllerTest.cs b/test/Services/UnitTest/Catalog/Application/CatalogControllerTest.cs index 58d32c212..7410551e4 100644 --- a/test/Services/UnitTest/Catalog/Application/CatalogControllerTest.cs +++ b/test/Services/UnitTest/Catalog/Application/CatalogControllerTest.cs @@ -67,19 +67,19 @@ namespace UnitTest.Catalog.Application { new CatalogItem() { - Id = "1", + Id = 1, Name = "fakeItemA", CatalogTypeId = 1 }, new CatalogItem() { - Id = "2", + Id = 2, Name = "fakeItemB", CatalogTypeId = 1 }, new CatalogItem() { - Id = "3", + Id = 3, Name = "fakeItemC", CatalogTypeId = 1 } From d8382f8d523807d822fa93429e1523af73478d8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduard=20Tom=C3=A0s?= Date: Wed, 31 Jan 2018 15:46:10 +0000 Subject: [PATCH 11/78] Changed catalog.api url from catalog.api to pass through API gateway --- docker-compose.override.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.override.yml b/docker-compose.override.yml index 4b4e3469b..0a0b547b4 100644 --- a/docker-compose.override.yml +++ b/docker-compose.override.yml @@ -134,7 +134,7 @@ services: environment: - ASPNETCORE_ENVIRONMENT=Development - ASPNETCORE_URLS=http://0.0.0.0:80 - - CatalogUrl=http://catalog.api + - CatalogUrl=http://apigw/purchase-bff/catalog - OrderingUrl=http://ordering.api - BasketUrl=http://basket.api - PurchaseUrl=http://apigw/purchase-bff From 0256c6a7ad75403c8a5d4cf1587e41550aaf58a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduard=20Tom=C3=A0s?= Date: Wed, 31 Jan 2018 16:29:06 +0000 Subject: [PATCH 12/78] Moved Change Basket Quantities to PurchaseBFF. MVC client updated --- .../configuration/configuration.json | 2 +- .../Controllers/BasketController.cs | 35 ++++++++++++++++++- src/Web/WebMVC/Controllers/CartController.cs | 1 - src/Web/WebMVC/Infrastructure/API.cs | 1 + src/Web/WebMVC/Services/BasketService.cs | 24 ++++++++----- 5 files changed, 51 insertions(+), 12 deletions(-) diff --git a/src/Apigw/OcelotApiGw/configuration/configuration.json b/src/Apigw/OcelotApiGw/configuration/configuration.json index 2e95c8843..5216c9540 100644 --- a/src/Apigw/OcelotApiGw/configuration/configuration.json +++ b/src/Apigw/OcelotApiGw/configuration/configuration.json @@ -26,7 +26,7 @@ "DownstreamHost": "purchasebff", "DownstreamPort": 80, "UpstreamPathTemplate": "/purchase-bff/{everything}", - "UpstreamHttpMethod": ["POST"], + "UpstreamHttpMethod": [ "POST", "PUT" ], "AuthenticationOptions": { "AuthenticationProviderKey": "IdentityApiKey", "AllowedScopes": [] diff --git a/src/BFFs/PurchaseBff/Controllers/BasketController.cs b/src/BFFs/PurchaseBff/Controllers/BasketController.cs index 6030dfadb..12290a127 100644 --- a/src/BFFs/PurchaseBff/Controllers/BasketController.cs +++ b/src/BFFs/PurchaseBff/Controllers/BasketController.cs @@ -21,7 +21,40 @@ namespace PurchaseBff.Controllers _basket = basketService; } - [HttpPost("items")] + [HttpPut] + [Route("items")] + public async Task UpdateQuantities([FromBody] UpdateBasketItemsRequest data) + { + if (!data.Updates.Any()) + { + return BadRequest("No updates sent"); + } + + // Retrieve the current basket + var currentBasket = await _basket.GetById(data.BasketId); + if (currentBasket == null) + { + return BadRequest($"Basket with id {data.BasketId} not found."); + } + + // Update with new quantities + foreach (var update in data.Updates) + { + var basketItem = currentBasket.Items.SingleOrDefault(bitem => bitem.Id == update.BasketItemId); + if (basketItem == null) + { + return BadRequest($"Basket item with id {update.BasketItemId} not found"); + } + basketItem.Quantity = update.NewQty; + } + + // Save the updated basket + await _basket.Update(currentBasket); + return Ok(currentBasket); + } + + [HttpPost] + [Route("items")] public async Task AddBasketItem([FromBody] AddBasketItemRequest data) { if (data == null || data.Quantity == 0) diff --git a/src/Web/WebMVC/Controllers/CartController.cs b/src/Web/WebMVC/Controllers/CartController.cs index 94f50a2de..41484d79c 100644 --- a/src/Web/WebMVC/Controllers/CartController.cs +++ b/src/Web/WebMVC/Controllers/CartController.cs @@ -49,7 +49,6 @@ namespace Microsoft.eShopOnContainers.WebMVC.Controllers { var user = _appUserParser.Parse(HttpContext.User); var basket = await _basketSvc.SetQuantities(user, quantities); - var vm = await _basketSvc.UpdateBasket(basket); if (action == "[ Checkout ]") { diff --git a/src/Web/WebMVC/Infrastructure/API.cs b/src/Web/WebMVC/Infrastructure/API.cs index b59183512..765ee3e9b 100644 --- a/src/Web/WebMVC/Infrastructure/API.cs +++ b/src/Web/WebMVC/Infrastructure/API.cs @@ -8,6 +8,7 @@ namespace WebMVC.Infrastructure public static class Purchase { public static string AddItemToBasket(string baseUri) => $"{baseUri}/basket/items"; + public static string UpdateBasketItem(string baseUri) => $"{baseUri}/basket/items"; } public static class Basket diff --git a/src/Web/WebMVC/Services/BasketService.cs b/src/Web/WebMVC/Services/BasketService.cs index e167f73cc..1c4b2aa87 100644 --- a/src/Web/WebMVC/Services/BasketService.cs +++ b/src/Web/WebMVC/Services/BasketService.cs @@ -5,6 +5,7 @@ using Microsoft.eShopOnContainers.WebMVC.ViewModels; using Microsoft.Extensions.Options; using Newtonsoft.Json; using System.Collections.Generic; +using System.Linq; using System.Threading.Tasks; using WebMVC.Infrastructure; using WebMVC.Models; @@ -72,19 +73,24 @@ namespace Microsoft.eShopOnContainers.WebMVC.Services public async Task SetQuantities(ApplicationUser user, Dictionary quantities) { - var basket = await GetBasket(user); - basket.Items.ForEach(x => + var token = await GetUserTokenAsync(); + var updateBasketUri = API.Purchase.UpdateBasketItem(_purchaseUrl); + var userId = user.Id; + + var response = await _apiClient.PutAsync(updateBasketUri, new { - // Simplify this logic by using the - // new out variable initializer. - if (quantities.TryGetValue(x.Id, out var quantity)) + BasketId = userId, + Updates = quantities.Select(kvp => new { - x.Quantity = quantity; - } - }); + BasketItemId = kvp.Key, + NewQty = kvp.Value + }).ToArray() + }, token); - return basket; + response.EnsureSuccessStatusCode(); + var jsonResponse = await response.Content.ReadAsStringAsync(); + return JsonConvert.DeserializeObject(jsonResponse); } public Order MapBasketToOrder(Basket basket) From 2a2f3a4da195539f43d99e116b0d5fba5cd5007d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduard=20Tom=C3=A0s?= Date: Wed, 31 Jan 2018 16:29:19 +0000 Subject: [PATCH 13/78] Added missing file --- .../Models/UpdateBasketItemsRequest.cs | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 src/BFFs/PurchaseBff/Models/UpdateBasketItemsRequest.cs diff --git a/src/BFFs/PurchaseBff/Models/UpdateBasketItemsRequest.cs b/src/BFFs/PurchaseBff/Models/UpdateBasketItemsRequest.cs new file mode 100644 index 000000000..eb63efa23 --- /dev/null +++ b/src/BFFs/PurchaseBff/Models/UpdateBasketItemsRequest.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace PurchaseBff.Models +{ + public class UpdateBasketItemsRequest + { + + public string BasketId { get; set; } + + public ICollection Updates { get; set; } + + public UpdateBasketItemsRequest() + { + Updates = new List(); + } + } + + public class UpdateBasketItemData + { + public string BasketItemId { get; set; } + public int NewQty { get; set; } + + public UpdateBasketItemData() + { + NewQty = 0; + } + } +} From 2a81a080bacb978172c88097acb3c064b483d2bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduard=20Tom=C3=A0s?= Date: Thu, 1 Feb 2018 14:04:20 +0000 Subject: [PATCH 14/78] Moved Create Order from MVC logic client to Purchase logic. --- .../configuration/configuration.json | 2 +- .../Controllers/OrderController.cs | 40 +++++++++++++++++++ src/BFFs/PurchaseBff/Models/OrderData.cs | 33 +++++++++++++++ src/BFFs/PurchaseBff/Models/OrderItemData.cs | 17 ++++++++ .../Properties/launchSettings.json | 4 +- .../PurchaseBff/Services/BasketService.cs | 25 ++++++++++++ .../PurchaseBff/Services/IBasketService.cs | 2 + .../Basket.API/Properties/launchSettings.json | 2 +- .../Properties/launchSettings.json | 2 +- src/Web/WebMVC/Controllers/CartController.cs | 2 - src/Web/WebMVC/Controllers/OrderController.cs | 4 +- src/Web/WebMVC/Infrastructure/API.cs | 2 + src/Web/WebMVC/Services/BasketService.cs | 24 +++-------- src/Web/WebMVC/Services/IBasketService.cs | 2 +- src/Web/WebSPA/Properties/launchSettings.json | 2 +- .../Application/OrderControllerTest.cs | 35 +--------------- 16 files changed, 135 insertions(+), 63 deletions(-) create mode 100644 src/BFFs/PurchaseBff/Controllers/OrderController.cs create mode 100644 src/BFFs/PurchaseBff/Models/OrderData.cs create mode 100644 src/BFFs/PurchaseBff/Models/OrderItemData.cs diff --git a/src/Apigw/OcelotApiGw/configuration/configuration.json b/src/Apigw/OcelotApiGw/configuration/configuration.json index 5216c9540..cc2defca6 100644 --- a/src/Apigw/OcelotApiGw/configuration/configuration.json +++ b/src/Apigw/OcelotApiGw/configuration/configuration.json @@ -26,7 +26,7 @@ "DownstreamHost": "purchasebff", "DownstreamPort": 80, "UpstreamPathTemplate": "/purchase-bff/{everything}", - "UpstreamHttpMethod": [ "POST", "PUT" ], + "UpstreamHttpMethod": [ "POST", "PUT", "GET" ], "AuthenticationOptions": { "AuthenticationProviderKey": "IdentityApiKey", "AllowedScopes": [] diff --git a/src/BFFs/PurchaseBff/Controllers/OrderController.cs b/src/BFFs/PurchaseBff/Controllers/OrderController.cs new file mode 100644 index 000000000..7e7b00c1b --- /dev/null +++ b/src/BFFs/PurchaseBff/Controllers/OrderController.cs @@ -0,0 +1,40 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using PurchaseBff.Services; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace PurchaseBff.Controllers +{ + [Route("api/v1/[controller]")] + [Authorize] + public class OrderController : Controller + { + private readonly IBasketService _basketService; + public OrderController(IBasketService basketService) + { + _basketService = basketService; + } + + [Route("draft/{basketId}")] + [HttpGet] + public async Task GetOrderDraft(string basketId) + { + if (string.IsNullOrEmpty(basketId)) + { + return BadRequest("Need a valid basketid"); + } + // Get the basket data and build a order draft based on it + var basket = await _basketService.GetById(basketId); + if (basket == null) + { + return BadRequest($"No basket found for id {basketId}"); + } + + var order = _basketService.MapBasketToOrder(basket, isDraft: true); + return Ok(order); + } + } +} diff --git a/src/BFFs/PurchaseBff/Models/OrderData.cs b/src/BFFs/PurchaseBff/Models/OrderData.cs new file mode 100644 index 000000000..c561a53ad --- /dev/null +++ b/src/BFFs/PurchaseBff/Models/OrderData.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace PurchaseBff.Models +{ + public class OrderData + { + public string OrderNumber { get; set; } + public DateTime Date { get; set; } + public string Status { get; set; } + public decimal Total { get; set; } + public string Description { get; set; } + public string City { get; set; } + public string Street { get; set; } + public string State { get; set; } + public string Country { get; set; } + public string ZipCode { get; set; } + public string CardNumber { get; set; } + public string CardHolderName { get; set; } + public bool IsDraft { get; set; } + public DateTime CardExpiration { get; set; } + public string CardExpirationShort { get; set; } + public string CardSecurityNumber { get; set; } + + public int CardTypeId { get; set; } + + public string Buyer { get; set; } + + public List OrderItems { get; } = new List(); + } +} diff --git a/src/BFFs/PurchaseBff/Models/OrderItemData.cs b/src/BFFs/PurchaseBff/Models/OrderItemData.cs new file mode 100644 index 000000000..bdc7b361e --- /dev/null +++ b/src/BFFs/PurchaseBff/Models/OrderItemData.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace PurchaseBff.Models +{ + public class OrderItemData + { + public int ProductId { get; set; } + public string ProductName { get; set; } + public decimal UnitPrice { get; set; } + public decimal Discount { get; set; } + public int Units { get; set; } + public string PictureUrl { get; set; } + } +} diff --git a/src/BFFs/PurchaseBff/Properties/launchSettings.json b/src/BFFs/PurchaseBff/Properties/launchSettings.json index 709d1b89a..d6c88d211 100644 --- a/src/BFFs/PurchaseBff/Properties/launchSettings.json +++ b/src/BFFs/PurchaseBff/Properties/launchSettings.json @@ -3,7 +3,7 @@ "windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": { - "applicationUrl": "http://localhost:61631/", + "applicationUrl": "http://localhost:58243/", "sslPort": 0 } }, @@ -26,4 +26,4 @@ "applicationUrl": "http://localhost:61632/" } } -} +} \ No newline at end of file diff --git a/src/BFFs/PurchaseBff/Services/BasketService.cs b/src/BFFs/PurchaseBff/Services/BasketService.cs index 881718baf..fd16843a1 100644 --- a/src/BFFs/PurchaseBff/Services/BasketService.cs +++ b/src/BFFs/PurchaseBff/Services/BasketService.cs @@ -44,6 +44,31 @@ namespace PurchaseBff.Services int i = 0; } + public OrderData MapBasketToOrder(BasketData basket, bool isDraft) + { + var order = new OrderData + { + Total = 0, + IsDraft = isDraft + }; + + basket.Items.ForEach(x => + { + order.OrderItems.Add(new OrderItemData() + { + ProductId = int.Parse(x.ProductId), + + PictureUrl = x.PictureUrl, + ProductName = x.ProductName, + Units = x.Quantity, + UnitPrice = x.UnitPrice + }); + order.Total += (x.Quantity * x.UnitPrice); + }); + + return order; + } + async Task GetUserTokenAsync() { var context = _httpContextAccessor.HttpContext; diff --git a/src/BFFs/PurchaseBff/Services/IBasketService.cs b/src/BFFs/PurchaseBff/Services/IBasketService.cs index 0c33c5c41..79319536f 100644 --- a/src/BFFs/PurchaseBff/Services/IBasketService.cs +++ b/src/BFFs/PurchaseBff/Services/IBasketService.cs @@ -10,5 +10,7 @@ namespace PurchaseBff.Services { Task GetById(string id); Task Update(BasketData currentBasket); + + OrderData MapBasketToOrder(BasketData basket, bool isDraft); } } diff --git a/src/Services/Basket/Basket.API/Properties/launchSettings.json b/src/Services/Basket/Basket.API/Properties/launchSettings.json index 0045edd47..013205c33 100644 --- a/src/Services/Basket/Basket.API/Properties/launchSettings.json +++ b/src/Services/Basket/Basket.API/Properties/launchSettings.json @@ -3,7 +3,7 @@ "windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": { - "applicationUrl": "http://localhost:56695/", + "applicationUrl": "http://localhost:57622/", "sslPort": 0 } }, diff --git a/src/Services/Catalog/Catalog.API/Properties/launchSettings.json b/src/Services/Catalog/Catalog.API/Properties/launchSettings.json index 28f08bad2..a0b19b3bf 100644 --- a/src/Services/Catalog/Catalog.API/Properties/launchSettings.json +++ b/src/Services/Catalog/Catalog.API/Properties/launchSettings.json @@ -3,7 +3,7 @@ "windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": { - "applicationUrl": "http://localhost:56698/", + "applicationUrl": "http://localhost:57623/", "sslPort": 0 } }, diff --git a/src/Web/WebMVC/Controllers/CartController.cs b/src/Web/WebMVC/Controllers/CartController.cs index 41484d79c..660da1d56 100644 --- a/src/Web/WebMVC/Controllers/CartController.cs +++ b/src/Web/WebMVC/Controllers/CartController.cs @@ -49,10 +49,8 @@ namespace Microsoft.eShopOnContainers.WebMVC.Controllers { var user = _appUserParser.Parse(HttpContext.User); var basket = await _basketSvc.SetQuantities(user, quantities); - if (action == "[ Checkout ]") { - var order = _basketSvc.MapBasketToOrder(basket); return RedirectToAction("Create", "Order"); } } diff --git a/src/Web/WebMVC/Controllers/OrderController.cs b/src/Web/WebMVC/Controllers/OrderController.cs index 11e688728..a5bf4785e 100644 --- a/src/Web/WebMVC/Controllers/OrderController.cs +++ b/src/Web/WebMVC/Controllers/OrderController.cs @@ -27,9 +27,9 @@ namespace Microsoft.eShopOnContainers.WebMVC.Controllers public async Task Create() { + var user = _appUserParser.Parse(HttpContext.User); - var basket = await _basketSvc.GetBasket(user); - var order = _basketSvc.MapBasketToOrder(basket); + var order = await _basketSvc.GetOrderDraft(user.Id); var vm = _orderSvc.MapUserInfoIntoOrder(user, order); vm.CardExpirationShortFormat(); diff --git a/src/Web/WebMVC/Infrastructure/API.cs b/src/Web/WebMVC/Infrastructure/API.cs index 765ee3e9b..d6f485e21 100644 --- a/src/Web/WebMVC/Infrastructure/API.cs +++ b/src/Web/WebMVC/Infrastructure/API.cs @@ -9,6 +9,8 @@ namespace WebMVC.Infrastructure { public static string AddItemToBasket(string baseUri) => $"{baseUri}/basket/items"; public static string UpdateBasketItem(string baseUri) => $"{baseUri}/basket/items"; + + public static string GetOrderDraft(string baseUri, string basketId) => $"{baseUri}/order/draft/{basketId}"; } public static class Basket diff --git a/src/Web/WebMVC/Services/BasketService.cs b/src/Web/WebMVC/Services/BasketService.cs index 1c4b2aa87..208ea71ad 100644 --- a/src/Web/WebMVC/Services/BasketService.cs +++ b/src/Web/WebMVC/Services/BasketService.cs @@ -93,27 +93,15 @@ namespace Microsoft.eShopOnContainers.WebMVC.Services return JsonConvert.DeserializeObject(jsonResponse); } - public Order MapBasketToOrder(Basket basket) + public async Task GetOrderDraft(string basketId) { - var order = new Order(); - order.Total = 0; - - basket.Items.ForEach(x => - { - order.OrderItems.Add(new OrderItem() - { - ProductId = int.Parse(x.ProductId), + var token = await GetUserTokenAsync(); + var draftOrderUri = API.Purchase.GetOrderDraft(_purchaseUrl, basketId); + var json = await _apiClient.GetStringAsync(draftOrderUri, token); + return JsonConvert.DeserializeObject(json); + } - PictureUrl = x.PictureUrl, - ProductName = x.ProductName, - Units = x.Quantity, - UnitPrice = x.UnitPrice - }); - order.Total += (x.Quantity * x.UnitPrice); - }); - return order; - } public async Task AddItemToBasket(ApplicationUser user, int productId) { diff --git a/src/Web/WebMVC/Services/IBasketService.cs b/src/Web/WebMVC/Services/IBasketService.cs index 78898de7d..cfbea5ff0 100644 --- a/src/Web/WebMVC/Services/IBasketService.cs +++ b/src/Web/WebMVC/Services/IBasketService.cs @@ -14,6 +14,6 @@ namespace Microsoft.eShopOnContainers.WebMVC.Services Task UpdateBasket(Basket basket); Task Checkout(BasketDTO basket); Task SetQuantities(ApplicationUser user, Dictionary quantities); - Order MapBasketToOrder(Basket basket); + Task GetOrderDraft(string basketId); } } diff --git a/src/Web/WebSPA/Properties/launchSettings.json b/src/Web/WebSPA/Properties/launchSettings.json index 9be3bf34a..8a55ca730 100644 --- a/src/Web/WebSPA/Properties/launchSettings.json +++ b/src/Web/WebSPA/Properties/launchSettings.json @@ -3,7 +3,7 @@ "windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": { - "applicationUrl": "http://localhost:56727/", + "applicationUrl": "http://localhost:57625/", "sslPort": 0 } }, diff --git a/test/Services/UnitTest/Ordering/Application/OrderControllerTest.cs b/test/Services/UnitTest/Ordering/Application/OrderControllerTest.cs index 12f2be395..a60ce3bb3 100644 --- a/test/Services/UnitTest/Ordering/Application/OrderControllerTest.cs +++ b/test/Services/UnitTest/Ordering/Application/OrderControllerTest.cs @@ -68,40 +68,7 @@ namespace UnitTest.Ordering.Application Assert.IsAssignableFrom(viewResult.ViewData.Model); } - [Fact] - public async Task Get_create_order_success() - { - //Arrange - var fakeBuyerId = "1"; - var fakeBasket = GetFakeBasket(fakeBuyerId); - var fakeOrder = GetFakeOrder(); - - _basketServiceMock.Setup(x => x.GetBasket(It.IsAny())) - .Returns(Task.FromResult(fakeBasket)); - - _basketServiceMock.Setup(x => x.MapBasketToOrder(It.IsAny())) - .Returns(fakeOrder); - - _orderServiceMock.Setup(x => x.MapUserInfoIntoOrder(It.IsAny(), It.IsAny())) - .Returns(fakeOrder); - - //Act - var orderController = new OrderController(_orderServiceMock.Object, _basketServiceMock.Object, _identityParserMock.Object); - orderController.ControllerContext.HttpContext = _contextMock.Object; - var actionResult = await orderController.Create(); - - //Assert - var viewResult = Assert.IsType(actionResult); - Assert.IsAssignableFrom(viewResult.ViewData.Model); - } - - private BasketModel GetFakeBasket(string buyerId) - { - return new BasketModel() - { - BuyerId = buyerId - }; - } + private Order GetFakeOrder() { From b0d4ae5a72c36158716653a40b1c24308d53d76d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduard=20Tom=C3=A0s?= Date: Fri, 2 Feb 2018 11:26:47 +0000 Subject: [PATCH 15/78] All order flow goes through Purchase BFF API. Also some refactorings. --- docker-compose.override.yml | 1 + src/BFFs/PurchaseBff/Config/UrlsConfig.cs | 8 ++- .../Controllers/BasketController.cs | 3 + .../Controllers/OrderController.cs | 8 ++- .../PurchaseBff/Services/BasketService.cs | 25 ------- .../PurchaseBff/Services/IBasketService.cs | 1 - .../PurchaseBff/Services/IOrderApiClient.cs | 13 ++++ .../PurchaseBff/Services/OrderApiClient.cs | 37 ++++++++++ src/BFFs/PurchaseBff/Startup.cs | 1 + .../PurchaseBff/appsettings.localhost.json | 3 +- .../Basket.API/Properties/launchSettings.json | 2 +- .../Controllers/CatalogController.cs | 14 ++-- .../Extensions/CatalogItemExtensions.cs | 17 +++++ .../Commands/CreateOrderCommand.cs | 17 +---- .../Commands/CreateOrderDraftCommand.cs | 27 +++++++ .../CreateOrderDraftCommandHandler.cs | 72 +++++++++++++++++++ .../Controllers/OrdersController.cs | 9 +++ .../Extensions/BasketItemExtensions.cs | 32 +++++++++ .../Properties/launchSettings.json | 4 +- .../AggregatesModel/OrderAggregate/Order.cs | 31 +++++--- .../OrderAggregate/OrderItem.cs | 8 +-- src/Web/WebSPA/Properties/launchSettings.json | 2 +- 22 files changed, 264 insertions(+), 71 deletions(-) create mode 100644 src/BFFs/PurchaseBff/Services/IOrderApiClient.cs create mode 100644 src/BFFs/PurchaseBff/Services/OrderApiClient.cs create mode 100644 src/Services/Catalog/Catalog.API/Extensions/CatalogItemExtensions.cs create mode 100644 src/Services/Ordering/Ordering.API/Application/Commands/CreateOrderDraftCommand.cs create mode 100644 src/Services/Ordering/Ordering.API/Application/Commands/CreateOrderDraftCommandHandler.cs create mode 100644 src/Services/Ordering/Ordering.API/Extensions/BasketItemExtensions.cs diff --git a/docker-compose.override.yml b/docker-compose.override.yml index 0a0b547b4..bf6a80691 100644 --- a/docker-compose.override.yml +++ b/docker-compose.override.yml @@ -235,6 +235,7 @@ services: - ASPNETCORE_ENVIRONMENT=Development - urls__basket=http://basket.api - urls__catalog=http://catalog.api + - urls__orders=http://ordering.api - urls__identity=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110. ports: - "5120:80" diff --git a/src/BFFs/PurchaseBff/Config/UrlsConfig.cs b/src/BFFs/PurchaseBff/Config/UrlsConfig.cs index 2079a4615..bca4db9ff 100644 --- a/src/BFFs/PurchaseBff/Config/UrlsConfig.cs +++ b/src/BFFs/PurchaseBff/Config/UrlsConfig.cs @@ -15,10 +15,16 @@ namespace PurchaseBff.Config public class BasketOperations { public static string GetItemById(string id) => $"/api/v1/basket/{id}"; - public static string UpdateBasket() => $"/api/v1/basket"; + public static string UpdateBasket() => "/api/v1/basket"; + } + + public class OrdersOperations + { + public static string GetOrderDraft() => "/api/v1/orders/draft"; } public string Basket { get; set; } public string Catalog { get; set; } + public string Orders { get; set; } } } diff --git a/src/BFFs/PurchaseBff/Controllers/BasketController.cs b/src/BFFs/PurchaseBff/Controllers/BasketController.cs index 12290a127..17dbf6ff5 100644 --- a/src/BFFs/PurchaseBff/Controllers/BasketController.cs +++ b/src/BFFs/PurchaseBff/Controllers/BasketController.cs @@ -64,6 +64,9 @@ namespace PurchaseBff.Controllers // Step 1: Get the item from catalog var item = await _catalog.GetCatalogItem(data.CatalogItemId); + + //item.PictureUri = + // Step 2: Get current basket status var currentBasket = (await _basket.GetById(data.BasketId)) ?? new BasketData(data.BasketId); // Step 3: Merge current status with new product diff --git a/src/BFFs/PurchaseBff/Controllers/OrderController.cs b/src/BFFs/PurchaseBff/Controllers/OrderController.cs index 7e7b00c1b..91d0062ac 100644 --- a/src/BFFs/PurchaseBff/Controllers/OrderController.cs +++ b/src/BFFs/PurchaseBff/Controllers/OrderController.cs @@ -13,9 +13,11 @@ namespace PurchaseBff.Controllers public class OrderController : Controller { private readonly IBasketService _basketService; - public OrderController(IBasketService basketService) + private readonly IOrderApiClient _orderClient; + public OrderController(IBasketService basketService, IOrderApiClient orderClient) { _basketService = basketService; + _orderClient = orderClient; } [Route("draft/{basketId}")] @@ -33,8 +35,8 @@ namespace PurchaseBff.Controllers return BadRequest($"No basket found for id {basketId}"); } - var order = _basketService.MapBasketToOrder(basket, isDraft: true); - return Ok(order); + var orderDraft = await _orderClient.GetOrderDraftFromBasket(basket); + return Ok(orderDraft); } } } diff --git a/src/BFFs/PurchaseBff/Services/BasketService.cs b/src/BFFs/PurchaseBff/Services/BasketService.cs index fd16843a1..881718baf 100644 --- a/src/BFFs/PurchaseBff/Services/BasketService.cs +++ b/src/BFFs/PurchaseBff/Services/BasketService.cs @@ -44,31 +44,6 @@ namespace PurchaseBff.Services int i = 0; } - public OrderData MapBasketToOrder(BasketData basket, bool isDraft) - { - var order = new OrderData - { - Total = 0, - IsDraft = isDraft - }; - - basket.Items.ForEach(x => - { - order.OrderItems.Add(new OrderItemData() - { - ProductId = int.Parse(x.ProductId), - - PictureUrl = x.PictureUrl, - ProductName = x.ProductName, - Units = x.Quantity, - UnitPrice = x.UnitPrice - }); - order.Total += (x.Quantity * x.UnitPrice); - }); - - return order; - } - async Task GetUserTokenAsync() { var context = _httpContextAccessor.HttpContext; diff --git a/src/BFFs/PurchaseBff/Services/IBasketService.cs b/src/BFFs/PurchaseBff/Services/IBasketService.cs index 79319536f..74f6c21ba 100644 --- a/src/BFFs/PurchaseBff/Services/IBasketService.cs +++ b/src/BFFs/PurchaseBff/Services/IBasketService.cs @@ -11,6 +11,5 @@ namespace PurchaseBff.Services Task GetById(string id); Task Update(BasketData currentBasket); - OrderData MapBasketToOrder(BasketData basket, bool isDraft); } } diff --git a/src/BFFs/PurchaseBff/Services/IOrderApiClient.cs b/src/BFFs/PurchaseBff/Services/IOrderApiClient.cs new file mode 100644 index 000000000..2d23e71f6 --- /dev/null +++ b/src/BFFs/PurchaseBff/Services/IOrderApiClient.cs @@ -0,0 +1,13 @@ +using PurchaseBff.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace PurchaseBff.Services +{ + public interface IOrderApiClient + { + Task GetOrderDraftFromBasket(BasketData basket); + } +} diff --git a/src/BFFs/PurchaseBff/Services/OrderApiClient.cs b/src/BFFs/PurchaseBff/Services/OrderApiClient.cs new file mode 100644 index 000000000..44f33cf71 --- /dev/null +++ b/src/BFFs/PurchaseBff/Services/OrderApiClient.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.eShopOnContainers.BuildingBlocks.Resilience.Http; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Newtonsoft.Json; +using PurchaseBff.Config; +using PurchaseBff.Models; + +namespace PurchaseBff.Services +{ + public class OrderApiClient : IOrderApiClient + { + + private readonly IHttpClient _apiClient; + private readonly ILogger _logger; + private readonly UrlsConfig _urls; + + public OrderApiClient(IHttpClient httpClient, ILogger logger, IOptionsSnapshot config) + { + _apiClient = httpClient; + _logger = logger; + _urls = config.Value; + } + + public async Task GetOrderDraftFromBasket(BasketData basket) + { + var url = _urls.Orders + UrlsConfig.OrdersOperations.GetOrderDraft(); + var response = await _apiClient.PostAsync(url, basket); + response.EnsureSuccessStatusCode(); + var jsonResponse = await response.Content.ReadAsStringAsync(); + return JsonConvert.DeserializeObject(jsonResponse); + } + } +} diff --git a/src/BFFs/PurchaseBff/Startup.cs b/src/BFFs/PurchaseBff/Startup.cs index 13fdcc269..d7e9b4e28 100644 --- a/src/BFFs/PurchaseBff/Startup.cs +++ b/src/BFFs/PurchaseBff/Startup.cs @@ -35,6 +35,7 @@ namespace PurchaseBff services.AddSingleton(); services.AddTransient(); services.AddTransient(); + services.AddTransient(); services.AddOptions(); services.Configure(Configuration.GetSection("urls")); diff --git a/src/BFFs/PurchaseBff/appsettings.localhost.json b/src/BFFs/PurchaseBff/appsettings.localhost.json index a8c119c93..57b5e894d 100644 --- a/src/BFFs/PurchaseBff/appsettings.localhost.json +++ b/src/BFFs/PurchaseBff/appsettings.localhost.json @@ -2,6 +2,7 @@ "urls": { "basket": "http://localhost:55105", "catalog": "http://localhost:55101", - "identity": "http://localhost:55105" + "orders": "http://localhost:55102", + "identity": "http://localhost:55105" } } diff --git a/src/Services/Basket/Basket.API/Properties/launchSettings.json b/src/Services/Basket/Basket.API/Properties/launchSettings.json index 013205c33..bce29a595 100644 --- a/src/Services/Basket/Basket.API/Properties/launchSettings.json +++ b/src/Services/Basket/Basket.API/Properties/launchSettings.json @@ -3,7 +3,7 @@ "windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": { - "applicationUrl": "http://localhost:57622/", + "applicationUrl": "http://localhost:50920/", "sslPort": 0 } }, diff --git a/src/Services/Catalog/Catalog.API/Controllers/CatalogController.cs b/src/Services/Catalog/Catalog.API/Controllers/CatalogController.cs index 1b53171d0..0d224fc68 100644 --- a/src/Services/Catalog/Catalog.API/Controllers/CatalogController.cs +++ b/src/Services/Catalog/Catalog.API/Controllers/CatalogController.cs @@ -66,6 +66,11 @@ namespace Microsoft.eShopOnContainers.Services.Catalog.API.Controllers } var item = await _catalogContext.CatalogItems.SingleOrDefaultAsync(ci => ci.Id == id); + + var baseUri = _settings.PicBaseUrl; + var azureStorageEnabled = _settings.AzureStorageEnabled; + item.FillProductUrl(baseUri, azureStorageEnabled: azureStorageEnabled); + if (item != null) { return Ok(item); @@ -244,13 +249,12 @@ namespace Microsoft.eShopOnContainers.Services.Catalog.API.Controllers private List ChangeUriPlaceholder(List items) { var baseUri = _settings.PicBaseUrl; + var azureStorageEnabled = _settings.AzureStorageEnabled; - items.ForEach(catalogItem => + foreach (var item in items) { - catalogItem.PictureUri = _settings.AzureStorageEnabled - ? baseUri + catalogItem.PictureFileName - : baseUri.Replace("[0]", catalogItem.Id.ToString()); - }); + item.FillProductUrl(baseUri, azureStorageEnabled: azureStorageEnabled); + } return items; } diff --git a/src/Services/Catalog/Catalog.API/Extensions/CatalogItemExtensions.cs b/src/Services/Catalog/Catalog.API/Extensions/CatalogItemExtensions.cs new file mode 100644 index 000000000..71b9d88a3 --- /dev/null +++ b/src/Services/Catalog/Catalog.API/Extensions/CatalogItemExtensions.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace Microsoft.eShopOnContainers.Services.Catalog.API.Model +{ + public static class CatalogItemExtensions + { + public static void FillProductUrl(this CatalogItem item, string picBaseUrl, bool azureStorageEnabled) + { + item.PictureUri = azureStorageEnabled + ? picBaseUrl + item.PictureFileName + : picBaseUrl.Replace("[0]", item.Id.ToString()); + } + } +} diff --git a/src/Services/Ordering/Ordering.API/Application/Commands/CreateOrderCommand.cs b/src/Services/Ordering/Ordering.API/Application/Commands/CreateOrderCommand.cs index 980f9d0b6..437212b8d 100644 --- a/src/Services/Ordering/Ordering.API/Application/Commands/CreateOrderCommand.cs +++ b/src/Services/Ordering/Ordering.API/Application/Commands/CreateOrderCommand.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using System.Runtime.Serialization; using System.Collections; using Ordering.API.Application.Models; +using System.Linq; namespace Microsoft.eShopOnContainers.Services.Ordering.API.Application.Commands { @@ -68,7 +69,7 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.API.Application.Commands string cardNumber, string cardHolderName, DateTime cardExpiration, string cardSecurityNumber, int cardTypeId) : this() { - _orderItems = MapToOrderItems(basketItems); + _orderItems = basketItems.ToOrderItemsDTO().ToList(); UserId = userId; City = city; Street = street; @@ -83,20 +84,6 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.API.Application.Commands CardExpiration = cardExpiration; } - private List MapToOrderItems(List basketItems) - { - var result = new List(); - basketItems.ForEach((item) => { - result.Add(new OrderItemDTO() { - ProductId = int.TryParse(item.ProductId, out int id) ? id : -1, - ProductName = item.ProductName, - PictureUrl = item.PictureUrl, - UnitPrice = item.UnitPrice, - Units = item.Quantity - }); - }); - return result; - } public class OrderItemDTO { diff --git a/src/Services/Ordering/Ordering.API/Application/Commands/CreateOrderDraftCommand.cs b/src/Services/Ordering/Ordering.API/Application/Commands/CreateOrderDraftCommand.cs new file mode 100644 index 000000000..1d3d52c63 --- /dev/null +++ b/src/Services/Ordering/Ordering.API/Application/Commands/CreateOrderDraftCommand.cs @@ -0,0 +1,27 @@ +using MediatR; +using Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.OrderAggregate; +using Ordering.API.Application.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.Serialization; +using System.Threading.Tasks; +using static Microsoft.eShopOnContainers.Services.Ordering.API.Application.Commands.CreateOrderCommand; + +namespace Microsoft.eShopOnContainers.Services.Ordering.API.Application.Commands +{ + public class CreateOrderDraftCommand : IRequest + { + + public string BuyerId { get; private set; } + + public IEnumerable Items { get; private set; } + + public CreateOrderDraftCommand(string buyerId, IEnumerable items) + { + BuyerId = buyerId; + Items = items; + } + } + +} diff --git a/src/Services/Ordering/Ordering.API/Application/Commands/CreateOrderDraftCommandHandler.cs b/src/Services/Ordering/Ordering.API/Application/Commands/CreateOrderDraftCommandHandler.cs new file mode 100644 index 000000000..2c315248b --- /dev/null +++ b/src/Services/Ordering/Ordering.API/Application/Commands/CreateOrderDraftCommandHandler.cs @@ -0,0 +1,72 @@ +namespace Microsoft.eShopOnContainers.Services.Ordering.API.Application.Commands +{ + using Domain.AggregatesModel.OrderAggregate; + using global::Ordering.API.Application.Models; + using MediatR; + using Microsoft.eShopOnContainers.Services.Ordering.API.Infrastructure.Services; + using Microsoft.eShopOnContainers.Services.Ordering.Infrastructure.Idempotency; + using System; + using System.Collections.Generic; + using System.Linq; + using System.Threading; + using System.Threading.Tasks; + using static Microsoft.eShopOnContainers.Services.Ordering.API.Application.Commands.CreateOrderCommand; + + // Regular CommandHandler + public class CreateOrderDraftCommandHandler + : IRequestHandler + { + private readonly IOrderRepository _orderRepository; + private readonly IIdentityService _identityService; + private readonly IMediator _mediator; + + // Using DI to inject infrastructure persistence Repositories + public CreateOrderDraftCommandHandler(IMediator mediator, IIdentityService identityService) + { + _identityService = identityService ?? throw new ArgumentNullException(nameof(identityService)); + _mediator = mediator ?? throw new ArgumentNullException(nameof(mediator)); + } + + public Task Handle(CreateOrderDraftCommand message, CancellationToken cancellationToken) + { + + var order = Order.NewDraft(); + var orderItems = message.Items.Select(i => i.ToOrderItemDTO()); + foreach (var item in orderItems) + { + order.AddOrderItem(item.ProductId, item.ProductName, item.UnitPrice, item.Discount, item.PictureUrl, item.Units); + } + + return Task.FromResult(OrderDraftDTO.FromOrder(order)); + } + } + + + public class OrderDraftDTO + { + public IEnumerable OrderItems { get; set; } + public decimal Total { get; set; } + + public static OrderDraftDTO FromOrder(Order order) + { + return new OrderDraftDTO() + { + OrderItems = order.OrderItems.Select(oi => new OrderItemDTO + { + Discount = oi.GetCurrentDiscount(), + ProductId = oi.ProductId, + UnitPrice = oi.GetUnitPrice(), + PictureUrl = oi.GetPictureUri(), + Units = oi.GetUnits(), + ProductName = oi.GetOrderItemProductName() + }), + Total = order.GetTotal() + }; + } + + } + + + + +} diff --git a/src/Services/Ordering/Ordering.API/Controllers/OrdersController.cs b/src/Services/Ordering/Ordering.API/Controllers/OrdersController.cs index 993986543..ac179c97f 100644 --- a/src/Services/Ordering/Ordering.API/Controllers/OrdersController.cs +++ b/src/Services/Ordering/Ordering.API/Controllers/OrdersController.cs @@ -5,6 +5,7 @@ using Microsoft.eShopOnContainers.Services.Ordering.API.Application.Commands; using Microsoft.eShopOnContainers.Services.Ordering.API.Application.Queries; using Microsoft.eShopOnContainers.Services.Ordering.API.Infrastructure.Services; using Ordering.API.Application.Commands; +using Ordering.API.Application.Models; using System; using System.Collections.Generic; using System.Net; @@ -101,6 +102,14 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.API.Controllers return Ok(cardTypes); } + + [Route("draft")] + [HttpPost] + public async Task GetOrderDraftFromBasketData([FromBody] CreateOrderDraftCommand createOrderDraftCommand) + { + var draft = await _mediator.Send(createOrderDraftCommand); + return Ok(draft); + } } } diff --git a/src/Services/Ordering/Ordering.API/Extensions/BasketItemExtensions.cs b/src/Services/Ordering/Ordering.API/Extensions/BasketItemExtensions.cs new file mode 100644 index 000000000..56f280978 --- /dev/null +++ b/src/Services/Ordering/Ordering.API/Extensions/BasketItemExtensions.cs @@ -0,0 +1,32 @@ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using static Microsoft.eShopOnContainers.Services.Ordering.API.Application.Commands.CreateOrderCommand; + +namespace Ordering.API.Application.Models +{ + public static class BasketItemExtensions + { + public static IEnumerable ToOrderItemsDTO(this IEnumerable basketItems) + { + foreach (var item in basketItems) + { + yield return item.ToOrderItemDTO(); + } + } + + public static OrderItemDTO ToOrderItemDTO(this BasketItem item) + { + return new OrderItemDTO() + { + ProductId = int.TryParse(item.ProductId, out int id) ? id : -1, + ProductName = item.ProductName, + PictureUrl = item.PictureUrl, + UnitPrice = item.UnitPrice, + Units = item.Quantity + }; + } + } +} diff --git a/src/Services/Ordering/Ordering.API/Properties/launchSettings.json b/src/Services/Ordering/Ordering.API/Properties/launchSettings.json index a6e47ca2d..9d9a76490 100644 --- a/src/Services/Ordering/Ordering.API/Properties/launchSettings.json +++ b/src/Services/Ordering/Ordering.API/Properties/launchSettings.json @@ -3,7 +3,7 @@ "windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": { - "applicationUrl": "http://localhost:5102/", + "applicationUrl": "http://localhost:55102/", "sslPort": 0 } }, @@ -19,7 +19,7 @@ "Microsoft.eShopOnContainers.Services.Ordering.API": { "commandName": "Project", "launchBrowser": true, - "launchUrl": "http://localhost:5000/api/environmentInfo/machinename", + "launchUrl": "http://localhost:55102/", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } diff --git a/src/Services/Ordering/Ordering.Domain/AggregatesModel/OrderAggregate/Order.cs b/src/Services/Ordering/Ordering.Domain/AggregatesModel/OrderAggregate/Order.cs index d2e742b33..82e5744dd 100644 --- a/src/Services/Ordering/Ordering.Domain/AggregatesModel/OrderAggregate/Order.cs +++ b/src/Services/Ordering/Ordering.Domain/AggregatesModel/OrderAggregate/Order.cs @@ -25,6 +25,10 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.O private string _description; + + // Draft orders have this set to true. Currently we don't check anywhere the draft status of an Order, but we could do it if needed + private bool _isDraft; + // DDD Patterns comment // Using a private collection field, better for DDD Aggregate's encapsulation // so OrderItems cannot be added from "outside the AggregateRoot" directly to the collection, @@ -34,12 +38,21 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.O private int? _paymentMethodId; - protected Order() { _orderItems = new List(); } + public static Order NewDraft() + { + var order = new Order(); + order._isDraft = true; + return order; + } + + protected Order() { + _orderItems = new List(); + _isDraft = false; + } public Order(string userId, Address address, int cardTypeId, string cardNumber, string cardSecurityNumber, - string cardHolderName, DateTime cardExpiration, int? buyerId = null, int? paymentMethodId = null) + string cardHolderName, DateTime cardExpiration, int? buyerId = null, int? paymentMethodId = null) : this() { - _orderItems = new List(); _buyerId = buyerId; _paymentMethodId = paymentMethodId; _orderStatusId = OrderStatus.Submitted.Id; @@ -92,12 +105,12 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.O } public void SetAwaitingValidationStatus() - { + { if (_orderStatusId == OrderStatus.Submitted.Id) { AddDomainEvent(new OrderStatusChangedToAwaitingValidationDomainEvent(Id, _orderItems)); _orderStatusId = OrderStatus.AwaitingValidation.Id; - } + } } public void SetStockConfirmedStatus() @@ -108,7 +121,7 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.O _orderStatusId = OrderStatus.StockConfirmed.Id; _description = "All the items were confirmed with available stock."; - } + } } public void SetPaidStatus() @@ -119,7 +132,7 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.O _orderStatusId = OrderStatus.Paid.Id; _description = "The payment was performed at a simulated \"American Bank checking bank account endinf on XX35071\""; - } + } } public void SetShippedStatus() @@ -157,13 +170,13 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.O var itemsStockRejectedDescription = string.Join(", ", itemsStockRejectedProductNames); _description = $"The product items don't have stock: ({itemsStockRejectedDescription})."; - } + } } private void AddOrderStartedDomainEvent(string userId, int cardTypeId, string cardNumber, string cardSecurityNumber, string cardHolderName, DateTime cardExpiration) { - var orderStartedDomainEvent = new OrderStartedDomainEvent(this, userId, cardTypeId, + var orderStartedDomainEvent = new OrderStartedDomainEvent(this, userId, cardTypeId, cardNumber, cardSecurityNumber, cardHolderName, cardExpiration); diff --git a/src/Services/Ordering/Ordering.Domain/AggregatesModel/OrderAggregate/OrderItem.cs b/src/Services/Ordering/Ordering.Domain/AggregatesModel/OrderAggregate/OrderItem.cs index 1b7896dcc..b3b7435e3 100644 --- a/src/Services/Ordering/Ordering.Domain/AggregatesModel/OrderAggregate/OrderItem.cs +++ b/src/Services/Ordering/Ordering.Domain/AggregatesModel/OrderAggregate/OrderItem.cs @@ -41,13 +41,7 @@ namespace Microsoft.eShopOnContainers.Services.Ordering.Domain.AggregatesModel.O _pictureUrl = PictureUrl; } - public void SetPictureUri(string pictureUri) - { - if (!String.IsNullOrWhiteSpace(pictureUri)) - { - _pictureUrl = pictureUri; - } - } + public string GetPictureUri() => _pictureUrl; public decimal GetCurrentDiscount() { diff --git a/src/Web/WebSPA/Properties/launchSettings.json b/src/Web/WebSPA/Properties/launchSettings.json index 8a55ca730..9ae65426a 100644 --- a/src/Web/WebSPA/Properties/launchSettings.json +++ b/src/Web/WebSPA/Properties/launchSettings.json @@ -3,7 +3,7 @@ "windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": { - "applicationUrl": "http://localhost:57625/", + "applicationUrl": "http://localhost:50921/", "sslPort": 0 } }, From 5dfaf07059bbd25201d2d801b8d5fa342a889610 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduard=20Tom=C3=A0s?= Date: Fri, 2 Feb 2018 12:03:48 +0000 Subject: [PATCH 16/78] Ocelot updated to 3.0.0 --- src/Apigw/OcelotApiGw/OcelotApiGw.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Apigw/OcelotApiGw/OcelotApiGw.csproj b/src/Apigw/OcelotApiGw/OcelotApiGw.csproj index 4f6ce6e77..d72d014b4 100644 --- a/src/Apigw/OcelotApiGw/OcelotApiGw.csproj +++ b/src/Apigw/OcelotApiGw/OcelotApiGw.csproj @@ -10,7 +10,7 @@ - + From 704e6ae69333551e3d7b91b361e60211e035430e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduard=20Tom=C3=A0s?= Date: Fri, 2 Feb 2018 15:55:33 +0000 Subject: [PATCH 17/78] Finished purchase-bff implementation and ocelot rerouting --- docker-compose.override.yml | 3 - src/Apigw/OcelotApiGw/Program.cs | 13 ++- .../configuration/configuration.json | 98 ++++++++++++++----- .../Resilience.Http/ResilientHttpClient.cs | 5 + .../Resilience.Http/StandardHttpClient.cs | 5 + .../Controllers/BasketController.cs | 4 + src/Web/WebMVC/AppSettings.cs | 3 - src/Web/WebMVC/Services/BasketService.cs | 21 ++-- src/Web/WebMVC/Services/CatalogService.cs | 2 +- src/Web/WebMVC/Services/OrderingService.cs | 2 +- 10 files changed, 108 insertions(+), 48 deletions(-) diff --git a/docker-compose.override.yml b/docker-compose.override.yml index bf6a80691..1a8d9c284 100644 --- a/docker-compose.override.yml +++ b/docker-compose.override.yml @@ -134,9 +134,6 @@ services: environment: - ASPNETCORE_ENVIRONMENT=Development - ASPNETCORE_URLS=http://0.0.0.0:80 - - CatalogUrl=http://apigw/purchase-bff/catalog - - OrderingUrl=http://ordering.api - - BasketUrl=http://basket.api - PurchaseUrl=http://apigw/purchase-bff - LocationsUrl=http://locations.api - IdentityUrl=http://10.0.75.1:5105 # Local Mac: Use http://docker.for.mac.localhost:5105 || Local Windows: Use 10.0.75.1 in a "Docker for Windows" environment, if using "localhost" from browser. || #Remote access: Use ${ESHOP_EXTERNAL_DNS_NAME_OR_IP} if using external IP or DNS name from browser. diff --git a/src/Apigw/OcelotApiGw/Program.cs b/src/Apigw/OcelotApiGw/Program.cs index bd5230b96..782681901 100644 --- a/src/Apigw/OcelotApiGw/Program.cs +++ b/src/Apigw/OcelotApiGw/Program.cs @@ -7,6 +7,7 @@ using Microsoft.AspNetCore; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; +using Microsoft.Extensions.DependencyInjection; namespace OcelotApiGw { @@ -17,10 +18,14 @@ namespace OcelotApiGw BuildWebHost(args).Run(); } - public static IWebHost BuildWebHost(string[] args) => - WebHost.CreateDefaultBuilder(args) + public static IWebHost BuildWebHost(string[] args) + { + var builder = WebHost.CreateDefaultBuilder(args); + builder.ConfigureServices(s => s.AddSingleton(builder)) .ConfigureAppConfiguration(ic => ic.AddJsonFile(Path.Combine("configuration", "configuration.json"))) - .UseStartup() - .Build(); + .UseStartup(); + var host = builder.Build(); + return host; + } } } diff --git a/src/Apigw/OcelotApiGw/configuration/configuration.json b/src/Apigw/OcelotApiGw/configuration/configuration.json index cc2defca6..2d5e6c8f7 100644 --- a/src/Apigw/OcelotApiGw/configuration/configuration.json +++ b/src/Apigw/OcelotApiGw/configuration/configuration.json @@ -1,20 +1,44 @@ { "ReRoutes": [ { - "DownstreamPathTemplate": "/{everything}", + "DownstreamPathTemplate": "/api/{version}/{everything}", "DownstreamScheme": "http", - "DownstreamHost": "catalog.api", - "DownstreamPort": 80, - "UpstreamPathTemplate": "/purchase-bff/catalog/{everything}", + "DownstreamHostAndPorts": [ + { + "Host": "catalog.api", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/purchase-bff/api/{version}/c/{everything}", "UpstreamHttpMethod": [ "GET" ] }, { - "DownstreamPathTemplate": "/{everything}", + "DownstreamPathTemplate": "/api/{version}/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "basket.api", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/purchase-bff/api/{version}/b/{everything}", + "UpstreamHttpMethod": [], + "AuthenticationOptions": { + "AuthenticationProviderKey": "IdentityApiKey", + "AllowedScopes": [] + } + }, + { + "DownstreamPathTemplate": "/api/{version}/{everything}", "DownstreamScheme": "http", - "DownstreamHost": "basket.api", - "DownstreamPort": 80, - "UpstreamPathTemplate": "/purchase-bff/basket/{everything}", - "UpstreamHttpMethod": [ "GET" ], + "DownstreamHostAndPorts": [ + { + "Host": "ordering.api", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/purchase-bff/api/{version}/o/{everything}", + "UpstreamHttpMethod": [], "AuthenticationOptions": { "AuthenticationProviderKey": "IdentityApiKey", "AllowedScopes": [] @@ -23,8 +47,12 @@ { "DownstreamPathTemplate": "/{everything}", "DownstreamScheme": "http", - "DownstreamHost": "purchasebff", - "DownstreamPort": 80, + "DownstreamHostAndPorts": [ + { + "Host": "purchasebff", + "Port": 80 + } + ], "UpstreamPathTemplate": "/purchase-bff/{everything}", "UpstreamHttpMethod": [ "POST", "PUT", "GET" ], "AuthenticationOptions": { @@ -35,48 +63,72 @@ { "DownstreamPathTemplate": "/{everything}", "DownstreamScheme": "http", - "DownstreamHost": "ordering.api", - "DownstreamPort": 80, + "DownstreamHostAndPorts": [ + { + "Host": "ordering.api", + "Port": 80 + } + ], "UpstreamPathTemplate": "/orders-api/{everything}", "UpstreamHttpMethod": [] }, { "DownstreamPathTemplate": "/{everything}", "DownstreamScheme": "http", - "DownstreamHost": "basket.api", - "DownstreamPort": 80, + "DownstreamHostAndPorts": [ + { + "Host": "basket.api", + "Port": 80 + } + ], "UpstreamPathTemplate": "/basket-api/{everything}", "UpstreamHttpMethod": [] }, { "DownstreamPathTemplate": "/{everything}", "DownstreamScheme": "http", - "DownstreamHost": "catalog.api", - "DownstreamPort": 80, + "DownstreamHostAndPorts": [ + { + "Host": "catalog.api", + "Port": 80 + } + ], "UpstreamPathTemplate": "/catalog-api/{everything}", "UpstreamHttpMethod": [] }, { "DownstreamPathTemplate": "/{everything}", "DownstreamScheme": "http", - "DownstreamHost": "marketing.api", - "DownstreamPort": 80, + "DownstreamHostAndPorts": [ + { + "Host": "marketing.api", + "Port": 80 + } + ], "UpstreamPathTemplate": "/marketing-api/{everything}", "UpstreamHttpMethod": [] }, { "DownstreamPathTemplate": "/{everything}", "DownstreamScheme": "http", - "DownstreamHost": "payment.api", - "DownstreamPort": 80, + "DownstreamHostAndPorts": [ + { + "Host": "payment.api", + "Port": 80 + } + ], "UpstreamPathTemplate": "/payment-api/{everything}", "UpstreamHttpMethod": [] }, { "DownstreamPathTemplate": "/{everything}", "DownstreamScheme": "http", - "DownstreamHost": "locations.api", - "DownstreamPort": 80, + "DownstreamHostAndPorts": [ + { + "Host": "locations.api", + "Port": 80 + } + ], "UpstreamPathTemplate": "/location-api/{everything}", "UpstreamHttpMethod": [] } diff --git a/src/BuildingBlocks/Resilience/Resilience.Http/ResilientHttpClient.cs b/src/BuildingBlocks/Resilience/Resilience.Http/ResilientHttpClient.cs index 18051a501..9fa38ee8d 100644 --- a/src/BuildingBlocks/Resilience/Resilience.Http/ResilientHttpClient.cs +++ b/src/BuildingBlocks/Resilience/Resilience.Http/ResilientHttpClient.cs @@ -97,6 +97,11 @@ namespace Microsoft.eShopOnContainers.BuildingBlocks.Resilience.Http throw new HttpRequestException(); } + if (!response.IsSuccessStatusCode) + { + return null; + } + return await response.Content.ReadAsStringAsync(); }); } diff --git a/src/BuildingBlocks/Resilience/Resilience.Http/StandardHttpClient.cs b/src/BuildingBlocks/Resilience/Resilience.Http/StandardHttpClient.cs index a5f6a63c4..578168bff 100644 --- a/src/BuildingBlocks/Resilience/Resilience.Http/StandardHttpClient.cs +++ b/src/BuildingBlocks/Resilience/Resilience.Http/StandardHttpClient.cs @@ -36,6 +36,11 @@ namespace Microsoft.eShopOnContainers.BuildingBlocks.Resilience.Http var response = await _client.SendAsync(requestMessage); + if (!response.IsSuccessStatusCode) + { + return null; + } + return await response.Content.ReadAsStringAsync(); } diff --git a/src/Services/Basket/Basket.API/Controllers/BasketController.cs b/src/Services/Basket/Basket.API/Controllers/BasketController.cs index 11ecac7c2..48ad68903 100644 --- a/src/Services/Basket/Basket.API/Controllers/BasketController.cs +++ b/src/Services/Basket/Basket.API/Controllers/BasketController.cs @@ -34,6 +34,10 @@ namespace Microsoft.eShopOnContainers.Services.Basket.API.Controllers public async Task Get(string id) { var basket = await _repository.GetBasketAsync(id); + if (basket == null) + { + return NotFound(); + } return Ok(basket); } diff --git a/src/Web/WebMVC/AppSettings.cs b/src/Web/WebMVC/AppSettings.cs index 18db7d4bf..d235910b0 100644 --- a/src/Web/WebMVC/AppSettings.cs +++ b/src/Web/WebMVC/AppSettings.cs @@ -8,9 +8,6 @@ namespace Microsoft.eShopOnContainers.WebMVC public class AppSettings { public Connectionstrings ConnectionStrings { get; set; } - public string CatalogUrl { get; set; } - public string OrderingUrl { get; set; } - public string BasketUrl { get; set; } public string MarketingUrl { get; set; } public string LocationsUrl { get; set; } diff --git a/src/Web/WebMVC/Services/BasketService.cs b/src/Web/WebMVC/Services/BasketService.cs index 208ea71ad..54287a796 100644 --- a/src/Web/WebMVC/Services/BasketService.cs +++ b/src/Web/WebMVC/Services/BasketService.cs @@ -16,7 +16,7 @@ namespace Microsoft.eShopOnContainers.WebMVC.Services { private readonly IOptionsSnapshot _settings; private readonly IHttpClient _apiClient; - private readonly string _remoteServiceBaseUrl; + private readonly string _basketByPassUrl; private readonly string _purchaseUrl; private readonly IHttpContextAccessor _httpContextAccesor; @@ -26,7 +26,7 @@ namespace Microsoft.eShopOnContainers.WebMVC.Services IHttpContextAccessor httpContextAccesor, IHttpClient httpClient) { _settings = settings; - _remoteServiceBaseUrl = $"{_settings.Value.BasketUrl}/api/v1/basket"; + _basketByPassUrl = $"{_settings.Value.PurchaseUrl}/api/v1/b/basket"; _purchaseUrl = $"{_settings.Value.PurchaseUrl}/api/v1"; _httpContextAccesor = httpContextAccesor; _apiClient = httpClient; @@ -35,24 +35,19 @@ namespace Microsoft.eShopOnContainers.WebMVC.Services public async Task GetBasket(ApplicationUser user) { var token = await GetUserTokenAsync(); - var getBasketUri = API.Basket.GetBasket(_remoteServiceBaseUrl, user.Id); + var getBasketUri = API.Basket.GetBasket(_basketByPassUrl, user.Id); var dataString = await _apiClient.GetStringAsync(getBasketUri, token); - // Use the ?? Null conditional operator to simplify the initialization of response - var response = JsonConvert.DeserializeObject(dataString) ?? - new Basket() - { - BuyerId = user.Id - }; - - return response; + return string.IsNullOrEmpty(dataString) ? + new Basket() { BuyerId = user.Id} : + JsonConvert.DeserializeObject(dataString); } public async Task UpdateBasket(Basket basket) { var token = await GetUserTokenAsync(); - var updateBasketUri = API.Basket.UpdateBasket(_remoteServiceBaseUrl); + var updateBasketUri = API.Basket.UpdateBasket(_basketByPassUrl); var response = await _apiClient.PostAsync(updateBasketUri, basket, token); @@ -64,7 +59,7 @@ namespace Microsoft.eShopOnContainers.WebMVC.Services public async Task Checkout(BasketDTO basket) { var token = await GetUserTokenAsync(); - var updateBasketUri = API.Basket.CheckoutBasket(_remoteServiceBaseUrl); + var updateBasketUri = API.Basket.CheckoutBasket(_basketByPassUrl); var response = await _apiClient.PostAsync(updateBasketUri, basket, token); diff --git a/src/Web/WebMVC/Services/CatalogService.cs b/src/Web/WebMVC/Services/CatalogService.cs index 2af428e2e..5b6fbe26b 100644 --- a/src/Web/WebMVC/Services/CatalogService.cs +++ b/src/Web/WebMVC/Services/CatalogService.cs @@ -25,7 +25,7 @@ namespace Microsoft.eShopOnContainers.WebMVC.Services _apiClient = httpClient; _logger = logger; - _remoteServiceBaseUrl = $"{_settings.Value.CatalogUrl}/api/v1/catalog/"; + _remoteServiceBaseUrl = $"{_settings.Value.PurchaseUrl}/api/v1/c/catalog/"; } public async Task GetCatalogItems(int page, int take, int? brand, int? type) diff --git a/src/Web/WebMVC/Services/OrderingService.cs b/src/Web/WebMVC/Services/OrderingService.cs index f36f1410d..ec9d2e8fd 100644 --- a/src/Web/WebMVC/Services/OrderingService.cs +++ b/src/Web/WebMVC/Services/OrderingService.cs @@ -21,7 +21,7 @@ namespace Microsoft.eShopOnContainers.WebMVC.Services public OrderingService(IOptionsSnapshot settings, IHttpContextAccessor httpContextAccesor, IHttpClient httpClient) { - _remoteServiceBaseUrl = $"{settings.Value.OrderingUrl}/api/v1/orders"; + _remoteServiceBaseUrl = $"{settings.Value.PurchaseUrl}/api/v1/o/orders"; _settings = settings; _httpContextAccesor = httpContextAccesor; _apiClient = httpClient; From 735e9bd94ea85e821f3e6e54bb562cf28498ea17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduard=20Tom=C3=A0s?= Date: Fri, 2 Feb 2018 15:55:51 +0000 Subject: [PATCH 18/78] Fixed crash on BasketService --- src/BFFs/PurchaseBff/Services/BasketService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/BFFs/PurchaseBff/Services/BasketService.cs b/src/BFFs/PurchaseBff/Services/BasketService.cs index 881718baf..c1c3a6f9d 100644 --- a/src/BFFs/PurchaseBff/Services/BasketService.cs +++ b/src/BFFs/PurchaseBff/Services/BasketService.cs @@ -33,7 +33,7 @@ namespace PurchaseBff.Services { var token = await GetUserTokenAsync(); var data = await _apiClient.GetStringAsync(_urls.Basket + UrlsConfig.BasketOperations.GetItemById(id), token); - var basket = JsonConvert.DeserializeObject(data); + var basket = !string.IsNullOrEmpty(data) ? JsonConvert.DeserializeObject(data) : null; return basket; } From 8edd7361967c25a7e93763389447f1d71e87bd26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduard=20Tom=C3=A0s?= Date: Tue, 6 Feb 2018 17:35:01 +0000 Subject: [PATCH 19/78] Updating SPA for working with PurchaseBFF. --- docker-compose.override.yml | 4 +- src/Apigw/OcelotApiGw/Startup.cs | 11 +++++ src/BFFs/PurchaseBff/Config/UrlsConfig.cs | 1 + .../Controllers/BasketController.cs | 43 +++++++++++++++++++ .../PurchaseBff/Models/UpdateBasketRequest.cs | 21 +++++++++ .../Properties/launchSettings.json | 2 +- .../PurchaseBff/Services/CatalogService.cs | 8 ++++ .../PurchaseBff/Services/ICatalogService.cs | 1 + .../Basket.API/Properties/launchSettings.json | 2 +- .../Controllers/CatalogController.cs | 28 ++++++++++-- .../Properties/launchSettings.json | 2 +- src/Web/WebSPA/AppSettings.cs | 8 ++-- .../Client/modules/basket/basket.service.ts | 13 +++--- .../Client/modules/catalog/catalog.service.ts | 6 +-- .../Client/modules/orders/orders.service.ts | 8 ++-- .../shared/models/configuration.model.ts | 4 +- .../shared/services/configuration.service.ts | 4 +- .../shared/services/security.service.ts | 2 +- src/Web/WebSPA/Properties/launchSettings.json | 2 +- src/Web/WebSPA/appsettings.json | 4 +- 20 files changed, 138 insertions(+), 36 deletions(-) create mode 100644 src/BFFs/PurchaseBff/Models/UpdateBasketRequest.cs diff --git a/docker-compose.override.yml b/docker-compose.override.yml index 1a8d9c284..cfff01732 100644 --- a/docker-compose.override.yml +++ b/docker-compose.override.yml @@ -112,12 +112,10 @@ services: environment: - ASPNETCORE_ENVIRONMENT=Development - ASPNETCORE_URLS=http://0.0.0.0:80 - - CatalogUrl=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5101 - - OrderingUrl=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5102 - IdentityUrl=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5105 #Local: You need to open your local dev-machine firewall at range 5100-5105. at range 5100-5105. - - BasketUrl=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5103 - MarketingUrl=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5110 - LocationsUrl=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5109 + - PurchaseUrl=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5200 - CatalogUrlHC=http://catalog.api/hc - OrderingUrlHC=http://ordering.api/hc - IdentityUrlHC=http://identity.api/hc #Local: Use ${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}, if using external IP or DNS name from browser. diff --git a/src/Apigw/OcelotApiGw/Startup.cs b/src/Apigw/OcelotApiGw/Startup.cs index 9c7eb18ef..01ffe5139 100644 --- a/src/Apigw/OcelotApiGw/Startup.cs +++ b/src/Apigw/OcelotApiGw/Startup.cs @@ -29,6 +29,15 @@ namespace OcelotApiGw var identityUrl = _cfg.GetValue("IdentityUrl"); var authenticationProviderKey = "IdentityApiKey"; + services.AddCors(options => + { + options.AddPolicy("CorsPolicy", + builder => builder.AllowAnyOrigin() + .AllowAnyMethod() + .AllowAnyHeader() + .AllowCredentials()); + }); + services.AddAuthentication() .AddJwtBearer(authenticationProviderKey, x => { @@ -68,6 +77,8 @@ namespace OcelotApiGw loggerFactory.AddConsole(_cfg.GetSection("Logging")); + app.UseCors("CorsPolicy"); + app.UseOcelot().Wait(); } } diff --git a/src/BFFs/PurchaseBff/Config/UrlsConfig.cs b/src/BFFs/PurchaseBff/Config/UrlsConfig.cs index bca4db9ff..58f344aac 100644 --- a/src/BFFs/PurchaseBff/Config/UrlsConfig.cs +++ b/src/BFFs/PurchaseBff/Config/UrlsConfig.cs @@ -10,6 +10,7 @@ namespace PurchaseBff.Config public class CatalogOperations { public static string GetItemById(int id) => $"/api/v1/catalog/items/{id}"; + public static string GetItemsById(IEnumerable ids) => $"/api/v1/catalog/items?ids={string.Join(',', ids)}"; } public class BasketOperations diff --git a/src/BFFs/PurchaseBff/Controllers/BasketController.cs b/src/BFFs/PurchaseBff/Controllers/BasketController.cs index 17dbf6ff5..ac8620623 100644 --- a/src/BFFs/PurchaseBff/Controllers/BasketController.cs +++ b/src/BFFs/PurchaseBff/Controllers/BasketController.cs @@ -21,6 +21,49 @@ namespace PurchaseBff.Controllers _basket = basketService; } + [HttpPost] + [HttpPut] + public async Task UpdateAllBasket([FromBody] UpdateBasketRequest data) + { + + if (data.Items == null || !data.Items.Any()) + { + return BadRequest("Need to pass at least one basket line"); + } + + // Retrieve the current basket + var currentBasket = await _basket.GetById(data.BuyerId); + if (currentBasket == null) + { + currentBasket = new BasketData(data.BuyerId); + } + + var catalogItems = await _catalog.GetCatalogItems(data.Items.Select(x => x.ProductId)); + var newBasket = new BasketData(data.BuyerId); + + foreach (var bitem in data.Items) + { + var catalogItem = catalogItems.SingleOrDefault(ci => ci.Id == bitem.ProductId); + if (catalogItem == null) + { + return BadRequest($"Basket refers to a non-existing catalog item ({bitem.ProductId})"); + } + + newBasket.Items.Add(new BasketDataItem() + { + Id = bitem.Id, + ProductId = catalogItem.Id.ToString(), + ProductName = catalogItem.Name, + PictureUrl = catalogItem.PictureUri, + UnitPrice = catalogItem.Price, + Quantity = bitem.Quantity + }); + } + + await _basket.Update(newBasket); + return Ok(newBasket); + } + [HttpPut] [Route("items")] public async Task UpdateQuantities([FromBody] UpdateBasketItemsRequest data) diff --git a/src/BFFs/PurchaseBff/Models/UpdateBasketRequest.cs b/src/BFFs/PurchaseBff/Models/UpdateBasketRequest.cs new file mode 100644 index 000000000..a6813c788 --- /dev/null +++ b/src/BFFs/PurchaseBff/Models/UpdateBasketRequest.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace PurchaseBff.Models +{ + public class UpdateBasketRequest + { + public string BuyerId { get; set; } + + public IEnumerable Items { get; set; } + } + + public class UpdateBasketRequestItemData + { + public string Id { get; set; } // Basket id + public int ProductId { get; set; } // Catalog item id + public int Quantity { get; set; } // Quantity + } +} diff --git a/src/BFFs/PurchaseBff/Properties/launchSettings.json b/src/BFFs/PurchaseBff/Properties/launchSettings.json index d6c88d211..925e70b0d 100644 --- a/src/BFFs/PurchaseBff/Properties/launchSettings.json +++ b/src/BFFs/PurchaseBff/Properties/launchSettings.json @@ -3,7 +3,7 @@ "windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": { - "applicationUrl": "http://localhost:58243/", + "applicationUrl": "http://localhost:57425/", "sslPort": 0 } }, diff --git a/src/BFFs/PurchaseBff/Services/CatalogService.cs b/src/BFFs/PurchaseBff/Services/CatalogService.cs index 071c162b4..7030da747 100644 --- a/src/BFFs/PurchaseBff/Services/CatalogService.cs +++ b/src/BFFs/PurchaseBff/Services/CatalogService.cs @@ -31,5 +31,13 @@ namespace PurchaseBff.Services var item = JsonConvert.DeserializeObject(data); return item; } + + public async Task> GetCatalogItems(IEnumerable ids) + { + var data = await _apiClient.GetStringAsync(_urls.Catalog + UrlsConfig.CatalogOperations.GetItemsById(ids)); + var item = JsonConvert.DeserializeObject(data); + return item; + + } } } diff --git a/src/BFFs/PurchaseBff/Services/ICatalogService.cs b/src/BFFs/PurchaseBff/Services/ICatalogService.cs index f7caaf6e3..b51c0f0cd 100644 --- a/src/BFFs/PurchaseBff/Services/ICatalogService.cs +++ b/src/BFFs/PurchaseBff/Services/ICatalogService.cs @@ -9,5 +9,6 @@ namespace PurchaseBff.Services public interface ICatalogService { Task GetCatalogItem(int id); + Task> GetCatalogItems(IEnumerable ids); } } diff --git a/src/Services/Basket/Basket.API/Properties/launchSettings.json b/src/Services/Basket/Basket.API/Properties/launchSettings.json index bce29a595..7d1c959e3 100644 --- a/src/Services/Basket/Basket.API/Properties/launchSettings.json +++ b/src/Services/Basket/Basket.API/Properties/launchSettings.json @@ -3,7 +3,7 @@ "windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": { - "applicationUrl": "http://localhost:50920/", + "applicationUrl": "http://localhost:57423/", "sslPort": 0 } }, diff --git a/src/Services/Catalog/Catalog.API/Controllers/CatalogController.cs b/src/Services/Catalog/Catalog.API/Controllers/CatalogController.cs index 0d224fc68..71f700762 100644 --- a/src/Services/Catalog/Catalog.API/Controllers/CatalogController.cs +++ b/src/Services/Catalog/Catalog.API/Controllers/CatalogController.cs @@ -32,11 +32,16 @@ namespace Microsoft.eShopOnContainers.Services.Catalog.API.Controllers // GET api/v1/[controller]/items[?pageSize=3&pageIndex=10] [HttpGet] - [Route("[action]")] + [Route("items")] [ProducesResponseType(typeof(PaginatedItemsViewModel), (int)HttpStatusCode.OK)] - public async Task Items([FromQuery]int pageSize = 10, [FromQuery]int pageIndex = 0) - + [ProducesResponseType(typeof(IEnumerable), (int)HttpStatusCode.OK)] + public async Task Items([FromQuery]int pageSize = 10, [FromQuery]int pageIndex = 0, [FromQuery] string ids = null) { + if (!string.IsNullOrEmpty(ids)) + { + return GetItemsByIds(ids); + } + var totalItems = await _catalogContext.CatalogItems .LongCountAsync(); @@ -54,6 +59,23 @@ namespace Microsoft.eShopOnContainers.Services.Catalog.API.Controllers return Ok(model); } + private IActionResult GetItemsByIds(string ids) + { + var numIds = ids.Split(',') + .Select(id => (Ok: int.TryParse(id, out int x), Value: x)); + if (!numIds.All(nid => nid.Ok)) + { + return BadRequest("ids value invalid. Must be comma-separated list of numbers"); + } + + var idsToSelect = numIds.Select(id => id.Value); + var items = _catalogContext.CatalogItems.Where(ci => idsToSelect.Contains(ci.Id)).ToList(); + + items = ChangeUriPlaceholder(items); + return Ok(items); + + } + [HttpGet] [Route("items/{id:int}")] [ProducesResponseType((int)HttpStatusCode.NotFound)] diff --git a/src/Services/Catalog/Catalog.API/Properties/launchSettings.json b/src/Services/Catalog/Catalog.API/Properties/launchSettings.json index a0b19b3bf..2b21ca280 100644 --- a/src/Services/Catalog/Catalog.API/Properties/launchSettings.json +++ b/src/Services/Catalog/Catalog.API/Properties/launchSettings.json @@ -3,7 +3,7 @@ "windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": { - "applicationUrl": "http://localhost:57623/", + "applicationUrl": "http://localhost:57424/", "sslPort": 0 } }, diff --git a/src/Web/WebSPA/AppSettings.cs b/src/Web/WebSPA/AppSettings.cs index fd254c3ae..c3fbd3b80 100644 --- a/src/Web/WebSPA/AppSettings.cs +++ b/src/Web/WebSPA/AppSettings.cs @@ -7,13 +7,13 @@ namespace eShopOnContainers.WebSPA { public class AppSettings { - public string BaseUrl { get; set; } - public string CatalogUrl { get; set; } - public string OrderingUrl { get; set; } public string IdentityUrl { get; set; } public string BasketUrl { get; set; } public string MarketingUrl { get; set; } + + public string PurchaseUrl { get; set; } + public string ActivateCampaignDetailFunction { get; set; } - public bool UseCustomizationData { get; set; } + public bool UseCustomizationData { get; set; } } } diff --git a/src/Web/WebSPA/Client/modules/basket/basket.service.ts b/src/Web/WebSPA/Client/modules/basket/basket.service.ts index 864915541..da422d5ad 100644 --- a/src/Web/WebSPA/Client/modules/basket/basket.service.ts +++ b/src/Web/WebSPA/Client/modules/basket/basket.service.ts @@ -23,6 +23,7 @@ import { Subject } from 'rxjs/Subject'; @Injectable() export class BasketService { private basketUrl: string = ''; + private purchaseUrl: string = ''; basket: IBasket = { buyerId: '', items: [] @@ -40,12 +41,14 @@ export class BasketService { if (this.authService.UserData) { this.basket.buyerId = this.authService.UserData.sub; if (this.configurationService.isReady) { - this.basketUrl = this.configurationService.serverSettings.basketUrl; + this.basketUrl = this.configurationService.serverSettings.purchaseUrl; + this.purchaseUrl = this.configurationService.serverSettings.purchaseUrl; this.loadData(); } else { this.configurationService.settingsLoaded$.subscribe(x => { - this.basketUrl = this.configurationService.serverSettings.basketUrl; + this.basketUrl = this.configurationService.serverSettings.purchaseUrl; + this.purchaseUrl = this.configurationService.serverSettings.purchaseUrl; this.loadData(); }); } @@ -63,7 +66,7 @@ export class BasketService { } setBasket(basket): Observable { - let url = this.basketUrl + '/api/v1/basket/'; + let url = this.purchaseUrl + '/purchase-bff/api/v1/basket/'; this.basket = basket; return this.service.post(url, basket).map((response: Response) => { return true; @@ -71,7 +74,7 @@ export class BasketService { } setBasketCheckout(basketCheckout): Observable { - let url = this.basketUrl + '/api/v1/basket/checkout'; + let url = this.basketUrl + '/purchase-bff/api/v1/b/basket/checkout'; return this.service.postWithId(url, basketCheckout).map((response: Response) => { this.basketEvents.orderCreated(); return true; @@ -79,7 +82,7 @@ export class BasketService { } getBasket(): Observable { - let url = this.basketUrl + '/api/v1/basket/' + this.basket.buyerId; + let url = this.basketUrl + '/api/v1/b/basket/' + this.basket.buyerId; return this.service.get(url).map((response: Response) => { if (response.status === 204) { return null; diff --git a/src/Web/WebSPA/Client/modules/catalog/catalog.service.ts b/src/Web/WebSPA/Client/modules/catalog/catalog.service.ts index bdcb9d664..672146c9e 100644 --- a/src/Web/WebSPA/Client/modules/catalog/catalog.service.ts +++ b/src/Web/WebSPA/Client/modules/catalog/catalog.service.ts @@ -21,9 +21,9 @@ export class CatalogService { constructor(private service: DataService, private configurationService: ConfigurationService) { this.configurationService.settingsLoaded$.subscribe(x => { - this.catalogUrl = this.configurationService.serverSettings.catalogUrl + '/api/v1/catalog/items'; - this.brandUrl = this.configurationService.serverSettings.catalogUrl + '/api/v1/catalog/catalogbrands'; - this.typesUrl = this.configurationService.serverSettings.catalogUrl + '/api/v1/catalog/catalogtypes'; + this.catalogUrl = this.configurationService.serverSettings.purchaseUrl + '/purchase-bff/api/v1/c/catalog/items'; + this.brandUrl = this.configurationService.serverSettings.purchaseUrl + '/purchase-bff/api/v1/c/catalog/catalogbrands'; + this.typesUrl = this.configurationService.serverSettings.purchaseUrl + '/purchase-bff/api/v1/c/catalog/catalogtypes'; }); } diff --git a/src/Web/WebSPA/Client/modules/orders/orders.service.ts b/src/Web/WebSPA/Client/modules/orders/orders.service.ts index 5eda7c8ce..8d96602a1 100644 --- a/src/Web/WebSPA/Client/modules/orders/orders.service.ts +++ b/src/Web/WebSPA/Client/modules/orders/orders.service.ts @@ -22,14 +22,14 @@ export class OrdersService { constructor(private service: DataService, private basketService: BasketWrapperService, private identityService: SecurityService, private configurationService: ConfigurationService) { if (this.configurationService.isReady) - this.ordersUrl = this.configurationService.serverSettings.orderingUrl; + this.ordersUrl = this.configurationService.serverSettings.purchaseUrl; else - this.configurationService.settingsLoaded$.subscribe(x => this.ordersUrl = this.configurationService.serverSettings.orderingUrl); + this.configurationService.settingsLoaded$.subscribe(x => this.ordersUrl = this.configurationService.serverSettings.purchaseUrl); } getOrders(): Observable { - let url = this.ordersUrl + '/api/v1/orders'; + let url = this.ordersUrl + '/purchase-bff/api/v1/o/orders'; return this.service.get(url).map((response: Response) => { return response.json(); @@ -37,7 +37,7 @@ export class OrdersService { } getOrder(id: number): Observable { - let url = this.ordersUrl + '/api/v1/orders/' + id; + let url = this.ordersUrl + '/purchase-bff/api/v1/o/orders/' + id; return this.service.get(url).map((response: Response) => { return response.json(); diff --git a/src/Web/WebSPA/Client/modules/shared/models/configuration.model.ts b/src/Web/WebSPA/Client/modules/shared/models/configuration.model.ts index f22b28a3e..49950e9d6 100644 --- a/src/Web/WebSPA/Client/modules/shared/models/configuration.model.ts +++ b/src/Web/WebSPA/Client/modules/shared/models/configuration.model.ts @@ -1,8 +1,6 @@ export interface IConfiguration { - catalogUrl: string, - orderingUrl: string, identityUrl: string, - basketUrl: string, marketingUrl: string, + purchaseUrl: string, activateCampaignDetailFunction: boolean } \ No newline at end of file diff --git a/src/Web/WebSPA/Client/modules/shared/services/configuration.service.ts b/src/Web/WebSPA/Client/modules/shared/services/configuration.service.ts index d41786859..ea95275e0 100644 --- a/src/Web/WebSPA/Client/modules/shared/services/configuration.service.ts +++ b/src/Web/WebSPA/Client/modules/shared/services/configuration.service.ts @@ -28,11 +28,9 @@ export class ConfigurationService { console.log('server settings loaded'); this.serverSettings = response.json(); console.log(this.serverSettings); - this.storageService.store('basketUrl', this.serverSettings.basketUrl); - this.storageService.store('catalogUrl', this.serverSettings.catalogUrl); this.storageService.store('identityUrl', this.serverSettings.identityUrl); - this.storageService.store('orderingUrl', this.serverSettings.orderingUrl); this.storageService.store('marketingUrl', this.serverSettings.marketingUrl); + this.storageService.store('purchaseUrl', this.serverSettings.purchaseUrl); this.storageService.store('activateCampaignDetailFunction', this.serverSettings.activateCampaignDetailFunction); this.isReady = true; this.settingsLoadedSource.next(); diff --git a/src/Web/WebSPA/Client/modules/shared/services/security.service.ts b/src/Web/WebSPA/Client/modules/shared/services/security.service.ts index 483ea4ae4..2b580b5cd 100644 --- a/src/Web/WebSPA/Client/modules/shared/services/security.service.ts +++ b/src/Web/WebSPA/Client/modules/shared/services/security.service.ts @@ -82,7 +82,7 @@ export class SecurityService { let client_id = 'js'; let redirect_uri = location.origin + '/'; let response_type = 'id_token token'; - let scope = 'openid profile orders basket marketing locations'; + let scope = 'openid profile orders basket marketing locations purchasebff'; let nonce = 'N' + Math.random() + '' + Date.now(); let state = Date.now() + '' + Math.random(); diff --git a/src/Web/WebSPA/Properties/launchSettings.json b/src/Web/WebSPA/Properties/launchSettings.json index 9ae65426a..bf0fc44d4 100644 --- a/src/Web/WebSPA/Properties/launchSettings.json +++ b/src/Web/WebSPA/Properties/launchSettings.json @@ -3,7 +3,7 @@ "windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": { - "applicationUrl": "http://localhost:50921/", + "applicationUrl": "http://localhost:64923/", "sslPort": 0 } }, diff --git a/src/Web/WebSPA/appsettings.json b/src/Web/WebSPA/appsettings.json index 7b1930f84..75f17ac35 100644 --- a/src/Web/WebSPA/appsettings.json +++ b/src/Web/WebSPA/appsettings.json @@ -1,10 +1,8 @@ { - "CatalogUrl": "http://localhost:5101", - "OrderingUrl": "http://localhost:5102", - "BasketUrl": "http://localhost:5103", "IdentityUrl": "http://localhost:5105", "MarketingUrl": "http://localhost:5110", "CallBackUrl": "http://localhost:5104/", + "PurchaseUrl": "http://localhost:5200", "UseCustomizationData": true, "IsClusterEnv": "False", "ActivateCampaignDetailFunction": true, From 0be655d2e0f72f8ca4aaa800b05478b607f10753 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduard=20Tom=C3=A0s?= Date: Wed, 7 Feb 2018 13:15:17 +0000 Subject: [PATCH 20/78] Fixing errors in SPA when calling basket api through apigw --- src/Services/Basket/Basket.API/Properties/launchSettings.json | 2 +- .../Identity/Identity.API/Properties/launchSettings.json | 2 +- .../Location/Locations.API/Properties/launchSettings.json | 2 +- src/Web/WebSPA/Client/modules/basket/basket.service.ts | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Services/Basket/Basket.API/Properties/launchSettings.json b/src/Services/Basket/Basket.API/Properties/launchSettings.json index 7d1c959e3..382f0584a 100644 --- a/src/Services/Basket/Basket.API/Properties/launchSettings.json +++ b/src/Services/Basket/Basket.API/Properties/launchSettings.json @@ -3,7 +3,7 @@ "windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": { - "applicationUrl": "http://localhost:57423/", + "applicationUrl": "http://localhost:53998/", "sslPort": 0 } }, diff --git a/src/Services/Identity/Identity.API/Properties/launchSettings.json b/src/Services/Identity/Identity.API/Properties/launchSettings.json index c20d94307..e52e9f99c 100644 --- a/src/Services/Identity/Identity.API/Properties/launchSettings.json +++ b/src/Services/Identity/Identity.API/Properties/launchSettings.json @@ -3,7 +3,7 @@ "windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": { - "applicationUrl": "http://localhost:55105", + "applicationUrl": "http://localhost:54010/", "sslPort": 0 } }, diff --git a/src/Services/Location/Locations.API/Properties/launchSettings.json b/src/Services/Location/Locations.API/Properties/launchSettings.json index 6401e4bbe..1c86a33b1 100644 --- a/src/Services/Location/Locations.API/Properties/launchSettings.json +++ b/src/Services/Location/Locations.API/Properties/launchSettings.json @@ -3,7 +3,7 @@ "windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": { - "applicationUrl": "http://localhost:53933/", + "applicationUrl": "http://localhost:54020/", "sslPort": 0 } }, diff --git a/src/Web/WebSPA/Client/modules/basket/basket.service.ts b/src/Web/WebSPA/Client/modules/basket/basket.service.ts index da422d5ad..f59357020 100644 --- a/src/Web/WebSPA/Client/modules/basket/basket.service.ts +++ b/src/Web/WebSPA/Client/modules/basket/basket.service.ts @@ -82,7 +82,7 @@ export class BasketService { } getBasket(): Observable { - let url = this.basketUrl + '/api/v1/b/basket/' + this.basket.buyerId; + let url = this.basketUrl + '/purchase-bff/api/v1/b/basket/' + this.basket.buyerId; return this.service.get(url).map((response: Response) => { if (response.status === 204) { return null; From 6cc87fc80ab52f203c6817945574baeba02a9796 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduard=20Tom=C3=A0s?= Date: Thu, 15 Feb 2018 17:30:39 +0100 Subject: [PATCH 21/78] renaming of PurchaseBff to Aggregator --- docker-compose.override.yml | 6 +- docker-compose.prod.yml | 2 +- docker-compose.yml | 6 +- eShopOnContainers-ServicesAndWebApps.sln | 104 +++++++++--------- .../Config/UrlsConfig.cs | 2 +- .../Controllers/BasketController.cs | 6 +- .../Controllers/HomeController.cs | 2 +- .../Controllers/OrderController.cs | 4 +- .../Dockerfile | 4 +- .../Filters/AuthorizeCheckOperationFilter.cs | 4 +- .../Mobile.Shopping.HttpAggregator.csproj} | 4 +- .../Models/AddBasketItemRequest.cs | 2 +- .../Models/BasketData.cs | 2 +- .../Models/CatalogItem.cs | 2 +- .../Models/OrderData.cs | 2 +- .../Models/OrderItemData.cs | 2 +- .../Models/UpdateBasketItemsRequest.cs | 2 +- .../Models/UpdateBasketRequest.cs | 2 +- .../Program.cs | 2 +- .../Properties/launchSettings.json | 0 .../Services/BasketService.cs | 6 +- .../Services/CatalogService.cs | 6 +- .../Services/IBasketService.cs | 4 +- .../Services/ICatalogService.cs | 4 +- .../Services/IOrderApiClient.cs | 4 +- .../Services/OrderApiClient.cs | 6 +- .../Startup.cs | 14 +-- .../appsettings.json | 0 .../appsettings.localhost.json | 0 src/Apigw/OcelotApiGw/Startup.cs | 2 +- .../configuration/configuration.json | 10 +- .../Basket.API/Properties/launchSettings.json | 2 +- .../Identity.API/Configuration/Config.cs | 20 ++-- .../Data/ConfigurationDbContextSeed.cs | 2 +- src/Web/WebMVC/Controllers/TestController.cs | 2 +- src/Web/WebMVC/Startup.cs | 2 +- .../Client/modules/basket/basket.service.ts | 6 +- .../Client/modules/catalog/catalog.service.ts | 6 +- .../Client/modules/orders/orders.service.ts | 4 +- .../shared/services/security.service.ts | 2 +- src/Web/WebSPA/Properties/launchSettings.json | 2 +- 41 files changed, 132 insertions(+), 132 deletions(-) rename src/{BFFs/PurchaseBff => Aggregators/Mobile.Shopping.HttpAggregator}/Config/UrlsConfig.cs (92%) rename src/{BFFs/PurchaseBff => Aggregators/Mobile.Shopping.HttpAggregator}/Controllers/BasketController.cs (95%) rename src/{BFFs/PurchaseBff => Aggregators/Mobile.Shopping.HttpAggregator}/Controllers/HomeController.cs (80%) rename src/{BFFs/PurchaseBff => Aggregators/Mobile.Shopping.HttpAggregator}/Controllers/OrderController.cs (88%) rename src/{BFFs/PurchaseBff => Aggregators/Mobile.Shopping.HttpAggregator}/Dockerfile (74%) rename src/{BFFs/PurchaseBff => Aggregators/Mobile.Shopping.HttpAggregator}/Filters/AuthorizeCheckOperationFilter.cs (86%) rename src/{BFFs/PurchaseBff/PurchaseBff.csproj => Aggregators/Mobile.Shopping.HttpAggregator/Mobile.Shopping.HttpAggregator.csproj} (82%) rename src/{BFFs/PurchaseBff => Aggregators/Mobile.Shopping.HttpAggregator}/Models/AddBasketItemRequest.cs (83%) rename src/{BFFs/PurchaseBff => Aggregators/Mobile.Shopping.HttpAggregator}/Models/BasketData.cs (90%) rename src/{BFFs/PurchaseBff => Aggregators/Mobile.Shopping.HttpAggregator}/Models/CatalogItem.cs (80%) rename src/{BFFs/PurchaseBff => Aggregators/Mobile.Shopping.HttpAggregator}/Models/OrderData.cs (93%) rename src/{BFFs/PurchaseBff => Aggregators/Mobile.Shopping.HttpAggregator}/Models/OrderItemData.cs (84%) rename src/{BFFs/PurchaseBff => Aggregators/Mobile.Shopping.HttpAggregator}/Models/UpdateBasketItemsRequest.cs (89%) rename src/{BFFs/PurchaseBff => Aggregators/Mobile.Shopping.HttpAggregator}/Models/UpdateBasketRequest.cs (87%) rename src/{BFFs/PurchaseBff => Aggregators/Mobile.Shopping.HttpAggregator}/Program.cs (93%) rename src/{BFFs/PurchaseBff => Aggregators/Mobile.Shopping.HttpAggregator}/Properties/launchSettings.json (100%) rename src/{BFFs/PurchaseBff => Aggregators/Mobile.Shopping.HttpAggregator}/Services/BasketService.cs (89%) rename src/{BFFs/PurchaseBff => Aggregators/Mobile.Shopping.HttpAggregator}/Services/CatalogService.cs (85%) rename src/{BFFs/PurchaseBff => Aggregators/Mobile.Shopping.HttpAggregator}/Services/IBasketService.cs (61%) rename src/{BFFs/PurchaseBff => Aggregators/Mobile.Shopping.HttpAggregator}/Services/ICatalogService.cs (64%) rename src/{BFFs/PurchaseBff => Aggregators/Mobile.Shopping.HttpAggregator}/Services/IOrderApiClient.cs (58%) rename src/{BFFs/PurchaseBff => Aggregators/Mobile.Shopping.HttpAggregator}/Services/OrderApiClient.cs (84%) rename src/{BFFs/PurchaseBff => Aggregators/Mobile.Shopping.HttpAggregator}/Startup.cs (88%) rename src/{BFFs/PurchaseBff => Aggregators/Mobile.Shopping.HttpAggregator}/appsettings.json (100%) rename src/{BFFs/PurchaseBff => Aggregators/Mobile.Shopping.HttpAggregator}/appsettings.localhost.json (100%) diff --git a/docker-compose.override.yml b/docker-compose.override.yml index cfff01732..b6347824f 100644 --- a/docker-compose.override.yml +++ b/docker-compose.override.yml @@ -57,7 +57,7 @@ services: - MarketingApiClient=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5110 - BasketApiClient=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5103 - OrderingApiClient=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5102 - - PurchaseBFFClient=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5120 + - MobileShoppingAggClient=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5120 - UseCustomizationData=True - ApplicationInsights__InstrumentationKey=${INSTRUMENTATION_KEY} - OrchestratorType=${ORCHESTRATOR_TYPE} @@ -132,7 +132,7 @@ services: environment: - ASPNETCORE_ENVIRONMENT=Development - ASPNETCORE_URLS=http://0.0.0.0:80 - - PurchaseUrl=http://apigw/purchase-bff + - PurchaseUrl=http://apigw/shopping - LocationsUrl=http://locations.api - IdentityUrl=http://10.0.75.1:5105 # Local Mac: Use http://docker.for.mac.localhost:5105 || Local Windows: Use 10.0.75.1 in a "Docker for Windows" environment, if using "localhost" from browser. || #Remote access: Use ${ESHOP_EXTERNAL_DNS_NAME_OR_IP} if using external IP or DNS name from browser. - MarketingUrl=http://marketing.api @@ -225,7 +225,7 @@ services: ports: - "5200:80" - purchasebff: + mobileshoppingagg: environment: - ASPNETCORE_ENVIRONMENT=Development - urls__basket=http://basket.api diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index 8c8d67b5d..68e02e4da 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -64,7 +64,7 @@ services: - MarketingApiClient=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5110 - BasketApiClient=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5103 - OrderingApiClient=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5102 - - PurchaseBFFClient=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5120 + - MobileShoppingAggClient=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5120 - UseCustomizationData=True - ApplicationInsights__InstrumentationKey=${INSTRUMENTATION_KEY} - OrchestratorType=${ORCHESTRATOR_TYPE} diff --git a/docker-compose.yml b/docker-compose.yml index 18a3273f8..672790166 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -114,9 +114,9 @@ services: context: . dockerfile: src/Apigw/OcelotApiGw/Dockerfile - purchasebff: - image: eshop/purchasebff + mobileshoppingagg: + image: eshop/mobileshoppingagg build: context: . - dockerfile: src/BFFs/PurchaseBff/Dockerfile + dockerfile: src/Aggregators/Mobile.Shopping.HttpAggregator/Dockerfile diff --git a/eShopOnContainers-ServicesAndWebApps.sln b/eShopOnContainers-ServicesAndWebApps.sln index 7d25f9b3a..fc72b85f6 100644 --- a/eShopOnContainers-ServicesAndWebApps.sln +++ b/eShopOnContainers-ServicesAndWebApps.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 15 -VisualStudioVersion = 15.0.27004.2009 +VisualStudioVersion = 15.0.27130.2027 MinimumVisualStudioVersion = 10.0.40219.1 Project("{E53339B2-1760-4266-BCC7-CA923CBCF16C}") = "docker-compose", "docker-compose.dcproj", "{FEA0C318-FFED-4D39-8781-265718CA43DD}" EndProject @@ -101,9 +101,9 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ApiGw", "ApiGw", "{7A58AA20 EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OcelotApiGw", "src\Apigw\OcelotApiGw\OcelotApiGw.csproj", "{E0C5162E-DF26-4341-9E51-14AE800D7505}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "BFFs", "BFFs", "{EA378316-9D49-4A6B-858E-D4A25F948A74}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Aggregators", "Aggregators", "{EA378316-9D49-4A6B-858E-D4A25F948A74}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PurchaseBff", "src\BFFs\PurchaseBff\PurchaseBff.csproj", "{F77054A6-5808-45D7-88EB-CD92B3FDB889}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Mobile.Shopping.HttpAggregator", "src\Aggregators\Mobile.Shopping.HttpAggregator\Mobile.Shopping.HttpAggregator.csproj", "{6E99F232-1536-424F-A28C-91692C8FD325}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -1367,54 +1367,54 @@ Global {E0C5162E-DF26-4341-9E51-14AE800D7505}.Release|x64.Build.0 = Release|Any CPU {E0C5162E-DF26-4341-9E51-14AE800D7505}.Release|x86.ActiveCfg = Release|Any CPU {E0C5162E-DF26-4341-9E51-14AE800D7505}.Release|x86.Build.0 = Release|Any CPU - {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU - {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU - {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Ad-Hoc|ARM.ActiveCfg = Debug|Any CPU - {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Ad-Hoc|ARM.Build.0 = Debug|Any CPU - {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU - {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU - {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU - {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Ad-Hoc|x64.ActiveCfg = Debug|Any CPU - {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Ad-Hoc|x64.Build.0 = Debug|Any CPU - {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Ad-Hoc|x86.ActiveCfg = Debug|Any CPU - {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Ad-Hoc|x86.Build.0 = Debug|Any CPU - {F77054A6-5808-45D7-88EB-CD92B3FDB889}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU - {F77054A6-5808-45D7-88EB-CD92B3FDB889}.AppStore|Any CPU.Build.0 = Debug|Any CPU - {F77054A6-5808-45D7-88EB-CD92B3FDB889}.AppStore|ARM.ActiveCfg = Debug|Any CPU - {F77054A6-5808-45D7-88EB-CD92B3FDB889}.AppStore|ARM.Build.0 = Debug|Any CPU - {F77054A6-5808-45D7-88EB-CD92B3FDB889}.AppStore|iPhone.ActiveCfg = Debug|Any CPU - {F77054A6-5808-45D7-88EB-CD92B3FDB889}.AppStore|iPhone.Build.0 = Debug|Any CPU - {F77054A6-5808-45D7-88EB-CD92B3FDB889}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {F77054A6-5808-45D7-88EB-CD92B3FDB889}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU - {F77054A6-5808-45D7-88EB-CD92B3FDB889}.AppStore|x64.ActiveCfg = Debug|Any CPU - {F77054A6-5808-45D7-88EB-CD92B3FDB889}.AppStore|x64.Build.0 = Debug|Any CPU - {F77054A6-5808-45D7-88EB-CD92B3FDB889}.AppStore|x86.ActiveCfg = Debug|Any CPU - {F77054A6-5808-45D7-88EB-CD92B3FDB889}.AppStore|x86.Build.0 = Debug|Any CPU - {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Debug|ARM.ActiveCfg = Debug|Any CPU - {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Debug|ARM.Build.0 = Debug|Any CPU - {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Debug|iPhone.ActiveCfg = Debug|Any CPU - {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Debug|iPhone.Build.0 = Debug|Any CPU - {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU - {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Debug|x64.ActiveCfg = Debug|Any CPU - {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Debug|x64.Build.0 = Debug|Any CPU - {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Debug|x86.ActiveCfg = Debug|Any CPU - {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Debug|x86.Build.0 = Debug|Any CPU - {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Release|Any CPU.Build.0 = Release|Any CPU - {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Release|ARM.ActiveCfg = Release|Any CPU - {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Release|ARM.Build.0 = Release|Any CPU - {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Release|iPhone.ActiveCfg = Release|Any CPU - {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Release|iPhone.Build.0 = Release|Any CPU - {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU - {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Release|iPhoneSimulator.Build.0 = Release|Any CPU - {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Release|x64.ActiveCfg = Release|Any CPU - {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Release|x64.Build.0 = Release|Any CPU - {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Release|x86.ActiveCfg = Release|Any CPU - {F77054A6-5808-45D7-88EB-CD92B3FDB889}.Release|x86.Build.0 = Release|Any CPU + {6E99F232-1536-424F-A28C-91692C8FD325}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU + {6E99F232-1536-424F-A28C-91692C8FD325}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU + {6E99F232-1536-424F-A28C-91692C8FD325}.Ad-Hoc|ARM.ActiveCfg = Debug|Any CPU + {6E99F232-1536-424F-A28C-91692C8FD325}.Ad-Hoc|ARM.Build.0 = Debug|Any CPU + {6E99F232-1536-424F-A28C-91692C8FD325}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU + {6E99F232-1536-424F-A28C-91692C8FD325}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU + {6E99F232-1536-424F-A28C-91692C8FD325}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {6E99F232-1536-424F-A28C-91692C8FD325}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU + {6E99F232-1536-424F-A28C-91692C8FD325}.Ad-Hoc|x64.ActiveCfg = Debug|Any CPU + {6E99F232-1536-424F-A28C-91692C8FD325}.Ad-Hoc|x64.Build.0 = Debug|Any CPU + {6E99F232-1536-424F-A28C-91692C8FD325}.Ad-Hoc|x86.ActiveCfg = Debug|Any CPU + {6E99F232-1536-424F-A28C-91692C8FD325}.Ad-Hoc|x86.Build.0 = Debug|Any CPU + {6E99F232-1536-424F-A28C-91692C8FD325}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU + {6E99F232-1536-424F-A28C-91692C8FD325}.AppStore|Any CPU.Build.0 = Debug|Any CPU + {6E99F232-1536-424F-A28C-91692C8FD325}.AppStore|ARM.ActiveCfg = Debug|Any CPU + {6E99F232-1536-424F-A28C-91692C8FD325}.AppStore|ARM.Build.0 = Debug|Any CPU + {6E99F232-1536-424F-A28C-91692C8FD325}.AppStore|iPhone.ActiveCfg = Debug|Any CPU + {6E99F232-1536-424F-A28C-91692C8FD325}.AppStore|iPhone.Build.0 = Debug|Any CPU + {6E99F232-1536-424F-A28C-91692C8FD325}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {6E99F232-1536-424F-A28C-91692C8FD325}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU + {6E99F232-1536-424F-A28C-91692C8FD325}.AppStore|x64.ActiveCfg = Debug|Any CPU + {6E99F232-1536-424F-A28C-91692C8FD325}.AppStore|x64.Build.0 = Debug|Any CPU + {6E99F232-1536-424F-A28C-91692C8FD325}.AppStore|x86.ActiveCfg = Debug|Any CPU + {6E99F232-1536-424F-A28C-91692C8FD325}.AppStore|x86.Build.0 = Debug|Any CPU + {6E99F232-1536-424F-A28C-91692C8FD325}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6E99F232-1536-424F-A28C-91692C8FD325}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6E99F232-1536-424F-A28C-91692C8FD325}.Debug|ARM.ActiveCfg = Debug|Any CPU + {6E99F232-1536-424F-A28C-91692C8FD325}.Debug|ARM.Build.0 = Debug|Any CPU + {6E99F232-1536-424F-A28C-91692C8FD325}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {6E99F232-1536-424F-A28C-91692C8FD325}.Debug|iPhone.Build.0 = Debug|Any CPU + {6E99F232-1536-424F-A28C-91692C8FD325}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {6E99F232-1536-424F-A28C-91692C8FD325}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {6E99F232-1536-424F-A28C-91692C8FD325}.Debug|x64.ActiveCfg = Debug|Any CPU + {6E99F232-1536-424F-A28C-91692C8FD325}.Debug|x64.Build.0 = Debug|Any CPU + {6E99F232-1536-424F-A28C-91692C8FD325}.Debug|x86.ActiveCfg = Debug|Any CPU + {6E99F232-1536-424F-A28C-91692C8FD325}.Debug|x86.Build.0 = Debug|Any CPU + {6E99F232-1536-424F-A28C-91692C8FD325}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6E99F232-1536-424F-A28C-91692C8FD325}.Release|Any CPU.Build.0 = Release|Any CPU + {6E99F232-1536-424F-A28C-91692C8FD325}.Release|ARM.ActiveCfg = Release|Any CPU + {6E99F232-1536-424F-A28C-91692C8FD325}.Release|ARM.Build.0 = Release|Any CPU + {6E99F232-1536-424F-A28C-91692C8FD325}.Release|iPhone.ActiveCfg = Release|Any CPU + {6E99F232-1536-424F-A28C-91692C8FD325}.Release|iPhone.Build.0 = Release|Any CPU + {6E99F232-1536-424F-A28C-91692C8FD325}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {6E99F232-1536-424F-A28C-91692C8FD325}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {6E99F232-1536-424F-A28C-91692C8FD325}.Release|x64.ActiveCfg = Release|Any CPU + {6E99F232-1536-424F-A28C-91692C8FD325}.Release|x64.Build.0 = Release|Any CPU + {6E99F232-1536-424F-A28C-91692C8FD325}.Release|x86.ActiveCfg = Release|Any CPU + {6E99F232-1536-424F-A28C-91692C8FD325}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -1464,7 +1464,7 @@ Global {7A58AA20-67F3-48F3-88C8-24EBFE621792} = {932D8224-11F6-4D07-B109-DA28AD288A63} {E0C5162E-DF26-4341-9E51-14AE800D7505} = {7A58AA20-67F3-48F3-88C8-24EBFE621792} {EA378316-9D49-4A6B-858E-D4A25F948A74} = {932D8224-11F6-4D07-B109-DA28AD288A63} - {F77054A6-5808-45D7-88EB-CD92B3FDB889} = {EA378316-9D49-4A6B-858E-D4A25F948A74} + {6E99F232-1536-424F-A28C-91692C8FD325} = {EA378316-9D49-4A6B-858E-D4A25F948A74} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {25728519-5F0F-4973-8A64-0A81EB4EA8D9} diff --git a/src/BFFs/PurchaseBff/Config/UrlsConfig.cs b/src/Aggregators/Mobile.Shopping.HttpAggregator/Config/UrlsConfig.cs similarity index 92% rename from src/BFFs/PurchaseBff/Config/UrlsConfig.cs rename to src/Aggregators/Mobile.Shopping.HttpAggregator/Config/UrlsConfig.cs index 58f344aac..e920fbbb2 100644 --- a/src/BFFs/PurchaseBff/Config/UrlsConfig.cs +++ b/src/Aggregators/Mobile.Shopping.HttpAggregator/Config/UrlsConfig.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; -namespace PurchaseBff.Config +namespace Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Config { public class UrlsConfig { diff --git a/src/BFFs/PurchaseBff/Controllers/BasketController.cs b/src/Aggregators/Mobile.Shopping.HttpAggregator/Controllers/BasketController.cs similarity index 95% rename from src/BFFs/PurchaseBff/Controllers/BasketController.cs rename to src/Aggregators/Mobile.Shopping.HttpAggregator/Controllers/BasketController.cs index ac8620623..702c805fb 100644 --- a/src/BFFs/PurchaseBff/Controllers/BasketController.cs +++ b/src/Aggregators/Mobile.Shopping.HttpAggregator/Controllers/BasketController.cs @@ -1,13 +1,13 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -using PurchaseBff.Models; -using PurchaseBff.Services; +using Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Models; +using Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Services; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; -namespace PurchaseBff.Controllers +namespace Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Controllers { [Route("api/v1/[controller]")] [Authorize] diff --git a/src/BFFs/PurchaseBff/Controllers/HomeController.cs b/src/Aggregators/Mobile.Shopping.HttpAggregator/Controllers/HomeController.cs similarity index 80% rename from src/BFFs/PurchaseBff/Controllers/HomeController.cs rename to src/Aggregators/Mobile.Shopping.HttpAggregator/Controllers/HomeController.cs index f54ec94ad..48a71480a 100644 --- a/src/BFFs/PurchaseBff/Controllers/HomeController.cs +++ b/src/Aggregators/Mobile.Shopping.HttpAggregator/Controllers/HomeController.cs @@ -4,7 +4,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; -namespace PurchaseBff.Controllers +namespace Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Controllers { [Route("")] public class HomeController : Controller diff --git a/src/BFFs/PurchaseBff/Controllers/OrderController.cs b/src/Aggregators/Mobile.Shopping.HttpAggregator/Controllers/OrderController.cs similarity index 88% rename from src/BFFs/PurchaseBff/Controllers/OrderController.cs rename to src/Aggregators/Mobile.Shopping.HttpAggregator/Controllers/OrderController.cs index 91d0062ac..4c18d25ae 100644 --- a/src/BFFs/PurchaseBff/Controllers/OrderController.cs +++ b/src/Aggregators/Mobile.Shopping.HttpAggregator/Controllers/OrderController.cs @@ -1,12 +1,12 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; -using PurchaseBff.Services; +using Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Services; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; -namespace PurchaseBff.Controllers +namespace Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Controllers { [Route("api/v1/[controller]")] [Authorize] diff --git a/src/BFFs/PurchaseBff/Dockerfile b/src/Aggregators/Mobile.Shopping.HttpAggregator/Dockerfile similarity index 74% rename from src/BFFs/PurchaseBff/Dockerfile rename to src/Aggregators/Mobile.Shopping.HttpAggregator/Dockerfile index 500f8406f..24df53c80 100644 --- a/src/BFFs/PurchaseBff/Dockerfile +++ b/src/Aggregators/Mobile.Shopping.HttpAggregator/Dockerfile @@ -6,7 +6,7 @@ FROM microsoft/aspnetcore-build:2.0 AS build WORKDIR /src COPY . . RUN dotnet restore -nowarn:msb3202,nu1503 -WORKDIR /src/src/BFFs/PurchaseBff +WORKDIR /src/src/Aggregators/Mobile.Shopping.HttpAggregator RUN dotnet build --no-restore -c Release -o /app FROM build AS publish @@ -15,4 +15,4 @@ RUN dotnet publish --no-restore -c Release -o /app FROM base AS final WORKDIR /app COPY --from=publish /app . -ENTRYPOINT ["dotnet", "PurchaseBff.dll"] +ENTRYPOINT ["dotnet", "Mobile.Shopping.HttpAggregator.dll"] diff --git a/src/BFFs/PurchaseBff/Filters/AuthorizeCheckOperationFilter.cs b/src/Aggregators/Mobile.Shopping.HttpAggregator/Filters/AuthorizeCheckOperationFilter.cs similarity index 86% rename from src/BFFs/PurchaseBff/Filters/AuthorizeCheckOperationFilter.cs rename to src/Aggregators/Mobile.Shopping.HttpAggregator/Filters/AuthorizeCheckOperationFilter.cs index 31b5bf99e..b3a7246aa 100644 --- a/src/BFFs/PurchaseBff/Filters/AuthorizeCheckOperationFilter.cs +++ b/src/Aggregators/Mobile.Shopping.HttpAggregator/Filters/AuthorizeCheckOperationFilter.cs @@ -1,4 +1,4 @@ -namespace PurchaseBff.Filters +namespace Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Filters { using Microsoft.AspNetCore.Authorization; using Swashbuckle.AspNetCore.Swagger; @@ -24,7 +24,7 @@ operation.Security = new List>>(); operation.Security.Add(new Dictionary> { - { "oauth2", new [] { "purchasebff" } } + { "oauth2", new [] { "Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator" } } }); } } diff --git a/src/BFFs/PurchaseBff/PurchaseBff.csproj b/src/Aggregators/Mobile.Shopping.HttpAggregator/Mobile.Shopping.HttpAggregator.csproj similarity index 82% rename from src/BFFs/PurchaseBff/PurchaseBff.csproj rename to src/Aggregators/Mobile.Shopping.HttpAggregator/Mobile.Shopping.HttpAggregator.csproj index dd7a5909e..093e7a370 100644 --- a/src/BFFs/PurchaseBff/PurchaseBff.csproj +++ b/src/Aggregators/Mobile.Shopping.HttpAggregator/Mobile.Shopping.HttpAggregator.csproj @@ -2,8 +2,8 @@ netcoreapp2.0 - PurchaseBff - PurchaseBff + Mobile.Shopping.HttpAggregator + Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator ..\..\..\docker-compose.dcproj diff --git a/src/BFFs/PurchaseBff/Models/AddBasketItemRequest.cs b/src/Aggregators/Mobile.Shopping.HttpAggregator/Models/AddBasketItemRequest.cs similarity index 83% rename from src/BFFs/PurchaseBff/Models/AddBasketItemRequest.cs rename to src/Aggregators/Mobile.Shopping.HttpAggregator/Models/AddBasketItemRequest.cs index 7c589a233..f81842c09 100644 --- a/src/BFFs/PurchaseBff/Models/AddBasketItemRequest.cs +++ b/src/Aggregators/Mobile.Shopping.HttpAggregator/Models/AddBasketItemRequest.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; -namespace PurchaseBff.Models +namespace Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Models { public class AddBasketItemRequest { diff --git a/src/BFFs/PurchaseBff/Models/BasketData.cs b/src/Aggregators/Mobile.Shopping.HttpAggregator/Models/BasketData.cs similarity index 90% rename from src/BFFs/PurchaseBff/Models/BasketData.cs rename to src/Aggregators/Mobile.Shopping.HttpAggregator/Models/BasketData.cs index 3f14660a7..1b9348c44 100644 --- a/src/BFFs/PurchaseBff/Models/BasketData.cs +++ b/src/Aggregators/Mobile.Shopping.HttpAggregator/Models/BasketData.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; -namespace PurchaseBff.Models +namespace Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Models { public class BasketData { diff --git a/src/BFFs/PurchaseBff/Models/CatalogItem.cs b/src/Aggregators/Mobile.Shopping.HttpAggregator/Models/CatalogItem.cs similarity index 80% rename from src/BFFs/PurchaseBff/Models/CatalogItem.cs rename to src/Aggregators/Mobile.Shopping.HttpAggregator/Models/CatalogItem.cs index 13b0a65c0..25f766719 100644 --- a/src/BFFs/PurchaseBff/Models/CatalogItem.cs +++ b/src/Aggregators/Mobile.Shopping.HttpAggregator/Models/CatalogItem.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; -namespace PurchaseBff.Models +namespace Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Models { public class CatalogItem { diff --git a/src/BFFs/PurchaseBff/Models/OrderData.cs b/src/Aggregators/Mobile.Shopping.HttpAggregator/Models/OrderData.cs similarity index 93% rename from src/BFFs/PurchaseBff/Models/OrderData.cs rename to src/Aggregators/Mobile.Shopping.HttpAggregator/Models/OrderData.cs index c561a53ad..e87cc18f0 100644 --- a/src/BFFs/PurchaseBff/Models/OrderData.cs +++ b/src/Aggregators/Mobile.Shopping.HttpAggregator/Models/OrderData.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; -namespace PurchaseBff.Models +namespace Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Models { public class OrderData { diff --git a/src/BFFs/PurchaseBff/Models/OrderItemData.cs b/src/Aggregators/Mobile.Shopping.HttpAggregator/Models/OrderItemData.cs similarity index 84% rename from src/BFFs/PurchaseBff/Models/OrderItemData.cs rename to src/Aggregators/Mobile.Shopping.HttpAggregator/Models/OrderItemData.cs index bdc7b361e..b0179e470 100644 --- a/src/BFFs/PurchaseBff/Models/OrderItemData.cs +++ b/src/Aggregators/Mobile.Shopping.HttpAggregator/Models/OrderItemData.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; -namespace PurchaseBff.Models +namespace Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Models { public class OrderItemData { diff --git a/src/BFFs/PurchaseBff/Models/UpdateBasketItemsRequest.cs b/src/Aggregators/Mobile.Shopping.HttpAggregator/Models/UpdateBasketItemsRequest.cs similarity index 89% rename from src/BFFs/PurchaseBff/Models/UpdateBasketItemsRequest.cs rename to src/Aggregators/Mobile.Shopping.HttpAggregator/Models/UpdateBasketItemsRequest.cs index eb63efa23..43cc81b89 100644 --- a/src/BFFs/PurchaseBff/Models/UpdateBasketItemsRequest.cs +++ b/src/Aggregators/Mobile.Shopping.HttpAggregator/Models/UpdateBasketItemsRequest.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; -namespace PurchaseBff.Models +namespace Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Models { public class UpdateBasketItemsRequest { diff --git a/src/BFFs/PurchaseBff/Models/UpdateBasketRequest.cs b/src/Aggregators/Mobile.Shopping.HttpAggregator/Models/UpdateBasketRequest.cs similarity index 87% rename from src/BFFs/PurchaseBff/Models/UpdateBasketRequest.cs rename to src/Aggregators/Mobile.Shopping.HttpAggregator/Models/UpdateBasketRequest.cs index a6813c788..cb22bf55f 100644 --- a/src/BFFs/PurchaseBff/Models/UpdateBasketRequest.cs +++ b/src/Aggregators/Mobile.Shopping.HttpAggregator/Models/UpdateBasketRequest.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; -namespace PurchaseBff.Models +namespace Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Models { public class UpdateBasketRequest { diff --git a/src/BFFs/PurchaseBff/Program.cs b/src/Aggregators/Mobile.Shopping.HttpAggregator/Program.cs similarity index 93% rename from src/BFFs/PurchaseBff/Program.cs rename to src/Aggregators/Mobile.Shopping.HttpAggregator/Program.cs index 7c6110260..0c88fcd7d 100644 --- a/src/BFFs/PurchaseBff/Program.cs +++ b/src/Aggregators/Mobile.Shopping.HttpAggregator/Program.cs @@ -8,7 +8,7 @@ using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; -namespace PurchaseBff +namespace Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator { public class Program { diff --git a/src/BFFs/PurchaseBff/Properties/launchSettings.json b/src/Aggregators/Mobile.Shopping.HttpAggregator/Properties/launchSettings.json similarity index 100% rename from src/BFFs/PurchaseBff/Properties/launchSettings.json rename to src/Aggregators/Mobile.Shopping.HttpAggregator/Properties/launchSettings.json diff --git a/src/BFFs/PurchaseBff/Services/BasketService.cs b/src/Aggregators/Mobile.Shopping.HttpAggregator/Services/BasketService.cs similarity index 89% rename from src/BFFs/PurchaseBff/Services/BasketService.cs rename to src/Aggregators/Mobile.Shopping.HttpAggregator/Services/BasketService.cs index c1c3a6f9d..b00fbb52c 100644 --- a/src/BFFs/PurchaseBff/Services/BasketService.cs +++ b/src/Aggregators/Mobile.Shopping.HttpAggregator/Services/BasketService.cs @@ -8,10 +8,10 @@ using Microsoft.eShopOnContainers.BuildingBlocks.Resilience.Http; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Newtonsoft.Json; -using PurchaseBff.Config; -using PurchaseBff.Models; +using Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Config; +using Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Models; -namespace PurchaseBff.Services +namespace Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Services { public class BasketService : IBasketService { diff --git a/src/BFFs/PurchaseBff/Services/CatalogService.cs b/src/Aggregators/Mobile.Shopping.HttpAggregator/Services/CatalogService.cs similarity index 85% rename from src/BFFs/PurchaseBff/Services/CatalogService.cs rename to src/Aggregators/Mobile.Shopping.HttpAggregator/Services/CatalogService.cs index 7030da747..d37b67679 100644 --- a/src/BFFs/PurchaseBff/Services/CatalogService.cs +++ b/src/Aggregators/Mobile.Shopping.HttpAggregator/Services/CatalogService.cs @@ -6,10 +6,10 @@ using Microsoft.eShopOnContainers.BuildingBlocks.Resilience.Http; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Newtonsoft.Json; -using PurchaseBff.Config; -using PurchaseBff.Models; +using Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Config; +using Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Models; -namespace PurchaseBff.Services +namespace Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Services { public class CatalogService : ICatalogService { diff --git a/src/BFFs/PurchaseBff/Services/IBasketService.cs b/src/Aggregators/Mobile.Shopping.HttpAggregator/Services/IBasketService.cs similarity index 61% rename from src/BFFs/PurchaseBff/Services/IBasketService.cs rename to src/Aggregators/Mobile.Shopping.HttpAggregator/Services/IBasketService.cs index 74f6c21ba..6fd6871c1 100644 --- a/src/BFFs/PurchaseBff/Services/IBasketService.cs +++ b/src/Aggregators/Mobile.Shopping.HttpAggregator/Services/IBasketService.cs @@ -1,10 +1,10 @@ -using PurchaseBff.Models; +using Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Models; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; -namespace PurchaseBff.Services +namespace Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Services { public interface IBasketService { diff --git a/src/BFFs/PurchaseBff/Services/ICatalogService.cs b/src/Aggregators/Mobile.Shopping.HttpAggregator/Services/ICatalogService.cs similarity index 64% rename from src/BFFs/PurchaseBff/Services/ICatalogService.cs rename to src/Aggregators/Mobile.Shopping.HttpAggregator/Services/ICatalogService.cs index b51c0f0cd..d7e605bfa 100644 --- a/src/BFFs/PurchaseBff/Services/ICatalogService.cs +++ b/src/Aggregators/Mobile.Shopping.HttpAggregator/Services/ICatalogService.cs @@ -1,10 +1,10 @@ -using PurchaseBff.Models; +using Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Models; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; -namespace PurchaseBff.Services +namespace Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Services { public interface ICatalogService { diff --git a/src/BFFs/PurchaseBff/Services/IOrderApiClient.cs b/src/Aggregators/Mobile.Shopping.HttpAggregator/Services/IOrderApiClient.cs similarity index 58% rename from src/BFFs/PurchaseBff/Services/IOrderApiClient.cs rename to src/Aggregators/Mobile.Shopping.HttpAggregator/Services/IOrderApiClient.cs index 2d23e71f6..30ac013b9 100644 --- a/src/BFFs/PurchaseBff/Services/IOrderApiClient.cs +++ b/src/Aggregators/Mobile.Shopping.HttpAggregator/Services/IOrderApiClient.cs @@ -1,10 +1,10 @@ -using PurchaseBff.Models; +using Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Models; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; -namespace PurchaseBff.Services +namespace Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Services { public interface IOrderApiClient { diff --git a/src/BFFs/PurchaseBff/Services/OrderApiClient.cs b/src/Aggregators/Mobile.Shopping.HttpAggregator/Services/OrderApiClient.cs similarity index 84% rename from src/BFFs/PurchaseBff/Services/OrderApiClient.cs rename to src/Aggregators/Mobile.Shopping.HttpAggregator/Services/OrderApiClient.cs index 44f33cf71..2659e11cc 100644 --- a/src/BFFs/PurchaseBff/Services/OrderApiClient.cs +++ b/src/Aggregators/Mobile.Shopping.HttpAggregator/Services/OrderApiClient.cs @@ -6,10 +6,10 @@ using Microsoft.eShopOnContainers.BuildingBlocks.Resilience.Http; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Newtonsoft.Json; -using PurchaseBff.Config; -using PurchaseBff.Models; +using Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Config; +using Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Models; -namespace PurchaseBff.Services +namespace Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Services { public class OrderApiClient : IOrderApiClient { diff --git a/src/BFFs/PurchaseBff/Startup.cs b/src/Aggregators/Mobile.Shopping.HttpAggregator/Startup.cs similarity index 88% rename from src/BFFs/PurchaseBff/Startup.cs rename to src/Aggregators/Mobile.Shopping.HttpAggregator/Startup.cs index d7e9b4e28..083839bd5 100644 --- a/src/BFFs/PurchaseBff/Startup.cs +++ b/src/Aggregators/Mobile.Shopping.HttpAggregator/Startup.cs @@ -12,12 +12,12 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using PurchaseBff.Config; -using PurchaseBff.Filters.Basket.API.Infrastructure.Filters; -using PurchaseBff.Services; +using Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Config; +using Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Filters.Basket.API.Infrastructure.Filters; +using Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator.Services; using Swashbuckle.AspNetCore.Swagger; -namespace PurchaseBff +namespace Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator { public class Startup { @@ -61,7 +61,7 @@ namespace PurchaseBff TokenUrl = $"{Configuration.GetValue("IdentityUrlExternal")}/connect/token", Scopes = new Dictionary() { - { "purchasebff", "Purchase BFF API Gateway" } + { "mobileshoppingagg", "Purchase BFF API Gateway" } } }); @@ -89,7 +89,7 @@ namespace PurchaseBff { options.Authority = identityUrl; options.RequireHttpsMetadata = false; - options.Audience = "purchasebff"; + options.Audience = "mobileshoppingagg"; options.Events = new JwtBearerEvents() { OnAuthenticationFailed = async ctx => @@ -129,7 +129,7 @@ namespace PurchaseBff app.UseSwagger().UseSwaggerUI(c => { c.SwaggerEndpoint($"{ (!string.IsNullOrEmpty(pathBase) ? pathBase : string.Empty) }/swagger/v1/swagger.json", "Purchase BFF V1"); - c.ConfigureOAuth2("purchasebffwaggerui", "", "", "Purchase BFF Swagger UI"); + c.ConfigureOAuth2("Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregatorwaggerui", "", "", "Purchase BFF Swagger UI"); }); diff --git a/src/BFFs/PurchaseBff/appsettings.json b/src/Aggregators/Mobile.Shopping.HttpAggregator/appsettings.json similarity index 100% rename from src/BFFs/PurchaseBff/appsettings.json rename to src/Aggregators/Mobile.Shopping.HttpAggregator/appsettings.json diff --git a/src/BFFs/PurchaseBff/appsettings.localhost.json b/src/Aggregators/Mobile.Shopping.HttpAggregator/appsettings.localhost.json similarity index 100% rename from src/BFFs/PurchaseBff/appsettings.localhost.json rename to src/Aggregators/Mobile.Shopping.HttpAggregator/appsettings.localhost.json diff --git a/src/Apigw/OcelotApiGw/Startup.cs b/src/Apigw/OcelotApiGw/Startup.cs index 01ffe5139..f0a41c172 100644 --- a/src/Apigw/OcelotApiGw/Startup.cs +++ b/src/Apigw/OcelotApiGw/Startup.cs @@ -45,7 +45,7 @@ namespace OcelotApiGw x.RequireHttpsMetadata = false; x.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters() { - ValidAudiences = new[] { "orders", "basket", "locations", "marketing", "purchasebff" } + ValidAudiences = new[] { "orders", "basket", "locations", "marketing", "mobileshoppingagg" } }; x.Events = new Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerEvents() { diff --git a/src/Apigw/OcelotApiGw/configuration/configuration.json b/src/Apigw/OcelotApiGw/configuration/configuration.json index 2d5e6c8f7..80d3f1116 100644 --- a/src/Apigw/OcelotApiGw/configuration/configuration.json +++ b/src/Apigw/OcelotApiGw/configuration/configuration.json @@ -9,7 +9,7 @@ "Port": 80 } ], - "UpstreamPathTemplate": "/purchase-bff/api/{version}/c/{everything}", + "UpstreamPathTemplate": "/shopping/api/{version}/c/{everything}", "UpstreamHttpMethod": [ "GET" ] }, { @@ -21,7 +21,7 @@ "Port": 80 } ], - "UpstreamPathTemplate": "/purchase-bff/api/{version}/b/{everything}", + "UpstreamPathTemplate": "/shopping/api/{version}/b/{everything}", "UpstreamHttpMethod": [], "AuthenticationOptions": { "AuthenticationProviderKey": "IdentityApiKey", @@ -37,7 +37,7 @@ "Port": 80 } ], - "UpstreamPathTemplate": "/purchase-bff/api/{version}/o/{everything}", + "UpstreamPathTemplate": "/shopping/api/{version}/o/{everything}", "UpstreamHttpMethod": [], "AuthenticationOptions": { "AuthenticationProviderKey": "IdentityApiKey", @@ -49,11 +49,11 @@ "DownstreamScheme": "http", "DownstreamHostAndPorts": [ { - "Host": "purchasebff", + "Host": "mobileshoppingagg", "Port": 80 } ], - "UpstreamPathTemplate": "/purchase-bff/{everything}", + "UpstreamPathTemplate": "/shopping/{everything}", "UpstreamHttpMethod": [ "POST", "PUT", "GET" ], "AuthenticationOptions": { "AuthenticationProviderKey": "IdentityApiKey", diff --git a/src/Services/Basket/Basket.API/Properties/launchSettings.json b/src/Services/Basket/Basket.API/Properties/launchSettings.json index 382f0584a..60a56b153 100644 --- a/src/Services/Basket/Basket.API/Properties/launchSettings.json +++ b/src/Services/Basket/Basket.API/Properties/launchSettings.json @@ -3,7 +3,7 @@ "windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": { - "applicationUrl": "http://localhost:53998/", + "applicationUrl": "http://localhost:58017/", "sslPort": 0 } }, diff --git a/src/Services/Identity/Identity.API/Configuration/Config.cs b/src/Services/Identity/Identity.API/Configuration/Config.cs index 9905a04d3..18e313bf8 100644 --- a/src/Services/Identity/Identity.API/Configuration/Config.cs +++ b/src/Services/Identity/Identity.API/Configuration/Config.cs @@ -15,7 +15,7 @@ namespace Microsoft.eShopOnContainers.Services.Identity.API.Configuration new ApiResource("basket", "Basket Service"), new ApiResource("marketing", "Marketing Service"), new ApiResource("locations", "Locations Service"), - new ApiResource("purchasebff", "Purchase BFF") + new ApiResource("mobileshoppingagg", "Mobile Shopping Aggregator") }; } @@ -54,7 +54,7 @@ namespace Microsoft.eShopOnContainers.Services.Identity.API.Configuration "basket", "locations", "marketing", - "purchasebff" + "mobileshoppingagg" } }, new Client @@ -81,7 +81,7 @@ namespace Microsoft.eShopOnContainers.Services.Identity.API.Configuration "basket", "locations", "marketing", - "purchasebff" + "mobileshoppingagg" }, //Allow requesting refresh tokens for long lived API access AllowOfflineAccess = true, @@ -118,7 +118,7 @@ namespace Microsoft.eShopOnContainers.Services.Identity.API.Configuration "basket", "locations", "marketing", - "purchasebff" + "mobileshoppingagg" }, }, new Client @@ -151,7 +151,7 @@ namespace Microsoft.eShopOnContainers.Services.Identity.API.Configuration "basket", "locations", "marketing", - "purchasebff" + "mobileshoppingagg" }, }, new Client @@ -216,17 +216,17 @@ namespace Microsoft.eShopOnContainers.Services.Identity.API.Configuration }, new Client { - ClientId = "purchasebffwaggerui", - ClientName = "Purchase BFF Swagger UI", + ClientId = "mobileshoppingaggswaggerui", + ClientName = "Mobile Shopping Aggregattor Swagger UI", AllowedGrantTypes = GrantTypes.Implicit, AllowAccessTokensViaBrowser = true, - RedirectUris = { $"{clientsUrl["PurchaseBFF"]}/swagger/o2c.html" }, - PostLogoutRedirectUris = { $"{clientsUrl["PurchaseBFF"]}/swagger/" }, + RedirectUris = { $"{clientsUrl["MobileShoppingAgg"]}/swagger/o2c.html" }, + PostLogoutRedirectUris = { $"{clientsUrl["MobileShoppingAgg"]}/swagger/" }, AllowedScopes = { - "purchasebff" + "mobileshoppingagg" } } diff --git a/src/Services/Identity/Identity.API/Data/ConfigurationDbContextSeed.cs b/src/Services/Identity/Identity.API/Data/ConfigurationDbContextSeed.cs index 0875361be..4757d4743 100644 --- a/src/Services/Identity/Identity.API/Data/ConfigurationDbContextSeed.cs +++ b/src/Services/Identity/Identity.API/Data/ConfigurationDbContextSeed.cs @@ -23,7 +23,7 @@ namespace Microsoft.eShopOnContainers.Services.Identity.API.Data clientUrls.Add("MarketingApi", configuration.GetValue("MarketingApiClient")); clientUrls.Add("BasketApi", configuration.GetValue("BasketApiClient")); clientUrls.Add("OrderingApi", configuration.GetValue("OrderingApiClient")); - clientUrls.Add("PurchaseBFF", configuration.GetValue("PurchaseBFFClient")); + clientUrls.Add("MobileShoppingAgg", configuration.GetValue("MobileShoppingAggClient")); if (!context.Clients.Any()) { diff --git a/src/Web/WebMVC/Controllers/TestController.cs b/src/Web/WebMVC/Controllers/TestController.cs index 7a2140ea8..1b35d5d2b 100644 --- a/src/Web/WebMVC/Controllers/TestController.cs +++ b/src/Web/WebMVC/Controllers/TestController.cs @@ -32,7 +32,7 @@ namespace WebMVC.Controllers public async Task Ocelot() { - var url = "http://apigw/purchase-bff/api/v1/basket/items"; + var url = "http://apigw/shopping/api/v1/basket/items"; var payload = new TestPayload() { CatalogItemId = 1, diff --git a/src/Web/WebMVC/Startup.cs b/src/Web/WebMVC/Startup.cs index e9e86d1cd..21986b5df 100644 --- a/src/Web/WebMVC/Startup.cs +++ b/src/Web/WebMVC/Startup.cs @@ -130,7 +130,7 @@ namespace Microsoft.eShopOnContainers.WebMVC options.Scope.Add("basket"); options.Scope.Add("marketing"); options.Scope.Add("locations"); - options.Scope.Add("purchasebff"); + options.Scope.Add("mobileshoppingagg"); }); } diff --git a/src/Web/WebSPA/Client/modules/basket/basket.service.ts b/src/Web/WebSPA/Client/modules/basket/basket.service.ts index f59357020..f26cbc2cb 100644 --- a/src/Web/WebSPA/Client/modules/basket/basket.service.ts +++ b/src/Web/WebSPA/Client/modules/basket/basket.service.ts @@ -66,7 +66,7 @@ export class BasketService { } setBasket(basket): Observable { - let url = this.purchaseUrl + '/purchase-bff/api/v1/basket/'; + let url = this.purchaseUrl + '/shopping/api/v1/basket/'; this.basket = basket; return this.service.post(url, basket).map((response: Response) => { return true; @@ -74,7 +74,7 @@ export class BasketService { } setBasketCheckout(basketCheckout): Observable { - let url = this.basketUrl + '/purchase-bff/api/v1/b/basket/checkout'; + let url = this.basketUrl + '/shopping/api/v1/b/basket/checkout'; return this.service.postWithId(url, basketCheckout).map((response: Response) => { this.basketEvents.orderCreated(); return true; @@ -82,7 +82,7 @@ export class BasketService { } getBasket(): Observable { - let url = this.basketUrl + '/purchase-bff/api/v1/b/basket/' + this.basket.buyerId; + let url = this.basketUrl + '/shopping/api/v1/b/basket/' + this.basket.buyerId; return this.service.get(url).map((response: Response) => { if (response.status === 204) { return null; diff --git a/src/Web/WebSPA/Client/modules/catalog/catalog.service.ts b/src/Web/WebSPA/Client/modules/catalog/catalog.service.ts index 672146c9e..8e91ef541 100644 --- a/src/Web/WebSPA/Client/modules/catalog/catalog.service.ts +++ b/src/Web/WebSPA/Client/modules/catalog/catalog.service.ts @@ -21,9 +21,9 @@ export class CatalogService { constructor(private service: DataService, private configurationService: ConfigurationService) { this.configurationService.settingsLoaded$.subscribe(x => { - this.catalogUrl = this.configurationService.serverSettings.purchaseUrl + '/purchase-bff/api/v1/c/catalog/items'; - this.brandUrl = this.configurationService.serverSettings.purchaseUrl + '/purchase-bff/api/v1/c/catalog/catalogbrands'; - this.typesUrl = this.configurationService.serverSettings.purchaseUrl + '/purchase-bff/api/v1/c/catalog/catalogtypes'; + this.catalogUrl = this.configurationService.serverSettings.purchaseUrl + '/shopping/api/v1/c/catalog/items'; + this.brandUrl = this.configurationService.serverSettings.purchaseUrl + '/shopping/api/v1/c/catalog/catalogbrands'; + this.typesUrl = this.configurationService.serverSettings.purchaseUrl + '/shopping/api/v1/c/catalog/catalogtypes'; }); } diff --git a/src/Web/WebSPA/Client/modules/orders/orders.service.ts b/src/Web/WebSPA/Client/modules/orders/orders.service.ts index 8d96602a1..9eabeb1cf 100644 --- a/src/Web/WebSPA/Client/modules/orders/orders.service.ts +++ b/src/Web/WebSPA/Client/modules/orders/orders.service.ts @@ -29,7 +29,7 @@ export class OrdersService { } getOrders(): Observable { - let url = this.ordersUrl + '/purchase-bff/api/v1/o/orders'; + let url = this.ordersUrl + '/shopping/api/v1/o/orders'; return this.service.get(url).map((response: Response) => { return response.json(); @@ -37,7 +37,7 @@ export class OrdersService { } getOrder(id: number): Observable { - let url = this.ordersUrl + '/purchase-bff/api/v1/o/orders/' + id; + let url = this.ordersUrl + '/shopping/api/v1/o/orders/' + id; return this.service.get(url).map((response: Response) => { return response.json(); diff --git a/src/Web/WebSPA/Client/modules/shared/services/security.service.ts b/src/Web/WebSPA/Client/modules/shared/services/security.service.ts index 2b580b5cd..c2ac8e5e2 100644 --- a/src/Web/WebSPA/Client/modules/shared/services/security.service.ts +++ b/src/Web/WebSPA/Client/modules/shared/services/security.service.ts @@ -82,7 +82,7 @@ export class SecurityService { let client_id = 'js'; let redirect_uri = location.origin + '/'; let response_type = 'id_token token'; - let scope = 'openid profile orders basket marketing locations purchasebff'; + let scope = 'openid profile orders basket marketing locations mobileshoppingagg'; let nonce = 'N' + Math.random() + '' + Date.now(); let state = Date.now() + '' + Math.random(); diff --git a/src/Web/WebSPA/Properties/launchSettings.json b/src/Web/WebSPA/Properties/launchSettings.json index bf0fc44d4..eff752f63 100644 --- a/src/Web/WebSPA/Properties/launchSettings.json +++ b/src/Web/WebSPA/Properties/launchSettings.json @@ -3,7 +3,7 @@ "windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": { - "applicationUrl": "http://localhost:64923/", + "applicationUrl": "http://localhost:58018/", "sslPort": 0 } }, From 3b2c80e6d34d1969af480d99764c70e400f91015 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduard=20Tom=C3=A0s?= Date: Thu, 15 Feb 2018 18:13:14 +0100 Subject: [PATCH 22/78] Ocelot config via volumes --- .gitattributes | 12 ++ docker-compose.override.yml | 32 +++- docker-compose.yml | 20 ++- eShopOnContainers-ServicesAndWebApps.sln | 15 ++ .../mobilemarketingapigw/configuration.json | 1 + .../mobileshoppingapigw/configuration.json | 1 + .../webmarketingapigw/configuration.json | 1 + .../webshoppingapigw}/configuration.json | 0 .../mobilemarketingapigw/configuration.json | 1 + .../mobileshoppingapigw/configuration.json | 1 + .../webmarketingapigw/configuration.json | 1 + .../webshoppingapigw/configuration.json | 142 ++++++++++++++++++ 12 files changed, 225 insertions(+), 2 deletions(-) create mode 100644 src/Apigw/configs/linux/mobilemarketingapigw/configuration.json create mode 100644 src/Apigw/configs/linux/mobileshoppingapigw/configuration.json create mode 100644 src/Apigw/configs/linux/webmarketingapigw/configuration.json rename src/Apigw/{OcelotApiGw/configuration => configs/linux/webshoppingapigw}/configuration.json (100%) create mode 100644 src/Apigw/configs/windows/mobilemarketingapigw/configuration.json create mode 100644 src/Apigw/configs/windows/mobileshoppingapigw/configuration.json create mode 100644 src/Apigw/configs/windows/webmarketingapigw/configuration.json create mode 100644 src/Apigw/configs/windows/webshoppingapigw/configuration.json diff --git a/.gitattributes b/.gitattributes index f2943e52e..1afa507c8 100644 --- a/.gitattributes +++ b/.gitattributes @@ -69,3 +69,15 @@ ############################################################################### *.pfx binary +################################################################################ +# Ocelot config files are shared via volumes, so its EOL are important +################################################################################ +/src/Apigw/configs/linux/mobilemarketingapigw/configuration.json text eol=lf +/src/Apigw/configs/linux/mobileshoppingapigw/configuration.json text eol=lf +/src/Apigw/configs/linux/webmarketingapigw/configuration.json text eol=lf +/src/Apigw/configs/linux/webshoppingapigw/configuration.json text eol=lf + +/src/Apigw/configs/windows/mobilemarketingapigw/configuration.json text eol=crlf +/src/Apigw/configs/windows/mobileshoppingapigw/configuration.json text eol=crlf +/src/Apigw/configs/windows/webmarketingapigw/configuration.json text eol=crlf +/src/Apigw/configs/windows/webshoppingapigw/configuration.json text eol=crlf \ No newline at end of file diff --git a/docker-compose.override.yml b/docker-compose.override.yml index b6347824f..152d2ec0e 100644 --- a/docker-compose.override.yml +++ b/docker-compose.override.yml @@ -218,12 +218,42 @@ services: - "15672:15672" - "5672:5672" - apigw: + mobileshoppingapigw: environment: - ASPNETCORE_ENVIRONMENT=Development - identityUrl=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110. ports: - "5200:80" + volumes: + - ./src/Apigw/configs/mobileshoppingapigw:/app/configuration + + mobilemarketingapigw: + environment: + - ASPNETCORE_ENVIRONMENT=Development + - identityUrl=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110. + ports: + - "5201:80" + volumes: + - ./src/Apigw/configs/mobilemarketingapigw:/app/configuration + + webshoppingapigw: + environment: + - ASPNETCORE_ENVIRONMENT=Development + - identityUrl=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110. + ports: + - "5202:80" + volumes: + - ./src/Apigw/configs/webshoppingapigw:/app/configuration + + + webmarketingapigw: + environment: + - ASPNETCORE_ENVIRONMENT=Development + - identityUrl=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110. + ports: + - "5203:80" + volumes: + - ./src/Apigw/configs/webmarketingapigw:/app/configuration mobileshoppingagg: environment: diff --git a/docker-compose.yml b/docker-compose.yml index 672790166..4b2fb7a1d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -108,7 +108,25 @@ services: rabbitmq: image: rabbitmq:3-management-alpine - apigw: + mobileshoppingapigw: + image: eshop/ocelotapigw + build: + context: . + dockerfile: src/Apigw/OcelotApiGw/Dockerfile + + mobilemarketingapigw: + image: eshop/ocelotapigw + build: + context: . + dockerfile: src/Apigw/OcelotApiGw/Dockerfile + + webshoppingapigw: + image: eshop/ocelotapigw + build: + context: . + dockerfile: src/Apigw/OcelotApiGw/Dockerfile + + webmarketingapigw: image: eshop/ocelotapigw build: context: . diff --git a/eShopOnContainers-ServicesAndWebApps.sln b/eShopOnContainers-ServicesAndWebApps.sln index fc72b85f6..d274f804e 100644 --- a/eShopOnContainers-ServicesAndWebApps.sln +++ b/eShopOnContainers-ServicesAndWebApps.sln @@ -105,6 +105,18 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Aggregators", "Aggregators" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Mobile.Shopping.HttpAggregator", "src\Aggregators\Mobile.Shopping.HttpAggregator\Mobile.Shopping.HttpAggregator.csproj", "{6E99F232-1536-424F-A28C-91692C8FD325}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "configs", "configs", "{D8D24753-8421-40EE-8FE5-B8BE06A07AC5}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "MobileBff.Shopping.ApiGw", "MobileBff.Shopping.ApiGw", "{DAEA3807-1578-4B43-9033-E400FAF1DC49}" + ProjectSection(SolutionItems) = preProject + src\Apigw\configs\mobileshoppingapigw\configuration.json = src\Apigw\configs\mobileshoppingapigw\configuration.json + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "MobileBff.Marketing.ApiGw", "MobileBff.Marketing.ApiGw", "{AC3EDABD-8EB0-4045-BC12-39865490A79D}" + ProjectSection(SolutionItems) = preProject + src\Apigw\configs\mobilemarketingapigw\configuration.json = src\Apigw\configs\mobilemarketingapigw\configuration.json + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Ad-Hoc|Any CPU = Ad-Hoc|Any CPU @@ -1465,6 +1477,9 @@ Global {E0C5162E-DF26-4341-9E51-14AE800D7505} = {7A58AA20-67F3-48F3-88C8-24EBFE621792} {EA378316-9D49-4A6B-858E-D4A25F948A74} = {932D8224-11F6-4D07-B109-DA28AD288A63} {6E99F232-1536-424F-A28C-91692C8FD325} = {EA378316-9D49-4A6B-858E-D4A25F948A74} + {D8D24753-8421-40EE-8FE5-B8BE06A07AC5} = {7A58AA20-67F3-48F3-88C8-24EBFE621792} + {DAEA3807-1578-4B43-9033-E400FAF1DC49} = {D8D24753-8421-40EE-8FE5-B8BE06A07AC5} + {AC3EDABD-8EB0-4045-BC12-39865490A79D} = {D8D24753-8421-40EE-8FE5-B8BE06A07AC5} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {25728519-5F0F-4973-8A64-0A81EB4EA8D9} diff --git a/src/Apigw/configs/linux/mobilemarketingapigw/configuration.json b/src/Apigw/configs/linux/mobilemarketingapigw/configuration.json new file mode 100644 index 000000000..22fdca1b2 --- /dev/null +++ b/src/Apigw/configs/linux/mobilemarketingapigw/configuration.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/Apigw/configs/linux/mobileshoppingapigw/configuration.json b/src/Apigw/configs/linux/mobileshoppingapigw/configuration.json new file mode 100644 index 000000000..22fdca1b2 --- /dev/null +++ b/src/Apigw/configs/linux/mobileshoppingapigw/configuration.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/Apigw/configs/linux/webmarketingapigw/configuration.json b/src/Apigw/configs/linux/webmarketingapigw/configuration.json new file mode 100644 index 000000000..22fdca1b2 --- /dev/null +++ b/src/Apigw/configs/linux/webmarketingapigw/configuration.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/Apigw/OcelotApiGw/configuration/configuration.json b/src/Apigw/configs/linux/webshoppingapigw/configuration.json similarity index 100% rename from src/Apigw/OcelotApiGw/configuration/configuration.json rename to src/Apigw/configs/linux/webshoppingapigw/configuration.json diff --git a/src/Apigw/configs/windows/mobilemarketingapigw/configuration.json b/src/Apigw/configs/windows/mobilemarketingapigw/configuration.json new file mode 100644 index 000000000..22fdca1b2 --- /dev/null +++ b/src/Apigw/configs/windows/mobilemarketingapigw/configuration.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/Apigw/configs/windows/mobileshoppingapigw/configuration.json b/src/Apigw/configs/windows/mobileshoppingapigw/configuration.json new file mode 100644 index 000000000..22fdca1b2 --- /dev/null +++ b/src/Apigw/configs/windows/mobileshoppingapigw/configuration.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/Apigw/configs/windows/webmarketingapigw/configuration.json b/src/Apigw/configs/windows/webmarketingapigw/configuration.json new file mode 100644 index 000000000..22fdca1b2 --- /dev/null +++ b/src/Apigw/configs/windows/webmarketingapigw/configuration.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/src/Apigw/configs/windows/webshoppingapigw/configuration.json b/src/Apigw/configs/windows/webshoppingapigw/configuration.json new file mode 100644 index 000000000..80d3f1116 --- /dev/null +++ b/src/Apigw/configs/windows/webshoppingapigw/configuration.json @@ -0,0 +1,142 @@ +{ + "ReRoutes": [ + { + "DownstreamPathTemplate": "/api/{version}/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "catalog.api", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/shopping/api/{version}/c/{everything}", + "UpstreamHttpMethod": [ "GET" ] + }, + { + "DownstreamPathTemplate": "/api/{version}/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "basket.api", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/shopping/api/{version}/b/{everything}", + "UpstreamHttpMethod": [], + "AuthenticationOptions": { + "AuthenticationProviderKey": "IdentityApiKey", + "AllowedScopes": [] + } + }, + { + "DownstreamPathTemplate": "/api/{version}/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "ordering.api", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/shopping/api/{version}/o/{everything}", + "UpstreamHttpMethod": [], + "AuthenticationOptions": { + "AuthenticationProviderKey": "IdentityApiKey", + "AllowedScopes": [] + } + }, + { + "DownstreamPathTemplate": "/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "mobileshoppingagg", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/shopping/{everything}", + "UpstreamHttpMethod": [ "POST", "PUT", "GET" ], + "AuthenticationOptions": { + "AuthenticationProviderKey": "IdentityApiKey", + "AllowedScopes": [] + } + }, + { + "DownstreamPathTemplate": "/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "ordering.api", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/orders-api/{everything}", + "UpstreamHttpMethod": [] + }, + { + "DownstreamPathTemplate": "/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "basket.api", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/basket-api/{everything}", + "UpstreamHttpMethod": [] + }, + { + "DownstreamPathTemplate": "/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "catalog.api", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/catalog-api/{everything}", + "UpstreamHttpMethod": [] + }, + { + "DownstreamPathTemplate": "/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "marketing.api", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/marketing-api/{everything}", + "UpstreamHttpMethod": [] + }, + { + "DownstreamPathTemplate": "/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "payment.api", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/payment-api/{everything}", + "UpstreamHttpMethod": [] + }, + { + "DownstreamPathTemplate": "/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "locations.api", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/location-api/{everything}", + "UpstreamHttpMethod": [] + } + + ], + "GlobalConfiguration": { + "RequestIdKey": "OcRequestId", + "AdministrationPath": "/administration" + } + } + \ No newline at end of file From 1b87e2a18f15cae958818349a7e9b7b698461e38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduard=20Tom=C3=A0s?= Date: Thu, 15 Feb 2018 18:45:18 +0100 Subject: [PATCH 23/78] Reverted duality of config files for ocelot because were not really needed --- .gitattributes | 12 -- docker-compose.override.yml | 9 +- eShopOnContainers-ServicesAndWebApps.sln | 15 -- .../mobilemarketingapigw/configuration.json | 0 .../mobileshoppingapigw/configuration.json | 0 .../webmarketingapigw/configuration.json | 0 .../webshoppingapigw/configuration.json | 0 .../mobilemarketingapigw/configuration.json | 1 - .../mobileshoppingapigw/configuration.json | 1 - .../webmarketingapigw/configuration.json | 1 - .../webshoppingapigw/configuration.json | 142 ------------------ 11 files changed, 4 insertions(+), 177 deletions(-) rename src/Apigw/configs/{linux => }/mobilemarketingapigw/configuration.json (100%) rename src/Apigw/configs/{linux => }/mobileshoppingapigw/configuration.json (100%) rename src/Apigw/configs/{linux => }/webmarketingapigw/configuration.json (100%) rename src/Apigw/configs/{linux => }/webshoppingapigw/configuration.json (100%) delete mode 100644 src/Apigw/configs/windows/mobilemarketingapigw/configuration.json delete mode 100644 src/Apigw/configs/windows/mobileshoppingapigw/configuration.json delete mode 100644 src/Apigw/configs/windows/webmarketingapigw/configuration.json delete mode 100644 src/Apigw/configs/windows/webshoppingapigw/configuration.json diff --git a/.gitattributes b/.gitattributes index 1afa507c8..f2943e52e 100644 --- a/.gitattributes +++ b/.gitattributes @@ -69,15 +69,3 @@ ############################################################################### *.pfx binary -################################################################################ -# Ocelot config files are shared via volumes, so its EOL are important -################################################################################ -/src/Apigw/configs/linux/mobilemarketingapigw/configuration.json text eol=lf -/src/Apigw/configs/linux/mobileshoppingapigw/configuration.json text eol=lf -/src/Apigw/configs/linux/webmarketingapigw/configuration.json text eol=lf -/src/Apigw/configs/linux/webshoppingapigw/configuration.json text eol=lf - -/src/Apigw/configs/windows/mobilemarketingapigw/configuration.json text eol=crlf -/src/Apigw/configs/windows/mobileshoppingapigw/configuration.json text eol=crlf -/src/Apigw/configs/windows/webmarketingapigw/configuration.json text eol=crlf -/src/Apigw/configs/windows/webshoppingapigw/configuration.json text eol=crlf \ No newline at end of file diff --git a/docker-compose.override.yml b/docker-compose.override.yml index 152d2ec0e..43e2fbcb8 100644 --- a/docker-compose.override.yml +++ b/docker-compose.override.yml @@ -221,7 +221,7 @@ services: mobileshoppingapigw: environment: - ASPNETCORE_ENVIRONMENT=Development - - identityUrl=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110. + - IdentityUrl=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110. ports: - "5200:80" volumes: @@ -230,7 +230,7 @@ services: mobilemarketingapigw: environment: - ASPNETCORE_ENVIRONMENT=Development - - identityUrl=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110. + - IdentityUrl=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110. ports: - "5201:80" volumes: @@ -239,17 +239,16 @@ services: webshoppingapigw: environment: - ASPNETCORE_ENVIRONMENT=Development - - identityUrl=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110. + - IdentityUrl=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110. ports: - "5202:80" volumes: - ./src/Apigw/configs/webshoppingapigw:/app/configuration - webmarketingapigw: environment: - ASPNETCORE_ENVIRONMENT=Development - - identityUrl=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110. + - IdentityUrl=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110. ports: - "5203:80" volumes: diff --git a/eShopOnContainers-ServicesAndWebApps.sln b/eShopOnContainers-ServicesAndWebApps.sln index d274f804e..fc72b85f6 100644 --- a/eShopOnContainers-ServicesAndWebApps.sln +++ b/eShopOnContainers-ServicesAndWebApps.sln @@ -105,18 +105,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Aggregators", "Aggregators" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Mobile.Shopping.HttpAggregator", "src\Aggregators\Mobile.Shopping.HttpAggregator\Mobile.Shopping.HttpAggregator.csproj", "{6E99F232-1536-424F-A28C-91692C8FD325}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "configs", "configs", "{D8D24753-8421-40EE-8FE5-B8BE06A07AC5}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "MobileBff.Shopping.ApiGw", "MobileBff.Shopping.ApiGw", "{DAEA3807-1578-4B43-9033-E400FAF1DC49}" - ProjectSection(SolutionItems) = preProject - src\Apigw\configs\mobileshoppingapigw\configuration.json = src\Apigw\configs\mobileshoppingapigw\configuration.json - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "MobileBff.Marketing.ApiGw", "MobileBff.Marketing.ApiGw", "{AC3EDABD-8EB0-4045-BC12-39865490A79D}" - ProjectSection(SolutionItems) = preProject - src\Apigw\configs\mobilemarketingapigw\configuration.json = src\Apigw\configs\mobilemarketingapigw\configuration.json - EndProjectSection -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Ad-Hoc|Any CPU = Ad-Hoc|Any CPU @@ -1477,9 +1465,6 @@ Global {E0C5162E-DF26-4341-9E51-14AE800D7505} = {7A58AA20-67F3-48F3-88C8-24EBFE621792} {EA378316-9D49-4A6B-858E-D4A25F948A74} = {932D8224-11F6-4D07-B109-DA28AD288A63} {6E99F232-1536-424F-A28C-91692C8FD325} = {EA378316-9D49-4A6B-858E-D4A25F948A74} - {D8D24753-8421-40EE-8FE5-B8BE06A07AC5} = {7A58AA20-67F3-48F3-88C8-24EBFE621792} - {DAEA3807-1578-4B43-9033-E400FAF1DC49} = {D8D24753-8421-40EE-8FE5-B8BE06A07AC5} - {AC3EDABD-8EB0-4045-BC12-39865490A79D} = {D8D24753-8421-40EE-8FE5-B8BE06A07AC5} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {25728519-5F0F-4973-8A64-0A81EB4EA8D9} diff --git a/src/Apigw/configs/linux/mobilemarketingapigw/configuration.json b/src/Apigw/configs/mobilemarketingapigw/configuration.json similarity index 100% rename from src/Apigw/configs/linux/mobilemarketingapigw/configuration.json rename to src/Apigw/configs/mobilemarketingapigw/configuration.json diff --git a/src/Apigw/configs/linux/mobileshoppingapigw/configuration.json b/src/Apigw/configs/mobileshoppingapigw/configuration.json similarity index 100% rename from src/Apigw/configs/linux/mobileshoppingapigw/configuration.json rename to src/Apigw/configs/mobileshoppingapigw/configuration.json diff --git a/src/Apigw/configs/linux/webmarketingapigw/configuration.json b/src/Apigw/configs/webmarketingapigw/configuration.json similarity index 100% rename from src/Apigw/configs/linux/webmarketingapigw/configuration.json rename to src/Apigw/configs/webmarketingapigw/configuration.json diff --git a/src/Apigw/configs/linux/webshoppingapigw/configuration.json b/src/Apigw/configs/webshoppingapigw/configuration.json similarity index 100% rename from src/Apigw/configs/linux/webshoppingapigw/configuration.json rename to src/Apigw/configs/webshoppingapigw/configuration.json diff --git a/src/Apigw/configs/windows/mobilemarketingapigw/configuration.json b/src/Apigw/configs/windows/mobilemarketingapigw/configuration.json deleted file mode 100644 index 22fdca1b2..000000000 --- a/src/Apigw/configs/windows/mobilemarketingapigw/configuration.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/src/Apigw/configs/windows/mobileshoppingapigw/configuration.json b/src/Apigw/configs/windows/mobileshoppingapigw/configuration.json deleted file mode 100644 index 22fdca1b2..000000000 --- a/src/Apigw/configs/windows/mobileshoppingapigw/configuration.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/src/Apigw/configs/windows/webmarketingapigw/configuration.json b/src/Apigw/configs/windows/webmarketingapigw/configuration.json deleted file mode 100644 index 22fdca1b2..000000000 --- a/src/Apigw/configs/windows/webmarketingapigw/configuration.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/src/Apigw/configs/windows/webshoppingapigw/configuration.json b/src/Apigw/configs/windows/webshoppingapigw/configuration.json deleted file mode 100644 index 80d3f1116..000000000 --- a/src/Apigw/configs/windows/webshoppingapigw/configuration.json +++ /dev/null @@ -1,142 +0,0 @@ -{ - "ReRoutes": [ - { - "DownstreamPathTemplate": "/api/{version}/{everything}", - "DownstreamScheme": "http", - "DownstreamHostAndPorts": [ - { - "Host": "catalog.api", - "Port": 80 - } - ], - "UpstreamPathTemplate": "/shopping/api/{version}/c/{everything}", - "UpstreamHttpMethod": [ "GET" ] - }, - { - "DownstreamPathTemplate": "/api/{version}/{everything}", - "DownstreamScheme": "http", - "DownstreamHostAndPorts": [ - { - "Host": "basket.api", - "Port": 80 - } - ], - "UpstreamPathTemplate": "/shopping/api/{version}/b/{everything}", - "UpstreamHttpMethod": [], - "AuthenticationOptions": { - "AuthenticationProviderKey": "IdentityApiKey", - "AllowedScopes": [] - } - }, - { - "DownstreamPathTemplate": "/api/{version}/{everything}", - "DownstreamScheme": "http", - "DownstreamHostAndPorts": [ - { - "Host": "ordering.api", - "Port": 80 - } - ], - "UpstreamPathTemplate": "/shopping/api/{version}/o/{everything}", - "UpstreamHttpMethod": [], - "AuthenticationOptions": { - "AuthenticationProviderKey": "IdentityApiKey", - "AllowedScopes": [] - } - }, - { - "DownstreamPathTemplate": "/{everything}", - "DownstreamScheme": "http", - "DownstreamHostAndPorts": [ - { - "Host": "mobileshoppingagg", - "Port": 80 - } - ], - "UpstreamPathTemplate": "/shopping/{everything}", - "UpstreamHttpMethod": [ "POST", "PUT", "GET" ], - "AuthenticationOptions": { - "AuthenticationProviderKey": "IdentityApiKey", - "AllowedScopes": [] - } - }, - { - "DownstreamPathTemplate": "/{everything}", - "DownstreamScheme": "http", - "DownstreamHostAndPorts": [ - { - "Host": "ordering.api", - "Port": 80 - } - ], - "UpstreamPathTemplate": "/orders-api/{everything}", - "UpstreamHttpMethod": [] - }, - { - "DownstreamPathTemplate": "/{everything}", - "DownstreamScheme": "http", - "DownstreamHostAndPorts": [ - { - "Host": "basket.api", - "Port": 80 - } - ], - "UpstreamPathTemplate": "/basket-api/{everything}", - "UpstreamHttpMethod": [] - }, - { - "DownstreamPathTemplate": "/{everything}", - "DownstreamScheme": "http", - "DownstreamHostAndPorts": [ - { - "Host": "catalog.api", - "Port": 80 - } - ], - "UpstreamPathTemplate": "/catalog-api/{everything}", - "UpstreamHttpMethod": [] - }, - { - "DownstreamPathTemplate": "/{everything}", - "DownstreamScheme": "http", - "DownstreamHostAndPorts": [ - { - "Host": "marketing.api", - "Port": 80 - } - ], - "UpstreamPathTemplate": "/marketing-api/{everything}", - "UpstreamHttpMethod": [] - }, - { - "DownstreamPathTemplate": "/{everything}", - "DownstreamScheme": "http", - "DownstreamHostAndPorts": [ - { - "Host": "payment.api", - "Port": 80 - } - ], - "UpstreamPathTemplate": "/payment-api/{everything}", - "UpstreamHttpMethod": [] - }, - { - "DownstreamPathTemplate": "/{everything}", - "DownstreamScheme": "http", - "DownstreamHostAndPorts": [ - { - "Host": "locations.api", - "Port": 80 - } - ], - "UpstreamPathTemplate": "/location-api/{everything}", - "UpstreamHttpMethod": [] - } - - ], - "GlobalConfiguration": { - "RequestIdKey": "OcRequestId", - "AdministrationPath": "/administration" - } - } - \ No newline at end of file From 8cfb74fe9335591a8ba08bf7afe184b79a985751 Mon Sep 17 00:00:00 2001 From: eiximenis Date: Tue, 27 Feb 2018 13:10:39 +0100 Subject: [PATCH 24/78] Fixing SPA for using aggregators --- docker-compose.override.yml | 57 +- docker-compose.prod.yml | 11 +- docker-compose.yml | 38 +- src/Apigw/OcelotApiGw/Dockerfile2 | 19 + src/Apigw/OcelotApiGw/Dockerfile3 | 19 + src/Apigw/OcelotApiGw/Dockerfile4 | 19 + .../webshoppingapigw/configuration.json | 8 +- .../Client/modules/basket/basket.service.ts | 6 +- .../Client/modules/catalog/catalog.service.ts | 6 +- .../Client/modules/orders/orders.service.ts | 4 +- src/Web/WebSPA/package-lock.json | 905 ++++++++++++++++++ 11 files changed, 1026 insertions(+), 66 deletions(-) create mode 100644 src/Apigw/OcelotApiGw/Dockerfile2 create mode 100644 src/Apigw/OcelotApiGw/Dockerfile3 create mode 100644 src/Apigw/OcelotApiGw/Dockerfile4 diff --git a/docker-compose.override.yml b/docker-compose.override.yml index 43e2fbcb8..c3dbd0027 100644 --- a/docker-compose.override.yml +++ b/docker-compose.override.yml @@ -115,7 +115,7 @@ services: - IdentityUrl=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5105 #Local: You need to open your local dev-machine firewall at range 5100-5105. at range 5100-5105. - MarketingUrl=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5110 - LocationsUrl=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5109 - - PurchaseUrl=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5200 + - PurchaseUrl=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5202 - CatalogUrlHC=http://catalog.api/hc - OrderingUrlHC=http://ordering.api/hc - IdentityUrlHC=http://identity.api/hc #Local: Use ${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}, if using external IP or DNS name from browser. @@ -132,7 +132,7 @@ services: environment: - ASPNETCORE_ENVIRONMENT=Development - ASPNETCORE_URLS=http://0.0.0.0:80 - - PurchaseUrl=http://apigw/shopping + - PurchaseUrl=http://webshoppingapigw - LocationsUrl=http://locations.api - IdentityUrl=http://10.0.75.1:5105 # Local Mac: Use http://docker.for.mac.localhost:5105 || Local Windows: Use 10.0.75.1 in a "Docker for Windows" environment, if using "localhost" from browser. || #Remote access: Use ${ESHOP_EXTERNAL_DNS_NAME_OR_IP} if using external IP or DNS name from browser. - MarketingUrl=http://marketing.api @@ -218,23 +218,23 @@ services: - "15672:15672" - "5672:5672" - mobileshoppingapigw: - environment: - - ASPNETCORE_ENVIRONMENT=Development - - IdentityUrl=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110. - ports: - - "5200:80" - volumes: - - ./src/Apigw/configs/mobileshoppingapigw:/app/configuration - - mobilemarketingapigw: - environment: - - ASPNETCORE_ENVIRONMENT=Development - - IdentityUrl=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110. - ports: - - "5201:80" - volumes: - - ./src/Apigw/configs/mobilemarketingapigw:/app/configuration +# mobileshoppingapigw: +# environment: +# - ASPNETCORE_ENVIRONMENT=Development +# - IdentityUrl=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110. +# ports: +# - "5200:80" +# volumes: +# - ./src/Apigw/configs/mobileshoppingapigw:/app/configuration +# +# mobilemarketingapigw: +# environment: +# - ASPNETCORE_ENVIRONMENT=Development +# - IdentityUrl=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110. +# ports: +# - "5201:80" +# volumes: +# - ./src/Apigw/configs/mobilemarketingapigw:/app/configuration webshoppingapigw: environment: @@ -245,14 +245,14 @@ services: volumes: - ./src/Apigw/configs/webshoppingapigw:/app/configuration - webmarketingapigw: - environment: - - ASPNETCORE_ENVIRONMENT=Development - - IdentityUrl=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110. - ports: - - "5203:80" - volumes: - - ./src/Apigw/configs/webmarketingapigw:/app/configuration +# webmarketingapigw: +# environment: +# - ASPNETCORE_ENVIRONMENT=Development +# - IdentityUrl=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110. +# ports: +# - "5203:80" +# volumes: +# - ./src/Apigw/configs/webmarketingapigw:/app/configuration mobileshoppingagg: environment: @@ -262,5 +262,4 @@ services: - urls__orders=http://ordering.api - urls__identity=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110. ports: - - "5120:80" - + - "5120:80" \ No newline at end of file diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index 68e02e4da..81deef911 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -139,17 +139,16 @@ services: webmvc: environment: + - ASPNETCORE_ENVIRONMENT=Development - ASPNETCORE_URLS=http://0.0.0.0:80 - - CatalogUrl=http://catalog.api - - OrderingUrl=http://ordering.api - - BasketUrl=http://basket.api + - PurchaseUrl=http://webshoppingapigw/shopping - LocationsUrl=http://locations.api - - IdentityUrl=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5105 #Local: Use 10.0.75.1 in a "Docker for Windows" environment, if using "localhost" from browser. #Remote: Use ${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP} if using external IP or DNS name from browser. - - MarketingUrl=http://marketing.api + - IdentityUrl=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5105 # Local Mac: Use http://docker.for.mac.localhost:5105 || Local Windows: Use 10.0.75.1 in a "Docker for Windows" environment, if using "localhost" from browser. || #Remote access: Use ${ESHOP_EXTERNAL_DNS_NAME_OR_IP} if using external IP or DNS name from browser. + - MarketingUrl=http://marketing.api - CatalogUrlHC=http://catalog.api/hc - OrderingUrlHC=http://ordering.api/hc - - IdentityUrlHC=http://identity.api/hc + - IdentityUrlHC=http://identity.api/hc #Local: Use ${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}, if using external IP or DNS name from browser. - BasketUrlHC=http://basket.api/hc - MarketingUrlHC=http://marketing.api/hc - PaymentUrlHC=http://payment.api/hc diff --git a/docker-compose.yml b/docker-compose.yml index 4b2fb7a1d..703dbfee9 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -108,29 +108,29 @@ services: rabbitmq: image: rabbitmq:3-management-alpine - mobileshoppingapigw: - image: eshop/ocelotapigw - build: - context: . - dockerfile: src/Apigw/OcelotApiGw/Dockerfile - - mobilemarketingapigw: - image: eshop/ocelotapigw - build: - context: . - dockerfile: src/Apigw/OcelotApiGw/Dockerfile - +# mobileshoppingapigw: +# image: eshop/ocelotapigw-ms +# build: +# context: . +# dockerfile: src/Apigw/OcelotApiGw/Dockerfile +# +# mobilemarketingapigw: +# image: eshop/ocelotapigw-mm +# build: +# context: . +# dockerfile: src/Apigw/OcelotApiGw/Dockerfile2 +# webshoppingapigw: - image: eshop/ocelotapigw + image: eshop/ocelotapigw-ws build: context: . - dockerfile: src/Apigw/OcelotApiGw/Dockerfile + dockerfile: src/Apigw/OcelotApiGw/Dockerfile3 - webmarketingapigw: - image: eshop/ocelotapigw - build: - context: . - dockerfile: src/Apigw/OcelotApiGw/Dockerfile +# webmarketingapigw: +# image: eshop/ocelotapigw-wm +# build: +# context: . +# dockerfile: src/Apigw/OcelotApiGw/Dockerfile4 mobileshoppingagg: image: eshop/mobileshoppingagg diff --git a/src/Apigw/OcelotApiGw/Dockerfile2 b/src/Apigw/OcelotApiGw/Dockerfile2 new file mode 100644 index 000000000..aec2dc4e3 --- /dev/null +++ b/src/Apigw/OcelotApiGw/Dockerfile2 @@ -0,0 +1,19 @@ +FROM microsoft/aspnetcore:2.0 AS base +WORKDIR /app +EXPOSE 80 + +FROM microsoft/aspnetcore-build:2.0 AS build +WORKDIR /src +COPY src/Apigw/OcelotApiGw/OcelotApiGw.csproj src/Apigw/OcelotApiGw/ +RUN dotnet restore src/Apigw/OcelotApiGw/ +COPY . . +WORKDIR /src/src/Apigw/OcelotApiGw +RUN dotnet build -c Release -o /app + +FROM build AS publish +RUN dotnet publish -c Release -o /app + +FROM base AS final +WORKDIR /app +COPY --from=publish /app . +ENTRYPOINT ["dotnet", "OcelotApiGw.dll"] diff --git a/src/Apigw/OcelotApiGw/Dockerfile3 b/src/Apigw/OcelotApiGw/Dockerfile3 new file mode 100644 index 000000000..aec2dc4e3 --- /dev/null +++ b/src/Apigw/OcelotApiGw/Dockerfile3 @@ -0,0 +1,19 @@ +FROM microsoft/aspnetcore:2.0 AS base +WORKDIR /app +EXPOSE 80 + +FROM microsoft/aspnetcore-build:2.0 AS build +WORKDIR /src +COPY src/Apigw/OcelotApiGw/OcelotApiGw.csproj src/Apigw/OcelotApiGw/ +RUN dotnet restore src/Apigw/OcelotApiGw/ +COPY . . +WORKDIR /src/src/Apigw/OcelotApiGw +RUN dotnet build -c Release -o /app + +FROM build AS publish +RUN dotnet publish -c Release -o /app + +FROM base AS final +WORKDIR /app +COPY --from=publish /app . +ENTRYPOINT ["dotnet", "OcelotApiGw.dll"] diff --git a/src/Apigw/OcelotApiGw/Dockerfile4 b/src/Apigw/OcelotApiGw/Dockerfile4 new file mode 100644 index 000000000..aec2dc4e3 --- /dev/null +++ b/src/Apigw/OcelotApiGw/Dockerfile4 @@ -0,0 +1,19 @@ +FROM microsoft/aspnetcore:2.0 AS base +WORKDIR /app +EXPOSE 80 + +FROM microsoft/aspnetcore-build:2.0 AS build +WORKDIR /src +COPY src/Apigw/OcelotApiGw/OcelotApiGw.csproj src/Apigw/OcelotApiGw/ +RUN dotnet restore src/Apigw/OcelotApiGw/ +COPY . . +WORKDIR /src/src/Apigw/OcelotApiGw +RUN dotnet build -c Release -o /app + +FROM build AS publish +RUN dotnet publish -c Release -o /app + +FROM base AS final +WORKDIR /app +COPY --from=publish /app . +ENTRYPOINT ["dotnet", "OcelotApiGw.dll"] diff --git a/src/Apigw/configs/webshoppingapigw/configuration.json b/src/Apigw/configs/webshoppingapigw/configuration.json index 80d3f1116..801eac5d9 100644 --- a/src/Apigw/configs/webshoppingapigw/configuration.json +++ b/src/Apigw/configs/webshoppingapigw/configuration.json @@ -9,7 +9,7 @@ "Port": 80 } ], - "UpstreamPathTemplate": "/shopping/api/{version}/c/{everything}", + "UpstreamPathTemplate": "/api/{version}/c/{everything}", "UpstreamHttpMethod": [ "GET" ] }, { @@ -21,7 +21,7 @@ "Port": 80 } ], - "UpstreamPathTemplate": "/shopping/api/{version}/b/{everything}", + "UpstreamPathTemplate": "/api/{version}/b/{everything}", "UpstreamHttpMethod": [], "AuthenticationOptions": { "AuthenticationProviderKey": "IdentityApiKey", @@ -37,7 +37,7 @@ "Port": 80 } ], - "UpstreamPathTemplate": "/shopping/api/{version}/o/{everything}", + "UpstreamPathTemplate": "/api/{version}/o/{everything}", "UpstreamHttpMethod": [], "AuthenticationOptions": { "AuthenticationProviderKey": "IdentityApiKey", @@ -53,7 +53,7 @@ "Port": 80 } ], - "UpstreamPathTemplate": "/shopping/{everything}", + "UpstreamPathTemplate": "/{everything}", "UpstreamHttpMethod": [ "POST", "PUT", "GET" ], "AuthenticationOptions": { "AuthenticationProviderKey": "IdentityApiKey", diff --git a/src/Web/WebSPA/Client/modules/basket/basket.service.ts b/src/Web/WebSPA/Client/modules/basket/basket.service.ts index f26cbc2cb..fef74974e 100644 --- a/src/Web/WebSPA/Client/modules/basket/basket.service.ts +++ b/src/Web/WebSPA/Client/modules/basket/basket.service.ts @@ -66,7 +66,7 @@ export class BasketService { } setBasket(basket): Observable { - let url = this.purchaseUrl + '/shopping/api/v1/basket/'; + let url = this.purchaseUrl + '/api/v1/basket/'; this.basket = basket; return this.service.post(url, basket).map((response: Response) => { return true; @@ -74,7 +74,7 @@ export class BasketService { } setBasketCheckout(basketCheckout): Observable { - let url = this.basketUrl + '/shopping/api/v1/b/basket/checkout'; + let url = this.basketUrl + '/api/v1/b/basket/checkout'; return this.service.postWithId(url, basketCheckout).map((response: Response) => { this.basketEvents.orderCreated(); return true; @@ -82,7 +82,7 @@ export class BasketService { } getBasket(): Observable { - let url = this.basketUrl + '/shopping/api/v1/b/basket/' + this.basket.buyerId; + let url = this.basketUrl + '/api/v1/b/basket/' + this.basket.buyerId; return this.service.get(url).map((response: Response) => { if (response.status === 204) { return null; diff --git a/src/Web/WebSPA/Client/modules/catalog/catalog.service.ts b/src/Web/WebSPA/Client/modules/catalog/catalog.service.ts index 8e91ef541..fc5bc4c5e 100644 --- a/src/Web/WebSPA/Client/modules/catalog/catalog.service.ts +++ b/src/Web/WebSPA/Client/modules/catalog/catalog.service.ts @@ -21,9 +21,9 @@ export class CatalogService { constructor(private service: DataService, private configurationService: ConfigurationService) { this.configurationService.settingsLoaded$.subscribe(x => { - this.catalogUrl = this.configurationService.serverSettings.purchaseUrl + '/shopping/api/v1/c/catalog/items'; - this.brandUrl = this.configurationService.serverSettings.purchaseUrl + '/shopping/api/v1/c/catalog/catalogbrands'; - this.typesUrl = this.configurationService.serverSettings.purchaseUrl + '/shopping/api/v1/c/catalog/catalogtypes'; + this.catalogUrl = this.configurationService.serverSettings.purchaseUrl + '/api/v1/c/catalog/items'; + this.brandUrl = this.configurationService.serverSettings.purchaseUrl + '/api/v1/c/catalog/catalogbrands'; + this.typesUrl = this.configurationService.serverSettings.purchaseUrl + '/api/v1/c/catalog/catalogtypes'; }); } diff --git a/src/Web/WebSPA/Client/modules/orders/orders.service.ts b/src/Web/WebSPA/Client/modules/orders/orders.service.ts index 9eabeb1cf..5c563f836 100644 --- a/src/Web/WebSPA/Client/modules/orders/orders.service.ts +++ b/src/Web/WebSPA/Client/modules/orders/orders.service.ts @@ -29,7 +29,7 @@ export class OrdersService { } getOrders(): Observable { - let url = this.ordersUrl + '/shopping/api/v1/o/orders'; + let url = this.ordersUrl + '/api/v1/o/orders'; return this.service.get(url).map((response: Response) => { return response.json(); @@ -37,7 +37,7 @@ export class OrdersService { } getOrder(id: number): Observable { - let url = this.ordersUrl + '/shopping/api/v1/o/orders/' + id; + let url = this.ordersUrl + '/api/v1/o/orders/' + id; return this.service.get(url).map((response: Response) => { return response.json(); diff --git a/src/Web/WebSPA/package-lock.json b/src/Web/WebSPA/package-lock.json index 313a88257..550b77da7 100644 --- a/src/Web/WebSPA/package-lock.json +++ b/src/Web/WebSPA/package-lock.json @@ -1176,6 +1176,7 @@ "requires": { "anymatch": "1.3.2", "async-each": "1.0.1", + "fsevents": "1.1.3", "glob-parent": "2.0.0", "inherits": "2.0.3", "is-binary-path": "1.0.1", @@ -2806,6 +2807,910 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, + "fsevents": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.3.tgz", + "integrity": "sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q==", + "dev": true, + "optional": true, + "requires": { + "nan": "2.6.2", + "node-pre-gyp": "0.6.39" + }, + "dependencies": { + "abbrev": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "ajv": { + "version": "4.11.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "co": "4.6.0", + "json-stable-stringify": "1.0.1" + } + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.2.9" + } + }, + "asn1": { + "version": "0.2.3", + "bundled": true, + "dev": true, + "optional": true + }, + "assert-plus": { + "version": "0.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "asynckit": { + "version": "0.4.0", + "bundled": true, + "dev": true, + "optional": true + }, + "aws-sign2": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "aws4": { + "version": "1.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "balanced-match": { + "version": "0.4.2", + "bundled": true, + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "block-stream": { + "version": "0.0.9", + "bundled": true, + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "boom": { + "version": "2.10.1", + "bundled": true, + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "brace-expansion": { + "version": "1.1.7", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "0.4.2", + "concat-map": "0.0.1" + } + }, + "buffer-shims": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "caseless": { + "version": "0.12.0", + "bundled": true, + "dev": true, + "optional": true + }, + "co": { + "version": "4.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "combined-stream": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "cryptiles": { + "version": "2.0.5", + "bundled": true, + "dev": true, + "requires": { + "boom": "2.10.1" + } + }, + "dashdash": { + "version": "1.14.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "debug": { + "version": "2.6.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.4.2", + "bundled": true, + "dev": true, + "optional": true + }, + "delayed-stream": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "extend": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "extsprintf": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "bundled": true, + "dev": true, + "optional": true + }, + "form-data": { + "version": "2.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.15" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "fstream": { + "version": "1.0.11", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "inherits": "2.0.3", + "mkdirp": "0.5.1", + "rimraf": "2.6.1" + } + }, + "fstream-ignore": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fstream": "1.0.11", + "inherits": "2.0.3", + "minimatch": "3.0.4" + } + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "1.1.1", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.2" + } + }, + "getpass": { + "version": "0.1.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "graceful-fs": { + "version": "4.1.11", + "bundled": true, + "dev": true + }, + "har-schema": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "optional": true + }, + "har-validator": { + "version": "4.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ajv": "4.11.8", + "har-schema": "1.0.5" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "hawk": { + "version": "3.1.3", + "bundled": true, + "dev": true, + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } + }, + "hoek": { + "version": "2.16.3", + "bundled": true, + "dev": true + }, + "http-signature": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.0", + "sshpk": "1.13.0" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.4", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "isstream": { + "version": "0.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "jodid25519": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "jsbn": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "bundled": true, + "dev": true, + "optional": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsonify": "0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "jsonify": { + "version": "0.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "jsprim": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.0.2", + "json-schema": "0.2.3", + "verror": "1.3.6" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "mime-db": { + "version": "1.27.0", + "bundled": true, + "dev": true + }, + "mime-types": { + "version": "2.1.15", + "bundled": true, + "dev": true, + "requires": { + "mime-db": "1.27.0" + } + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "node-pre-gyp": { + "version": "0.6.39", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "1.0.2", + "hawk": "3.1.3", + "mkdirp": "0.5.1", + "nopt": "4.0.1", + "npmlog": "4.1.0", + "rc": "1.2.1", + "request": "2.81.0", + "rimraf": "2.6.1", + "semver": "5.3.0", + "tar": "2.2.1", + "tar-pack": "3.4.0" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1.1.0", + "osenv": "0.1.4" + } + }, + "npmlog": { + "version": "4.1.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "performance-now": { + "version": "0.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "1.0.7", + "bundled": true, + "dev": true + }, + "punycode": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "optional": true + }, + "qs": { + "version": "6.4.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.4", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.2.9", + "bundled": true, + "dev": true, + "requires": { + "buffer-shims": "1.0.0", + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "string_decoder": "1.0.1", + "util-deprecate": "1.0.2" + } + }, + "request": { + "version": "2.81.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "4.2.1", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.15", + "oauth-sign": "0.8.2", + "performance-now": "0.2.0", + "qs": "6.4.0", + "safe-buffer": "5.0.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.2", + "tunnel-agent": "0.6.0", + "uuid": "3.0.1" + } + }, + "rimraf": { + "version": "2.6.1", + "bundled": true, + "dev": true, + "requires": { + "glob": "7.1.2" + } + }, + "safe-buffer": { + "version": "5.0.1", + "bundled": true, + "dev": true + }, + "semver": { + "version": "5.3.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sntp": { + "version": "1.0.9", + "bundled": true, + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "sshpk": { + "version": "1.13.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jodid25519": "1.0.2", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "5.0.1" + } + }, + "stringstream": { + "version": "0.0.5", + "bundled": true, + "dev": true, + "optional": true + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "2.2.1", + "bundled": true, + "dev": true, + "requires": { + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "2.0.3" + } + }, + "tar-pack": { + "version": "3.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "2.6.8", + "fstream": "1.0.11", + "fstream-ignore": "1.0.5", + "once": "1.4.0", + "readable-stream": "2.2.9", + "rimraf": "2.6.1", + "tar": "2.2.1", + "uid-number": "0.0.6" + } + }, + "tough-cookie": { + "version": "2.3.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "punycode": "1.4.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "bundled": true, + "dev": true, + "optional": true + }, + "uid-number": { + "version": "0.0.6", + "bundled": true, + "dev": true, + "optional": true + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "uuid": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "verror": { + "version": "1.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "extsprintf": "1.0.2" + } + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + } + } + }, "fstream": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", From a18cec21fea70d2ad0c9368a52d95f981689521b Mon Sep 17 00:00:00 2001 From: eiximenis Date: Tue, 27 Feb 2018 14:32:25 +0100 Subject: [PATCH 25/78] Missing aggregator project --- docker-compose.override.yml | 13 +- docker-compose.prod.yml | 1 + docker-compose.yml | 6 + eShopOnContainers-ServicesAndWebApps.sln | 51 +++++++ .../Config/UrlsConfig.cs | 31 ++++ .../Controllers/BasketController.cs | 133 +++++++++++++++++ .../Controllers/HomeController.cs | 18 +++ .../Controllers/OrderController.cs | 42 ++++++ .../Web.Shopping.HttpAggregator/Dockerfile | 18 +++ .../Filters/AuthorizeCheckOperationFilter.cs | 33 +++++ .../Models/AddBasketItemRequest.cs | 20 +++ .../Models/BasketData.cs | 31 ++++ .../Models/CatalogItem.cs | 20 +++ .../Models/OrderData.cs | 33 +++++ .../Models/OrderItemData.cs | 17 +++ .../Models/UpdateBasketItemsRequest.cs | 31 ++++ .../Models/UpdateBasketRequest.cs | 21 +++ .../Web.Shopping.HttpAggregator/Program.cs | 36 +++++ .../Properties/launchSettings.json | 29 ++++ .../Services/BasketService.cs | 53 +++++++ .../Services/CatalogService.cs | 43 ++++++ .../Services/IBasketService.cs | 15 ++ .../Services/ICatalogService.cs | 14 ++ .../Services/IOrderApiClient.cs | 13 ++ .../Services/OrderApiClient.cs | 37 +++++ .../Web.Shopping.HttpAggregator/Startup.cs | 138 ++++++++++++++++++ .../Web.Shopping.HttpAggregator.csproj | 27 ++++ .../appsettings.json | 15 ++ .../appsettings.localhost.json | 8 + src/Apigw/OcelotApiGw/Startup.cs | 2 +- .../webshoppingapigw/configuration.json | 2 +- .../Identity.API/Configuration/Config.cs | 24 ++- .../Data/ConfigurationDbContextSeed.cs | 1 + src/Web/WebMVC/Startup.cs | 1 + 34 files changed, 970 insertions(+), 7 deletions(-) create mode 100644 src/Aggregators/Web.Shopping.HttpAggregator/Config/UrlsConfig.cs create mode 100644 src/Aggregators/Web.Shopping.HttpAggregator/Controllers/BasketController.cs create mode 100644 src/Aggregators/Web.Shopping.HttpAggregator/Controllers/HomeController.cs create mode 100644 src/Aggregators/Web.Shopping.HttpAggregator/Controllers/OrderController.cs create mode 100644 src/Aggregators/Web.Shopping.HttpAggregator/Dockerfile create mode 100644 src/Aggregators/Web.Shopping.HttpAggregator/Filters/AuthorizeCheckOperationFilter.cs create mode 100644 src/Aggregators/Web.Shopping.HttpAggregator/Models/AddBasketItemRequest.cs create mode 100644 src/Aggregators/Web.Shopping.HttpAggregator/Models/BasketData.cs create mode 100644 src/Aggregators/Web.Shopping.HttpAggregator/Models/CatalogItem.cs create mode 100644 src/Aggregators/Web.Shopping.HttpAggregator/Models/OrderData.cs create mode 100644 src/Aggregators/Web.Shopping.HttpAggregator/Models/OrderItemData.cs create mode 100644 src/Aggregators/Web.Shopping.HttpAggregator/Models/UpdateBasketItemsRequest.cs create mode 100644 src/Aggregators/Web.Shopping.HttpAggregator/Models/UpdateBasketRequest.cs create mode 100644 src/Aggregators/Web.Shopping.HttpAggregator/Program.cs create mode 100644 src/Aggregators/Web.Shopping.HttpAggregator/Properties/launchSettings.json create mode 100644 src/Aggregators/Web.Shopping.HttpAggregator/Services/BasketService.cs create mode 100644 src/Aggregators/Web.Shopping.HttpAggregator/Services/CatalogService.cs create mode 100644 src/Aggregators/Web.Shopping.HttpAggregator/Services/IBasketService.cs create mode 100644 src/Aggregators/Web.Shopping.HttpAggregator/Services/ICatalogService.cs create mode 100644 src/Aggregators/Web.Shopping.HttpAggregator/Services/IOrderApiClient.cs create mode 100644 src/Aggregators/Web.Shopping.HttpAggregator/Services/OrderApiClient.cs create mode 100644 src/Aggregators/Web.Shopping.HttpAggregator/Startup.cs create mode 100644 src/Aggregators/Web.Shopping.HttpAggregator/Web.Shopping.HttpAggregator.csproj create mode 100644 src/Aggregators/Web.Shopping.HttpAggregator/appsettings.json create mode 100644 src/Aggregators/Web.Shopping.HttpAggregator/appsettings.localhost.json diff --git a/docker-compose.override.yml b/docker-compose.override.yml index c3dbd0027..51284360a 100644 --- a/docker-compose.override.yml +++ b/docker-compose.override.yml @@ -58,6 +58,7 @@ services: - BasketApiClient=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5103 - OrderingApiClient=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5102 - MobileShoppingAggClient=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5120 + - WebShoppingAggClient=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5121 - UseCustomizationData=True - ApplicationInsights__InstrumentationKey=${INSTRUMENTATION_KEY} - OrchestratorType=${ORCHESTRATOR_TYPE} @@ -262,4 +263,14 @@ services: - urls__orders=http://ordering.api - urls__identity=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110. ports: - - "5120:80" \ No newline at end of file + - "5120:80" + + webshoppingagg: + environment: + - ASPNETCORE_ENVIRONMENT=Development + - urls__basket=http://basket.api + - urls__catalog=http://catalog.api + - urls__orders=http://ordering.api + - urls__identity=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110. + ports: + - "5121:80" \ No newline at end of file diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index 81deef911..1f8fc6dd9 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -65,6 +65,7 @@ services: - BasketApiClient=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5103 - OrderingApiClient=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5102 - MobileShoppingAggClient=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5120 + - WebShoppingAggClient=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5120 - UseCustomizationData=True - ApplicationInsights__InstrumentationKey=${INSTRUMENTATION_KEY} - OrchestratorType=${ORCHESTRATOR_TYPE} diff --git a/docker-compose.yml b/docker-compose.yml index 703dbfee9..ae7a7faa0 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -138,3 +138,9 @@ services: context: . dockerfile: src/Aggregators/Mobile.Shopping.HttpAggregator/Dockerfile + webshoppingagg: + image: eshop/webshoppingagg + build: + context: . + dockerfile: src/Aggregators/Mobile.Shopping.HttpAggregator/Dockerfile + diff --git a/eShopOnContainers-ServicesAndWebApps.sln b/eShopOnContainers-ServicesAndWebApps.sln index fc72b85f6..2be8cf090 100644 --- a/eShopOnContainers-ServicesAndWebApps.sln +++ b/eShopOnContainers-ServicesAndWebApps.sln @@ -105,6 +105,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Aggregators", "Aggregators" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Mobile.Shopping.HttpAggregator", "src\Aggregators\Mobile.Shopping.HttpAggregator\Mobile.Shopping.HttpAggregator.csproj", "{6E99F232-1536-424F-A28C-91692C8FD325}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Web.Shopping.HttpAggregator", "src\Aggregators\Web.Shopping.HttpAggregator\Web.Shopping.HttpAggregator.csproj", "{714CE0A1-E8BE-4CF1-8948-C1202E1526E2}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Ad-Hoc|Any CPU = Ad-Hoc|Any CPU @@ -1415,6 +1417,54 @@ Global {6E99F232-1536-424F-A28C-91692C8FD325}.Release|x64.Build.0 = Release|Any CPU {6E99F232-1536-424F-A28C-91692C8FD325}.Release|x86.ActiveCfg = Release|Any CPU {6E99F232-1536-424F-A28C-91692C8FD325}.Release|x86.Build.0 = Release|Any CPU + {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU + {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU + {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Ad-Hoc|ARM.ActiveCfg = Debug|Any CPU + {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Ad-Hoc|ARM.Build.0 = Debug|Any CPU + {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU + {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU + {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU + {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Ad-Hoc|x64.ActiveCfg = Debug|Any CPU + {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Ad-Hoc|x64.Build.0 = Debug|Any CPU + {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Ad-Hoc|x86.ActiveCfg = Debug|Any CPU + {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Ad-Hoc|x86.Build.0 = Debug|Any CPU + {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU + {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.AppStore|Any CPU.Build.0 = Debug|Any CPU + {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.AppStore|ARM.ActiveCfg = Debug|Any CPU + {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.AppStore|ARM.Build.0 = Debug|Any CPU + {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.AppStore|iPhone.ActiveCfg = Debug|Any CPU + {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.AppStore|iPhone.Build.0 = Debug|Any CPU + {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU + {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.AppStore|x64.ActiveCfg = Debug|Any CPU + {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.AppStore|x64.Build.0 = Debug|Any CPU + {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.AppStore|x86.ActiveCfg = Debug|Any CPU + {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.AppStore|x86.Build.0 = Debug|Any CPU + {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Debug|ARM.ActiveCfg = Debug|Any CPU + {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Debug|ARM.Build.0 = Debug|Any CPU + {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Debug|iPhone.Build.0 = Debug|Any CPU + {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Debug|x64.ActiveCfg = Debug|Any CPU + {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Debug|x64.Build.0 = Debug|Any CPU + {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Debug|x86.ActiveCfg = Debug|Any CPU + {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Debug|x86.Build.0 = Debug|Any CPU + {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Release|Any CPU.Build.0 = Release|Any CPU + {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Release|ARM.ActiveCfg = Release|Any CPU + {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Release|ARM.Build.0 = Release|Any CPU + {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Release|iPhone.ActiveCfg = Release|Any CPU + {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Release|iPhone.Build.0 = Release|Any CPU + {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Release|x64.ActiveCfg = Release|Any CPU + {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Release|x64.Build.0 = Release|Any CPU + {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Release|x86.ActiveCfg = Release|Any CPU + {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -1465,6 +1515,7 @@ Global {E0C5162E-DF26-4341-9E51-14AE800D7505} = {7A58AA20-67F3-48F3-88C8-24EBFE621792} {EA378316-9D49-4A6B-858E-D4A25F948A74} = {932D8224-11F6-4D07-B109-DA28AD288A63} {6E99F232-1536-424F-A28C-91692C8FD325} = {EA378316-9D49-4A6B-858E-D4A25F948A74} + {714CE0A1-E8BE-4CF1-8948-C1202E1526E2} = {EA378316-9D49-4A6B-858E-D4A25F948A74} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {25728519-5F0F-4973-8A64-0A81EB4EA8D9} diff --git a/src/Aggregators/Web.Shopping.HttpAggregator/Config/UrlsConfig.cs b/src/Aggregators/Web.Shopping.HttpAggregator/Config/UrlsConfig.cs new file mode 100644 index 000000000..19be27dce --- /dev/null +++ b/src/Aggregators/Web.Shopping.HttpAggregator/Config/UrlsConfig.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Config +{ + public class UrlsConfig + { + public class CatalogOperations + { + public static string GetItemById(int id) => $"/api/v1/catalog/items/{id}"; + public static string GetItemsById(IEnumerable ids) => $"/api/v1/catalog/items?ids={string.Join(',', ids)}"; + } + + public class BasketOperations + { + public static string GetItemById(string id) => $"/api/v1/basket/{id}"; + public static string UpdateBasket() => "/api/v1/basket"; + } + + public class OrdersOperations + { + public static string GetOrderDraft() => "/api/v1/orders/draft"; + } + + public string Basket { get; set; } + public string Catalog { get; set; } + public string Orders { get; set; } + } +} diff --git a/src/Aggregators/Web.Shopping.HttpAggregator/Controllers/BasketController.cs b/src/Aggregators/Web.Shopping.HttpAggregator/Controllers/BasketController.cs new file mode 100644 index 000000000..bfef55726 --- /dev/null +++ b/src/Aggregators/Web.Shopping.HttpAggregator/Controllers/BasketController.cs @@ -0,0 +1,133 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Models; +using Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Services; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Controllers +{ + [Route("api/v1/[controller]")] + [Authorize] + public class BasketController : Controller + { + private readonly ICatalogService _catalog; + private readonly IBasketService _basket; + public BasketController(ICatalogService catalogService, IBasketService basketService) + { + _catalog = catalogService; + _basket = basketService; + } + + [HttpPost] + [HttpPut] + public async Task UpdateAllBasket([FromBody] UpdateBasketRequest data) + { + + if (data.Items == null || !data.Items.Any()) + { + return BadRequest("Need to pass at least one basket line"); + } + + // Retrieve the current basket + var currentBasket = await _basket.GetById(data.BuyerId); + if (currentBasket == null) + { + currentBasket = new BasketData(data.BuyerId); + } + + var catalogItems = await _catalog.GetCatalogItems(data.Items.Select(x => x.ProductId)); + var newBasket = new BasketData(data.BuyerId); + + foreach (var bitem in data.Items) + { + var catalogItem = catalogItems.SingleOrDefault(ci => ci.Id == bitem.ProductId); + if (catalogItem == null) + { + return BadRequest($"Basket refers to a non-existing catalog item ({bitem.ProductId})"); + } + + newBasket.Items.Add(new BasketDataItem() + { + Id = bitem.Id, + ProductId = catalogItem.Id.ToString(), + ProductName = catalogItem.Name, + PictureUrl = catalogItem.PictureUri, + UnitPrice = catalogItem.Price, + Quantity = bitem.Quantity + }); + } + + await _basket.Update(newBasket); + return Ok(newBasket); + } + + [HttpPut] + [Route("items")] + public async Task UpdateQuantities([FromBody] UpdateBasketItemsRequest data) + { + if (!data.Updates.Any()) + { + return BadRequest("No updates sent"); + } + + // Retrieve the current basket + var currentBasket = await _basket.GetById(data.BasketId); + if (currentBasket == null) + { + return BadRequest($"Basket with id {data.BasketId} not found."); + } + + // Update with new quantities + foreach (var update in data.Updates) + { + var basketItem = currentBasket.Items.SingleOrDefault(bitem => bitem.Id == update.BasketItemId); + if (basketItem == null) + { + return BadRequest($"Basket item with id {update.BasketItemId} not found"); + } + basketItem.Quantity = update.NewQty; + } + + // Save the updated basket + await _basket.Update(currentBasket); + return Ok(currentBasket); + } + + [HttpPost] + [Route("items")] + public async Task AddBasketItem([FromBody] AddBasketItemRequest data) + { + if (data == null || data.Quantity == 0) + { + return BadRequest("Invalid payload"); + } + + // Step 1: Get the item from catalog + var item = await _catalog.GetCatalogItem(data.CatalogItemId); + + //item.PictureUri = + + // Step 2: Get current basket status + var currentBasket = (await _basket.GetById(data.BasketId)) ?? new BasketData(data.BasketId); + // Step 3: Merge current status with new product + currentBasket.Items.Add(new BasketDataItem() + { + UnitPrice = item.Price, + PictureUrl = item.PictureUri, + ProductId = item.Id.ToString(), + ProductName = item.Name, + Quantity = data.Quantity, + Id = Guid.NewGuid().ToString() + }); + + // Step 4: Update basket + await _basket.Update(currentBasket); + + + return Ok(); + } + } +} diff --git a/src/Aggregators/Web.Shopping.HttpAggregator/Controllers/HomeController.cs b/src/Aggregators/Web.Shopping.HttpAggregator/Controllers/HomeController.cs new file mode 100644 index 000000000..58ed48d1a --- /dev/null +++ b/src/Aggregators/Web.Shopping.HttpAggregator/Controllers/HomeController.cs @@ -0,0 +1,18 @@ +using Microsoft.AspNetCore.Mvc; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Controllers +{ + [Route("")] + public class HomeController : Controller + { + [HttpGet()] + public IActionResult Index() + { + return new RedirectResult("~/swagger"); + } + } +} diff --git a/src/Aggregators/Web.Shopping.HttpAggregator/Controllers/OrderController.cs b/src/Aggregators/Web.Shopping.HttpAggregator/Controllers/OrderController.cs new file mode 100644 index 000000000..fd108ffb8 --- /dev/null +++ b/src/Aggregators/Web.Shopping.HttpAggregator/Controllers/OrderController.cs @@ -0,0 +1,42 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Services; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Controllers +{ + [Route("api/v1/[controller]")] + [Authorize] + public class OrderController : Controller + { + private readonly IBasketService _basketService; + private readonly IOrderApiClient _orderClient; + public OrderController(IBasketService basketService, IOrderApiClient orderClient) + { + _basketService = basketService; + _orderClient = orderClient; + } + + [Route("draft/{basketId}")] + [HttpGet] + public async Task GetOrderDraft(string basketId) + { + if (string.IsNullOrEmpty(basketId)) + { + return BadRequest("Need a valid basketid"); + } + // Get the basket data and build a order draft based on it + var basket = await _basketService.GetById(basketId); + if (basket == null) + { + return BadRequest($"No basket found for id {basketId}"); + } + + var orderDraft = await _orderClient.GetOrderDraftFromBasket(basket); + return Ok(orderDraft); + } + } +} diff --git a/src/Aggregators/Web.Shopping.HttpAggregator/Dockerfile b/src/Aggregators/Web.Shopping.HttpAggregator/Dockerfile new file mode 100644 index 000000000..267cb233c --- /dev/null +++ b/src/Aggregators/Web.Shopping.HttpAggregator/Dockerfile @@ -0,0 +1,18 @@ +FROM microsoft/aspnetcore:2.0.5 AS base +WORKDIR /app +EXPOSE 80 + +FROM microsoft/aspnetcore-build:2.0 AS build +WORKDIR /src +COPY . . +RUN dotnet restore -nowarn:msb3202,nu1503 +WORKDIR /src/src/Aggregators/Web.Shopping.HttpAggregator +RUN dotnet build --no-restore -c Release -o /app + +FROM build AS publish +RUN dotnet publish --no-restore -c Release -o /app + +FROM base AS final +WORKDIR /app +COPY --from=publish /app . +ENTRYPOINT ["dotnet", "Web.Shopping.HttpAggregator.dll"] diff --git a/src/Aggregators/Web.Shopping.HttpAggregator/Filters/AuthorizeCheckOperationFilter.cs b/src/Aggregators/Web.Shopping.HttpAggregator/Filters/AuthorizeCheckOperationFilter.cs new file mode 100644 index 000000000..3f382e5df --- /dev/null +++ b/src/Aggregators/Web.Shopping.HttpAggregator/Filters/AuthorizeCheckOperationFilter.cs @@ -0,0 +1,33 @@ +namespace Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Filters +{ + using Microsoft.AspNetCore.Authorization; + using Swashbuckle.AspNetCore.Swagger; + using Swashbuckle.AspNetCore.SwaggerGen; + using System.Collections.Generic; + using System.Linq; + + namespace Basket.API.Infrastructure.Filters + { + public class AuthorizeCheckOperationFilter : IOperationFilter + { + public void Apply(Operation operation, OperationFilterContext context) + { + // Check for authorize attribute + var hasAuthorize = context.ApiDescription.ControllerAttributes().OfType().Any() || + context.ApiDescription.ActionAttributes().OfType().Any(); + + if (hasAuthorize) + { + operation.Responses.Add("401", new Response { Description = "Unauthorized" }); + operation.Responses.Add("403", new Response { Description = "Forbidden" }); + + operation.Security = new List>>(); + operation.Security.Add(new Dictionary> + { + { "oauth2", new [] { "Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator" } } + }); + } + } + } + } +} diff --git a/src/Aggregators/Web.Shopping.HttpAggregator/Models/AddBasketItemRequest.cs b/src/Aggregators/Web.Shopping.HttpAggregator/Models/AddBasketItemRequest.cs new file mode 100644 index 000000000..88aff245f --- /dev/null +++ b/src/Aggregators/Web.Shopping.HttpAggregator/Models/AddBasketItemRequest.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Models +{ + public class AddBasketItemRequest + { + public int CatalogItemId { get; set; } + public string BasketId { get; set; } + + public int Quantity { get; set; } + + public AddBasketItemRequest() + { + Quantity = 1; + } + } +} diff --git a/src/Aggregators/Web.Shopping.HttpAggregator/Models/BasketData.cs b/src/Aggregators/Web.Shopping.HttpAggregator/Models/BasketData.cs new file mode 100644 index 000000000..01831a5c9 --- /dev/null +++ b/src/Aggregators/Web.Shopping.HttpAggregator/Models/BasketData.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Models +{ + public class BasketData + { + public string BuyerId { get; set; } + public List Items { get; set; } + + public BasketData(string buyerId) + { + BuyerId = buyerId; + Items = new List(); + } + } + + public class BasketDataItem + { + public string Id { get; set; } + public string ProductId { get; set; } + public string ProductName { get; set; } + public decimal UnitPrice { get; set; } + public decimal OldUnitPrice { get; set; } + public int Quantity { get; set; } + public string PictureUrl { get; set; } + + } +} diff --git a/src/Aggregators/Web.Shopping.HttpAggregator/Models/CatalogItem.cs b/src/Aggregators/Web.Shopping.HttpAggregator/Models/CatalogItem.cs new file mode 100644 index 000000000..c6085f934 --- /dev/null +++ b/src/Aggregators/Web.Shopping.HttpAggregator/Models/CatalogItem.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Models +{ + public class CatalogItem + { + public int Id { get; set; } + + public string Name { get; set; } + + public decimal Price { get; set; } + + + public string PictureUri { get; set; } + + } +} diff --git a/src/Aggregators/Web.Shopping.HttpAggregator/Models/OrderData.cs b/src/Aggregators/Web.Shopping.HttpAggregator/Models/OrderData.cs new file mode 100644 index 000000000..e9d5982b9 --- /dev/null +++ b/src/Aggregators/Web.Shopping.HttpAggregator/Models/OrderData.cs @@ -0,0 +1,33 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Models +{ + public class OrderData + { + public string OrderNumber { get; set; } + public DateTime Date { get; set; } + public string Status { get; set; } + public decimal Total { get; set; } + public string Description { get; set; } + public string City { get; set; } + public string Street { get; set; } + public string State { get; set; } + public string Country { get; set; } + public string ZipCode { get; set; } + public string CardNumber { get; set; } + public string CardHolderName { get; set; } + public bool IsDraft { get; set; } + public DateTime CardExpiration { get; set; } + public string CardExpirationShort { get; set; } + public string CardSecurityNumber { get; set; } + + public int CardTypeId { get; set; } + + public string Buyer { get; set; } + + public List OrderItems { get; } = new List(); + } +} diff --git a/src/Aggregators/Web.Shopping.HttpAggregator/Models/OrderItemData.cs b/src/Aggregators/Web.Shopping.HttpAggregator/Models/OrderItemData.cs new file mode 100644 index 000000000..1a40cb8cb --- /dev/null +++ b/src/Aggregators/Web.Shopping.HttpAggregator/Models/OrderItemData.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Models +{ + public class OrderItemData + { + public int ProductId { get; set; } + public string ProductName { get; set; } + public decimal UnitPrice { get; set; } + public decimal Discount { get; set; } + public int Units { get; set; } + public string PictureUrl { get; set; } + } +} diff --git a/src/Aggregators/Web.Shopping.HttpAggregator/Models/UpdateBasketItemsRequest.cs b/src/Aggregators/Web.Shopping.HttpAggregator/Models/UpdateBasketItemsRequest.cs new file mode 100644 index 000000000..b41c069bc --- /dev/null +++ b/src/Aggregators/Web.Shopping.HttpAggregator/Models/UpdateBasketItemsRequest.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Models +{ + public class UpdateBasketItemsRequest + { + + public string BasketId { get; set; } + + public ICollection Updates { get; set; } + + public UpdateBasketItemsRequest() + { + Updates = new List(); + } + } + + public class UpdateBasketItemData + { + public string BasketItemId { get; set; } + public int NewQty { get; set; } + + public UpdateBasketItemData() + { + NewQty = 0; + } + } +} diff --git a/src/Aggregators/Web.Shopping.HttpAggregator/Models/UpdateBasketRequest.cs b/src/Aggregators/Web.Shopping.HttpAggregator/Models/UpdateBasketRequest.cs new file mode 100644 index 000000000..9beeeade4 --- /dev/null +++ b/src/Aggregators/Web.Shopping.HttpAggregator/Models/UpdateBasketRequest.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Models +{ + public class UpdateBasketRequest + { + public string BuyerId { get; set; } + + public IEnumerable Items { get; set; } + } + + public class UpdateBasketRequestItemData + { + public string Id { get; set; } // Basket id + public int ProductId { get; set; } // Catalog item id + public int Quantity { get; set; } // Quantity + } +} diff --git a/src/Aggregators/Web.Shopping.HttpAggregator/Program.cs b/src/Aggregators/Web.Shopping.HttpAggregator/Program.cs new file mode 100644 index 000000000..c865a8b3b --- /dev/null +++ b/src/Aggregators/Web.Shopping.HttpAggregator/Program.cs @@ -0,0 +1,36 @@ +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; + +namespace Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator +{ + public class Program + { + public static void Main(string[] args) + { + BuildWebHost(args).Run(); + } + + public static IWebHost BuildWebHost(string[] args) => + WebHost + .CreateDefaultBuilder(args) + .ConfigureAppConfiguration(cb => + { + var sources = cb.Sources; + sources.Insert(3, new Microsoft.Extensions.Configuration.Json.JsonConfigurationSource() + { + Optional = true, + Path = "appsettings.localhost.json", + ReloadOnChange = false + }); + }) + .UseStartup() + .Build(); + } +} diff --git a/src/Aggregators/Web.Shopping.HttpAggregator/Properties/launchSettings.json b/src/Aggregators/Web.Shopping.HttpAggregator/Properties/launchSettings.json new file mode 100644 index 000000000..925e70b0d --- /dev/null +++ b/src/Aggregators/Web.Shopping.HttpAggregator/Properties/launchSettings.json @@ -0,0 +1,29 @@ +{ + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:57425/", + "sslPort": 0 + } + }, + "profiles": { + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "launchUrl": "api/values", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "PurchaseForMvc": { + "commandName": "Project", + "launchBrowser": true, + "launchUrl": "api/values", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "applicationUrl": "http://localhost:61632/" + } + } +} \ No newline at end of file diff --git a/src/Aggregators/Web.Shopping.HttpAggregator/Services/BasketService.cs b/src/Aggregators/Web.Shopping.HttpAggregator/Services/BasketService.cs new file mode 100644 index 000000000..5ca89a408 --- /dev/null +++ b/src/Aggregators/Web.Shopping.HttpAggregator/Services/BasketService.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Authentication; +using Microsoft.AspNetCore.Http; +using Microsoft.eShopOnContainers.BuildingBlocks.Resilience.Http; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Newtonsoft.Json; +using Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Config; +using Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Models; + +namespace Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Services +{ + public class BasketService : IBasketService + { + + private readonly IHttpClient _apiClient; + private readonly ILogger _logger; + private readonly UrlsConfig _urls; + private readonly IHttpContextAccessor _httpContextAccessor; + + public BasketService(IHttpClient httpClient, IHttpContextAccessor httpContextAccessor, ILogger logger, IOptionsSnapshot config) + { + _apiClient = httpClient; + _logger = logger; + _urls = config.Value; + _httpContextAccessor = httpContextAccessor; + } + + public async Task GetById(string id) + { + var token = await GetUserTokenAsync(); + var data = await _apiClient.GetStringAsync(_urls.Basket + UrlsConfig.BasketOperations.GetItemById(id), token); + var basket = !string.IsNullOrEmpty(data) ? JsonConvert.DeserializeObject(data) : null; + return basket; + } + + public async Task Update(BasketData currentBasket) + { + var token = await GetUserTokenAsync(); + var data = await _apiClient.PostAsync(_urls.Basket + UrlsConfig.BasketOperations.UpdateBasket(), currentBasket, token); + int i = 0; + } + + async Task GetUserTokenAsync() + { + var context = _httpContextAccessor.HttpContext; + return await context.GetTokenAsync("access_token"); + } + } +} diff --git a/src/Aggregators/Web.Shopping.HttpAggregator/Services/CatalogService.cs b/src/Aggregators/Web.Shopping.HttpAggregator/Services/CatalogService.cs new file mode 100644 index 000000000..46d895f68 --- /dev/null +++ b/src/Aggregators/Web.Shopping.HttpAggregator/Services/CatalogService.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.eShopOnContainers.BuildingBlocks.Resilience.Http; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Newtonsoft.Json; +using Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Config; +using Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Models; + +namespace Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Services +{ + public class CatalogService : ICatalogService + { + + private readonly IHttpClient _apiClient; + private readonly ILogger _logger; + private readonly UrlsConfig _urls; + + public CatalogService(IHttpClient httpClient, ILogger logger, IOptionsSnapshot config) + { + _apiClient = httpClient; + _logger = logger; + _urls = config.Value; + } + + public async Task GetCatalogItem(int id) + { + var data = await _apiClient.GetStringAsync(_urls.Catalog + UrlsConfig.CatalogOperations.GetItemById(id)); + var item = JsonConvert.DeserializeObject(data); + return item; + } + + public async Task> GetCatalogItems(IEnumerable ids) + { + var data = await _apiClient.GetStringAsync(_urls.Catalog + UrlsConfig.CatalogOperations.GetItemsById(ids)); + var item = JsonConvert.DeserializeObject(data); + return item; + + } + } +} diff --git a/src/Aggregators/Web.Shopping.HttpAggregator/Services/IBasketService.cs b/src/Aggregators/Web.Shopping.HttpAggregator/Services/IBasketService.cs new file mode 100644 index 000000000..f59c31965 --- /dev/null +++ b/src/Aggregators/Web.Shopping.HttpAggregator/Services/IBasketService.cs @@ -0,0 +1,15 @@ +using Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Services +{ + public interface IBasketService + { + Task GetById(string id); + Task Update(BasketData currentBasket); + + } +} diff --git a/src/Aggregators/Web.Shopping.HttpAggregator/Services/ICatalogService.cs b/src/Aggregators/Web.Shopping.HttpAggregator/Services/ICatalogService.cs new file mode 100644 index 000000000..7d192f3cc --- /dev/null +++ b/src/Aggregators/Web.Shopping.HttpAggregator/Services/ICatalogService.cs @@ -0,0 +1,14 @@ +using Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Services +{ + public interface ICatalogService + { + Task GetCatalogItem(int id); + Task> GetCatalogItems(IEnumerable ids); + } +} diff --git a/src/Aggregators/Web.Shopping.HttpAggregator/Services/IOrderApiClient.cs b/src/Aggregators/Web.Shopping.HttpAggregator/Services/IOrderApiClient.cs new file mode 100644 index 000000000..c97eccbbd --- /dev/null +++ b/src/Aggregators/Web.Shopping.HttpAggregator/Services/IOrderApiClient.cs @@ -0,0 +1,13 @@ +using Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Services +{ + public interface IOrderApiClient + { + Task GetOrderDraftFromBasket(BasketData basket); + } +} diff --git a/src/Aggregators/Web.Shopping.HttpAggregator/Services/OrderApiClient.cs b/src/Aggregators/Web.Shopping.HttpAggregator/Services/OrderApiClient.cs new file mode 100644 index 000000000..220e9afa9 --- /dev/null +++ b/src/Aggregators/Web.Shopping.HttpAggregator/Services/OrderApiClient.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.eShopOnContainers.BuildingBlocks.Resilience.Http; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Newtonsoft.Json; +using Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Config; +using Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Models; + +namespace Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Services +{ + public class OrderApiClient : IOrderApiClient + { + + private readonly IHttpClient _apiClient; + private readonly ILogger _logger; + private readonly UrlsConfig _urls; + + public OrderApiClient(IHttpClient httpClient, ILogger logger, IOptionsSnapshot config) + { + _apiClient = httpClient; + _logger = logger; + _urls = config.Value; + } + + public async Task GetOrderDraftFromBasket(BasketData basket) + { + var url = _urls.Orders + UrlsConfig.OrdersOperations.GetOrderDraft(); + var response = await _apiClient.PostAsync(url, basket); + response.EnsureSuccessStatusCode(); + var jsonResponse = await response.Content.ReadAsStringAsync(); + return JsonConvert.DeserializeObject(jsonResponse); + } + } +} diff --git a/src/Aggregators/Web.Shopping.HttpAggregator/Startup.cs b/src/Aggregators/Web.Shopping.HttpAggregator/Startup.cs new file mode 100644 index 000000000..79b9bc77b --- /dev/null +++ b/src/Aggregators/Web.Shopping.HttpAggregator/Startup.cs @@ -0,0 +1,138 @@ +using System; +using System.Collections.Generic; +using System.IdentityModel.Tokens.Jwt; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Authentication.JwtBearer; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Http; +using Microsoft.eShopOnContainers.BuildingBlocks.Resilience.Http; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Config; +using Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Filters.Basket.API.Infrastructure.Filters; +using Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator.Services; +using Swashbuckle.AspNetCore.Swagger; + +namespace Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator +{ + public class Startup + { + public Startup(IConfiguration configuration) + { + Configuration = configuration; + } + + public IConfiguration Configuration { get; } + + // This method gets called by the runtime. Use this method to add services to the container. + public void ConfigureServices(IServiceCollection services) + { + services.AddSingleton(); + services.AddSingleton(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + + services.AddOptions(); + services.Configure(Configuration.GetSection("urls")); + + services.AddMvc(); + + services.AddSwaggerGen(options => + { + options.DescribeAllEnumsAsStrings(); + options.SwaggerDoc("v1", new Swashbuckle.AspNetCore.Swagger.Info + { + Title = "Purchase BFF API Gateway", + Version = "v1", + Description = "BFF API Gateway for Purchase features", + TermsOfService = "Terms Of Service" + }); + + options.AddSecurityDefinition("oauth2", new OAuth2Scheme + { + Type = "oauth2", + Flow = "implicit", + AuthorizationUrl = $"{Configuration.GetValue("IdentityUrlExternal")}/connect/authorize", + TokenUrl = $"{Configuration.GetValue("IdentityUrlExternal")}/connect/token", + Scopes = new Dictionary() + { + { "webshoppingagg", "Purchase BFF API Gateway" } + } + }); + + options.OperationFilter(); + }); + + services.AddCors(options => + { + options.AddPolicy("CorsPolicy", + builder => builder.AllowAnyOrigin() + .AllowAnyMethod() + .AllowAnyHeader() + .AllowCredentials()); + }); + + + JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear(); + var identityUrl = Configuration.GetValue("urls:identity"); + services.AddAuthentication(options => + { + options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; + options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; + + }).AddJwtBearer(options => + { + options.Authority = identityUrl; + options.RequireHttpsMetadata = false; + options.Audience = "webshoppingagg"; + options.Events = new JwtBearerEvents() + { + OnAuthenticationFailed = async ctx => + { + int i = 0; + }, + OnTokenValidated = async ctx => + { + int i = 0; + } + }; + }); + } + + // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. + public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) + { + + var pathBase = Configuration["PATH_BASE"]; + if (!string.IsNullOrEmpty(pathBase)) + { + loggerFactory.CreateLogger("init").LogDebug($"Using PATH BASE '{pathBase}'"); + app.UsePathBase(pathBase); + } + + app.UseCors("CorsPolicy"); + + if (env.IsDevelopment()) + { + app.UseDeveloperExceptionPage(); + } + + app.UseAuthentication(); + + app.UseMvc(); + + app.UseSwagger().UseSwaggerUI(c => + { + c.SwaggerEndpoint($"{ (!string.IsNullOrEmpty(pathBase) ? pathBase : string.Empty) }/swagger/v1/swagger.json", "Purchase BFF V1"); + c.ConfigureOAuth2("Microsoft.eShopOnContainers.Web.Shopping.HttpAggregatorwaggerui", "", "", "Purchase BFF Swagger UI"); + }); + + + } + } +} diff --git a/src/Aggregators/Web.Shopping.HttpAggregator/Web.Shopping.HttpAggregator.csproj b/src/Aggregators/Web.Shopping.HttpAggregator/Web.Shopping.HttpAggregator.csproj new file mode 100644 index 000000000..fd04c8bee --- /dev/null +++ b/src/Aggregators/Web.Shopping.HttpAggregator/Web.Shopping.HttpAggregator.csproj @@ -0,0 +1,27 @@ + + + + netcoreapp2.0 + Web.Shopping.HttpAggregator + Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator + ..\..\..\docker-compose.dcproj + + + + + + + + + + + + + + + + + + + + diff --git a/src/Aggregators/Web.Shopping.HttpAggregator/appsettings.json b/src/Aggregators/Web.Shopping.HttpAggregator/appsettings.json new file mode 100644 index 000000000..26bb0ac7a --- /dev/null +++ b/src/Aggregators/Web.Shopping.HttpAggregator/appsettings.json @@ -0,0 +1,15 @@ +{ + "Logging": { + "IncludeScopes": false, + "Debug": { + "LogLevel": { + "Default": "Warning" + } + }, + "Console": { + "LogLevel": { + "Default": "Warning" + } + } + } +} diff --git a/src/Aggregators/Web.Shopping.HttpAggregator/appsettings.localhost.json b/src/Aggregators/Web.Shopping.HttpAggregator/appsettings.localhost.json new file mode 100644 index 000000000..57b5e894d --- /dev/null +++ b/src/Aggregators/Web.Shopping.HttpAggregator/appsettings.localhost.json @@ -0,0 +1,8 @@ +{ + "urls": { + "basket": "http://localhost:55105", + "catalog": "http://localhost:55101", + "orders": "http://localhost:55102", + "identity": "http://localhost:55105" + } +} diff --git a/src/Apigw/OcelotApiGw/Startup.cs b/src/Apigw/OcelotApiGw/Startup.cs index f0a41c172..254849d89 100644 --- a/src/Apigw/OcelotApiGw/Startup.cs +++ b/src/Apigw/OcelotApiGw/Startup.cs @@ -45,7 +45,7 @@ namespace OcelotApiGw x.RequireHttpsMetadata = false; x.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters() { - ValidAudiences = new[] { "orders", "basket", "locations", "marketing", "mobileshoppingagg" } + ValidAudiences = new[] { "orders", "basket", "locations", "marketing", "mobileshoppingagg", "webshoppingagg" } }; x.Events = new Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerEvents() { diff --git a/src/Apigw/configs/webshoppingapigw/configuration.json b/src/Apigw/configs/webshoppingapigw/configuration.json index 801eac5d9..63aeb7752 100644 --- a/src/Apigw/configs/webshoppingapigw/configuration.json +++ b/src/Apigw/configs/webshoppingapigw/configuration.json @@ -49,7 +49,7 @@ "DownstreamScheme": "http", "DownstreamHostAndPorts": [ { - "Host": "mobileshoppingagg", + "Host": "webshoppingagg", "Port": 80 } ], diff --git a/src/Services/Identity/Identity.API/Configuration/Config.cs b/src/Services/Identity/Identity.API/Configuration/Config.cs index 18e313bf8..6aed6120d 100644 --- a/src/Services/Identity/Identity.API/Configuration/Config.cs +++ b/src/Services/Identity/Identity.API/Configuration/Config.cs @@ -15,7 +15,8 @@ namespace Microsoft.eShopOnContainers.Services.Identity.API.Configuration new ApiResource("basket", "Basket Service"), new ApiResource("marketing", "Marketing Service"), new ApiResource("locations", "Locations Service"), - new ApiResource("mobileshoppingagg", "Mobile Shopping Aggregator") + new ApiResource("mobileshoppingagg", "Mobile Shopping Aggregator"), + new ApiResource("Webshoppingagg", "Web Shopping Aggregator") }; } @@ -54,7 +55,7 @@ namespace Microsoft.eShopOnContainers.Services.Identity.API.Configuration "basket", "locations", "marketing", - "mobileshoppingagg" + "webshoppingagg" } }, new Client @@ -118,7 +119,7 @@ namespace Microsoft.eShopOnContainers.Services.Identity.API.Configuration "basket", "locations", "marketing", - "mobileshoppingagg" + "webshoppingagg" }, }, new Client @@ -151,7 +152,7 @@ namespace Microsoft.eShopOnContainers.Services.Identity.API.Configuration "basket", "locations", "marketing", - "mobileshoppingagg" + "webshoppingagg" }, }, new Client @@ -228,6 +229,21 @@ namespace Microsoft.eShopOnContainers.Services.Identity.API.Configuration { "mobileshoppingagg" } + }, + new Client + { + ClientId = "webshoppingaggswaggerui", + ClientName = "Web Shopping Aggregattor Swagger UI", + AllowedGrantTypes = GrantTypes.Implicit, + AllowAccessTokensViaBrowser = true, + + RedirectUris = { $"{clientsUrl["WebShoppingAgg"]}/swagger/o2c.html" }, + PostLogoutRedirectUris = { $"{clientsUrl["WebShoppingAgg"]}/swagger/" }, + + AllowedScopes = + { + "webshoppingagg" + } } }; diff --git a/src/Services/Identity/Identity.API/Data/ConfigurationDbContextSeed.cs b/src/Services/Identity/Identity.API/Data/ConfigurationDbContextSeed.cs index 4757d4743..a5a4383bd 100644 --- a/src/Services/Identity/Identity.API/Data/ConfigurationDbContextSeed.cs +++ b/src/Services/Identity/Identity.API/Data/ConfigurationDbContextSeed.cs @@ -24,6 +24,7 @@ namespace Microsoft.eShopOnContainers.Services.Identity.API.Data clientUrls.Add("BasketApi", configuration.GetValue("BasketApiClient")); clientUrls.Add("OrderingApi", configuration.GetValue("OrderingApiClient")); clientUrls.Add("MobileShoppingAgg", configuration.GetValue("MobileShoppingAggClient")); + clientUrls.Add("WebShoppingAgg", configuration.GetValue("WebShoppingAggClient")); if (!context.Clients.Any()) { diff --git a/src/Web/WebMVC/Startup.cs b/src/Web/WebMVC/Startup.cs index 21986b5df..385a007c3 100644 --- a/src/Web/WebMVC/Startup.cs +++ b/src/Web/WebMVC/Startup.cs @@ -131,6 +131,7 @@ namespace Microsoft.eShopOnContainers.WebMVC options.Scope.Add("marketing"); options.Scope.Add("locations"); options.Scope.Add("mobileshoppingagg"); + options.Scope.Add("webshoppingagg"); }); } From 152fcc820576889b76e1a39be14bf4fe328cacc4 Mon Sep 17 00:00:00 2001 From: eiximenis Date: Tue, 27 Feb 2018 17:29:37 +0100 Subject: [PATCH 26/78] Fixed errors and updated config --- docker-compose.yml | 2 +- src/Aggregators/Mobile.Shopping.HttpAggregator/Startup.cs | 6 +++--- src/Aggregators/Web.Shopping.HttpAggregator/Startup.cs | 6 +++--- src/Services/Identity/Identity.API/Configuration/Config.cs | 2 +- src/Web/WebMVC/Startup.cs | 1 - .../Client/modules/shared/services/security.service.ts | 2 +- 6 files changed, 9 insertions(+), 10 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index ae7a7faa0..18372f23e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -142,5 +142,5 @@ services: image: eshop/webshoppingagg build: context: . - dockerfile: src/Aggregators/Mobile.Shopping.HttpAggregator/Dockerfile + dockerfile: src/Aggregators/Web.Shopping.HttpAggregator/Dockerfile diff --git a/src/Aggregators/Mobile.Shopping.HttpAggregator/Startup.cs b/src/Aggregators/Mobile.Shopping.HttpAggregator/Startup.cs index 083839bd5..73b736519 100644 --- a/src/Aggregators/Mobile.Shopping.HttpAggregator/Startup.cs +++ b/src/Aggregators/Mobile.Shopping.HttpAggregator/Startup.cs @@ -47,9 +47,9 @@ namespace Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator options.DescribeAllEnumsAsStrings(); options.SwaggerDoc("v1", new Swashbuckle.AspNetCore.Swagger.Info { - Title = "Purchase BFF API Gateway", + Title = "Shopping Aggregator for Mobile Clients", Version = "v1", - Description = "BFF API Gateway for Purchase features", + Description = "Shopping Aggregator for Mobile Clients", TermsOfService = "Terms Of Service" }); @@ -61,7 +61,7 @@ namespace Microsoft.eShopOnContainers.Mobile.Shopping.HttpAggregator TokenUrl = $"{Configuration.GetValue("IdentityUrlExternal")}/connect/token", Scopes = new Dictionary() { - { "mobileshoppingagg", "Purchase BFF API Gateway" } + { "mobileshoppingagg", "Shopping Aggregator for Mobile Clients" } } }); diff --git a/src/Aggregators/Web.Shopping.HttpAggregator/Startup.cs b/src/Aggregators/Web.Shopping.HttpAggregator/Startup.cs index 79b9bc77b..17f9f90e6 100644 --- a/src/Aggregators/Web.Shopping.HttpAggregator/Startup.cs +++ b/src/Aggregators/Web.Shopping.HttpAggregator/Startup.cs @@ -47,9 +47,9 @@ namespace Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator options.DescribeAllEnumsAsStrings(); options.SwaggerDoc("v1", new Swashbuckle.AspNetCore.Swagger.Info { - Title = "Purchase BFF API Gateway", + Title = "Shopping Aggregator for Web Clients", Version = "v1", - Description = "BFF API Gateway for Purchase features", + Description = "Shopping Aggregator for Web Clients", TermsOfService = "Terms Of Service" }); @@ -61,7 +61,7 @@ namespace Microsoft.eShopOnContainers.Web.Shopping.HttpAggregator TokenUrl = $"{Configuration.GetValue("IdentityUrlExternal")}/connect/token", Scopes = new Dictionary() { - { "webshoppingagg", "Purchase BFF API Gateway" } + { "webshoppingagg", "Shopping Aggregator for Web Clients" } } }); diff --git a/src/Services/Identity/Identity.API/Configuration/Config.cs b/src/Services/Identity/Identity.API/Configuration/Config.cs index 6aed6120d..3bc705995 100644 --- a/src/Services/Identity/Identity.API/Configuration/Config.cs +++ b/src/Services/Identity/Identity.API/Configuration/Config.cs @@ -16,7 +16,7 @@ namespace Microsoft.eShopOnContainers.Services.Identity.API.Configuration new ApiResource("marketing", "Marketing Service"), new ApiResource("locations", "Locations Service"), new ApiResource("mobileshoppingagg", "Mobile Shopping Aggregator"), - new ApiResource("Webshoppingagg", "Web Shopping Aggregator") + new ApiResource("webshoppingagg", "Web Shopping Aggregator") }; } diff --git a/src/Web/WebMVC/Startup.cs b/src/Web/WebMVC/Startup.cs index 385a007c3..b1dd6580a 100644 --- a/src/Web/WebMVC/Startup.cs +++ b/src/Web/WebMVC/Startup.cs @@ -130,7 +130,6 @@ namespace Microsoft.eShopOnContainers.WebMVC options.Scope.Add("basket"); options.Scope.Add("marketing"); options.Scope.Add("locations"); - options.Scope.Add("mobileshoppingagg"); options.Scope.Add("webshoppingagg"); }); } diff --git a/src/Web/WebSPA/Client/modules/shared/services/security.service.ts b/src/Web/WebSPA/Client/modules/shared/services/security.service.ts index c2ac8e5e2..45007b5d1 100644 --- a/src/Web/WebSPA/Client/modules/shared/services/security.service.ts +++ b/src/Web/WebSPA/Client/modules/shared/services/security.service.ts @@ -82,7 +82,7 @@ export class SecurityService { let client_id = 'js'; let redirect_uri = location.origin + '/'; let response_type = 'id_token token'; - let scope = 'openid profile orders basket marketing locations mobileshoppingagg'; + let scope = 'openid profile orders basket marketing locations webshoppingagg'; let nonce = 'N' + Math.random() + '' + Date.now(); let state = Date.now() + '' + Math.random(); From de37559c4186a9fac590ca74b7626972f90b1c41 Mon Sep 17 00:00:00 2001 From: eiximenis Date: Wed, 28 Feb 2018 11:30:25 +0100 Subject: [PATCH 27/78] Files moved / names changes / csprojs updated / sln updated --- docker-compose.override.yml | 52 +-- docker-compose.yml | 40 +-- eShopOnContainers-ServicesAndWebApps.sln | 332 ++++++++++-------- .../ApiGw-Base}/Dockerfile | 7 +- .../ApiGw-Base}/Dockerfile2 | 7 +- .../ApiGw-Base}/Dockerfile3 | 7 +- .../ApiGw-Base}/Dockerfile4 | 7 +- .../ApiGw-Base}/OcelotApiGw.csproj | 0 .../ApiGw-Base}/Program.cs | 0 .../Properties/launchSettings.json | 0 .../ApiGw-Base}/Startup.cs | 0 .../ApiGw-Base}/appsettings.json | 0 .../apigw}/configuration.json | 0 .../aggregator}/Config/UrlsConfig.cs | 0 .../Controllers/BasketController.cs | 0 .../aggregator}/Controllers/HomeController.cs | 0 .../Controllers/OrderController.cs | 0 .../aggregator}/Dockerfile | 3 +- .../Filters/AuthorizeCheckOperationFilter.cs | 0 .../Mobile.Shopping.HttpAggregator.csproj | 2 +- .../Models/AddBasketItemRequest.cs | 0 .../aggregator}/Models/BasketData.cs | 0 .../aggregator}/Models/CatalogItem.cs | 0 .../aggregator}/Models/OrderData.cs | 0 .../aggregator}/Models/OrderItemData.cs | 0 .../Models/UpdateBasketItemsRequest.cs | 0 .../aggregator}/Models/UpdateBasketRequest.cs | 0 .../aggregator}/Program.cs | 0 .../Properties/launchSettings.json | 0 .../aggregator}/Services/BasketService.cs | 0 .../aggregator}/Services/CatalogService.cs | 0 .../aggregator}/Services/IBasketService.cs | 0 .../aggregator}/Services/ICatalogService.cs | 0 .../aggregator}/Services/IOrderApiClient.cs | 0 .../aggregator}/Services/OrderApiClient.cs | 0 .../aggregator}/Startup.cs | 0 .../aggregator}/appsettings.json | 0 .../aggregator}/appsettings.localhost.json | 0 .../apigw}/configuration.json | 0 .../apigw}/configuration.json | 0 .../aggregator}/Config/UrlsConfig.cs | 0 .../Controllers/BasketController.cs | 0 .../aggregator}/Controllers/HomeController.cs | 0 .../Controllers/OrderController.cs | 0 .../Web.Bff.Shopping/aggregator}/Dockerfile | 2 +- .../Filters/AuthorizeCheckOperationFilter.cs | 0 .../Models/AddBasketItemRequest.cs | 0 .../aggregator}/Models/BasketData.cs | 0 .../aggregator}/Models/CatalogItem.cs | 0 .../aggregator}/Models/OrderData.cs | 0 .../aggregator}/Models/OrderItemData.cs | 0 .../Models/UpdateBasketItemsRequest.cs | 0 .../aggregator}/Models/UpdateBasketRequest.cs | 0 .../Web.Bff.Shopping/aggregator}/Program.cs | 0 .../Properties/launchSettings.json | 0 .../aggregator}/Services/BasketService.cs | 0 .../aggregator}/Services/CatalogService.cs | 0 .../aggregator}/Services/IBasketService.cs | 0 .../aggregator}/Services/ICatalogService.cs | 0 .../aggregator}/Services/IOrderApiClient.cs | 0 .../aggregator}/Services/OrderApiClient.cs | 0 .../Web.Bff.Shopping/aggregator}/Startup.cs | 0 .../Web.Shopping.HttpAggregator.csproj | 2 +- .../aggregator}/appsettings.json | 0 .../aggregator}/appsettings.localhost.json | 0 .../apigw}/configuration.json | 0 66 files changed, 245 insertions(+), 216 deletions(-) rename src/{Apigw/OcelotApiGw => ApiGateways/ApiGw-Base}/Dockerfile (60%) rename src/{Apigw/OcelotApiGw => ApiGateways/ApiGw-Base}/Dockerfile2 (60%) rename src/{Apigw/OcelotApiGw => ApiGateways/ApiGw-Base}/Dockerfile3 (61%) rename src/{Apigw/OcelotApiGw => ApiGateways/ApiGw-Base}/Dockerfile4 (61%) rename src/{Apigw/OcelotApiGw => ApiGateways/ApiGw-Base}/OcelotApiGw.csproj (100%) rename src/{Apigw/OcelotApiGw => ApiGateways/ApiGw-Base}/Program.cs (100%) rename src/{Apigw/OcelotApiGw => ApiGateways/ApiGw-Base}/Properties/launchSettings.json (100%) rename src/{Apigw/OcelotApiGw => ApiGateways/ApiGw-Base}/Startup.cs (100%) rename src/{Apigw/OcelotApiGw => ApiGateways/ApiGw-Base}/appsettings.json (100%) rename src/{Apigw/configs/mobilemarketingapigw => ApiGateways/Mobile.Bff.Marketing/apigw}/configuration.json (100%) rename src/{Aggregators/Mobile.Shopping.HttpAggregator => ApiGateways/Mobile.Bff.Shopping/aggregator}/Config/UrlsConfig.cs (100%) rename src/{Aggregators/Mobile.Shopping.HttpAggregator => ApiGateways/Mobile.Bff.Shopping/aggregator}/Controllers/BasketController.cs (100%) rename src/{Aggregators/Mobile.Shopping.HttpAggregator => ApiGateways/Mobile.Bff.Shopping/aggregator}/Controllers/HomeController.cs (100%) rename src/{Aggregators/Mobile.Shopping.HttpAggregator => ApiGateways/Mobile.Bff.Shopping/aggregator}/Controllers/OrderController.cs (100%) rename src/{Aggregators/Mobile.Shopping.HttpAggregator => ApiGateways/Mobile.Bff.Shopping/aggregator}/Dockerfile (87%) rename src/{Aggregators/Mobile.Shopping.HttpAggregator => ApiGateways/Mobile.Bff.Shopping/aggregator}/Filters/AuthorizeCheckOperationFilter.cs (100%) rename src/{Aggregators/Mobile.Shopping.HttpAggregator => ApiGateways/Mobile.Bff.Shopping/aggregator}/Mobile.Shopping.HttpAggregator.csproj (87%) rename src/{Aggregators/Mobile.Shopping.HttpAggregator => ApiGateways/Mobile.Bff.Shopping/aggregator}/Models/AddBasketItemRequest.cs (100%) rename src/{Aggregators/Mobile.Shopping.HttpAggregator => ApiGateways/Mobile.Bff.Shopping/aggregator}/Models/BasketData.cs (100%) rename src/{Aggregators/Mobile.Shopping.HttpAggregator => ApiGateways/Mobile.Bff.Shopping/aggregator}/Models/CatalogItem.cs (100%) rename src/{Aggregators/Mobile.Shopping.HttpAggregator => ApiGateways/Mobile.Bff.Shopping/aggregator}/Models/OrderData.cs (100%) rename src/{Aggregators/Mobile.Shopping.HttpAggregator => ApiGateways/Mobile.Bff.Shopping/aggregator}/Models/OrderItemData.cs (100%) rename src/{Aggregators/Mobile.Shopping.HttpAggregator => ApiGateways/Mobile.Bff.Shopping/aggregator}/Models/UpdateBasketItemsRequest.cs (100%) rename src/{Aggregators/Mobile.Shopping.HttpAggregator => ApiGateways/Mobile.Bff.Shopping/aggregator}/Models/UpdateBasketRequest.cs (100%) rename src/{Aggregators/Mobile.Shopping.HttpAggregator => ApiGateways/Mobile.Bff.Shopping/aggregator}/Program.cs (100%) rename src/{Aggregators/Mobile.Shopping.HttpAggregator => ApiGateways/Mobile.Bff.Shopping/aggregator}/Properties/launchSettings.json (100%) rename src/{Aggregators/Mobile.Shopping.HttpAggregator => ApiGateways/Mobile.Bff.Shopping/aggregator}/Services/BasketService.cs (100%) rename src/{Aggregators/Mobile.Shopping.HttpAggregator => ApiGateways/Mobile.Bff.Shopping/aggregator}/Services/CatalogService.cs (100%) rename src/{Aggregators/Mobile.Shopping.HttpAggregator => ApiGateways/Mobile.Bff.Shopping/aggregator}/Services/IBasketService.cs (100%) rename src/{Aggregators/Mobile.Shopping.HttpAggregator => ApiGateways/Mobile.Bff.Shopping/aggregator}/Services/ICatalogService.cs (100%) rename src/{Aggregators/Mobile.Shopping.HttpAggregator => ApiGateways/Mobile.Bff.Shopping/aggregator}/Services/IOrderApiClient.cs (100%) rename src/{Aggregators/Mobile.Shopping.HttpAggregator => ApiGateways/Mobile.Bff.Shopping/aggregator}/Services/OrderApiClient.cs (100%) rename src/{Aggregators/Mobile.Shopping.HttpAggregator => ApiGateways/Mobile.Bff.Shopping/aggregator}/Startup.cs (100%) rename src/{Aggregators/Mobile.Shopping.HttpAggregator => ApiGateways/Mobile.Bff.Shopping/aggregator}/appsettings.json (100%) rename src/{Aggregators/Mobile.Shopping.HttpAggregator => ApiGateways/Mobile.Bff.Shopping/aggregator}/appsettings.localhost.json (100%) rename src/{Apigw/configs/mobileshoppingapigw => ApiGateways/Mobile.Bff.Shopping/apigw}/configuration.json (100%) rename src/{Apigw/configs/webmarketingapigw => ApiGateways/Web.Bff.Marketing/apigw}/configuration.json (100%) rename src/{Aggregators/Web.Shopping.HttpAggregator => ApiGateways/Web.Bff.Shopping/aggregator}/Config/UrlsConfig.cs (100%) rename src/{Aggregators/Web.Shopping.HttpAggregator => ApiGateways/Web.Bff.Shopping/aggregator}/Controllers/BasketController.cs (100%) rename src/{Aggregators/Web.Shopping.HttpAggregator => ApiGateways/Web.Bff.Shopping/aggregator}/Controllers/HomeController.cs (100%) rename src/{Aggregators/Web.Shopping.HttpAggregator => ApiGateways/Web.Bff.Shopping/aggregator}/Controllers/OrderController.cs (100%) rename src/{Aggregators/Web.Shopping.HttpAggregator => ApiGateways/Web.Bff.Shopping/aggregator}/Dockerfile (87%) rename src/{Aggregators/Web.Shopping.HttpAggregator => ApiGateways/Web.Bff.Shopping/aggregator}/Filters/AuthorizeCheckOperationFilter.cs (100%) rename src/{Aggregators/Web.Shopping.HttpAggregator => ApiGateways/Web.Bff.Shopping/aggregator}/Models/AddBasketItemRequest.cs (100%) rename src/{Aggregators/Web.Shopping.HttpAggregator => ApiGateways/Web.Bff.Shopping/aggregator}/Models/BasketData.cs (100%) rename src/{Aggregators/Web.Shopping.HttpAggregator => ApiGateways/Web.Bff.Shopping/aggregator}/Models/CatalogItem.cs (100%) rename src/{Aggregators/Web.Shopping.HttpAggregator => ApiGateways/Web.Bff.Shopping/aggregator}/Models/OrderData.cs (100%) rename src/{Aggregators/Web.Shopping.HttpAggregator => ApiGateways/Web.Bff.Shopping/aggregator}/Models/OrderItemData.cs (100%) rename src/{Aggregators/Web.Shopping.HttpAggregator => ApiGateways/Web.Bff.Shopping/aggregator}/Models/UpdateBasketItemsRequest.cs (100%) rename src/{Aggregators/Web.Shopping.HttpAggregator => ApiGateways/Web.Bff.Shopping/aggregator}/Models/UpdateBasketRequest.cs (100%) rename src/{Aggregators/Web.Shopping.HttpAggregator => ApiGateways/Web.Bff.Shopping/aggregator}/Program.cs (100%) rename src/{Aggregators/Web.Shopping.HttpAggregator => ApiGateways/Web.Bff.Shopping/aggregator}/Properties/launchSettings.json (100%) rename src/{Aggregators/Web.Shopping.HttpAggregator => ApiGateways/Web.Bff.Shopping/aggregator}/Services/BasketService.cs (100%) rename src/{Aggregators/Web.Shopping.HttpAggregator => ApiGateways/Web.Bff.Shopping/aggregator}/Services/CatalogService.cs (100%) rename src/{Aggregators/Web.Shopping.HttpAggregator => ApiGateways/Web.Bff.Shopping/aggregator}/Services/IBasketService.cs (100%) rename src/{Aggregators/Web.Shopping.HttpAggregator => ApiGateways/Web.Bff.Shopping/aggregator}/Services/ICatalogService.cs (100%) rename src/{Aggregators/Web.Shopping.HttpAggregator => ApiGateways/Web.Bff.Shopping/aggregator}/Services/IOrderApiClient.cs (100%) rename src/{Aggregators/Web.Shopping.HttpAggregator => ApiGateways/Web.Bff.Shopping/aggregator}/Services/OrderApiClient.cs (100%) rename src/{Aggregators/Web.Shopping.HttpAggregator => ApiGateways/Web.Bff.Shopping/aggregator}/Startup.cs (100%) rename src/{Aggregators/Web.Shopping.HttpAggregator => ApiGateways/Web.Bff.Shopping/aggregator}/Web.Shopping.HttpAggregator.csproj (87%) rename src/{Aggregators/Web.Shopping.HttpAggregator => ApiGateways/Web.Bff.Shopping/aggregator}/appsettings.json (100%) rename src/{Aggregators/Web.Shopping.HttpAggregator => ApiGateways/Web.Bff.Shopping/aggregator}/appsettings.localhost.json (100%) rename src/{Apigw/configs/webshoppingapigw => ApiGateways/Web.Bff.Shopping/apigw}/configuration.json (100%) diff --git a/docker-compose.override.yml b/docker-compose.override.yml index 51284360a..dc01317a8 100644 --- a/docker-compose.override.yml +++ b/docker-compose.override.yml @@ -219,23 +219,23 @@ services: - "15672:15672" - "5672:5672" -# mobileshoppingapigw: -# environment: -# - ASPNETCORE_ENVIRONMENT=Development -# - IdentityUrl=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110. -# ports: -# - "5200:80" -# volumes: -# - ./src/Apigw/configs/mobileshoppingapigw:/app/configuration -# -# mobilemarketingapigw: -# environment: -# - ASPNETCORE_ENVIRONMENT=Development -# - IdentityUrl=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110. -# ports: -# - "5201:80" -# volumes: -# - ./src/Apigw/configs/mobilemarketingapigw:/app/configuration + mobileshoppingapigw: + environment: + - ASPNETCORE_ENVIRONMENT=Development + - IdentityUrl=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110. + ports: + - "5200:80" + volumes: + - ./src/ApiGateways/Mobile.Bff.Shopping/apigw:/app/configuration + + mobilemarketingapigw: + environment: + - ASPNETCORE_ENVIRONMENT=Development + - IdentityUrl=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110. + ports: + - "5201:80" + volumes: + - ./src/ApiGateways/Mobile.Bff.Marketing/apigw:/app/configuration webshoppingapigw: environment: @@ -244,16 +244,16 @@ services: ports: - "5202:80" volumes: - - ./src/Apigw/configs/webshoppingapigw:/app/configuration + - ./src/ApiGateways/Web.Bff.Shopping/apigw:/app/configuration -# webmarketingapigw: -# environment: -# - ASPNETCORE_ENVIRONMENT=Development -# - IdentityUrl=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110. -# ports: -# - "5203:80" -# volumes: -# - ./src/Apigw/configs/webmarketingapigw:/app/configuration + webmarketingapigw: + environment: + - ASPNETCORE_ENVIRONMENT=Development + - IdentityUrl=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110. + ports: + - "5203:80" + volumes: + - ./src/ApiGateways/Web.Bff.Marketing/apigw:/app/configuration mobileshoppingagg: environment: diff --git a/docker-compose.yml b/docker-compose.yml index 18372f23e..f1bd68076 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -108,39 +108,39 @@ services: rabbitmq: image: rabbitmq:3-management-alpine -# mobileshoppingapigw: -# image: eshop/ocelotapigw-ms -# build: -# context: . -# dockerfile: src/Apigw/OcelotApiGw/Dockerfile -# -# mobilemarketingapigw: -# image: eshop/ocelotapigw-mm -# build: -# context: . -# dockerfile: src/Apigw/OcelotApiGw/Dockerfile2 -# + mobileshoppingapigw: + image: eshop/ocelotapigw-ms + build: + context: . + dockerfile: src/ApiGateways/ApiGw-Base/Dockerfile + + mobilemarketingapigw: + image: eshop/ocelotapigw-mm + build: + context: . + dockerfile: src/ApiGateways/ApiGw-Base/Dockerfile2 + webshoppingapigw: image: eshop/ocelotapigw-ws build: context: . - dockerfile: src/Apigw/OcelotApiGw/Dockerfile3 + dockerfile: src/ApiGateways/ApiGw-Base/Dockerfile3 -# webmarketingapigw: -# image: eshop/ocelotapigw-wm -# build: -# context: . -# dockerfile: src/Apigw/OcelotApiGw/Dockerfile4 + webmarketingapigw: + image: eshop/ocelotapigw-wm + build: + context: . + dockerfile: src/ApiGateways/ApiGw-Base/Dockerfile mobileshoppingagg: image: eshop/mobileshoppingagg build: context: . - dockerfile: src/Aggregators/Mobile.Shopping.HttpAggregator/Dockerfile + dockerfile: src/ApiGateways/Mobile.Bff.Shopping/aggregator/Dockerfile webshoppingagg: image: eshop/webshoppingagg build: context: . - dockerfile: src/Aggregators/Web.Shopping.HttpAggregator/Dockerfile + dockerfile: src/ApiGateways/Web.Bff.Shopping/aggregator/Dockerfile diff --git a/eShopOnContainers-ServicesAndWebApps.sln b/eShopOnContainers-ServicesAndWebApps.sln index 2be8cf090..c1fe125a5 100644 --- a/eShopOnContainers-ServicesAndWebApps.sln +++ b/eShopOnContainers-ServicesAndWebApps.sln @@ -97,15 +97,35 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WebHost", "WebHost", "{1815 EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WebHost.Customization", "src\BuildingBlocks\WebHostCustomization\WebHost.Customization\WebHost.Customization.csproj", "{15F4B3AA-89B6-4A0D-9051-414305974781}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ApiGw", "ApiGw", "{7A58AA20-67F3-48F3-88C8-24EBFE621792}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ApiGateways", "ApiGateways", "{77849D35-37D4-4802-81DC-9477B2775A40}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OcelotApiGw", "src\Apigw\OcelotApiGw\OcelotApiGw.csproj", "{E0C5162E-DF26-4341-9E51-14AE800D7505}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ApiGw-Base", "ApiGw-Base", "{EC91ADE9-3D66-4AB2-9FB4-2B585E1F3531}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Aggregators", "Aggregators", "{EA378316-9D49-4A6B-858E-D4A25F948A74}" +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Mobile.Bff.Marketing", "Mobile.Bff.Marketing", "{DB813A36-11BA-41FE-B258-CA9A7152247B}" + ProjectSection(SolutionItems) = preProject + src\ApiGateways\Mobile.Bff.Marketing\apigw\configuration.json = src\ApiGateways\Mobile.Bff.Marketing\apigw\configuration.json + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Mobile.Bff.Shopping", "Mobile.Bff.Shopping", "{0189E4FB-6E2B-4F2E-9B1D-5473D23FC6DB}" + ProjectSection(SolutionItems) = preProject + src\ApiGateways\Mobile.Bff.Shopping\apigw\configuration.json = src\ApiGateways\Mobile.Bff.Shopping\apigw\configuration.json + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Web.Bff.Marketing", "Web.Bff.Marketing", "{F8F0921C-EE5D-4AED-A4D6-5BF5FAE02CB5}" + ProjectSection(SolutionItems) = preProject + src\ApiGateways\Web.Bff.Marketing\apigw\configuration.json = src\ApiGateways\Web.Bff.Marketing\apigw\configuration.json + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Web.Bff.Shopping", "Web.Bff.Shopping", "{28C0F5C8-4849-4035-80AB-45639424E73F}" + ProjectSection(SolutionItems) = preProject + src\ApiGateways\Web.Bff.Shopping\apigw\configuration.json = src\ApiGateways\Web.Bff.Shopping\apigw\configuration.json + EndProjectSection +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OcelotApiGw", "src\ApiGateways\ApiGw-Base\OcelotApiGw.csproj", "{3F79558C-485D-49E1-BD3E-E12538D3D308}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Mobile.Shopping.HttpAggregator", "src\Aggregators\Mobile.Shopping.HttpAggregator\Mobile.Shopping.HttpAggregator.csproj", "{6E99F232-1536-424F-A28C-91692C8FD325}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Mobile.Shopping.HttpAggregator", "src\ApiGateways\Mobile.Bff.Shopping\aggregator\Mobile.Shopping.HttpAggregator.csproj", "{BEA37D6D-4CF2-4AE8-9575-72388E54FBD0}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Web.Shopping.HttpAggregator", "src\Aggregators\Web.Shopping.HttpAggregator\Web.Shopping.HttpAggregator.csproj", "{714CE0A1-E8BE-4CF1-8948-C1202E1526E2}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Web.Shopping.HttpAggregator", "src\ApiGateways\Web.Bff.Shopping\aggregator\Web.Shopping.HttpAggregator.csproj", "{AF0828DB-8BDD-411A-AEEF-B780FBB8D8C1}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -1321,150 +1341,150 @@ Global {15F4B3AA-89B6-4A0D-9051-414305974781}.Release|x64.Build.0 = Release|Any CPU {15F4B3AA-89B6-4A0D-9051-414305974781}.Release|x86.ActiveCfg = Release|Any CPU {15F4B3AA-89B6-4A0D-9051-414305974781}.Release|x86.Build.0 = Release|Any CPU - {E0C5162E-DF26-4341-9E51-14AE800D7505}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU - {E0C5162E-DF26-4341-9E51-14AE800D7505}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU - {E0C5162E-DF26-4341-9E51-14AE800D7505}.Ad-Hoc|ARM.ActiveCfg = Debug|Any CPU - {E0C5162E-DF26-4341-9E51-14AE800D7505}.Ad-Hoc|ARM.Build.0 = Debug|Any CPU - {E0C5162E-DF26-4341-9E51-14AE800D7505}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU - {E0C5162E-DF26-4341-9E51-14AE800D7505}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU - {E0C5162E-DF26-4341-9E51-14AE800D7505}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {E0C5162E-DF26-4341-9E51-14AE800D7505}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU - {E0C5162E-DF26-4341-9E51-14AE800D7505}.Ad-Hoc|x64.ActiveCfg = Debug|Any CPU - {E0C5162E-DF26-4341-9E51-14AE800D7505}.Ad-Hoc|x64.Build.0 = Debug|Any CPU - {E0C5162E-DF26-4341-9E51-14AE800D7505}.Ad-Hoc|x86.ActiveCfg = Debug|Any CPU - {E0C5162E-DF26-4341-9E51-14AE800D7505}.Ad-Hoc|x86.Build.0 = Debug|Any CPU - {E0C5162E-DF26-4341-9E51-14AE800D7505}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU - {E0C5162E-DF26-4341-9E51-14AE800D7505}.AppStore|Any CPU.Build.0 = Debug|Any CPU - {E0C5162E-DF26-4341-9E51-14AE800D7505}.AppStore|ARM.ActiveCfg = Debug|Any CPU - {E0C5162E-DF26-4341-9E51-14AE800D7505}.AppStore|ARM.Build.0 = Debug|Any CPU - {E0C5162E-DF26-4341-9E51-14AE800D7505}.AppStore|iPhone.ActiveCfg = Debug|Any CPU - {E0C5162E-DF26-4341-9E51-14AE800D7505}.AppStore|iPhone.Build.0 = Debug|Any CPU - {E0C5162E-DF26-4341-9E51-14AE800D7505}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {E0C5162E-DF26-4341-9E51-14AE800D7505}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU - {E0C5162E-DF26-4341-9E51-14AE800D7505}.AppStore|x64.ActiveCfg = Debug|Any CPU - {E0C5162E-DF26-4341-9E51-14AE800D7505}.AppStore|x64.Build.0 = Debug|Any CPU - {E0C5162E-DF26-4341-9E51-14AE800D7505}.AppStore|x86.ActiveCfg = Debug|Any CPU - {E0C5162E-DF26-4341-9E51-14AE800D7505}.AppStore|x86.Build.0 = Debug|Any CPU - {E0C5162E-DF26-4341-9E51-14AE800D7505}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E0C5162E-DF26-4341-9E51-14AE800D7505}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E0C5162E-DF26-4341-9E51-14AE800D7505}.Debug|ARM.ActiveCfg = Debug|Any CPU - {E0C5162E-DF26-4341-9E51-14AE800D7505}.Debug|ARM.Build.0 = Debug|Any CPU - {E0C5162E-DF26-4341-9E51-14AE800D7505}.Debug|iPhone.ActiveCfg = Debug|Any CPU - {E0C5162E-DF26-4341-9E51-14AE800D7505}.Debug|iPhone.Build.0 = Debug|Any CPU - {E0C5162E-DF26-4341-9E51-14AE800D7505}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {E0C5162E-DF26-4341-9E51-14AE800D7505}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU - {E0C5162E-DF26-4341-9E51-14AE800D7505}.Debug|x64.ActiveCfg = Debug|Any CPU - {E0C5162E-DF26-4341-9E51-14AE800D7505}.Debug|x64.Build.0 = Debug|Any CPU - {E0C5162E-DF26-4341-9E51-14AE800D7505}.Debug|x86.ActiveCfg = Debug|Any CPU - {E0C5162E-DF26-4341-9E51-14AE800D7505}.Debug|x86.Build.0 = Debug|Any CPU - {E0C5162E-DF26-4341-9E51-14AE800D7505}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E0C5162E-DF26-4341-9E51-14AE800D7505}.Release|Any CPU.Build.0 = Release|Any CPU - {E0C5162E-DF26-4341-9E51-14AE800D7505}.Release|ARM.ActiveCfg = Release|Any CPU - {E0C5162E-DF26-4341-9E51-14AE800D7505}.Release|ARM.Build.0 = Release|Any CPU - {E0C5162E-DF26-4341-9E51-14AE800D7505}.Release|iPhone.ActiveCfg = Release|Any CPU - {E0C5162E-DF26-4341-9E51-14AE800D7505}.Release|iPhone.Build.0 = Release|Any CPU - {E0C5162E-DF26-4341-9E51-14AE800D7505}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU - {E0C5162E-DF26-4341-9E51-14AE800D7505}.Release|iPhoneSimulator.Build.0 = Release|Any CPU - {E0C5162E-DF26-4341-9E51-14AE800D7505}.Release|x64.ActiveCfg = Release|Any CPU - {E0C5162E-DF26-4341-9E51-14AE800D7505}.Release|x64.Build.0 = Release|Any CPU - {E0C5162E-DF26-4341-9E51-14AE800D7505}.Release|x86.ActiveCfg = Release|Any CPU - {E0C5162E-DF26-4341-9E51-14AE800D7505}.Release|x86.Build.0 = Release|Any CPU - {6E99F232-1536-424F-A28C-91692C8FD325}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU - {6E99F232-1536-424F-A28C-91692C8FD325}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU - {6E99F232-1536-424F-A28C-91692C8FD325}.Ad-Hoc|ARM.ActiveCfg = Debug|Any CPU - {6E99F232-1536-424F-A28C-91692C8FD325}.Ad-Hoc|ARM.Build.0 = Debug|Any CPU - {6E99F232-1536-424F-A28C-91692C8FD325}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU - {6E99F232-1536-424F-A28C-91692C8FD325}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU - {6E99F232-1536-424F-A28C-91692C8FD325}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {6E99F232-1536-424F-A28C-91692C8FD325}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU - {6E99F232-1536-424F-A28C-91692C8FD325}.Ad-Hoc|x64.ActiveCfg = Debug|Any CPU - {6E99F232-1536-424F-A28C-91692C8FD325}.Ad-Hoc|x64.Build.0 = Debug|Any CPU - {6E99F232-1536-424F-A28C-91692C8FD325}.Ad-Hoc|x86.ActiveCfg = Debug|Any CPU - {6E99F232-1536-424F-A28C-91692C8FD325}.Ad-Hoc|x86.Build.0 = Debug|Any CPU - {6E99F232-1536-424F-A28C-91692C8FD325}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU - {6E99F232-1536-424F-A28C-91692C8FD325}.AppStore|Any CPU.Build.0 = Debug|Any CPU - {6E99F232-1536-424F-A28C-91692C8FD325}.AppStore|ARM.ActiveCfg = Debug|Any CPU - {6E99F232-1536-424F-A28C-91692C8FD325}.AppStore|ARM.Build.0 = Debug|Any CPU - {6E99F232-1536-424F-A28C-91692C8FD325}.AppStore|iPhone.ActiveCfg = Debug|Any CPU - {6E99F232-1536-424F-A28C-91692C8FD325}.AppStore|iPhone.Build.0 = Debug|Any CPU - {6E99F232-1536-424F-A28C-91692C8FD325}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {6E99F232-1536-424F-A28C-91692C8FD325}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU - {6E99F232-1536-424F-A28C-91692C8FD325}.AppStore|x64.ActiveCfg = Debug|Any CPU - {6E99F232-1536-424F-A28C-91692C8FD325}.AppStore|x64.Build.0 = Debug|Any CPU - {6E99F232-1536-424F-A28C-91692C8FD325}.AppStore|x86.ActiveCfg = Debug|Any CPU - {6E99F232-1536-424F-A28C-91692C8FD325}.AppStore|x86.Build.0 = Debug|Any CPU - {6E99F232-1536-424F-A28C-91692C8FD325}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6E99F232-1536-424F-A28C-91692C8FD325}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6E99F232-1536-424F-A28C-91692C8FD325}.Debug|ARM.ActiveCfg = Debug|Any CPU - {6E99F232-1536-424F-A28C-91692C8FD325}.Debug|ARM.Build.0 = Debug|Any CPU - {6E99F232-1536-424F-A28C-91692C8FD325}.Debug|iPhone.ActiveCfg = Debug|Any CPU - {6E99F232-1536-424F-A28C-91692C8FD325}.Debug|iPhone.Build.0 = Debug|Any CPU - {6E99F232-1536-424F-A28C-91692C8FD325}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {6E99F232-1536-424F-A28C-91692C8FD325}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU - {6E99F232-1536-424F-A28C-91692C8FD325}.Debug|x64.ActiveCfg = Debug|Any CPU - {6E99F232-1536-424F-A28C-91692C8FD325}.Debug|x64.Build.0 = Debug|Any CPU - {6E99F232-1536-424F-A28C-91692C8FD325}.Debug|x86.ActiveCfg = Debug|Any CPU - {6E99F232-1536-424F-A28C-91692C8FD325}.Debug|x86.Build.0 = Debug|Any CPU - {6E99F232-1536-424F-A28C-91692C8FD325}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6E99F232-1536-424F-A28C-91692C8FD325}.Release|Any CPU.Build.0 = Release|Any CPU - {6E99F232-1536-424F-A28C-91692C8FD325}.Release|ARM.ActiveCfg = Release|Any CPU - {6E99F232-1536-424F-A28C-91692C8FD325}.Release|ARM.Build.0 = Release|Any CPU - {6E99F232-1536-424F-A28C-91692C8FD325}.Release|iPhone.ActiveCfg = Release|Any CPU - {6E99F232-1536-424F-A28C-91692C8FD325}.Release|iPhone.Build.0 = Release|Any CPU - {6E99F232-1536-424F-A28C-91692C8FD325}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU - {6E99F232-1536-424F-A28C-91692C8FD325}.Release|iPhoneSimulator.Build.0 = Release|Any CPU - {6E99F232-1536-424F-A28C-91692C8FD325}.Release|x64.ActiveCfg = Release|Any CPU - {6E99F232-1536-424F-A28C-91692C8FD325}.Release|x64.Build.0 = Release|Any CPU - {6E99F232-1536-424F-A28C-91692C8FD325}.Release|x86.ActiveCfg = Release|Any CPU - {6E99F232-1536-424F-A28C-91692C8FD325}.Release|x86.Build.0 = Release|Any CPU - {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU - {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU - {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Ad-Hoc|ARM.ActiveCfg = Debug|Any CPU - {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Ad-Hoc|ARM.Build.0 = Debug|Any CPU - {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU - {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU - {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU - {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Ad-Hoc|x64.ActiveCfg = Debug|Any CPU - {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Ad-Hoc|x64.Build.0 = Debug|Any CPU - {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Ad-Hoc|x86.ActiveCfg = Debug|Any CPU - {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Ad-Hoc|x86.Build.0 = Debug|Any CPU - {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU - {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.AppStore|Any CPU.Build.0 = Debug|Any CPU - {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.AppStore|ARM.ActiveCfg = Debug|Any CPU - {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.AppStore|ARM.Build.0 = Debug|Any CPU - {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.AppStore|iPhone.ActiveCfg = Debug|Any CPU - {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.AppStore|iPhone.Build.0 = Debug|Any CPU - {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU - {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.AppStore|x64.ActiveCfg = Debug|Any CPU - {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.AppStore|x64.Build.0 = Debug|Any CPU - {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.AppStore|x86.ActiveCfg = Debug|Any CPU - {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.AppStore|x86.Build.0 = Debug|Any CPU - {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Debug|ARM.ActiveCfg = Debug|Any CPU - {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Debug|ARM.Build.0 = Debug|Any CPU - {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Debug|iPhone.ActiveCfg = Debug|Any CPU - {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Debug|iPhone.Build.0 = Debug|Any CPU - {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU - {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Debug|x64.ActiveCfg = Debug|Any CPU - {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Debug|x64.Build.0 = Debug|Any CPU - {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Debug|x86.ActiveCfg = Debug|Any CPU - {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Debug|x86.Build.0 = Debug|Any CPU - {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Release|Any CPU.Build.0 = Release|Any CPU - {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Release|ARM.ActiveCfg = Release|Any CPU - {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Release|ARM.Build.0 = Release|Any CPU - {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Release|iPhone.ActiveCfg = Release|Any CPU - {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Release|iPhone.Build.0 = Release|Any CPU - {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU - {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Release|iPhoneSimulator.Build.0 = Release|Any CPU - {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Release|x64.ActiveCfg = Release|Any CPU - {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Release|x64.Build.0 = Release|Any CPU - {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Release|x86.ActiveCfg = Release|Any CPU - {714CE0A1-E8BE-4CF1-8948-C1202E1526E2}.Release|x86.Build.0 = Release|Any CPU + {3F79558C-485D-49E1-BD3E-E12538D3D308}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU + {3F79558C-485D-49E1-BD3E-E12538D3D308}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU + {3F79558C-485D-49E1-BD3E-E12538D3D308}.Ad-Hoc|ARM.ActiveCfg = Debug|Any CPU + {3F79558C-485D-49E1-BD3E-E12538D3D308}.Ad-Hoc|ARM.Build.0 = Debug|Any CPU + {3F79558C-485D-49E1-BD3E-E12538D3D308}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU + {3F79558C-485D-49E1-BD3E-E12538D3D308}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU + {3F79558C-485D-49E1-BD3E-E12538D3D308}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {3F79558C-485D-49E1-BD3E-E12538D3D308}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU + {3F79558C-485D-49E1-BD3E-E12538D3D308}.Ad-Hoc|x64.ActiveCfg = Debug|Any CPU + {3F79558C-485D-49E1-BD3E-E12538D3D308}.Ad-Hoc|x64.Build.0 = Debug|Any CPU + {3F79558C-485D-49E1-BD3E-E12538D3D308}.Ad-Hoc|x86.ActiveCfg = Debug|Any CPU + {3F79558C-485D-49E1-BD3E-E12538D3D308}.Ad-Hoc|x86.Build.0 = Debug|Any CPU + {3F79558C-485D-49E1-BD3E-E12538D3D308}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU + {3F79558C-485D-49E1-BD3E-E12538D3D308}.AppStore|Any CPU.Build.0 = Debug|Any CPU + {3F79558C-485D-49E1-BD3E-E12538D3D308}.AppStore|ARM.ActiveCfg = Debug|Any CPU + {3F79558C-485D-49E1-BD3E-E12538D3D308}.AppStore|ARM.Build.0 = Debug|Any CPU + {3F79558C-485D-49E1-BD3E-E12538D3D308}.AppStore|iPhone.ActiveCfg = Debug|Any CPU + {3F79558C-485D-49E1-BD3E-E12538D3D308}.AppStore|iPhone.Build.0 = Debug|Any CPU + {3F79558C-485D-49E1-BD3E-E12538D3D308}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {3F79558C-485D-49E1-BD3E-E12538D3D308}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU + {3F79558C-485D-49E1-BD3E-E12538D3D308}.AppStore|x64.ActiveCfg = Debug|Any CPU + {3F79558C-485D-49E1-BD3E-E12538D3D308}.AppStore|x64.Build.0 = Debug|Any CPU + {3F79558C-485D-49E1-BD3E-E12538D3D308}.AppStore|x86.ActiveCfg = Debug|Any CPU + {3F79558C-485D-49E1-BD3E-E12538D3D308}.AppStore|x86.Build.0 = Debug|Any CPU + {3F79558C-485D-49E1-BD3E-E12538D3D308}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3F79558C-485D-49E1-BD3E-E12538D3D308}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3F79558C-485D-49E1-BD3E-E12538D3D308}.Debug|ARM.ActiveCfg = Debug|Any CPU + {3F79558C-485D-49E1-BD3E-E12538D3D308}.Debug|ARM.Build.0 = Debug|Any CPU + {3F79558C-485D-49E1-BD3E-E12538D3D308}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {3F79558C-485D-49E1-BD3E-E12538D3D308}.Debug|iPhone.Build.0 = Debug|Any CPU + {3F79558C-485D-49E1-BD3E-E12538D3D308}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {3F79558C-485D-49E1-BD3E-E12538D3D308}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {3F79558C-485D-49E1-BD3E-E12538D3D308}.Debug|x64.ActiveCfg = Debug|Any CPU + {3F79558C-485D-49E1-BD3E-E12538D3D308}.Debug|x64.Build.0 = Debug|Any CPU + {3F79558C-485D-49E1-BD3E-E12538D3D308}.Debug|x86.ActiveCfg = Debug|Any CPU + {3F79558C-485D-49E1-BD3E-E12538D3D308}.Debug|x86.Build.0 = Debug|Any CPU + {3F79558C-485D-49E1-BD3E-E12538D3D308}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3F79558C-485D-49E1-BD3E-E12538D3D308}.Release|Any CPU.Build.0 = Release|Any CPU + {3F79558C-485D-49E1-BD3E-E12538D3D308}.Release|ARM.ActiveCfg = Release|Any CPU + {3F79558C-485D-49E1-BD3E-E12538D3D308}.Release|ARM.Build.0 = Release|Any CPU + {3F79558C-485D-49E1-BD3E-E12538D3D308}.Release|iPhone.ActiveCfg = Release|Any CPU + {3F79558C-485D-49E1-BD3E-E12538D3D308}.Release|iPhone.Build.0 = Release|Any CPU + {3F79558C-485D-49E1-BD3E-E12538D3D308}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {3F79558C-485D-49E1-BD3E-E12538D3D308}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {3F79558C-485D-49E1-BD3E-E12538D3D308}.Release|x64.ActiveCfg = Release|Any CPU + {3F79558C-485D-49E1-BD3E-E12538D3D308}.Release|x64.Build.0 = Release|Any CPU + {3F79558C-485D-49E1-BD3E-E12538D3D308}.Release|x86.ActiveCfg = Release|Any CPU + {3F79558C-485D-49E1-BD3E-E12538D3D308}.Release|x86.Build.0 = Release|Any CPU + {BEA37D6D-4CF2-4AE8-9575-72388E54FBD0}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU + {BEA37D6D-4CF2-4AE8-9575-72388E54FBD0}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU + {BEA37D6D-4CF2-4AE8-9575-72388E54FBD0}.Ad-Hoc|ARM.ActiveCfg = Debug|Any CPU + {BEA37D6D-4CF2-4AE8-9575-72388E54FBD0}.Ad-Hoc|ARM.Build.0 = Debug|Any CPU + {BEA37D6D-4CF2-4AE8-9575-72388E54FBD0}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU + {BEA37D6D-4CF2-4AE8-9575-72388E54FBD0}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU + {BEA37D6D-4CF2-4AE8-9575-72388E54FBD0}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {BEA37D6D-4CF2-4AE8-9575-72388E54FBD0}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU + {BEA37D6D-4CF2-4AE8-9575-72388E54FBD0}.Ad-Hoc|x64.ActiveCfg = Debug|Any CPU + {BEA37D6D-4CF2-4AE8-9575-72388E54FBD0}.Ad-Hoc|x64.Build.0 = Debug|Any CPU + {BEA37D6D-4CF2-4AE8-9575-72388E54FBD0}.Ad-Hoc|x86.ActiveCfg = Debug|Any CPU + {BEA37D6D-4CF2-4AE8-9575-72388E54FBD0}.Ad-Hoc|x86.Build.0 = Debug|Any CPU + {BEA37D6D-4CF2-4AE8-9575-72388E54FBD0}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU + {BEA37D6D-4CF2-4AE8-9575-72388E54FBD0}.AppStore|Any CPU.Build.0 = Debug|Any CPU + {BEA37D6D-4CF2-4AE8-9575-72388E54FBD0}.AppStore|ARM.ActiveCfg = Debug|Any CPU + {BEA37D6D-4CF2-4AE8-9575-72388E54FBD0}.AppStore|ARM.Build.0 = Debug|Any CPU + {BEA37D6D-4CF2-4AE8-9575-72388E54FBD0}.AppStore|iPhone.ActiveCfg = Debug|Any CPU + {BEA37D6D-4CF2-4AE8-9575-72388E54FBD0}.AppStore|iPhone.Build.0 = Debug|Any CPU + {BEA37D6D-4CF2-4AE8-9575-72388E54FBD0}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {BEA37D6D-4CF2-4AE8-9575-72388E54FBD0}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU + {BEA37D6D-4CF2-4AE8-9575-72388E54FBD0}.AppStore|x64.ActiveCfg = Debug|Any CPU + {BEA37D6D-4CF2-4AE8-9575-72388E54FBD0}.AppStore|x64.Build.0 = Debug|Any CPU + {BEA37D6D-4CF2-4AE8-9575-72388E54FBD0}.AppStore|x86.ActiveCfg = Debug|Any CPU + {BEA37D6D-4CF2-4AE8-9575-72388E54FBD0}.AppStore|x86.Build.0 = Debug|Any CPU + {BEA37D6D-4CF2-4AE8-9575-72388E54FBD0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BEA37D6D-4CF2-4AE8-9575-72388E54FBD0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BEA37D6D-4CF2-4AE8-9575-72388E54FBD0}.Debug|ARM.ActiveCfg = Debug|Any CPU + {BEA37D6D-4CF2-4AE8-9575-72388E54FBD0}.Debug|ARM.Build.0 = Debug|Any CPU + {BEA37D6D-4CF2-4AE8-9575-72388E54FBD0}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {BEA37D6D-4CF2-4AE8-9575-72388E54FBD0}.Debug|iPhone.Build.0 = Debug|Any CPU + {BEA37D6D-4CF2-4AE8-9575-72388E54FBD0}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {BEA37D6D-4CF2-4AE8-9575-72388E54FBD0}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {BEA37D6D-4CF2-4AE8-9575-72388E54FBD0}.Debug|x64.ActiveCfg = Debug|Any CPU + {BEA37D6D-4CF2-4AE8-9575-72388E54FBD0}.Debug|x64.Build.0 = Debug|Any CPU + {BEA37D6D-4CF2-4AE8-9575-72388E54FBD0}.Debug|x86.ActiveCfg = Debug|Any CPU + {BEA37D6D-4CF2-4AE8-9575-72388E54FBD0}.Debug|x86.Build.0 = Debug|Any CPU + {BEA37D6D-4CF2-4AE8-9575-72388E54FBD0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BEA37D6D-4CF2-4AE8-9575-72388E54FBD0}.Release|Any CPU.Build.0 = Release|Any CPU + {BEA37D6D-4CF2-4AE8-9575-72388E54FBD0}.Release|ARM.ActiveCfg = Release|Any CPU + {BEA37D6D-4CF2-4AE8-9575-72388E54FBD0}.Release|ARM.Build.0 = Release|Any CPU + {BEA37D6D-4CF2-4AE8-9575-72388E54FBD0}.Release|iPhone.ActiveCfg = Release|Any CPU + {BEA37D6D-4CF2-4AE8-9575-72388E54FBD0}.Release|iPhone.Build.0 = Release|Any CPU + {BEA37D6D-4CF2-4AE8-9575-72388E54FBD0}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {BEA37D6D-4CF2-4AE8-9575-72388E54FBD0}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {BEA37D6D-4CF2-4AE8-9575-72388E54FBD0}.Release|x64.ActiveCfg = Release|Any CPU + {BEA37D6D-4CF2-4AE8-9575-72388E54FBD0}.Release|x64.Build.0 = Release|Any CPU + {BEA37D6D-4CF2-4AE8-9575-72388E54FBD0}.Release|x86.ActiveCfg = Release|Any CPU + {BEA37D6D-4CF2-4AE8-9575-72388E54FBD0}.Release|x86.Build.0 = Release|Any CPU + {AF0828DB-8BDD-411A-AEEF-B780FBB8D8C1}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU + {AF0828DB-8BDD-411A-AEEF-B780FBB8D8C1}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU + {AF0828DB-8BDD-411A-AEEF-B780FBB8D8C1}.Ad-Hoc|ARM.ActiveCfg = Debug|Any CPU + {AF0828DB-8BDD-411A-AEEF-B780FBB8D8C1}.Ad-Hoc|ARM.Build.0 = Debug|Any CPU + {AF0828DB-8BDD-411A-AEEF-B780FBB8D8C1}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU + {AF0828DB-8BDD-411A-AEEF-B780FBB8D8C1}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU + {AF0828DB-8BDD-411A-AEEF-B780FBB8D8C1}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {AF0828DB-8BDD-411A-AEEF-B780FBB8D8C1}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU + {AF0828DB-8BDD-411A-AEEF-B780FBB8D8C1}.Ad-Hoc|x64.ActiveCfg = Debug|Any CPU + {AF0828DB-8BDD-411A-AEEF-B780FBB8D8C1}.Ad-Hoc|x64.Build.0 = Debug|Any CPU + {AF0828DB-8BDD-411A-AEEF-B780FBB8D8C1}.Ad-Hoc|x86.ActiveCfg = Debug|Any CPU + {AF0828DB-8BDD-411A-AEEF-B780FBB8D8C1}.Ad-Hoc|x86.Build.0 = Debug|Any CPU + {AF0828DB-8BDD-411A-AEEF-B780FBB8D8C1}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU + {AF0828DB-8BDD-411A-AEEF-B780FBB8D8C1}.AppStore|Any CPU.Build.0 = Debug|Any CPU + {AF0828DB-8BDD-411A-AEEF-B780FBB8D8C1}.AppStore|ARM.ActiveCfg = Debug|Any CPU + {AF0828DB-8BDD-411A-AEEF-B780FBB8D8C1}.AppStore|ARM.Build.0 = Debug|Any CPU + {AF0828DB-8BDD-411A-AEEF-B780FBB8D8C1}.AppStore|iPhone.ActiveCfg = Debug|Any CPU + {AF0828DB-8BDD-411A-AEEF-B780FBB8D8C1}.AppStore|iPhone.Build.0 = Debug|Any CPU + {AF0828DB-8BDD-411A-AEEF-B780FBB8D8C1}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {AF0828DB-8BDD-411A-AEEF-B780FBB8D8C1}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU + {AF0828DB-8BDD-411A-AEEF-B780FBB8D8C1}.AppStore|x64.ActiveCfg = Debug|Any CPU + {AF0828DB-8BDD-411A-AEEF-B780FBB8D8C1}.AppStore|x64.Build.0 = Debug|Any CPU + {AF0828DB-8BDD-411A-AEEF-B780FBB8D8C1}.AppStore|x86.ActiveCfg = Debug|Any CPU + {AF0828DB-8BDD-411A-AEEF-B780FBB8D8C1}.AppStore|x86.Build.0 = Debug|Any CPU + {AF0828DB-8BDD-411A-AEEF-B780FBB8D8C1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AF0828DB-8BDD-411A-AEEF-B780FBB8D8C1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AF0828DB-8BDD-411A-AEEF-B780FBB8D8C1}.Debug|ARM.ActiveCfg = Debug|Any CPU + {AF0828DB-8BDD-411A-AEEF-B780FBB8D8C1}.Debug|ARM.Build.0 = Debug|Any CPU + {AF0828DB-8BDD-411A-AEEF-B780FBB8D8C1}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {AF0828DB-8BDD-411A-AEEF-B780FBB8D8C1}.Debug|iPhone.Build.0 = Debug|Any CPU + {AF0828DB-8BDD-411A-AEEF-B780FBB8D8C1}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {AF0828DB-8BDD-411A-AEEF-B780FBB8D8C1}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {AF0828DB-8BDD-411A-AEEF-B780FBB8D8C1}.Debug|x64.ActiveCfg = Debug|Any CPU + {AF0828DB-8BDD-411A-AEEF-B780FBB8D8C1}.Debug|x64.Build.0 = Debug|Any CPU + {AF0828DB-8BDD-411A-AEEF-B780FBB8D8C1}.Debug|x86.ActiveCfg = Debug|Any CPU + {AF0828DB-8BDD-411A-AEEF-B780FBB8D8C1}.Debug|x86.Build.0 = Debug|Any CPU + {AF0828DB-8BDD-411A-AEEF-B780FBB8D8C1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AF0828DB-8BDD-411A-AEEF-B780FBB8D8C1}.Release|Any CPU.Build.0 = Release|Any CPU + {AF0828DB-8BDD-411A-AEEF-B780FBB8D8C1}.Release|ARM.ActiveCfg = Release|Any CPU + {AF0828DB-8BDD-411A-AEEF-B780FBB8D8C1}.Release|ARM.Build.0 = Release|Any CPU + {AF0828DB-8BDD-411A-AEEF-B780FBB8D8C1}.Release|iPhone.ActiveCfg = Release|Any CPU + {AF0828DB-8BDD-411A-AEEF-B780FBB8D8C1}.Release|iPhone.Build.0 = Release|Any CPU + {AF0828DB-8BDD-411A-AEEF-B780FBB8D8C1}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {AF0828DB-8BDD-411A-AEEF-B780FBB8D8C1}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {AF0828DB-8BDD-411A-AEEF-B780FBB8D8C1}.Release|x64.ActiveCfg = Release|Any CPU + {AF0828DB-8BDD-411A-AEEF-B780FBB8D8C1}.Release|x64.Build.0 = Release|Any CPU + {AF0828DB-8BDD-411A-AEEF-B780FBB8D8C1}.Release|x86.ActiveCfg = Release|Any CPU + {AF0828DB-8BDD-411A-AEEF-B780FBB8D8C1}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -1511,11 +1531,15 @@ Global {969E793C-C413-490E-9C9D-B2B46DA5AF32} = {EF0337F2-ED00-4643-89FD-EE10863F1870} {1815B651-941C-466B-AE33-D1D7EEB8F77F} = {DB0EFB20-B024-4E5E-A75C-52143C131D25} {15F4B3AA-89B6-4A0D-9051-414305974781} = {1815B651-941C-466B-AE33-D1D7EEB8F77F} - {7A58AA20-67F3-48F3-88C8-24EBFE621792} = {932D8224-11F6-4D07-B109-DA28AD288A63} - {E0C5162E-DF26-4341-9E51-14AE800D7505} = {7A58AA20-67F3-48F3-88C8-24EBFE621792} - {EA378316-9D49-4A6B-858E-D4A25F948A74} = {932D8224-11F6-4D07-B109-DA28AD288A63} - {6E99F232-1536-424F-A28C-91692C8FD325} = {EA378316-9D49-4A6B-858E-D4A25F948A74} - {714CE0A1-E8BE-4CF1-8948-C1202E1526E2} = {EA378316-9D49-4A6B-858E-D4A25F948A74} + {77849D35-37D4-4802-81DC-9477B2775A40} = {932D8224-11F6-4D07-B109-DA28AD288A63} + {EC91ADE9-3D66-4AB2-9FB4-2B585E1F3531} = {77849D35-37D4-4802-81DC-9477B2775A40} + {DB813A36-11BA-41FE-B258-CA9A7152247B} = {77849D35-37D4-4802-81DC-9477B2775A40} + {0189E4FB-6E2B-4F2E-9B1D-5473D23FC6DB} = {77849D35-37D4-4802-81DC-9477B2775A40} + {F8F0921C-EE5D-4AED-A4D6-5BF5FAE02CB5} = {77849D35-37D4-4802-81DC-9477B2775A40} + {28C0F5C8-4849-4035-80AB-45639424E73F} = {77849D35-37D4-4802-81DC-9477B2775A40} + {3F79558C-485D-49E1-BD3E-E12538D3D308} = {EC91ADE9-3D66-4AB2-9FB4-2B585E1F3531} + {BEA37D6D-4CF2-4AE8-9575-72388E54FBD0} = {0189E4FB-6E2B-4F2E-9B1D-5473D23FC6DB} + {AF0828DB-8BDD-411A-AEEF-B780FBB8D8C1} = {28C0F5C8-4849-4035-80AB-45639424E73F} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {25728519-5F0F-4973-8A64-0A81EB4EA8D9} diff --git a/src/Apigw/OcelotApiGw/Dockerfile b/src/ApiGateways/ApiGw-Base/Dockerfile similarity index 60% rename from src/Apigw/OcelotApiGw/Dockerfile rename to src/ApiGateways/ApiGw-Base/Dockerfile index aec2dc4e3..f0ff49f43 100644 --- a/src/Apigw/OcelotApiGw/Dockerfile +++ b/src/ApiGateways/ApiGw-Base/Dockerfile @@ -1,13 +1,14 @@ FROM microsoft/aspnetcore:2.0 AS base WORKDIR /app +ENV ESHOP_API_GW Mobile_Bff_Shopping_ApiGw EXPOSE 80 FROM microsoft/aspnetcore-build:2.0 AS build WORKDIR /src -COPY src/Apigw/OcelotApiGw/OcelotApiGw.csproj src/Apigw/OcelotApiGw/ -RUN dotnet restore src/Apigw/OcelotApiGw/ +COPY src/ApiGateways/ApiGw-Base/OcelotApiGw.csproj src/ApiGateways/ApiGw-Base/ +RUN dotnet restore src/ApiGateways/ApiGw-Base/ COPY . . -WORKDIR /src/src/Apigw/OcelotApiGw +WORKDIR /src/src/ApiGateways/ApiGw-Base/ RUN dotnet build -c Release -o /app FROM build AS publish diff --git a/src/Apigw/OcelotApiGw/Dockerfile2 b/src/ApiGateways/ApiGw-Base/Dockerfile2 similarity index 60% rename from src/Apigw/OcelotApiGw/Dockerfile2 rename to src/ApiGateways/ApiGw-Base/Dockerfile2 index aec2dc4e3..f127b33d1 100644 --- a/src/Apigw/OcelotApiGw/Dockerfile2 +++ b/src/ApiGateways/ApiGw-Base/Dockerfile2 @@ -1,13 +1,14 @@ FROM microsoft/aspnetcore:2.0 AS base WORKDIR /app +ENV ESHOP_API_GW Mobile_Bff_Marketing_ApiGw EXPOSE 80 FROM microsoft/aspnetcore-build:2.0 AS build WORKDIR /src -COPY src/Apigw/OcelotApiGw/OcelotApiGw.csproj src/Apigw/OcelotApiGw/ -RUN dotnet restore src/Apigw/OcelotApiGw/ +COPY src/ApiGateways/ApiGw-Base/OcelotApiGw.csproj src/ApiGateways/ApiGw-Base/ +RUN dotnet restore src/ApiGateways/ApiGw-Base/ COPY . . -WORKDIR /src/src/Apigw/OcelotApiGw +WORKDIR /src/src/ApiGateways/ApiGw-Base/ RUN dotnet build -c Release -o /app FROM build AS publish diff --git a/src/Apigw/OcelotApiGw/Dockerfile3 b/src/ApiGateways/ApiGw-Base/Dockerfile3 similarity index 61% rename from src/Apigw/OcelotApiGw/Dockerfile3 rename to src/ApiGateways/ApiGw-Base/Dockerfile3 index aec2dc4e3..aff6cc920 100644 --- a/src/Apigw/OcelotApiGw/Dockerfile3 +++ b/src/ApiGateways/ApiGw-Base/Dockerfile3 @@ -1,13 +1,14 @@ FROM microsoft/aspnetcore:2.0 AS base WORKDIR /app +ENV ESHOP_API_GW Web_Bff_Shopping_ApiGw EXPOSE 80 FROM microsoft/aspnetcore-build:2.0 AS build WORKDIR /src -COPY src/Apigw/OcelotApiGw/OcelotApiGw.csproj src/Apigw/OcelotApiGw/ -RUN dotnet restore src/Apigw/OcelotApiGw/ +COPY src/ApiGateways/ApiGw-Base/OcelotApiGw.csproj src/ApiGateways/ApiGw-Base/ +RUN dotnet restore src/ApiGateways/ApiGw-Base/ COPY . . -WORKDIR /src/src/Apigw/OcelotApiGw +WORKDIR /src/src/ApiGateways/ApiGw-Base/ RUN dotnet build -c Release -o /app FROM build AS publish diff --git a/src/Apigw/OcelotApiGw/Dockerfile4 b/src/ApiGateways/ApiGw-Base/Dockerfile4 similarity index 61% rename from src/Apigw/OcelotApiGw/Dockerfile4 rename to src/ApiGateways/ApiGw-Base/Dockerfile4 index aec2dc4e3..4686420d1 100644 --- a/src/Apigw/OcelotApiGw/Dockerfile4 +++ b/src/ApiGateways/ApiGw-Base/Dockerfile4 @@ -1,13 +1,14 @@ FROM microsoft/aspnetcore:2.0 AS base WORKDIR /app +ENV ESHOP_API_GW Web_Bff_Marketing_ApiGw EXPOSE 80 FROM microsoft/aspnetcore-build:2.0 AS build WORKDIR /src -COPY src/Apigw/OcelotApiGw/OcelotApiGw.csproj src/Apigw/OcelotApiGw/ -RUN dotnet restore src/Apigw/OcelotApiGw/ +COPY src/ApiGateways/ApiGw-Base/OcelotApiGw.csproj src/ApiGateways/ApiGw-Base/ +RUN dotnet restore src/ApiGateways/ApiGw-Base/ COPY . . -WORKDIR /src/src/Apigw/OcelotApiGw +WORKDIR /src/src/ApiGateways/ApiGw-Base/ RUN dotnet build -c Release -o /app FROM build AS publish diff --git a/src/Apigw/OcelotApiGw/OcelotApiGw.csproj b/src/ApiGateways/ApiGw-Base/OcelotApiGw.csproj similarity index 100% rename from src/Apigw/OcelotApiGw/OcelotApiGw.csproj rename to src/ApiGateways/ApiGw-Base/OcelotApiGw.csproj diff --git a/src/Apigw/OcelotApiGw/Program.cs b/src/ApiGateways/ApiGw-Base/Program.cs similarity index 100% rename from src/Apigw/OcelotApiGw/Program.cs rename to src/ApiGateways/ApiGw-Base/Program.cs diff --git a/src/Apigw/OcelotApiGw/Properties/launchSettings.json b/src/ApiGateways/ApiGw-Base/Properties/launchSettings.json similarity index 100% rename from src/Apigw/OcelotApiGw/Properties/launchSettings.json rename to src/ApiGateways/ApiGw-Base/Properties/launchSettings.json diff --git a/src/Apigw/OcelotApiGw/Startup.cs b/src/ApiGateways/ApiGw-Base/Startup.cs similarity index 100% rename from src/Apigw/OcelotApiGw/Startup.cs rename to src/ApiGateways/ApiGw-Base/Startup.cs diff --git a/src/Apigw/OcelotApiGw/appsettings.json b/src/ApiGateways/ApiGw-Base/appsettings.json similarity index 100% rename from src/Apigw/OcelotApiGw/appsettings.json rename to src/ApiGateways/ApiGw-Base/appsettings.json diff --git a/src/Apigw/configs/mobilemarketingapigw/configuration.json b/src/ApiGateways/Mobile.Bff.Marketing/apigw/configuration.json similarity index 100% rename from src/Apigw/configs/mobilemarketingapigw/configuration.json rename to src/ApiGateways/Mobile.Bff.Marketing/apigw/configuration.json diff --git a/src/Aggregators/Mobile.Shopping.HttpAggregator/Config/UrlsConfig.cs b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Config/UrlsConfig.cs similarity index 100% rename from src/Aggregators/Mobile.Shopping.HttpAggregator/Config/UrlsConfig.cs rename to src/ApiGateways/Mobile.Bff.Shopping/aggregator/Config/UrlsConfig.cs diff --git a/src/Aggregators/Mobile.Shopping.HttpAggregator/Controllers/BasketController.cs b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Controllers/BasketController.cs similarity index 100% rename from src/Aggregators/Mobile.Shopping.HttpAggregator/Controllers/BasketController.cs rename to src/ApiGateways/Mobile.Bff.Shopping/aggregator/Controllers/BasketController.cs diff --git a/src/Aggregators/Mobile.Shopping.HttpAggregator/Controllers/HomeController.cs b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Controllers/HomeController.cs similarity index 100% rename from src/Aggregators/Mobile.Shopping.HttpAggregator/Controllers/HomeController.cs rename to src/ApiGateways/Mobile.Bff.Shopping/aggregator/Controllers/HomeController.cs diff --git a/src/Aggregators/Mobile.Shopping.HttpAggregator/Controllers/OrderController.cs b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Controllers/OrderController.cs similarity index 100% rename from src/Aggregators/Mobile.Shopping.HttpAggregator/Controllers/OrderController.cs rename to src/ApiGateways/Mobile.Bff.Shopping/aggregator/Controllers/OrderController.cs diff --git a/src/Aggregators/Mobile.Shopping.HttpAggregator/Dockerfile b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Dockerfile similarity index 87% rename from src/Aggregators/Mobile.Shopping.HttpAggregator/Dockerfile rename to src/ApiGateways/Mobile.Bff.Shopping/aggregator/Dockerfile index 24df53c80..273743cee 100644 --- a/src/Aggregators/Mobile.Shopping.HttpAggregator/Dockerfile +++ b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Dockerfile @@ -6,7 +6,7 @@ FROM microsoft/aspnetcore-build:2.0 AS build WORKDIR /src COPY . . RUN dotnet restore -nowarn:msb3202,nu1503 -WORKDIR /src/src/Aggregators/Mobile.Shopping.HttpAggregator +WORKDIR /src/src/ApiGateways/Mobile.Bff.Shopping/aggregator RUN dotnet build --no-restore -c Release -o /app FROM build AS publish @@ -16,3 +16,4 @@ FROM base AS final WORKDIR /app COPY --from=publish /app . ENTRYPOINT ["dotnet", "Mobile.Shopping.HttpAggregator.dll"] + diff --git a/src/Aggregators/Mobile.Shopping.HttpAggregator/Filters/AuthorizeCheckOperationFilter.cs b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Filters/AuthorizeCheckOperationFilter.cs similarity index 100% rename from src/Aggregators/Mobile.Shopping.HttpAggregator/Filters/AuthorizeCheckOperationFilter.cs rename to src/ApiGateways/Mobile.Bff.Shopping/aggregator/Filters/AuthorizeCheckOperationFilter.cs diff --git a/src/Aggregators/Mobile.Shopping.HttpAggregator/Mobile.Shopping.HttpAggregator.csproj b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Mobile.Shopping.HttpAggregator.csproj similarity index 87% rename from src/Aggregators/Mobile.Shopping.HttpAggregator/Mobile.Shopping.HttpAggregator.csproj rename to src/ApiGateways/Mobile.Bff.Shopping/aggregator/Mobile.Shopping.HttpAggregator.csproj index 093e7a370..bd6d73950 100644 --- a/src/Aggregators/Mobile.Shopping.HttpAggregator/Mobile.Shopping.HttpAggregator.csproj +++ b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Mobile.Shopping.HttpAggregator.csproj @@ -21,7 +21,7 @@ - + diff --git a/src/Aggregators/Mobile.Shopping.HttpAggregator/Models/AddBasketItemRequest.cs b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Models/AddBasketItemRequest.cs similarity index 100% rename from src/Aggregators/Mobile.Shopping.HttpAggregator/Models/AddBasketItemRequest.cs rename to src/ApiGateways/Mobile.Bff.Shopping/aggregator/Models/AddBasketItemRequest.cs diff --git a/src/Aggregators/Mobile.Shopping.HttpAggregator/Models/BasketData.cs b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Models/BasketData.cs similarity index 100% rename from src/Aggregators/Mobile.Shopping.HttpAggregator/Models/BasketData.cs rename to src/ApiGateways/Mobile.Bff.Shopping/aggregator/Models/BasketData.cs diff --git a/src/Aggregators/Mobile.Shopping.HttpAggregator/Models/CatalogItem.cs b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Models/CatalogItem.cs similarity index 100% rename from src/Aggregators/Mobile.Shopping.HttpAggregator/Models/CatalogItem.cs rename to src/ApiGateways/Mobile.Bff.Shopping/aggregator/Models/CatalogItem.cs diff --git a/src/Aggregators/Mobile.Shopping.HttpAggregator/Models/OrderData.cs b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Models/OrderData.cs similarity index 100% rename from src/Aggregators/Mobile.Shopping.HttpAggregator/Models/OrderData.cs rename to src/ApiGateways/Mobile.Bff.Shopping/aggregator/Models/OrderData.cs diff --git a/src/Aggregators/Mobile.Shopping.HttpAggregator/Models/OrderItemData.cs b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Models/OrderItemData.cs similarity index 100% rename from src/Aggregators/Mobile.Shopping.HttpAggregator/Models/OrderItemData.cs rename to src/ApiGateways/Mobile.Bff.Shopping/aggregator/Models/OrderItemData.cs diff --git a/src/Aggregators/Mobile.Shopping.HttpAggregator/Models/UpdateBasketItemsRequest.cs b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Models/UpdateBasketItemsRequest.cs similarity index 100% rename from src/Aggregators/Mobile.Shopping.HttpAggregator/Models/UpdateBasketItemsRequest.cs rename to src/ApiGateways/Mobile.Bff.Shopping/aggregator/Models/UpdateBasketItemsRequest.cs diff --git a/src/Aggregators/Mobile.Shopping.HttpAggregator/Models/UpdateBasketRequest.cs b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Models/UpdateBasketRequest.cs similarity index 100% rename from src/Aggregators/Mobile.Shopping.HttpAggregator/Models/UpdateBasketRequest.cs rename to src/ApiGateways/Mobile.Bff.Shopping/aggregator/Models/UpdateBasketRequest.cs diff --git a/src/Aggregators/Mobile.Shopping.HttpAggregator/Program.cs b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Program.cs similarity index 100% rename from src/Aggregators/Mobile.Shopping.HttpAggregator/Program.cs rename to src/ApiGateways/Mobile.Bff.Shopping/aggregator/Program.cs diff --git a/src/Aggregators/Mobile.Shopping.HttpAggregator/Properties/launchSettings.json b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Properties/launchSettings.json similarity index 100% rename from src/Aggregators/Mobile.Shopping.HttpAggregator/Properties/launchSettings.json rename to src/ApiGateways/Mobile.Bff.Shopping/aggregator/Properties/launchSettings.json diff --git a/src/Aggregators/Mobile.Shopping.HttpAggregator/Services/BasketService.cs b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Services/BasketService.cs similarity index 100% rename from src/Aggregators/Mobile.Shopping.HttpAggregator/Services/BasketService.cs rename to src/ApiGateways/Mobile.Bff.Shopping/aggregator/Services/BasketService.cs diff --git a/src/Aggregators/Mobile.Shopping.HttpAggregator/Services/CatalogService.cs b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Services/CatalogService.cs similarity index 100% rename from src/Aggregators/Mobile.Shopping.HttpAggregator/Services/CatalogService.cs rename to src/ApiGateways/Mobile.Bff.Shopping/aggregator/Services/CatalogService.cs diff --git a/src/Aggregators/Mobile.Shopping.HttpAggregator/Services/IBasketService.cs b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Services/IBasketService.cs similarity index 100% rename from src/Aggregators/Mobile.Shopping.HttpAggregator/Services/IBasketService.cs rename to src/ApiGateways/Mobile.Bff.Shopping/aggregator/Services/IBasketService.cs diff --git a/src/Aggregators/Mobile.Shopping.HttpAggregator/Services/ICatalogService.cs b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Services/ICatalogService.cs similarity index 100% rename from src/Aggregators/Mobile.Shopping.HttpAggregator/Services/ICatalogService.cs rename to src/ApiGateways/Mobile.Bff.Shopping/aggregator/Services/ICatalogService.cs diff --git a/src/Aggregators/Mobile.Shopping.HttpAggregator/Services/IOrderApiClient.cs b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Services/IOrderApiClient.cs similarity index 100% rename from src/Aggregators/Mobile.Shopping.HttpAggregator/Services/IOrderApiClient.cs rename to src/ApiGateways/Mobile.Bff.Shopping/aggregator/Services/IOrderApiClient.cs diff --git a/src/Aggregators/Mobile.Shopping.HttpAggregator/Services/OrderApiClient.cs b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Services/OrderApiClient.cs similarity index 100% rename from src/Aggregators/Mobile.Shopping.HttpAggregator/Services/OrderApiClient.cs rename to src/ApiGateways/Mobile.Bff.Shopping/aggregator/Services/OrderApiClient.cs diff --git a/src/Aggregators/Mobile.Shopping.HttpAggregator/Startup.cs b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/Startup.cs similarity index 100% rename from src/Aggregators/Mobile.Shopping.HttpAggregator/Startup.cs rename to src/ApiGateways/Mobile.Bff.Shopping/aggregator/Startup.cs diff --git a/src/Aggregators/Mobile.Shopping.HttpAggregator/appsettings.json b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/appsettings.json similarity index 100% rename from src/Aggregators/Mobile.Shopping.HttpAggregator/appsettings.json rename to src/ApiGateways/Mobile.Bff.Shopping/aggregator/appsettings.json diff --git a/src/Aggregators/Mobile.Shopping.HttpAggregator/appsettings.localhost.json b/src/ApiGateways/Mobile.Bff.Shopping/aggregator/appsettings.localhost.json similarity index 100% rename from src/Aggregators/Mobile.Shopping.HttpAggregator/appsettings.localhost.json rename to src/ApiGateways/Mobile.Bff.Shopping/aggregator/appsettings.localhost.json diff --git a/src/Apigw/configs/mobileshoppingapigw/configuration.json b/src/ApiGateways/Mobile.Bff.Shopping/apigw/configuration.json similarity index 100% rename from src/Apigw/configs/mobileshoppingapigw/configuration.json rename to src/ApiGateways/Mobile.Bff.Shopping/apigw/configuration.json diff --git a/src/Apigw/configs/webmarketingapigw/configuration.json b/src/ApiGateways/Web.Bff.Marketing/apigw/configuration.json similarity index 100% rename from src/Apigw/configs/webmarketingapigw/configuration.json rename to src/ApiGateways/Web.Bff.Marketing/apigw/configuration.json diff --git a/src/Aggregators/Web.Shopping.HttpAggregator/Config/UrlsConfig.cs b/src/ApiGateways/Web.Bff.Shopping/aggregator/Config/UrlsConfig.cs similarity index 100% rename from src/Aggregators/Web.Shopping.HttpAggregator/Config/UrlsConfig.cs rename to src/ApiGateways/Web.Bff.Shopping/aggregator/Config/UrlsConfig.cs diff --git a/src/Aggregators/Web.Shopping.HttpAggregator/Controllers/BasketController.cs b/src/ApiGateways/Web.Bff.Shopping/aggregator/Controllers/BasketController.cs similarity index 100% rename from src/Aggregators/Web.Shopping.HttpAggregator/Controllers/BasketController.cs rename to src/ApiGateways/Web.Bff.Shopping/aggregator/Controllers/BasketController.cs diff --git a/src/Aggregators/Web.Shopping.HttpAggregator/Controllers/HomeController.cs b/src/ApiGateways/Web.Bff.Shopping/aggregator/Controllers/HomeController.cs similarity index 100% rename from src/Aggregators/Web.Shopping.HttpAggregator/Controllers/HomeController.cs rename to src/ApiGateways/Web.Bff.Shopping/aggregator/Controllers/HomeController.cs diff --git a/src/Aggregators/Web.Shopping.HttpAggregator/Controllers/OrderController.cs b/src/ApiGateways/Web.Bff.Shopping/aggregator/Controllers/OrderController.cs similarity index 100% rename from src/Aggregators/Web.Shopping.HttpAggregator/Controllers/OrderController.cs rename to src/ApiGateways/Web.Bff.Shopping/aggregator/Controllers/OrderController.cs diff --git a/src/Aggregators/Web.Shopping.HttpAggregator/Dockerfile b/src/ApiGateways/Web.Bff.Shopping/aggregator/Dockerfile similarity index 87% rename from src/Aggregators/Web.Shopping.HttpAggregator/Dockerfile rename to src/ApiGateways/Web.Bff.Shopping/aggregator/Dockerfile index 267cb233c..ce6f1b155 100644 --- a/src/Aggregators/Web.Shopping.HttpAggregator/Dockerfile +++ b/src/ApiGateways/Web.Bff.Shopping/aggregator/Dockerfile @@ -6,7 +6,7 @@ FROM microsoft/aspnetcore-build:2.0 AS build WORKDIR /src COPY . . RUN dotnet restore -nowarn:msb3202,nu1503 -WORKDIR /src/src/Aggregators/Web.Shopping.HttpAggregator +WORKDIR /src/src/ApiGateways/Web.Bff.Shopping/aggregator RUN dotnet build --no-restore -c Release -o /app FROM build AS publish diff --git a/src/Aggregators/Web.Shopping.HttpAggregator/Filters/AuthorizeCheckOperationFilter.cs b/src/ApiGateways/Web.Bff.Shopping/aggregator/Filters/AuthorizeCheckOperationFilter.cs similarity index 100% rename from src/Aggregators/Web.Shopping.HttpAggregator/Filters/AuthorizeCheckOperationFilter.cs rename to src/ApiGateways/Web.Bff.Shopping/aggregator/Filters/AuthorizeCheckOperationFilter.cs diff --git a/src/Aggregators/Web.Shopping.HttpAggregator/Models/AddBasketItemRequest.cs b/src/ApiGateways/Web.Bff.Shopping/aggregator/Models/AddBasketItemRequest.cs similarity index 100% rename from src/Aggregators/Web.Shopping.HttpAggregator/Models/AddBasketItemRequest.cs rename to src/ApiGateways/Web.Bff.Shopping/aggregator/Models/AddBasketItemRequest.cs diff --git a/src/Aggregators/Web.Shopping.HttpAggregator/Models/BasketData.cs b/src/ApiGateways/Web.Bff.Shopping/aggregator/Models/BasketData.cs similarity index 100% rename from src/Aggregators/Web.Shopping.HttpAggregator/Models/BasketData.cs rename to src/ApiGateways/Web.Bff.Shopping/aggregator/Models/BasketData.cs diff --git a/src/Aggregators/Web.Shopping.HttpAggregator/Models/CatalogItem.cs b/src/ApiGateways/Web.Bff.Shopping/aggregator/Models/CatalogItem.cs similarity index 100% rename from src/Aggregators/Web.Shopping.HttpAggregator/Models/CatalogItem.cs rename to src/ApiGateways/Web.Bff.Shopping/aggregator/Models/CatalogItem.cs diff --git a/src/Aggregators/Web.Shopping.HttpAggregator/Models/OrderData.cs b/src/ApiGateways/Web.Bff.Shopping/aggregator/Models/OrderData.cs similarity index 100% rename from src/Aggregators/Web.Shopping.HttpAggregator/Models/OrderData.cs rename to src/ApiGateways/Web.Bff.Shopping/aggregator/Models/OrderData.cs diff --git a/src/Aggregators/Web.Shopping.HttpAggregator/Models/OrderItemData.cs b/src/ApiGateways/Web.Bff.Shopping/aggregator/Models/OrderItemData.cs similarity index 100% rename from src/Aggregators/Web.Shopping.HttpAggregator/Models/OrderItemData.cs rename to src/ApiGateways/Web.Bff.Shopping/aggregator/Models/OrderItemData.cs diff --git a/src/Aggregators/Web.Shopping.HttpAggregator/Models/UpdateBasketItemsRequest.cs b/src/ApiGateways/Web.Bff.Shopping/aggregator/Models/UpdateBasketItemsRequest.cs similarity index 100% rename from src/Aggregators/Web.Shopping.HttpAggregator/Models/UpdateBasketItemsRequest.cs rename to src/ApiGateways/Web.Bff.Shopping/aggregator/Models/UpdateBasketItemsRequest.cs diff --git a/src/Aggregators/Web.Shopping.HttpAggregator/Models/UpdateBasketRequest.cs b/src/ApiGateways/Web.Bff.Shopping/aggregator/Models/UpdateBasketRequest.cs similarity index 100% rename from src/Aggregators/Web.Shopping.HttpAggregator/Models/UpdateBasketRequest.cs rename to src/ApiGateways/Web.Bff.Shopping/aggregator/Models/UpdateBasketRequest.cs diff --git a/src/Aggregators/Web.Shopping.HttpAggregator/Program.cs b/src/ApiGateways/Web.Bff.Shopping/aggregator/Program.cs similarity index 100% rename from src/Aggregators/Web.Shopping.HttpAggregator/Program.cs rename to src/ApiGateways/Web.Bff.Shopping/aggregator/Program.cs diff --git a/src/Aggregators/Web.Shopping.HttpAggregator/Properties/launchSettings.json b/src/ApiGateways/Web.Bff.Shopping/aggregator/Properties/launchSettings.json similarity index 100% rename from src/Aggregators/Web.Shopping.HttpAggregator/Properties/launchSettings.json rename to src/ApiGateways/Web.Bff.Shopping/aggregator/Properties/launchSettings.json diff --git a/src/Aggregators/Web.Shopping.HttpAggregator/Services/BasketService.cs b/src/ApiGateways/Web.Bff.Shopping/aggregator/Services/BasketService.cs similarity index 100% rename from src/Aggregators/Web.Shopping.HttpAggregator/Services/BasketService.cs rename to src/ApiGateways/Web.Bff.Shopping/aggregator/Services/BasketService.cs diff --git a/src/Aggregators/Web.Shopping.HttpAggregator/Services/CatalogService.cs b/src/ApiGateways/Web.Bff.Shopping/aggregator/Services/CatalogService.cs similarity index 100% rename from src/Aggregators/Web.Shopping.HttpAggregator/Services/CatalogService.cs rename to src/ApiGateways/Web.Bff.Shopping/aggregator/Services/CatalogService.cs diff --git a/src/Aggregators/Web.Shopping.HttpAggregator/Services/IBasketService.cs b/src/ApiGateways/Web.Bff.Shopping/aggregator/Services/IBasketService.cs similarity index 100% rename from src/Aggregators/Web.Shopping.HttpAggregator/Services/IBasketService.cs rename to src/ApiGateways/Web.Bff.Shopping/aggregator/Services/IBasketService.cs diff --git a/src/Aggregators/Web.Shopping.HttpAggregator/Services/ICatalogService.cs b/src/ApiGateways/Web.Bff.Shopping/aggregator/Services/ICatalogService.cs similarity index 100% rename from src/Aggregators/Web.Shopping.HttpAggregator/Services/ICatalogService.cs rename to src/ApiGateways/Web.Bff.Shopping/aggregator/Services/ICatalogService.cs diff --git a/src/Aggregators/Web.Shopping.HttpAggregator/Services/IOrderApiClient.cs b/src/ApiGateways/Web.Bff.Shopping/aggregator/Services/IOrderApiClient.cs similarity index 100% rename from src/Aggregators/Web.Shopping.HttpAggregator/Services/IOrderApiClient.cs rename to src/ApiGateways/Web.Bff.Shopping/aggregator/Services/IOrderApiClient.cs diff --git a/src/Aggregators/Web.Shopping.HttpAggregator/Services/OrderApiClient.cs b/src/ApiGateways/Web.Bff.Shopping/aggregator/Services/OrderApiClient.cs similarity index 100% rename from src/Aggregators/Web.Shopping.HttpAggregator/Services/OrderApiClient.cs rename to src/ApiGateways/Web.Bff.Shopping/aggregator/Services/OrderApiClient.cs diff --git a/src/Aggregators/Web.Shopping.HttpAggregator/Startup.cs b/src/ApiGateways/Web.Bff.Shopping/aggregator/Startup.cs similarity index 100% rename from src/Aggregators/Web.Shopping.HttpAggregator/Startup.cs rename to src/ApiGateways/Web.Bff.Shopping/aggregator/Startup.cs diff --git a/src/Aggregators/Web.Shopping.HttpAggregator/Web.Shopping.HttpAggregator.csproj b/src/ApiGateways/Web.Bff.Shopping/aggregator/Web.Shopping.HttpAggregator.csproj similarity index 87% rename from src/Aggregators/Web.Shopping.HttpAggregator/Web.Shopping.HttpAggregator.csproj rename to src/ApiGateways/Web.Bff.Shopping/aggregator/Web.Shopping.HttpAggregator.csproj index fd04c8bee..0b6dbf44b 100644 --- a/src/Aggregators/Web.Shopping.HttpAggregator/Web.Shopping.HttpAggregator.csproj +++ b/src/ApiGateways/Web.Bff.Shopping/aggregator/Web.Shopping.HttpAggregator.csproj @@ -21,7 +21,7 @@ - + diff --git a/src/Aggregators/Web.Shopping.HttpAggregator/appsettings.json b/src/ApiGateways/Web.Bff.Shopping/aggregator/appsettings.json similarity index 100% rename from src/Aggregators/Web.Shopping.HttpAggregator/appsettings.json rename to src/ApiGateways/Web.Bff.Shopping/aggregator/appsettings.json diff --git a/src/Aggregators/Web.Shopping.HttpAggregator/appsettings.localhost.json b/src/ApiGateways/Web.Bff.Shopping/aggregator/appsettings.localhost.json similarity index 100% rename from src/Aggregators/Web.Shopping.HttpAggregator/appsettings.localhost.json rename to src/ApiGateways/Web.Bff.Shopping/aggregator/appsettings.localhost.json diff --git a/src/Apigw/configs/webshoppingapigw/configuration.json b/src/ApiGateways/Web.Bff.Shopping/apigw/configuration.json similarity index 100% rename from src/Apigw/configs/webshoppingapigw/configuration.json rename to src/ApiGateways/Web.Bff.Shopping/apigw/configuration.json From 181b475e3222a51f297f061f5e742dc736da663e Mon Sep 17 00:00:00 2001 From: eiximenis Date: Wed, 28 Feb 2018 13:13:18 +0100 Subject: [PATCH 28/78] MVC adapted to marketing bff apigw --- docker-compose.override.yml | 3 +- .../apigw/configuration.json | 35 ++++++++++++++++++- src/Web/WebMVC/AppSettings.cs | 1 - src/Web/WebMVC/Services/CampaignService.cs | 2 +- src/Web/WebMVC/Services/LocationService.cs | 2 +- 5 files changed, 37 insertions(+), 6 deletions(-) diff --git a/docker-compose.override.yml b/docker-compose.override.yml index dc01317a8..488868511 100644 --- a/docker-compose.override.yml +++ b/docker-compose.override.yml @@ -134,9 +134,8 @@ services: - ASPNETCORE_ENVIRONMENT=Development - ASPNETCORE_URLS=http://0.0.0.0:80 - PurchaseUrl=http://webshoppingapigw - - LocationsUrl=http://locations.api - IdentityUrl=http://10.0.75.1:5105 # Local Mac: Use http://docker.for.mac.localhost:5105 || Local Windows: Use 10.0.75.1 in a "Docker for Windows" environment, if using "localhost" from browser. || #Remote access: Use ${ESHOP_EXTERNAL_DNS_NAME_OR_IP} if using external IP or DNS name from browser. - - MarketingUrl=http://marketing.api + - MarketingUrl=http://webmarketingapigw - CatalogUrlHC=http://catalog.api/hc - OrderingUrlHC=http://ordering.api/hc - IdentityUrlHC=http://identity.api/hc #Local: Use ${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}, if using external IP or DNS name from browser. diff --git a/src/ApiGateways/Web.Bff.Marketing/apigw/configuration.json b/src/ApiGateways/Web.Bff.Marketing/apigw/configuration.json index 22fdca1b2..8afe4a4d6 100644 --- a/src/ApiGateways/Web.Bff.Marketing/apigw/configuration.json +++ b/src/ApiGateways/Web.Bff.Marketing/apigw/configuration.json @@ -1 +1,34 @@ -{} \ No newline at end of file +{ + "ReRoutes": [ + { + "DownstreamPathTemplate": "/api/{version}/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "marketing.api", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/api/{version}/m/{everything}", + "UpstreamHttpMethod": [] + }, + { + "DownstreamPathTemplate": "/api/{version}/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "locations.api", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/api/{version}/l/{everything}", + "UpstreamHttpMethod": [] + } + + ], + "GlobalConfiguration": { + "RequestIdKey": "OcRequestId", + "AdministrationPath": "/administration" + } +} + \ No newline at end of file diff --git a/src/Web/WebMVC/AppSettings.cs b/src/Web/WebMVC/AppSettings.cs index d235910b0..1f11e750e 100644 --- a/src/Web/WebMVC/AppSettings.cs +++ b/src/Web/WebMVC/AppSettings.cs @@ -9,7 +9,6 @@ namespace Microsoft.eShopOnContainers.WebMVC { public Connectionstrings ConnectionStrings { get; set; } public string MarketingUrl { get; set; } - public string LocationsUrl { get; set; } public string PurchaseUrl { get; set; } public bool ActivateCampaignDetailFunction { get; set; } diff --git a/src/Web/WebMVC/Services/CampaignService.cs b/src/Web/WebMVC/Services/CampaignService.cs index 6190e74d6..7d61c9e7a 100644 --- a/src/Web/WebMVC/Services/CampaignService.cs +++ b/src/Web/WebMVC/Services/CampaignService.cs @@ -26,7 +26,7 @@ _apiClient = httpClient; _logger = logger; - _remoteServiceBaseUrl = $"{_settings.Value.MarketingUrl}/api/v1/campaigns/"; + _remoteServiceBaseUrl = $"{_settings.Value.MarketingUrl}/api/v1/m/campaigns/"; _httpContextAccesor = httpContextAccesor ?? throw new ArgumentNullException(nameof(httpContextAccesor)); } diff --git a/src/Web/WebMVC/Services/LocationService.cs b/src/Web/WebMVC/Services/LocationService.cs index 652484f4b..8bbdf743a 100644 --- a/src/Web/WebMVC/Services/LocationService.cs +++ b/src/Web/WebMVC/Services/LocationService.cs @@ -27,7 +27,7 @@ namespace WebMVC.Services _apiClient = httpClient; _logger = logger; - _remoteServiceBaseUrl = $"{_settings.Value.LocationsUrl}/api/v1/locations/"; + _remoteServiceBaseUrl = $"{_settings.Value.MarketingUrl}/api/v1/l/locations/"; _httpContextAccesor = httpContextAccesor ?? throw new ArgumentNullException(nameof(httpContextAccesor)); } From a34ed284458b631f2fc015dd9ff2948e0bbb6a48 Mon Sep 17 00:00:00 2001 From: eiximenis Date: Wed, 28 Feb 2018 15:40:22 +0100 Subject: [PATCH 29/78] SPA adapted to gateway --- docker-compose.override.yml | 3 +-- src/Web/WebSPA/Client/modules/campaigns/campaigns.service.ts | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/docker-compose.override.yml b/docker-compose.override.yml index 488868511..e656f753f 100644 --- a/docker-compose.override.yml +++ b/docker-compose.override.yml @@ -114,9 +114,8 @@ services: - ASPNETCORE_ENVIRONMENT=Development - ASPNETCORE_URLS=http://0.0.0.0:80 - IdentityUrl=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5105 #Local: You need to open your local dev-machine firewall at range 5100-5105. at range 5100-5105. - - MarketingUrl=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5110 - - LocationsUrl=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5109 - PurchaseUrl=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5202 + - MarketingUrl=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5203 - CatalogUrlHC=http://catalog.api/hc - OrderingUrlHC=http://ordering.api/hc - IdentityUrlHC=http://identity.api/hc #Local: Use ${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}, if using external IP or DNS name from browser. diff --git a/src/Web/WebSPA/Client/modules/campaigns/campaigns.service.ts b/src/Web/WebSPA/Client/modules/campaigns/campaigns.service.ts index bd1678f44..2a8973322 100644 --- a/src/Web/WebSPA/Client/modules/campaigns/campaigns.service.ts +++ b/src/Web/WebSPA/Client/modules/campaigns/campaigns.service.ts @@ -33,7 +33,7 @@ export class CampaignsService { } getCampaigns(pageIndex: number, pageSize: number): Observable { - let url = this.marketingUrl + '/api/v1/campaigns/user'; + let url = this.marketingUrl + '/api/v1/m/campaigns/user'; url = url + '?pageIndex=' + pageIndex + '&pageSize=' + pageSize; return this.service.get(url).map((response: Response) => { @@ -42,7 +42,7 @@ export class CampaignsService { } getCampaign(id: number): Observable { - let url = this.marketingUrl + '/api/v1/campaigns/' + id; + let url = this.marketingUrl + '/api/v1/m/campaigns/' + id; return this.service.get(url).map((response: Response) => { return response.json(); From 5bb67596b9f7059ee9155d99ce614047a5ce5401 Mon Sep 17 00:00:00 2001 From: eiximenis Date: Wed, 14 Mar 2018 18:25:26 +0100 Subject: [PATCH 30/78] k8s config updated --- docker-compose.yml | 12 +- k8s/conf_cloud.yml | 14 +- k8s/conf_local.yml | 37 +- k8s/deploy.ps1 | 68 ++- k8s/deployments.yaml | 440 +++++++++--------- k8s/ingress.yaml | 46 +- k8s/internalurls.yaml | 31 ++ .../configuration-mobile-marketing.json | 34 ++ k8s/ocelot/configuration-mobile-shopping.json | 142 ++++++ k8s/ocelot/configuration-web-marketing.json | 34 ++ k8s/ocelot/configuration-web-shopping.json | 142 ++++++ k8s/ocelot/configuration.json | 58 --- k8s/ocelot/deployment.yaml | 136 +++++- k8s/ocelot/service.yaml | 48 +- src/ApiGateways/ApiGw-Base/Startup.cs | 6 + .../apigw/configuration.json | 35 +- .../apigw/configuration.json | 143 +++++- 17 files changed, 1046 insertions(+), 380 deletions(-) create mode 100644 k8s/internalurls.yaml create mode 100644 k8s/ocelot/configuration-mobile-marketing.json create mode 100644 k8s/ocelot/configuration-mobile-shopping.json create mode 100644 k8s/ocelot/configuration-web-marketing.json create mode 100644 k8s/ocelot/configuration-web-shopping.json delete mode 100644 k8s/ocelot/configuration.json diff --git a/docker-compose.yml b/docker-compose.yml index f1bd68076..39a0217be 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -109,37 +109,37 @@ services: image: rabbitmq:3-management-alpine mobileshoppingapigw: - image: eshop/ocelotapigw-ms + image: eshop/ocelotapigw-ms:${TAG:-latest} build: context: . dockerfile: src/ApiGateways/ApiGw-Base/Dockerfile mobilemarketingapigw: - image: eshop/ocelotapigw-mm + image: eshop/ocelotapigw-mm:${TAG:-latest} build: context: . dockerfile: src/ApiGateways/ApiGw-Base/Dockerfile2 webshoppingapigw: - image: eshop/ocelotapigw-ws + image: eshop/ocelotapigw-ws:${TAG:-latest} build: context: . dockerfile: src/ApiGateways/ApiGw-Base/Dockerfile3 webmarketingapigw: - image: eshop/ocelotapigw-wm + image: eshop/ocelotapigw-wm:${TAG:-latest} build: context: . dockerfile: src/ApiGateways/ApiGw-Base/Dockerfile mobileshoppingagg: - image: eshop/mobileshoppingagg + image: eshop/mobileshoppingagg:${TAG:-latest} build: context: . dockerfile: src/ApiGateways/Mobile.Bff.Shopping/aggregator/Dockerfile webshoppingagg: - image: eshop/webshoppingagg + image: eshop/webshoppingagg:${TAG:-latest} build: context: . dockerfile: src/ApiGateways/Web.Bff.Shopping/aggregator/Dockerfile diff --git a/k8s/conf_cloud.yml b/k8s/conf_cloud.yml index 0f079fd3f..891de14bc 100644 --- a/k8s/conf_cloud.yml +++ b/k8s/conf_cloud.yml @@ -4,13 +4,11 @@ metadata: name: externalcfg labels: app: eshop -data: +data: # Basket.API entries - BasketBus: CONNECTION_STRING (NAME OF RABBITMQ CONTAINER OR Endpoint=sb://XXXX in case of using Azure) - BasketRedisConStr: REDIS CONNECTION STRING FOR BASKET + basket__ConnectionString: REDIS CONNECTION STRING FOR BASKET # Catalog.API entries - CatalogBus: CONNECTION_STRING (NAME OF RABBITMQ CONTAINER OR Endpoint=sb://XXXX in case of using Azure) - CatalogSqlDb: Catalog SQL SERVER CONNECTION STRING (Server=xxxx;Intial Catalog=yyy;....) + catalog__ConnectionString: Catalog SQL SERVER CONNECTION STRING (Server=xxxx;Intial Catalog=yyy;....) # Identity.API entries IdentitySqlDb: Identity SQL SERVER CONNECTION STRING (Server=xxxx;Intial Catalog=yyy;....) # Locations.API entries @@ -30,5 +28,7 @@ data: # Payment.API entries PaymentBus: CONNECTION_STRING (NAME OF RABBITMQ CONTAINER OR Endpoint=sb://XXXX in case of using Azure) # Global entries - UseAzureServiceBus: "TRUE" IF USE AZURE SB ("FALSE" FOR USING RABBITMQ) - keystore: REDIS CONNECTION STRING FOR KEYSTORE \ No newline at end of file + all_UseAzureServiceBus: "TRUE" IF USE AZURE SB ("FALSE" FOR USING RABBITMQ) + keystore: REDIS CONNECTION STRING FOR KEYSTORE + all_EventBusConnection: CONNECTION_STRING (NAME OF RABBITMQ CONTAINER OR Endpoint=sb://XXXX in case of using Azure) + all_InstrumentationKey: APPINSIGHTS KEY \ No newline at end of file diff --git a/k8s/conf_local.yml b/k8s/conf_local.yml index 9a2059e63..615754bcf 100644 --- a/k8s/conf_local.yml +++ b/k8s/conf_local.yml @@ -5,28 +5,23 @@ metadata: labels: app: eshop data: - BasketBus: rabbitmq - BasketRedisConStr: basket-data - CatalogBus: rabbitmq - CatalogSqlDb: Server=sql-data;Initial Catalog=Microsoft.eShopOnContainers.Services.CatalogDb;User Id=sa;Password=Pass@word; - CatalogAzureStorageEnabled: "False" - IdentitySqlDb: Server=sql-data;Initial Catalog=Microsoft.eShopOnContainers.Services.IdentityDb;User Id=sa;Password=Pass@word; - LocationsBus: rabbitmq - LocationsNoSqlDb: mongodb://nosql-data - LocationsNoSqlDbName: LocationsDb - MarketingBus: rabbitmq - MarketingNoSqlDb: mongodb://nosql-data - MarketingNoSqlDbName: MarketingDb - MarketingSqlDb: Server=sql-data;Initial Catalog=Microsoft.eShopOnContainers.Services.MarketingDb;User Id=sa;Password=Pass@word; - OrderingBus: rabbitmq - OrderingSqlDb: Server=sql-data;Initial Catalog=Microsoft.eShopOnContainers.Services.OrderingDb;User Id=sa;Password=Pass@word; - PaymentBus: rabbitmq - UseAzureServiceBus: "False" - EnableLoadTest: "False" + basket__ConnectionString: basket-data + catalog__ConnectionString: Server=sql-data;Initial Catalog=Microsoft.eShopOnContainers.Services.CatalogDb;User Id=sa;Password=Pass@word; + catalog__AzureStorageEnabled: "False" + identity__ConnectionString: Server=sql-data;Initial Catalog=Microsoft.eShopOnContainers.Services.IdentityDb;User Id=sa;Password=Pass@word; + locations__ConnectionString: mongodb://nosql-data + locations__Database: LocationsDb + marketing__MongoConnectionString: mongodb://nosql-data + marketing__MongoDatabase: MarketingDb + marketing__ConnectionString: Server=sql-data;Initial Catalog=Microsoft.eShopOnContainers.Services.MarketingDb;User Id=sa;Password=Pass@word; + ordering__ConnectionString: Server=sql-data;Initial Catalog=Microsoft.eShopOnContainers.Services.OrderingDb;User Id=sa;Password=Pass@word; keystore: keystore-data - GracePeriodManager_GracePeriodTime: "1" - GracePeriodManager_CheckUpdateTime: "15000" - Instrumentation_Key: "" + GracePeriodManager__GracePeriodTime: "1" + GracePeriodManager__CheckUpdateTime: "15000" + all__EventBusConnection: rabbitmq + all__InstrumentationKey: "" + all__EnableLoadTest: "False" + all__UseAzureServiceBus: "False" diff --git a/k8s/deploy.ps1 b/k8s/deploy.ps1 index 3d9c54b5c..1ac5a2770 100644 --- a/k8s/deploy.ps1 +++ b/k8s/deploy.ps1 @@ -65,7 +65,7 @@ if ($buildImages) { docker-compose -p .. -f ../docker-compose.yml build Write-Host "Pushing images to $registry/$dockerOrg..." -ForegroundColor Yellow - $services = ("basket.api", "catalog.api", "identity.api", "ordering.api", "marketing.api","payment.api","locations.api", "webmvc", "webspa", "webstatus", "ocelotapigw") + $services = ("basket.api", "catalog.api", "identity.api", "ordering.api", "marketing.api","payment.api","locations.api", "webmvc", "webspa", "webstatus", "ocelotapigw-mm", "ocelotapigw-ms", "ocelotapigw-wm", "ocelotapigw-ws", "mobileshoppingagg", "webshoppingagg") foreach ($service in $services) { $imageFqdn = if ($useDockerHub) {"$dockerOrg/${service}"} else {"$registry/$dockerOrg/${service}"} @@ -103,6 +103,7 @@ if (-not [string]::IsNullOrEmpty($dockerUser)) { Write-Host "Removing existing services & deployments.." -ForegroundColor Yellow ExecKube -cmd 'delete deployments --all' ExecKube -cmd 'delete services --all' +ExecKube -cmd 'delete configmap internalurls' ExecKube -cmd 'delete configmap urls' ExecKube -cmd 'delete configmap externalcfg' ExecKube -cmd 'delete configmap ocelot' @@ -116,47 +117,28 @@ if ($deployInfrastructure) { Write-Host 'Deploying ocelot APIGW' -ForegroundColor Yellow -ExecKube "create configmap ocelot --from-file=ocelot/configuration.json" +ExecKube "create configmap ocelot --from-file=mm=ocelot/configuration-mobile-marketing.json --from-file=ms=ocelot/configuration-mobile-shopping.json --from-file=wm=ocelot/configuration-web-marketing.json --from-file=ws=ocelot/configuration-web-shopping.json " ExecKube -cmd "apply -f ocelot/deployment.yaml" ExecKube -cmd "apply -f ocelot/service.yaml" Write-Host 'Deploying code deployments (Web APIs, Web apps, ...)' -ForegroundColor Yellow ExecKube -cmd 'create -f services.yaml' +ExecKube -cmd 'create -f internalurls.yaml' ExecKube -cmd 'create configmap urls ` - --from-literal=BasketUrl=http://basket ` - --from-literal=BasketHealthCheckUrl=http://basket/hc ` - --from-literal=CatalogUrl=http://$($externalDns)/catalog-api ` - --from-literal=CatalogHealthCheckUrl=http://catalog/hc ` - --from-literal=PicBaseUrl=http://$($externalDns)/catalog-api/api/v1/catalog/items/[0]/pic/ ` - --from-literal=Marketing_PicBaseUrl=http://$($externalDns)/marketing-api/api/v1/campaigns/[0]/pic/ ` - --from-literal=IdentityUrl=http://$($externalDns)/identity ` - --from-literal=IdentityHealthCheckUrl=http://identity/hc ` - --from-literal=OrderingUrl=http://ordering ` - --from-literal=OrderingHealthCheckUrl=http://ordering/hc ` - --from-literal=MvcClientExternalUrl=http://$($externalDns)/webmvc ` - --from-literal=WebMvcHealthCheckUrl=http://webmvc/hc ` - --from-literal=MvcClientOrderingUrl=http://ordering ` - --from-literal=MvcClientCatalogUrl=http://catalog ` - --from-literal=MvcClientBasketUrl=http://basket ` - --from-literal=MvcClientMarketingUrl=http://marketing ` - --from-literal=MvcClientLocationsUrl=http://locations ` - --from-literal=MarketingHealthCheckUrl=http://marketing/hc ` - --from-literal=WebSpaHealthCheckUrl=http://webspa/hc ` - --from-literal=SpaClientMarketingExternalUrl=http://$($externalDns)/marketing-api ` - --from-literal=SpaClientOrderingExternalUrl=http://$($externalDns)/ordering-api ` - --from-literal=SpaClientCatalogExternalUrl=http://$($externalDns)/catalog-api ` - --from-literal=SpaClientBasketExternalUrl=http://$($externalDns)/basket-api ` - --from-literal=SpaClientIdentityExternalUrl=http://$($externalDns)/identity ` - --from-literal=SpaClientLocationsUrl=http://$($externalDns)/locations-api ` - --from-literal=LocationsHealthCheckUrl=http://locations/hc ` - --from-literal=SpaClientExternalUrl=http://$($externalDns) ` - --from-literal=LocationApiClient=http://$($externalDns)/locations-api ` - --from-literal=MarketingApiClient=http://$($externalDns)/marketing-api ` - --from-literal=BasketApiClient=http://$($externalDns)/basket-api ` - --from-literal=OrderingApiClient=http://$($externalDns)/ordering-api ` - --from-literal=PaymentHealthCheckUrl=http://payment/hc' - + --from-literal=PicBaseUrl=http://$($externalDns)/webshoppingapigw/api/v1/c/catalog/items/[0]/pic/ ` + --from-literal=Marketing_PicBaseUrl=http://$($externalDns)/webmarketingapigw/api/v1/m/campaigns/[0]/pic/ ` + --from-literal=mvc_e=http://$($externalDns)/webmvc ` + --from-literal=marketingapigw_e=http://$($externalDns)/webmarketingapigw ` + --from-literal=webshoppingapigw_e=http://$($externalDns)/webshoppingapigw ` + --from-literal=mobileshoppingagg_e=http://$($externalDns)/mobileshoppingagg ` + --from-literal=webshoppingagg_e=http://$($externalDns)/webshoppingagg ` + --from-literal=identity_e=http://$($externalDns)/identity ` + --from-literal=spa_e=http://$($externalDns) ` + --from-literal=locations_e=http://$($externalDns)/locations-api ` + --from-literal=marketing_e=http://$($externalDns)/marketing-api ` + --from-literal=basket_e=http://$($externalDns)/basket-api ` + --from-literal=ordering_e=http://$($externalDns)/ordering-api ' ExecKube -cmd 'label configmap urls app=eshop' @@ -184,7 +166,14 @@ ExecKube -cmd 'set image deployments/payment payment=${registryPath}${dockerOrg} ExecKube -cmd 'set image deployments/webmvc webmvc=${registryPath}${dockerOrg}/webmvc:$imageTag' ExecKube -cmd 'set image deployments/webstatus webstatus=${registryPath}${dockerOrg}/webstatus:$imageTag' ExecKube -cmd 'set image deployments/webspa webspa=${registryPath}${dockerOrg}/webspa:$imageTag' -ExecKube -cmd 'set image deployments/ocelot ocelot=${registryPath}${dockerOrg}/ocelotapigw:$imageTag' + +ExecKube -cmd 'set image deployments/mobileshoppingagg mobileshoppingagg=${registryPath}${dockerOrg}/mobileshoppingagg:$imageTag' +ExecKube -cmd 'set image deployments/webshoppingagg webshoppingagg=${registryPath}${dockerOrg}/webshoppingagg:$imageTag' + +ExecKube -cmd 'set image deployments/apigwmm apigwmm=${registryPath}${dockerOrg}/ocelotapigw-mm:$imageTag' +ExecKube -cmd 'set image deployments/apigwms apigwms=${registryPath}${dockerOrg}/ocelotapigw-ms:$imageTag' +ExecKube -cmd 'set image deployments/apigwwm apigwwm=${registryPath}${dockerOrg}/ocelotapigw-wm:$imageTag' +ExecKube -cmd 'set image deployments/apigwws apigwws=${registryPath}${dockerOrg}/ocelotapigw-ws:$imageTag' Write-Host "Execute rollout..." -ForegroundColor Yellow ExecKube -cmd 'rollout resume deployments/basket' @@ -197,7 +186,12 @@ ExecKube -cmd 'rollout resume deployments/payment' ExecKube -cmd 'rollout resume deployments/webmvc' ExecKube -cmd 'rollout resume deployments/webstatus' ExecKube -cmd 'rollout resume deployments/webspa' -ExecKube -cmd 'rollout resume deployments/ocelot' +ExecKube -cmd 'rollout resume deployments/mobileshoppingagg' +ExecKube -cmd 'rollout resume deployments/webshoppingagg' +ExecKube -cmd 'rollout resume deployments/apigwmm' +ExecKube -cmd 'rollout resume deployments/apigwms' +ExecKube -cmd 'rollout resume deployments/apigwwm' +ExecKube -cmd 'rollout resume deployments/apigwws' Write-Host "WebSPA is exposed at http://$externalDns, WebMVC at http://$externalDns/webmvc, WebStatus at http://$externalDns/webstatus" -ForegroundColor Yellow diff --git a/k8s/deployments.yaml b/k8s/deployments.yaml index 9935b83d7..10007fe4c 100644 --- a/k8s/deployments.yaml +++ b/k8s/deployments.yaml @@ -21,32 +21,32 @@ spec: valueFrom: configMapKeyRef: name: externalcfg - key: BasketRedisConStr + key: basket__ConnectionString - name: EventBusConnection valueFrom: configMapKeyRef: name: externalcfg - key: BasketBus + key: all__EventBusConnection - name: AzureServiceBusEnabled valueFrom: configMapKeyRef: name: externalcfg - key: UseAzureServiceBus + key: all__UseAzureServiceBus - name: ApplicationInsights__InstrumentationKey valueFrom: configMapKeyRef: name: externalcfg - key: Instrumentation_Key + key: all__InstrumentationKey - name: IdentityUrl valueFrom: configMapKeyRef: name: urls - key: IdentityUrl + key: identity_e - name: UseLoadTest valueFrom: configMapKeyRef: name: externalcfg - key: EnableLoadTest + key: all__EnableLoadTest - name: OrchestratorType value: 'K8S' ports: @@ -56,15 +56,8 @@ spec: path: /hc port: 80 scheme: HTTP - initialDelaySeconds: 5 - periodSeconds: 10 - livenessProbe: - httpGet: - path: /hc - port: 80 - scheme: HTTP - initialDelaySeconds: 60 - periodSeconds: 10 + initialDelaySeconds: 300 + periodSeconds: 240 imagePullSecrets: - name: registry-key --- @@ -91,7 +84,7 @@ spec: valueFrom: configMapKeyRef: name: externalcfg - key: CatalogSqlDb + key: catalog__ConnectionString - name: PicBaseUrl valueFrom: configMapKeyRef: @@ -101,17 +94,17 @@ spec: valueFrom: configMapKeyRef: name: externalcfg - key: CatalogAzureStorageEnabled + key: catalog__AzureStorageEnabled - name: EventBusConnection valueFrom: configMapKeyRef: name: externalcfg - key: CatalogBus + key: all__EventBusConnection - name: ApplicationInsights__InstrumentationKey valueFrom: configMapKeyRef: name: externalcfg - key: Instrumentation_Key + key: all__InstrumentationKey - name: OrchestratorType value: 'K8S' ports: @@ -121,15 +114,8 @@ spec: path: /hc port: 80 scheme: HTTP - initialDelaySeconds: 5 - periodSeconds: 10 - livenessProbe: - httpGet: - path: /hc - port: 80 - scheme: HTTP - initialDelaySeconds: 60 - periodSeconds: 10 + initialDelaySeconds: 300 + periodSeconds: 240 imagePullSecrets: - name: registry-key --- @@ -156,7 +142,7 @@ spec: valueFrom: configMapKeyRef: name: externalcfg - key: IdentitySqlDb + key: identity__ConnectionString - name: DPConnectionString valueFrom: configMapKeyRef: @@ -168,37 +154,47 @@ spec: valueFrom: configMapKeyRef: name: urls - key: MvcClientExternalUrl + key: mvc_e - name: SpaClient valueFrom: configMapKeyRef: name: urls - key: SpaClientExternalUrl + key: spa_e - name: LocationApiClient valueFrom: configMapKeyRef: name: urls - key: LocationApiClient + key: locations_e - name: MarketingApiClient valueFrom: configMapKeyRef: name: urls - key: MarketingApiClient + key: marketing_e - name: BasketApiClient valueFrom: configMapKeyRef: name: urls - key: BasketApiClient + key: basket_e - name: OrderingApiClient valueFrom: configMapKeyRef: name: urls - key: OrderingApiClient + key: ordering_e + - name: MobileShoppingAggClient + valueFrom: + configMapKeyRef: + name: urls + key: mobileshoppingagg_e + - name: WebShoppingAggClient + valueFrom: + configMapKeyRef: + name: urls + key: webshoppingagg_e - name: ApplicationInsights__InstrumentationKey valueFrom: configMapKeyRef: name: externalcfg - key: Instrumentation_Key + key: all__InstrumentationKey - name: OrchestratorType value: 'K8S' ports: @@ -208,15 +204,8 @@ spec: path: /hc port: 80 scheme: HTTP - initialDelaySeconds: 5 - periodSeconds: 10 - livenessProbe: - httpGet: - path: /hc - port: 80 - scheme: HTTP - initialDelaySeconds: 60 - periodSeconds: 10 + initialDelaySeconds: 300 + periodSeconds: 240 imagePullSecrets: - name: registry-key --- @@ -243,42 +232,42 @@ spec: valueFrom: configMapKeyRef: name: externalcfg - key: OrderingSqlDb + key: ordering__ConnectionString - name: EventBusConnection valueFrom: configMapKeyRef: name: externalcfg - key: OrderingBus + key: all__EventBusConnection - name: AzureServiceBusEnabled valueFrom: configMapKeyRef: name: externalcfg - key: UseAzureServiceBus + key: all__UseAzureServiceBus - name: IdentityUrl valueFrom: configMapKeyRef: name: urls - key: IdentityUrl + key: identity_e - name: CheckUpdateTime valueFrom: configMapKeyRef: name: externalcfg - key: GracePeriodManager_CheckUpdateTime + key: GracePeriodManager__CheckUpdateTime - name: GracePeriodTime valueFrom: configMapKeyRef: name: externalcfg - key: GracePeriodManager_GracePeriodTime + key: GracePeriodManager__GracePeriodTime - name: ApplicationInsights__InstrumentationKey valueFrom: configMapKeyRef: name: externalcfg - key: Instrumentation_Key + key: all__InstrumentationKey - name: UseLoadTest valueFrom: configMapKeyRef: name: externalcfg - key: EnableLoadTest + key: all__EnableLoadTest - name: OrchestratorType value: 'K8S' ports: @@ -288,15 +277,8 @@ spec: path: /hc port: 80 scheme: HTTP - initialDelaySeconds: 5 - periodSeconds: 10 - livenessProbe: - httpGet: - path: /hc - port: 80 - scheme: HTTP - initialDelaySeconds: 60 - periodSeconds: 10 + initialDelaySeconds: 300 + periodSeconds: 240 imagePullSecrets: - name: registry-key --- @@ -323,42 +305,42 @@ spec: valueFrom: configMapKeyRef: name: externalcfg - key: LocationsNoSqlDb + key: locations__ConnectionString - name: Database valueFrom: configMapKeyRef: name: externalcfg - key: LocationsNoSqlDbName + key: locations__Database - name: AzureServiceBusEnabled valueFrom: configMapKeyRef: name: externalcfg - key: UseAzureServiceBus + key: all__UseAzureServiceBus - name: EventBusConnection valueFrom: configMapKeyRef: name: externalcfg - key: LocationsBus + key: all__EventBusConnection - name: IdentityUrl valueFrom: configMapKeyRef: - name: urls - key: IdentityUrl + name: internalurls + key: identity - name: IdentityUrlExternal valueFrom: configMapKeyRef: name: urls - key: IdentityUrl + key: identity_e - name: ApplicationInsights__InstrumentationKey valueFrom: configMapKeyRef: name: externalcfg - key: Instrumentation_Key + key: all__InstrumentationKey - name: UseLoadTest valueFrom: configMapKeyRef: name: externalcfg - key: EnableLoadTest + key: all__EnableLoadTest - name: OrchestratorType value: 'K8S' ports: @@ -368,15 +350,8 @@ spec: path: /hc port: 80 scheme: HTTP - initialDelaySeconds: 5 - periodSeconds: 10 - livenessProbe: - httpGet: - path: /hc - port: 80 - scheme: HTTP - initialDelaySeconds: 60 - periodSeconds: 10 + initialDelaySeconds: 300 + periodSeconds: 240 imagePullSecrets: - name: registry-key --- @@ -403,37 +378,37 @@ spec: valueFrom: configMapKeyRef: name: externalcfg - key: MarketingSqlDb + key: marketing__ConnectionString - name: MongoConnectionString valueFrom: configMapKeyRef: name: externalcfg - key: MarketingNoSqlDb + key: marketing__MongoConnectionString - name: MongoDatabase valueFrom: configMapKeyRef: name: externalcfg - key: MarketingNoSqlDbName + key: marketing__MongoDatabase - name: AzureServiceBusEnabled valueFrom: configMapKeyRef: name: externalcfg - key: UseAzureServiceBus + key: all__UseAzureServiceBus - name: EventBusConnection valueFrom: configMapKeyRef: name: externalcfg - key: MarketingBus + key: all__EventBusConnection - name: IdentityUrl valueFrom: configMapKeyRef: - name: urls - key: IdentityUrl + name: internalurls + key: identity - name: IdentityUrlExternal valueFrom: configMapKeyRef: name: urls - key: IdentityUrl + key: identity_e - name: PicBaseUrl valueFrom: configMapKeyRef: @@ -443,12 +418,12 @@ spec: valueFrom: configMapKeyRef: name: externalcfg - key: Instrumentation_Key + key: all__InstrumentationKey - name: UseLoadTest valueFrom: configMapKeyRef: name: externalcfg - key: EnableLoadTest + key: all__EnableLoadTest - name: OrchestratorType value: 'K8S' ports: @@ -458,15 +433,8 @@ spec: path: /hc port: 80 scheme: HTTP - initialDelaySeconds: 5 - periodSeconds: 10 - livenessProbe: - httpGet: - path: /hc - port: 80 - scheme: HTTP - initialDelaySeconds: 60 - periodSeconds: 10 + initialDelaySeconds: 300 + periodSeconds: 240 imagePullSecrets: - name: registry-key --- @@ -493,17 +461,17 @@ spec: valueFrom: configMapKeyRef: name: externalcfg - key: UseAzureServiceBus + key: all__UseAzureServiceBus - name: EventBusConnection valueFrom: configMapKeyRef: name: externalcfg - key: PaymentBus + key: all__EventBusConnection - name: ApplicationInsights__InstrumentationKey valueFrom: configMapKeyRef: name: externalcfg - key: Instrumentation_Key + key: all__InstrumentationKey - name: OrchestratorType value: 'K8S' ports: @@ -513,15 +481,8 @@ spec: path: /hc port: 80 scheme: HTTP - initialDelaySeconds: 5 - periodSeconds: 10 - livenessProbe: - httpGet: - path: /hc - port: 80 - scheme: HTTP - initialDelaySeconds: 60 - periodSeconds: 10 + initialDelaySeconds: 300 + periodSeconds: 240 imagePullSecrets: - name: registry-key --- @@ -551,81 +512,66 @@ spec: key: keystore - name: IsClusterEnv value: 'True' - - name: BasketUrl + - name: PurchaseUrl valueFrom: configMapKeyRef: - name: urls - key: MvcClientBasketUrl + name: internalurls + key: apigwws - name: CallBackUrl valueFrom: configMapKeyRef: name: urls - key: MvcClientExternalUrl - - name: LocationsUrl - valueFrom: - configMapKeyRef: - name: urls - key: MvcClientLocationsUrl - - name: CatalogUrl - valueFrom: - configMapKeyRef: - name: urls - key: MvcClientCatalogUrl + key: mvc_e - name: IdentityUrl valueFrom: configMapKeyRef: name: urls - key: IdentityUrl - - name: OrderingUrl - valueFrom: - configMapKeyRef: - name: urls - key: MvcClientOrderingUrl + key: identity_e - name: MarketingUrl valueFrom: configMapKeyRef: - name: urls - key: MvcClientMarketingUrl + name: internalurls + key: apigwwm - name: BasketUrlHC valueFrom: configMapKeyRef: - name: urls - key: BasketHealthCheckUrl + name: internalurls + key: basket__hc - name: CatalogUrlHC valueFrom: configMapKeyRef: - name: urls - key: CatalogHealthCheckUrl + name: internalurls + key: catalog__hc - name: IdentityUrlHC valueFrom: configMapKeyRef: - name: urls - key: IdentityHealthCheckUrl + name: internalurls + key: identity__hc - name: OrderingUrlHC valueFrom: configMapKeyRef: - name: urls - key: OrderingHealthCheckUrl + name: internalurls + key: ordering__hc - name: MarketingUrlHC valueFrom: configMapKeyRef: - name: urls - key: MarketingHealthCheckUrl + name: internalurls + key: marketing__hc - name: PaymentUrlHC valueFrom: configMapKeyRef: - name: urls - key: PaymentHealthCheckUrl + name: internalurls + key: payment__hc - name: ApplicationInsights__InstrumentationKey valueFrom: configMapKeyRef: name: externalcfg - key: Instrumentation_Key + key: all__InstrumentationKey - name: UseLoadTest valueFrom: configMapKeyRef: name: externalcfg - key: EnableLoadTest + key: all__EnableLoadTest - name: OrchestratorType value: 'K8S' ports: @@ -635,15 +581,8 @@ spec: path: /hc port: 80 scheme: HTTP - initialDelaySeconds: 5 - periodSeconds: 10 - livenessProbe: - httpGet: - path: /hc - port: 80 - scheme: HTTP - initialDelaySeconds: 60 - periodSeconds: 10 + initialDelaySeconds: 300 + periodSeconds: 240 imagePullSecrets: - name: registry-key --- @@ -669,53 +608,53 @@ spec: - name: BasketUrl valueFrom: configMapKeyRef: - name: urls - key: BasketHealthCheckUrl + name: internalurls + key: basket__hc - name: CatalogUrl valueFrom: configMapKeyRef: - name: urls - key: CatalogHealthCheckUrl + name: internalurls + key: catalog__hc - name: IdentityUrl valueFrom: configMapKeyRef: - name: urls - key: IdentityHealthCheckUrl + name: internalurls + key: identity__hc - name: OrderingUrl valueFrom: configMapKeyRef: - name: urls - key: OrderingHealthCheckUrl + name: internalurls + key: ordering__hc - name: LocationsUrl valueFrom: configMapKeyRef: - name: urls - key: LocationsHealthCheckUrl + name: internalurls + key: locations__hc - name: MarketingUrl valueFrom: configMapKeyRef: - name: urls - key: MarketingHealthCheckUrl + name: internalurls + key: marketing__hc - name: mvc valueFrom: configMapKeyRef: - name: urls - key: WebMvcHealthCheckUrl + name: internalurls + key: mvc__hc - name: spa valueFrom: configMapKeyRef: - name: urls - key: WebSpaHealthCheckUrl + name: internalurls + key: spa__hc - name: PaymentUrl valueFrom: configMapKeyRef: - name: urls - key: PaymentHealthCheckUrl + name: internalurls + key: payment__hc - name: ApplicationInsights__InstrumentationKey valueFrom: configMapKeyRef: name: externalcfg - key: Instrumentation_Key + key: all__InstrumentationKey - name: OrchestratorType value: 'K8S' ports: @@ -749,76 +688,61 @@ spec: key: keystore - name: IsClusterEnv value: 'True' - - name: BasketUrl + - name: PurchaseUrl valueFrom: configMapKeyRef: name: urls - key: SpaClientBasketExternalUrl + key: webshoppingapigw_e - name: CallBackUrl valueFrom: configMapKeyRef: name: urls - key: SpaClientExternalUrl - - name: CatalogUrl - valueFrom: - configMapKeyRef: - name: urls - key: SpaClientCatalogExternalUrl + key: spa_e - name: IdentityUrl valueFrom: configMapKeyRef: name: urls - key: SpaClientIdentityExternalUrl - - name: OrderingUrl - valueFrom: - configMapKeyRef: - name: urls - key: SpaClientOrderingExternalUrl + key: identity_e - name: MarketingUrl valueFrom: configMapKeyRef: name: urls - key: SpaClientMarketingExternalUrl - - name: LocationsUrl - valueFrom: - configMapKeyRef: - name: urls - key: SpaClientLocationsUrl + key: marketingapigw_e - name: BasketUrlHC valueFrom: configMapKeyRef: - name: urls - key: BasketHealthCheckUrl + name: internalurls + key: basket__hc - name: CatalogUrlHC valueFrom: configMapKeyRef: - name: urls - key: CatalogHealthCheckUrl + name: internalurls + key: catalog__hc - name: IdentityUrlHC valueFrom: configMapKeyRef: - name: urls - key: IdentityHealthCheckUrl + name: internalurls + key: identity__hc - name: OrderingUrlHC valueFrom: configMapKeyRef: - name: urls - key: OrderingHealthCheckUrl + name: internalurls + key: ordering__hc - name: MarketingUrlHC valueFrom: configMapKeyRef: - name: urls - key: MarketingHealthCheckUrl + name: internalurls + key: marketing__hc - name: PaymentUrlHC valueFrom: configMapKeyRef: - name: urls - key: PaymentHealthCheckUrl + name: internalurls + key: payment__hc - name: ApplicationInsights__InstrumentationKey valueFrom: configMapKeyRef: name: externalcfg - key: Instrumentation_Key + key: all__InstrumentationKey - name: OrchestratorType value: 'K8S' ports: @@ -828,14 +752,96 @@ spec: path: /hc port: 80 scheme: HTTP - initialDelaySeconds: 5 - periodSeconds: 10 - livenessProbe: - httpGet: - path: /hc - port: 80 - scheme: HTTP - initialDelaySeconds: 60 - periodSeconds: 10 + initialDelaySeconds: 300 + periodSeconds: 240 imagePullSecrets: - name: registry-key +--- +apiVersion: extensions/v1beta1 +kind: Deployment +metadata: + name: webshoppingagg +spec: + paused: true + template: + metadata: + labels: + app: eshop + component: webshoppingagg + spec: + containers: + - name: webshoppingagg + image: eshop/webshoppingagg + imagePullPolicy: Always + env: + - name: ASPNETCORE_URLS + value: http://0.0.0.0:80 + - name: urls__basket + valueFrom: + configMapKeyRef: + name: internalurls + key: basket + - name: urls__catalog + valueFrom: + configMapKeyRef: + name: internalurls + key: catalog + - name: urls__orders + valueFrom: + configMapKeyRef: + name: internalurls + key: ordering + - name: urls__identity + valueFrom: + configMapKeyRef: + name: internalurls + key: identity + ports: + - containerPort: 80 + imagePullSecrets: + - name: registry-key +--- +apiVersion: extensions/v1beta1 +kind: Deployment +metadata: + name: mobileshoppingagg +spec: + paused: true + template: + metadata: + labels: + app: eshop + component: mobileshoppingagg + spec: + containers: + - name: mobileshoppingagg + image: eshop/mobileshoppingagg + imagePullPolicy: Always + env: + - name: ASPNETCORE_URLS + value: http://0.0.0.0:80 + - name: urls__basket + valueFrom: + configMapKeyRef: + name: internalurls + key: basket + - name: urls__catalog + valueFrom: + configMapKeyRef: + name: internalurls + key: catalog + - name: urls__orders + valueFrom: + configMapKeyRef: + name: internalurls + key: ordering + - name: urls__identity + valueFrom: + configMapKeyRef: + name: internalurls + key: identity + ports: + - containerPort: 80 + imagePullSecrets: + - name: registry-key +--- diff --git a/k8s/ingress.yaml b/k8s/ingress.yaml index 59012bf26..b5773bb25 100644 --- a/k8s/ingress.yaml +++ b/k8s/ingress.yaml @@ -11,22 +11,10 @@ spec: rules: - http: paths: - - path: /basket-api - backend: - serviceName: ocelot - servicePort: 80 - - path: /catalog-api - backend: - serviceName: ocelot - servicePort: 80 - path: /identity backend: serviceName: identity servicePort: 80 - - path: /ordering-api - backend: - serviceName: ocelot - servicePort: 80 - path: /webmvc backend: serviceName: webmvc @@ -35,25 +23,37 @@ spec: backend: serviceName: webstatus servicePort: 80 - - path: /marketing-api + - path: /webshoppingapigw + backend: + serviceName: ocelotapigw-ws + servicePort: 80 + - path: /webmarketingapigw backend: - serviceName: ocelot + serviceName: ocelotapigw-wm servicePort: 80 - - path: /payment-api + - path: /mobilemarketingapigw + backend: + serviceName: ocelotapigw-mm + servicePort: 80 + - path: /mobileshoppingapigw backend: - serviceName: ocelot + serviceName: ocelotapigw-ms + servicePort: 80 + - path: /webshoppingagg + backend: + serviceName: webshoppingagg servicePort: 80 - - path: /locations-api + - path: /mobileshoppingagg backend: - serviceName: ocelot + serviceName: mobileshoppingagg servicePort: 80 + - path: /payment-api + backend: + serviceName: payment + servicePort: 80 - path: / backend: serviceName: webspa servicePort: 80 - - path: /ocelot - backend: - serviceName: ocelot - servicePort: 80 - + diff --git a/k8s/internalurls.yaml b/k8s/internalurls.yaml new file mode 100644 index 000000000..e42ef23ec --- /dev/null +++ b/k8s/internalurls.yaml @@ -0,0 +1,31 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: internalurls + labels: + app: eshop +data: +# Internal Services & healthchecks + basket: http://basket + basket__hc: http://basket/hc + catalog: http://catalog + catalog__hc: http://catalog/hc + identity: http://identity + identity__hc: http://identity/hc + ordering: http://ordering + ordering__hc: http://ordering/hc + marketing: http://marketing + marketing__hc: http://marketing/hc + locations: http://locations + locations__hc: http://locations/hc + payment__hc: http://payment/hc + mvc__hc: http://webmvc/hc + spa__hc: http://webspa/hc +# Aggreggators + mobileshoppingagg: http://mobileshoppingagg + webshoppingagg: http://webshoppingagg +# API GWs + apigwmm: http://ocelotapigw-mm + apigwms: http://ocelotapigw-ms + apigwwm: http://ocelotapigw-wm + apigwws: http://ocelotapigw-ws \ No newline at end of file diff --git a/k8s/ocelot/configuration-mobile-marketing.json b/k8s/ocelot/configuration-mobile-marketing.json new file mode 100644 index 000000000..666df1633 --- /dev/null +++ b/k8s/ocelot/configuration-mobile-marketing.json @@ -0,0 +1,34 @@ +{ + "ReRoutes": [ + { + "DownstreamPathTemplate": "/api/{version}/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "marketing", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/api/{version}/m/{everything}", + "UpstreamHttpMethod": [] + }, + { + "DownstreamPathTemplate": "/api/{version}/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "locations", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/api/{version}/l/{everything}", + "UpstreamHttpMethod": [] + } + + ], + "GlobalConfiguration": { + "RequestIdKey": "OcRequestId", + "AdministrationPath": "/administration" + } +} + \ No newline at end of file diff --git a/k8s/ocelot/configuration-mobile-shopping.json b/k8s/ocelot/configuration-mobile-shopping.json new file mode 100644 index 000000000..edf0714a0 --- /dev/null +++ b/k8s/ocelot/configuration-mobile-shopping.json @@ -0,0 +1,142 @@ +{ + "ReRoutes": [ + { + "DownstreamPathTemplate": "/api/{version}/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "catalog", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/api/{version}/c/{everything}", + "UpstreamHttpMethod": [ "GET" ] + }, + { + "DownstreamPathTemplate": "/api/{version}/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "basket", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/api/{version}/b/{everything}", + "UpstreamHttpMethod": [], + "AuthenticationOptions": { + "AuthenticationProviderKey": "IdentityApiKey", + "AllowedScopes": [] + } + }, + { + "DownstreamPathTemplate": "/api/{version}/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "ordering", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/api/{version}/o/{everything}", + "UpstreamHttpMethod": [], + "AuthenticationOptions": { + "AuthenticationProviderKey": "IdentityApiKey", + "AllowedScopes": [] + } + }, + { + "DownstreamPathTemplate": "/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "webshoppingagg", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/{everything}", + "UpstreamHttpMethod": [ "POST", "PUT", "GET" ], + "AuthenticationOptions": { + "AuthenticationProviderKey": "IdentityApiKey", + "AllowedScopes": [] + } + }, + { + "DownstreamPathTemplate": "/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "ordering", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/orders-api/{everything}", + "UpstreamHttpMethod": [] + }, + { + "DownstreamPathTemplate": "/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "basket", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/basket-api/{everything}", + "UpstreamHttpMethod": [] + }, + { + "DownstreamPathTemplate": "/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "catalog", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/catalog-api/{everything}", + "UpstreamHttpMethod": [] + }, + { + "DownstreamPathTemplate": "/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "marketing", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/marketing-api/{everything}", + "UpstreamHttpMethod": [] + }, + { + "DownstreamPathTemplate": "/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "payment", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/payment-api/{everything}", + "UpstreamHttpMethod": [] + }, + { + "DownstreamPathTemplate": "/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "locations.api", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/location-api/{everything}", + "UpstreamHttpMethod": [] + } + + ], + "GlobalConfiguration": { + "RequestIdKey": "OcRequestId", + "AdministrationPath": "/administration" + } + } + \ No newline at end of file diff --git a/k8s/ocelot/configuration-web-marketing.json b/k8s/ocelot/configuration-web-marketing.json new file mode 100644 index 000000000..666df1633 --- /dev/null +++ b/k8s/ocelot/configuration-web-marketing.json @@ -0,0 +1,34 @@ +{ + "ReRoutes": [ + { + "DownstreamPathTemplate": "/api/{version}/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "marketing", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/api/{version}/m/{everything}", + "UpstreamHttpMethod": [] + }, + { + "DownstreamPathTemplate": "/api/{version}/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "locations", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/api/{version}/l/{everything}", + "UpstreamHttpMethod": [] + } + + ], + "GlobalConfiguration": { + "RequestIdKey": "OcRequestId", + "AdministrationPath": "/administration" + } +} + \ No newline at end of file diff --git a/k8s/ocelot/configuration-web-shopping.json b/k8s/ocelot/configuration-web-shopping.json new file mode 100644 index 000000000..edf0714a0 --- /dev/null +++ b/k8s/ocelot/configuration-web-shopping.json @@ -0,0 +1,142 @@ +{ + "ReRoutes": [ + { + "DownstreamPathTemplate": "/api/{version}/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "catalog", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/api/{version}/c/{everything}", + "UpstreamHttpMethod": [ "GET" ] + }, + { + "DownstreamPathTemplate": "/api/{version}/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "basket", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/api/{version}/b/{everything}", + "UpstreamHttpMethod": [], + "AuthenticationOptions": { + "AuthenticationProviderKey": "IdentityApiKey", + "AllowedScopes": [] + } + }, + { + "DownstreamPathTemplate": "/api/{version}/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "ordering", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/api/{version}/o/{everything}", + "UpstreamHttpMethod": [], + "AuthenticationOptions": { + "AuthenticationProviderKey": "IdentityApiKey", + "AllowedScopes": [] + } + }, + { + "DownstreamPathTemplate": "/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "webshoppingagg", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/{everything}", + "UpstreamHttpMethod": [ "POST", "PUT", "GET" ], + "AuthenticationOptions": { + "AuthenticationProviderKey": "IdentityApiKey", + "AllowedScopes": [] + } + }, + { + "DownstreamPathTemplate": "/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "ordering", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/orders-api/{everything}", + "UpstreamHttpMethod": [] + }, + { + "DownstreamPathTemplate": "/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "basket", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/basket-api/{everything}", + "UpstreamHttpMethod": [] + }, + { + "DownstreamPathTemplate": "/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "catalog", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/catalog-api/{everything}", + "UpstreamHttpMethod": [] + }, + { + "DownstreamPathTemplate": "/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "marketing", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/marketing-api/{everything}", + "UpstreamHttpMethod": [] + }, + { + "DownstreamPathTemplate": "/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "payment", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/payment-api/{everything}", + "UpstreamHttpMethod": [] + }, + { + "DownstreamPathTemplate": "/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "locations.api", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/location-api/{everything}", + "UpstreamHttpMethod": [] + } + + ], + "GlobalConfiguration": { + "RequestIdKey": "OcRequestId", + "AdministrationPath": "/administration" + } + } + \ No newline at end of file diff --git a/k8s/ocelot/configuration.json b/k8s/ocelot/configuration.json deleted file mode 100644 index 7a94504c3..000000000 --- a/k8s/ocelot/configuration.json +++ /dev/null @@ -1,58 +0,0 @@ -{ - "ReRoutes": [ - { - "DownstreamPathTemplate": "/{everything}", - "DownstreamScheme": "http", - "DownstreamHost": "ordering", - "DownstreamPort": 80, - "UpstreamPathTemplate": "/ordering-api/{everything}", - "UpstreamHttpMethod": [] - }, - { - "DownstreamPathTemplate": "/{everything}", - "DownstreamScheme": "http", - "DownstreamHost": "basket", - "DownstreamPort": 80, - "UpstreamPathTemplate": "/basket-api/{everything}", - "UpstreamHttpMethod": [] - }, - { - "DownstreamPathTemplate": "/{everything}", - "DownstreamScheme": "http", - "DownstreamHost": "catalog", - "DownstreamPort": 80, - "UpstreamPathTemplate": "/catalog-api/{everything}", - "UpstreamHttpMethod": [] - }, - { - "DownstreamPathTemplate": "/{everything}", - "DownstreamScheme": "http", - "DownstreamHost": "marketing", - "DownstreamPort": 80, - "UpstreamPathTemplate": "/marketing-api/{everything}", - "UpstreamHttpMethod": [] - }, - { - "DownstreamPathTemplate": "/{everything}", - "DownstreamScheme": "http", - "DownstreamHost": "payment", - "DownstreamPort": 80, - "UpstreamPathTemplate": "/payment-api/{everything}", - "UpstreamHttpMethod": [] - }, - { - "DownstreamPathTemplate": "/{everything}", - "DownstreamScheme": "http", - "DownstreamHost": "locations", - "DownstreamPort": 80, - "UpstreamPathTemplate": "/location-api/{everything}", - "UpstreamHttpMethod": [] - } - - ], - "GlobalConfiguration": { - "RequestIdKey": "OcRequestId", - "AdministrationPath": "/administration" - } - } - \ No newline at end of file diff --git a/k8s/ocelot/deployment.yaml b/k8s/ocelot/deployment.yaml index 4800172e6..516f91b2f 100644 --- a/k8s/ocelot/deployment.yaml +++ b/k8s/ocelot/deployment.yaml @@ -1,19 +1,27 @@ apiVersion: extensions/v1beta1 kind: Deployment metadata: - name: ocelot + name: apigwmm spec: paused: true template: metadata: labels: app: eshop - component: ocelot + component: apigwmm spec: containers: - - name: ocelot - image: eshop/ocelotapigw + - name: apigwmm + image: eshop/ocelotapigw-mm imagePullPolicy: Always + env: + - name: PATH_BASE + value: /mobilemarketingapigw + - name: IdentityUrl + valueFrom: + configMapKeyRef: + name: internalurls + key: identity ports: - containerPort: 80 volumeMounts: @@ -24,8 +32,124 @@ spec: configMap: name: ocelot items: - - key: configuration.json + - key: mm path: configuration.json imagePullSecrets: - name: registry-key - +--- +apiVersion: extensions/v1beta1 +kind: Deployment +metadata: + name: apigwms +spec: + paused: true + template: + metadata: + labels: + app: eshop + component: apigwms + spec: + containers: + - name: apigwms + image: eshop/ocelotapigw-ms + imagePullPolicy: Always + env: + - name: PATH_BASE + value: /mobileshoppingapigw + - name: IdentityUrl + valueFrom: + configMapKeyRef: + name: internalurls + key: identity + ports: + - containerPort: 80 + volumeMounts: + - name: config + mountPath: /app/configuration + volumes: + - name: config + configMap: + name: ocelot + items: + - key: ms + path: configuration.json + imagePullSecrets: + - name: registry-key +--- +apiVersion: extensions/v1beta1 +kind: Deployment +metadata: + name: apigwwm +spec: + paused: true + template: + metadata: + labels: + app: eshop + component: apigwwm + spec: + containers: + - name: apigwwm + image: eshop/ocelotapigw-wm + imagePullPolicy: Always + env: + - name: PATH_BASE + value: /webmarketingapigw + - name: IdentityUrl + valueFrom: + configMapKeyRef: + name: internalurls + key: identity + ports: + - containerPort: 80 + volumeMounts: + - name: config + mountPath: /app/configuration + volumes: + - name: config + configMap: + name: ocelot + items: + - key: wm + path: configuration.json + imagePullSecrets: + - name: registry-key +--- +apiVersion: extensions/v1beta1 +kind: Deployment +metadata: + name: apigwws +spec: + paused: true + template: + metadata: + labels: + app: eshop + component: apigwws + spec: + containers: + - name: apigwws + image: eshop/ocelotapigw-ws + imagePullPolicy: Always + env: + - name: PATH_BASE + value: /webshoppingapigw + - name: IdentityUrl + valueFrom: + configMapKeyRef: + name: internalurls + key: identity + ports: + - containerPort: 80 + volumeMounts: + - name: config + mountPath: /app/configuration + volumes: + - name: config + configMap: + name: ocelot + items: + - key: ws + path: configuration.json + imagePullSecrets: + - name: registry-key \ No newline at end of file diff --git a/k8s/ocelot/service.yaml b/k8s/ocelot/service.yaml index 6b376ca78..858b54b21 100644 --- a/k8s/ocelot/service.yaml +++ b/k8s/ocelot/service.yaml @@ -3,11 +3,53 @@ kind: Service metadata: labels: app: eshop - component: ocelot - name: ocelot + component: ocelotapigw-mm + name: ocelotapigw-mm spec: ports: - port: 80 selector: app: eshop - component: ocelot + component: apigwmm +--- +apiVersion: v1 +kind: Service +metadata: + labels: + app: eshop + component: ocelotapigw-ms + name: ocelotapigw-ms +spec: + ports: + - port: 80 + selector: + app: eshop + component: apigwms +--- +apiVersion: v1 +kind: Service +metadata: + labels: + app: eshop + component: ocelotapigw-wm + name: ocelotapigw-wm +spec: + ports: + - port: 80 + selector: + app: eshop + component: apigwwm +--- +apiVersion: v1 +kind: Service +metadata: + labels: + app: eshop + component: ocelotapigw-ws + name: ocelotapigw-ws +spec: + ports: + - port: 80 + selector: + app: eshop + component: apigwws diff --git a/src/ApiGateways/ApiGw-Base/Startup.cs b/src/ApiGateways/ApiGw-Base/Startup.cs index 254849d89..f6a36b59e 100644 --- a/src/ApiGateways/ApiGw-Base/Startup.cs +++ b/src/ApiGateways/ApiGw-Base/Startup.cs @@ -70,6 +70,12 @@ namespace OcelotApiGw public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { + var pathBase = _cfg["PATH_BASE"]; + if (!string.IsNullOrEmpty(pathBase)) + { + app.UsePathBase(pathBase); + } + if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); diff --git a/src/ApiGateways/Mobile.Bff.Marketing/apigw/configuration.json b/src/ApiGateways/Mobile.Bff.Marketing/apigw/configuration.json index 22fdca1b2..85d6777e6 100644 --- a/src/ApiGateways/Mobile.Bff.Marketing/apigw/configuration.json +++ b/src/ApiGateways/Mobile.Bff.Marketing/apigw/configuration.json @@ -1 +1,34 @@ -{} \ No newline at end of file +{ + "ReRoutes": [ + { + "DownstreamPathTemplate": "/api/{version}/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "marketing.api", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/api/{version}/m/{everything}", + "UpstreamHttpMethod": [] + }, + { + "DownstreamPathTemplate": "/api/{version}/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "locations.api", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/api/{version}/l/{everything}", + "UpstreamHttpMethod": [] + } + + ], + "GlobalConfiguration": { + "RequestIdKey": "OcRequestId", + "AdministrationPath": "/administration" + } + } + \ No newline at end of file diff --git a/src/ApiGateways/Mobile.Bff.Shopping/apigw/configuration.json b/src/ApiGateways/Mobile.Bff.Shopping/apigw/configuration.json index 22fdca1b2..1de765949 100644 --- a/src/ApiGateways/Mobile.Bff.Shopping/apigw/configuration.json +++ b/src/ApiGateways/Mobile.Bff.Shopping/apigw/configuration.json @@ -1 +1,142 @@ -{} \ No newline at end of file +{ + "ReRoutes": [ + { + "DownstreamPathTemplate": "/api/{version}/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "catalog.api", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/api/{version}/c/{everything}", + "UpstreamHttpMethod": [ "GET" ] + }, + { + "DownstreamPathTemplate": "/api/{version}/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "basket.api", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/api/{version}/b/{everything}", + "UpstreamHttpMethod": [], + "AuthenticationOptions": { + "AuthenticationProviderKey": "IdentityApiKey", + "AllowedScopes": [] + } + }, + { + "DownstreamPathTemplate": "/api/{version}/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "ordering.api", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/api/{version}/o/{everything}", + "UpstreamHttpMethod": [], + "AuthenticationOptions": { + "AuthenticationProviderKey": "IdentityApiKey", + "AllowedScopes": [] + } + }, + { + "DownstreamPathTemplate": "/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "webshoppingagg", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/{everything}", + "UpstreamHttpMethod": [ "POST", "PUT", "GET" ], + "AuthenticationOptions": { + "AuthenticationProviderKey": "IdentityApiKey", + "AllowedScopes": [] + } + }, + { + "DownstreamPathTemplate": "/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "ordering.api", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/orders-api/{everything}", + "UpstreamHttpMethod": [] + }, + { + "DownstreamPathTemplate": "/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "basket.api", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/basket-api/{everything}", + "UpstreamHttpMethod": [] + }, + { + "DownstreamPathTemplate": "/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "catalog.api", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/catalog-api/{everything}", + "UpstreamHttpMethod": [] + }, + { + "DownstreamPathTemplate": "/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "marketing.api", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/marketing-api/{everything}", + "UpstreamHttpMethod": [] + }, + { + "DownstreamPathTemplate": "/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "payment.api", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/payment-api/{everything}", + "UpstreamHttpMethod": [] + }, + { + "DownstreamPathTemplate": "/{everything}", + "DownstreamScheme": "http", + "DownstreamHostAndPorts": [ + { + "Host": "locations.api", + "Port": 80 + } + ], + "UpstreamPathTemplate": "/location-api/{everything}", + "UpstreamHttpMethod": [] + } + + ], + "GlobalConfiguration": { + "RequestIdKey": "OcRequestId", + "AdministrationPath": "/administration" + } + } + \ No newline at end of file From 72843eb6bb9e2b67d4b9fcc6859d062de7fd6649 Mon Sep 17 00:00:00 2001 From: eiximenis Date: Thu, 15 Mar 2018 15:49:24 +0100 Subject: [PATCH 31/78] Missing aggregrators services in k8s config *oops* --- k8s/services.yaml | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/k8s/services.yaml b/k8s/services.yaml index 02b73448a..96d2cb8b4 100644 --- a/k8s/services.yaml +++ b/k8s/services.yaml @@ -98,6 +98,34 @@ spec: --- apiVersion: v1 kind: Service +metadata: + labels: + app: eshop + component: webshoppingagg + name: webshoppingagg +spec: + ports: + - port: 80 + selector: + app: eshop + component: webshoppingagg +--- +apiVersion: v1 +kind: Service +metadata: + labels: + app: eshop + component: mobileshoppingagg + name: mobileshoppingagg +spec: + ports: + - port: 80 + selector: + app: eshop + component: mobileshoppingagg +--- +apiVersion: v1 +kind: Service metadata: labels: app: eshop From d9fb7e713c5d35e58afc79855e9fd9a73beae882 Mon Sep 17 00:00:00 2001 From: eiximenis Date: Thu, 15 Mar 2018 16:13:23 +0100 Subject: [PATCH 32/78] Error on ocelot config for k8s --- k8s/ocelot/configuration-mobile-shopping.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/k8s/ocelot/configuration-mobile-shopping.json b/k8s/ocelot/configuration-mobile-shopping.json index edf0714a0..cf3a48aff 100644 --- a/k8s/ocelot/configuration-mobile-shopping.json +++ b/k8s/ocelot/configuration-mobile-shopping.json @@ -49,7 +49,7 @@ "DownstreamScheme": "http", "DownstreamHostAndPorts": [ { - "Host": "webshoppingagg", + "Host": "mobileshoppingagg", "Port": 80 } ], From f80ee6967aa6f6514d7ee7d5ed4126fcedf319f9 Mon Sep 17 00:00:00 2001 From: eiximenis Date: Thu, 15 Mar 2018 16:14:40 +0100 Subject: [PATCH 33/78] Error on local mobile shopping apigw config file --- src/ApiGateways/Mobile.Bff.Shopping/apigw/configuration.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ApiGateways/Mobile.Bff.Shopping/apigw/configuration.json b/src/ApiGateways/Mobile.Bff.Shopping/apigw/configuration.json index 1de765949..870690ed4 100644 --- a/src/ApiGateways/Mobile.Bff.Shopping/apigw/configuration.json +++ b/src/ApiGateways/Mobile.Bff.Shopping/apigw/configuration.json @@ -49,7 +49,7 @@ "DownstreamScheme": "http", "DownstreamHostAndPorts": [ { - "Host": "webshoppingagg", + "Host": "mobileshoppingagg", "Port": 80 } ], From 51bb22366334eb6be3b4d57a7fc7c8ec58c01686 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Coben=CC=83a=20Moria=CC=81n?= Date: Mon, 19 Mar 2018 12:21:32 +0100 Subject: [PATCH 34/78] Ignored MFractor's stuff --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index a8d5986bc..6e46dd41b 100644 --- a/.gitignore +++ b/.gitignore @@ -260,3 +260,4 @@ pub/ /src/Web/WebMVC/wwwroot/lib /src/Web/WebMVC/wwwroot/css/site.min.css **/.kube/** +.mfractor From 1f27bcb5642473318af83f2a5ddd3f17e878decd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Coben=CC=83a=20Moria=CC=81n?= Date: Mon, 19 Mar 2018 12:24:37 +0100 Subject: [PATCH 35/78] WIP endpoint update --- .../eShopOnContainers.Core/GlobalSettings.cs | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/GlobalSettings.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/GlobalSettings.cs index d501a5d46..4714725af 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/GlobalSettings.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/GlobalSettings.cs @@ -4,7 +4,7 @@ { public const string AzureTag = "Azure"; public const string MockTag = "Mock"; - public const string DefaultEndpoint = "http://13.88.8.119"; + public const string DefaultEndpoint = "http://52.170.199.82"; private string _baseEndpoint; private static readonly GlobalSetting _instance = new GlobalSetting(); @@ -62,16 +62,21 @@ private void UpdateEndpoint(string baseEndpoint) { - RegisterWebsite = $"{baseEndpoint}:5105/Account/Register"; + var identityBaseEndpoint = $"{baseEndpoint}/identity"; + RegisterWebsite = $"{identityBaseEndpoint}/Account/Register"; + LogoutCallback = $"{identityBaseEndpoint}/Account/Redirecting"; + + var connectBaseEndpoint = $"{identityBaseEndpoint}/connect"; + IdentityEndpoint = $"{connectBaseEndpoint}/authorize"; + UserInfoEndpoint = $"{connectBaseEndpoint}/userinfo"; + TokenEndpoint = $"{connectBaseEndpoint}/token"; + LogoutEndpoint = $"{connectBaseEndpoint}/endsession"; + + IdentityCallback = $"{baseEndpoint}/xamarincallback"; + CatalogEndpoint = $"{baseEndpoint}:5101"; OrdersEndpoint = $"{baseEndpoint}:5102"; BasketEndpoint = $"{baseEndpoint}:5103"; - IdentityEndpoint = $"{baseEndpoint}:5105/connect/authorize"; - UserInfoEndpoint = $"{baseEndpoint}:5105/connect/userinfo"; - TokenEndpoint = $"{baseEndpoint}:5105/connect/token"; - LogoutEndpoint = $"{baseEndpoint}:5105/connect/endsession"; - IdentityCallback = $"{baseEndpoint}:5105/xamarincallback"; - LogoutCallback = $"{baseEndpoint}:5105/Account/Redirecting"; LocationEndpoint = $"{baseEndpoint}:5109"; MarketingEndpoint = $"{baseEndpoint}:5110"; } From 0f725666c0928adb611ee8c55524ccc9d8af9141 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Coben=CC=83a=20Moria=CC=81n?= Date: Wed, 21 Mar 2018 12:50:08 +0100 Subject: [PATCH 36/78] Updated endpoints --- .../eShopOnContainers.Core/GlobalSettings.cs | 16 -------------- .../Services/Basket/BasketService.cs | 22 +++++++++++++------ .../Services/Catalog/CatalogService.cs | 18 ++++++++------- .../Services/Location/LocationService.cs | 4 ++-- .../Services/Marketing/CampaignService.cs | 10 +++++---- .../Services/Order/OrderService.cs | 14 +++++++----- 6 files changed, 41 insertions(+), 43 deletions(-) diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/GlobalSettings.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/GlobalSettings.cs index 4714725af..9b2b22b72 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/GlobalSettings.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/GlobalSettings.cs @@ -38,18 +38,8 @@ public string RegisterWebsite { get; set; } - public string CatalogEndpoint { get; set; } - - public string OrdersEndpoint { get; set; } - - public string BasketEndpoint { get; set; } - public string IdentityEndpoint { get; set; } - public string LocationEndpoint { get; set; } - - public string MarketingEndpoint { get; set; } - public string UserInfoEndpoint { get; set; } public string TokenEndpoint { get; set; } @@ -73,12 +63,6 @@ LogoutEndpoint = $"{connectBaseEndpoint}/endsession"; IdentityCallback = $"{baseEndpoint}/xamarincallback"; - - CatalogEndpoint = $"{baseEndpoint}:5101"; - OrdersEndpoint = $"{baseEndpoint}:5102"; - BasketEndpoint = $"{baseEndpoint}:5103"; - LocationEndpoint = $"{baseEndpoint}:5109"; - MarketingEndpoint = $"{baseEndpoint}:5110"; } } } \ No newline at end of file diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Basket/BasketService.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Basket/BasketService.cs index 54f3a03bc..b36488f24 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Basket/BasketService.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Basket/BasketService.cs @@ -11,7 +11,7 @@ namespace eShopOnContainers.Core.Services.Basket private readonly IRequestProvider _requestProvider; private readonly IFixUriService _fixUriService; - private const string ApiUrlBase = "api/v1/basket"; + private const string ApiUrlBase = "mobileshoppingapigw/api/v1/b/basket"; public BasketService(IRequestProvider requestProvider, IFixUriService fixUriService) { @@ -21,15 +21,23 @@ namespace eShopOnContainers.Core.Services.Basket public async Task GetBasketAsync(string guidUser, string token) { - var builder = new UriBuilder(GlobalSetting.Instance.BasketEndpoint) + var builder = new UriBuilder(GlobalSetting.Instance.BaseEndpoint) { Path = $"{ApiUrlBase}/{guidUser}" }; var uri = builder.ToString(); - CustomerBasket basket = - await _requestProvider.GetAsync(uri, token); + CustomerBasket basket; + + try + { + basket = await _requestProvider.GetAsync(uri, token); + } + catch (HttpRequestExceptionEx exception) when (exception.HttpCode == System.Net.HttpStatusCode.NotFound) + { + basket = null; + } _fixUriService.FixBasketItemPictureUri(basket?.Items); return basket; @@ -37,7 +45,7 @@ namespace eShopOnContainers.Core.Services.Basket public async Task UpdateBasketAsync(CustomerBasket customerBasket, string token) { - var builder = new UriBuilder(GlobalSetting.Instance.BasketEndpoint) + var builder = new UriBuilder(GlobalSetting.Instance.BaseEndpoint) { Path = ApiUrlBase }; @@ -49,7 +57,7 @@ namespace eShopOnContainers.Core.Services.Basket public async Task CheckoutAsync(BasketCheckout basketCheckout, string token) { - var builder = new UriBuilder(GlobalSetting.Instance.BasketEndpoint) + var builder = new UriBuilder(GlobalSetting.Instance.BaseEndpoint) { Path = $"{ApiUrlBase}/checkout" }; @@ -60,7 +68,7 @@ namespace eShopOnContainers.Core.Services.Basket public async Task ClearBasketAsync(string guidUser, string token) { - var builder = new UriBuilder(GlobalSetting.Instance.BasketEndpoint) + var builder = new UriBuilder(GlobalSetting.Instance.BaseEndpoint) { Path = $"{ApiUrlBase}/{guidUser}" }; diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Catalog/CatalogService.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Catalog/CatalogService.cs index 2e63e9516..dd7cfe732 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Catalog/CatalogService.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Catalog/CatalogService.cs @@ -13,6 +13,8 @@ namespace eShopOnContainers.Core.Services.Catalog { private readonly IRequestProvider _requestProvider; private readonly IFixUriService _fixUriService; + + private const string ApiUrlBase = "mobileshoppingapigw/api/v1/c/catalog"; public CatalogService(IRequestProvider requestProvider, IFixUriService fixUriService) { @@ -22,8 +24,8 @@ namespace eShopOnContainers.Core.Services.Catalog public async Task> FilterAsync(int catalogBrandId, int catalogTypeId) { - UriBuilder builder = new UriBuilder(GlobalSetting.Instance.CatalogEndpoint); - builder.Path = string.Format("api/v1/catalog/items/type/{0}/brand/{1}", catalogTypeId, catalogBrandId); + UriBuilder builder = new UriBuilder(GlobalSetting.Instance.BaseEndpoint); + builder.Path = string.Format($"{ApiUrlBase}/items/type/{0}/brand/{1}", catalogTypeId, catalogBrandId); string uri = builder.ToString(); CatalogRoot catalog = await _requestProvider.GetAsync(uri); @@ -36,8 +38,8 @@ namespace eShopOnContainers.Core.Services.Catalog public async Task> GetCatalogAsync() { - UriBuilder builder = new UriBuilder(GlobalSetting.Instance.CatalogEndpoint); - builder.Path = "api/v1/catalog/items"; + UriBuilder builder = new UriBuilder(GlobalSetting.Instance.BaseEndpoint); + builder.Path = $"{ApiUrlBase}/items"; string uri = builder.ToString(); CatalogRoot catalog = await _requestProvider.GetAsync(uri); @@ -53,8 +55,8 @@ namespace eShopOnContainers.Core.Services.Catalog public async Task> GetCatalogBrandAsync() { - UriBuilder builder = new UriBuilder(GlobalSetting.Instance.CatalogEndpoint); - builder.Path = "api/v1/catalog/catalogbrands"; + UriBuilder builder = new UriBuilder(GlobalSetting.Instance.BaseEndpoint); + builder.Path = $"{ApiUrlBase}/catalogbrands"; string uri = builder.ToString(); IEnumerable brands = await _requestProvider.GetAsync>(uri); @@ -67,8 +69,8 @@ namespace eShopOnContainers.Core.Services.Catalog public async Task> GetCatalogTypeAsync() { - UriBuilder builder = new UriBuilder(GlobalSetting.Instance.CatalogEndpoint); - builder.Path = "api/v1/catalog/catalogtypes"; + UriBuilder builder = new UriBuilder(GlobalSetting.Instance.BaseEndpoint); + builder.Path = $"{ApiUrlBase}/catalogtypes"; string uri = builder.ToString(); IEnumerable types = await _requestProvider.GetAsync>(uri); diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Location/LocationService.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Location/LocationService.cs index f20ae6339..e18d335c0 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Location/LocationService.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Location/LocationService.cs @@ -15,8 +15,8 @@ namespace eShopOnContainers.Core.Services.Location public async Task UpdateUserLocation(eShopOnContainers.Core.Models.Location.Location newLocReq, string token) { - UriBuilder builder = new UriBuilder(GlobalSetting.Instance.LocationEndpoint); - builder.Path = "api/v1/locations"; + UriBuilder builder = new UriBuilder(GlobalSetting.Instance.BaseEndpoint); + builder.Path = "/mobilemarketingapigw/api/v1/l/locations"; string uri = builder.ToString(); await _requestProvider.PostAsync(uri, newLocReq, token); } diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Marketing/CampaignService.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Marketing/CampaignService.cs index cb74f11b0..2fa5eaa9e 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Marketing/CampaignService.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Marketing/CampaignService.cs @@ -13,6 +13,8 @@ namespace eShopOnContainers.Core.Services.Marketing private readonly IRequestProvider _requestProvider; private readonly IFixUriService _fixUriService; + private const string ApiUrlBase = "mobilemarketingapigw/api/v1/m/campaigns"; + public CampaignService(IRequestProvider requestProvider, IFixUriService fixUriService) { _requestProvider = requestProvider; @@ -21,8 +23,8 @@ namespace eShopOnContainers.Core.Services.Marketing public async Task> GetAllCampaignsAsync(string token) { - UriBuilder builder = new UriBuilder(GlobalSetting.Instance.MarketingEndpoint); - builder.Path = "api/v1/campaigns/user"; + UriBuilder builder = new UriBuilder(GlobalSetting.Instance.BaseEndpoint); + builder.Path = $"{ApiUrlBase}/user"; string uri = builder.ToString(); CampaignRoot campaign = await _requestProvider.GetAsync(uri, token); @@ -38,8 +40,8 @@ namespace eShopOnContainers.Core.Services.Marketing public async Task GetCampaignByIdAsync(int campaignId, string token) { - UriBuilder builder = new UriBuilder(GlobalSetting.Instance.MarketingEndpoint); - builder.Path = $"api/v1/campaigns/{campaignId}"; + UriBuilder builder = new UriBuilder(GlobalSetting.Instance.BaseEndpoint); + builder.Path = $"{ApiUrlBase}/{campaignId}"; string uri = builder.ToString(); return await _requestProvider.GetAsync(uri, token); } diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Order/OrderService.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Order/OrderService.cs index f242971fb..0da0942ad 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Order/OrderService.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Order/OrderService.cs @@ -11,6 +11,8 @@ namespace eShopOnContainers.Core.Services.Order { private readonly IRequestProvider _requestProvider; + private const string ApiUrlBase = "mobileshoppingapigw/api/v1/o/orders"; + public OrderService(IRequestProvider requestProvider) { _requestProvider = requestProvider; @@ -23,9 +25,9 @@ namespace eShopOnContainers.Core.Services.Order public async Task> GetOrdersAsync(string token) { - UriBuilder builder = new UriBuilder(GlobalSetting.Instance.OrdersEndpoint); + UriBuilder builder = new UriBuilder(GlobalSetting.Instance.BaseEndpoint); - builder.Path = "api/v1/orders"; + builder.Path = ApiUrlBase; string uri = builder.ToString(); @@ -40,9 +42,9 @@ namespace eShopOnContainers.Core.Services.Order { try { - UriBuilder builder = new UriBuilder(GlobalSetting.Instance.OrdersEndpoint); + UriBuilder builder = new UriBuilder(GlobalSetting.Instance.BaseEndpoint); - builder.Path = string.Format("api/v1/orders/{0}", orderId); + builder.Path = string.Format($"{ApiUrlBase}/{0}", orderId); string uri = builder.ToString(); @@ -76,9 +78,9 @@ namespace eShopOnContainers.Core.Services.Order public async Task CancelOrderAsync(int orderId, string token) { - UriBuilder builder = new UriBuilder(GlobalSetting.Instance.OrdersEndpoint); + UriBuilder builder = new UriBuilder(GlobalSetting.Instance.BaseEndpoint); - builder.Path = "api/v1/orders/cancel"; + builder.Path = $"{ApiUrlBase}/cancel"; var cancelOrderCommand = new CancelOrderCommand(orderId); From 811f9a027ac75303dcf1d41623dc9192e51895e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Cobe=C3=B1a=20Mori=C3=A1n?= Date: Wed, 21 Mar 2018 15:53:52 +0100 Subject: [PATCH 37/78] Removed back-up file --- .../eShopOnContainers.Droid.csproj.bak | 429 ------------------ 1 file changed, 429 deletions(-) delete mode 100644 src/Mobile/eShopOnContainers/eShopOnContainers.Droid/eShopOnContainers.Droid.csproj.bak diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/eShopOnContainers.Droid.csproj.bak b/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/eShopOnContainers.Droid.csproj.bak deleted file mode 100644 index 8a2babd2e..000000000 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/eShopOnContainers.Droid.csproj.bak +++ /dev/null @@ -1,429 +0,0 @@ - - - - - Debug - AnyCPU - 8.0.30703 - 2.0 - {62DBB163-9CA9-4818-B48B-13233DF37C24} - {EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - Library - Properties - eShopOnContainers.Droid - eShopOnContainers.Droid - 512 - true - Resources\Resource.Designer.cs - Off - Properties\AndroidManifest.xml - true - v8.0 - armeabi,armeabi-v7a,x86 - - - 1G - - - - - - true - - - True - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - True - None - False - 1G - Xamarin - armeabi;armeabi-v7a;x86 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - False - SdkOnly - - - - ..\..\..\..\packages\Acr.Support.2.1.0\lib\MonoAndroid10\Acr.Support.Android.dll - True - - - ..\..\..\..\packages\AndHUD.1.2.0\lib\MonoAndroid\AndHUD.dll - True - - - ..\..\..\..\packages\Xamarin.FFImageLoading.2.2.9\lib\MonoAndroid10\FFImageLoading.dll - - - ..\..\..\..\packages\Xamarin.FFImageLoading.2.2.9\lib\MonoAndroid10\FFImageLoading.Platform.dll - - - ..\..\..\..\packages\IdentityModel.1.3.1\lib\portable-net45+wp80+win8+wpa81\IdentityModel.Portable.dll - True - - - - ..\..\..\..\packages\modernhttpclient.2.4.2\lib\MonoAndroid\ModernHttpClient.dll - True - - - - - ..\..\..\..\packages\Newtonsoft.Json.9.0.1\lib\portable-net45+wp80+win8+wpa81\Newtonsoft.Json.dll - - - ..\..\..\..\packages\modernhttpclient.2.4.2\lib\MonoAndroid\OkHttp.dll - True - - - ..\..\..\..\packages\PCLCrypto.2.0.147\lib\MonoAndroid23\PCLCrypto.dll - - - ..\..\..\..\packages\PInvoke.BCrypt.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.BCrypt.dll - - - ..\..\..\..\packages\PInvoke.Kernel32.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.Kernel32.dll - - - ..\..\..\..\packages\PInvoke.NCrypt.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.NCrypt.dll - - - ..\..\..\..\packages\PInvoke.Windows.Core.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.Windows.Core.dll - - - ..\..\..\..\packages\Plugin.CurrentActivity.1.0.1\lib\MonoAndroid10\Plugin.CurrentActivity.dll - - - ..\..\..\..\packages\Xam.Plugin.Geolocator.3.0.4\lib\MonoAndroid10\Plugin.Geolocator.dll - - - ..\..\..\..\packages\Xam.Plugin.Geolocator.3.0.4\lib\MonoAndroid10\Plugin.Geolocator.Abstractions.dll - - - ..\..\..\..\packages\Plugin.Permissions.1.1.7\lib\MonoAndroid10\Plugin.Permissions.dll - - - ..\..\..\..\packages\Plugin.Permissions.1.1.7\lib\MonoAndroid10\Plugin.Permissions.Abstractions.dll - - - ..\..\..\..\packages\Xam.Plugins.Settings.2.6.0.12-beta\lib\MonoAndroid10\Plugin.Settings.dll - True - - - ..\..\..\..\packages\Xam.Plugins.Settings.2.6.0.12-beta\lib\MonoAndroid10\Plugin.Settings.Abstractions.dll - True - - - ..\..\..\..\packages\SlideOverKit.2.1.4\lib\MonoAndroid10\SlideOverKit.dll - True - - - ..\..\..\..\packages\SlideOverKit.2.1.4\lib\MonoAndroid10\SlideOverKit.Droid.dll - True - - - ..\..\..\..\packages\Splat.1.6.2\lib\monoandroid\Splat.dll - True - - - - - - ..\..\..\..\packages\Microsoft.Net.Http.2.2.29\lib\monoandroid\System.Net.Http.Extensions.dll - True - - - ..\..\..\..\packages\Microsoft.Net.Http.2.2.29\lib\monoandroid\System.Net.Http.Primitives.dll - True - - - - - ..\..\..\..\packages\Validation.2.2.8\lib\dotnet\Validation.dll - - - - ..\..\..\..\packages\Autofac.4.5.0\lib\netstandard1.1\Autofac.dll - - - ..\..\..\..\packages\Acr.UserDialogs.6.3.8\lib\MonoAndroid10\Acr.UserDialogs.dll - - - ..\..\..\..\packages\Acr.UserDialogs.6.3.8\lib\MonoAndroid10\Acr.UserDialogs.Interface.dll - - - ..\..\..\..\packages\Xamarin.Forms.2.5.0.91635\lib\MonoAndroid10\FormsViewGroup.dll - - - ..\..\..\..\packages\Xamarin.Forms.2.5.0.91635\lib\MonoAndroid10\Xamarin.Forms.Core.dll - - - ..\..\..\..\packages\Xamarin.Forms.2.5.0.91635\lib\MonoAndroid10\Xamarin.Forms.Platform.Android.dll - - - ..\..\..\..\packages\Xamarin.Forms.2.5.0.91635\lib\MonoAndroid10\Xamarin.Forms.Platform.dll - - - ..\..\..\..\packages\Xamarin.Forms.2.5.0.91635\lib\MonoAndroid10\Xamarin.Forms.Xaml.dll - - - ..\..\..\..\packages\Xamarin.FFImageLoading.Forms.2.2.9\lib\MonoAndroid10\FFImageLoading.Forms.dll - - - ..\..\..\..\packages\Xamarin.FFImageLoading.Forms.2.2.9\lib\MonoAndroid10\FFImageLoading.Forms.Droid.dll - - - ..\..\..\..\packages\Xamarin.Android.Support.Animated.Vector.Drawable.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Animated.Vector.Drawable.dll - - - ..\..\..\..\packages\Xamarin.Android.Support.Vector.Drawable.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Vector.Drawable.dll - - - ..\..\..\..\packages\Xamarin.Android.Support.v7.RecyclerView.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.v7.RecyclerView.dll - - - ..\..\..\..\packages\Xamarin.Android.Support.Annotations.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Annotations.dll - - - ..\..\..\..\packages\Xamarin.Android.Support.Compat.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Compat.dll - - - ..\..\..\..\packages\Xamarin.Android.Support.v7.CardView.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.v7.CardView.dll - - - ..\..\..\..\packages\Xamarin.Android.Support.Media.Compat.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Media.Compat.dll - - - ..\..\..\..\packages\Xamarin.Android.Support.Core.UI.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Core.UI.dll - - - ..\..\..\..\packages\Xamarin.Android.Support.Core.Utils.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Core.Utils.dll - - - ..\..\..\..\packages\Xamarin.Android.Support.Fragment.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Fragment.dll - - - ..\..\..\..\packages\Xamarin.Android.Support.Design.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Design.dll - - - ..\..\..\..\packages\Xamarin.Android.Support.Transition.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.Transition.dll - - - ..\..\..\..\packages\Xamarin.Android.Support.v4.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.v4.dll - - - ..\..\..\..\packages\Xamarin.Android.Support.v7.Palette.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.v7.Palette.dll - - - ..\..\..\..\packages\Xamarin.Android.Support.v7.AppCompat.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.v7.AppCompat.dll - - - ..\..\..\..\packages\Xamarin.Android.Support.v7.MediaRouter.25.4.0.2\lib\MonoAndroid70\Xamarin.Android.Support.v7.MediaRouter.dll - - - - - - - - - - - - - - - - - - - - - Assets\Montserrat-Bold.ttf - - - Assets\Montserrat-Regular.ttf - - - Assets\SourceSansPro-Regular.ttf - - - - - - - - - Designer - - - Designer - - - Designer - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {ba96a12c-4ee3-46c4-bb3f-f811b554cd01} - eShopOnContainers.Core - - - - - - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file From 77f11330ae6977c5e13e6342ce17a205d8144e70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Cobe=C3=B1a=20Mori=C3=A1n?= Date: Wed, 21 Mar 2018 16:24:36 +0100 Subject: [PATCH 38/78] Fixed login lifecycle in UWP --- .../Views/LoginView.xaml | 28 +++++-------------- 1 file changed, 7 insertions(+), 21 deletions(-) diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/LoginView.xaml b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/LoginView.xaml index f6b9bd72c..2bccd06d6 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/LoginView.xaml +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/LoginView.xaml @@ -337,28 +337,14 @@ Grid.RowSpan="2" IsVisible="{Binding IsLogin}"> + Source="{Binding LoginUrl}" + AbsoluteLayout.LayoutBounds="0, 0, 1, 1" + AbsoluteLayout.LayoutFlags="All"> - - - - - - - - - - - - + From f910e48c37fb73f156b19bc7e54525e9fba72761 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Coben=CC=83a=20Moria=CC=81n?= Date: Wed, 21 Mar 2018 16:56:27 +0100 Subject: [PATCH 39/78] Replaced endpoint with copy --- .../eShopOnContainers/eShopOnContainers.Core/GlobalSettings.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/GlobalSettings.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/GlobalSettings.cs index 9b2b22b72..4c277d81b 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/GlobalSettings.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/GlobalSettings.cs @@ -4,7 +4,7 @@ { public const string AzureTag = "Azure"; public const string MockTag = "Mock"; - public const string DefaultEndpoint = "http://52.170.199.82"; + public const string DefaultEndpoint = "INSERT YOUR ENDPOINT HERE"; private string _baseEndpoint; private static readonly GlobalSetting _instance = new GlobalSetting(); From a91850a1903aa96e47c25dfcc7af00c54c20d9bc Mon Sep 17 00:00:00 2001 From: eiximenis Date: Wed, 21 Mar 2018 18:27:53 +0100 Subject: [PATCH 40/78] XamarinCallback config in k8s --- k8s/deploy.ps1 | 3 ++- k8s/deployments.yaml | 7 ++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/k8s/deploy.ps1 b/k8s/deploy.ps1 index 1ac5a2770..0739d7ef0 100644 --- a/k8s/deploy.ps1 +++ b/k8s/deploy.ps1 @@ -138,7 +138,8 @@ ExecKube -cmd 'create configmap urls ` --from-literal=locations_e=http://$($externalDns)/locations-api ` --from-literal=marketing_e=http://$($externalDns)/marketing-api ` --from-literal=basket_e=http://$($externalDns)/basket-api ` - --from-literal=ordering_e=http://$($externalDns)/ordering-api ' + --from-literal=ordering_e=http://$($externalDns)/ordering-api ` + --from-literal=xamarin_callback_e=http://$($externalDns)/xamarincallback' ExecKube -cmd 'label configmap urls app=eshop' diff --git a/k8s/deployments.yaml b/k8s/deployments.yaml index 10007fe4c..a7f2f8d37 100644 --- a/k8s/deployments.yaml +++ b/k8s/deployments.yaml @@ -189,7 +189,12 @@ spec: valueFrom: configMapKeyRef: name: urls - key: webshoppingagg_e + key: webshoppingagg_e + - name: XamarinCallback + valueFrom: + configMapKeyRef: + name: urls + key: xamarin_callback_e - name: ApplicationInsights__InstrumentationKey valueFrom: configMapKeyRef: From 9ba004187dedc0482be8c93b867cca9db90990d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Coben=CC=83a=20Moria=CC=81n?= Date: Thu, 22 Mar 2018 09:29:16 +0100 Subject: [PATCH 41/78] Clarified endpoint URI --- .../eShopOnContainers/eShopOnContainers.Core/GlobalSettings.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/GlobalSettings.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/GlobalSettings.cs index 4c277d81b..492dc1ca6 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/GlobalSettings.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/GlobalSettings.cs @@ -4,7 +4,7 @@ { public const string AzureTag = "Azure"; public const string MockTag = "Mock"; - public const string DefaultEndpoint = "INSERT YOUR ENDPOINT HERE"; + public const string DefaultEndpoint = "http://YOUR_IP_OR_DNS_NAME"; private string _baseEndpoint; private static readonly GlobalSetting _instance = new GlobalSetting(); From 4791be9298f3e319887c52e64e41d7c2eadbfb6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Coben=CC=83a=20Moria=CC=81n?= Date: Fri, 23 Mar 2018 10:26:02 +0100 Subject: [PATCH 42/78] Removed string.Format()s --- .../eShopOnContainers.Core/Services/Catalog/CatalogService.cs | 2 +- .../eShopOnContainers.Core/Services/Order/OrderService.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Catalog/CatalogService.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Catalog/CatalogService.cs index dd7cfe732..2811416ad 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Catalog/CatalogService.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Catalog/CatalogService.cs @@ -25,7 +25,7 @@ namespace eShopOnContainers.Core.Services.Catalog public async Task> FilterAsync(int catalogBrandId, int catalogTypeId) { UriBuilder builder = new UriBuilder(GlobalSetting.Instance.BaseEndpoint); - builder.Path = string.Format($"{ApiUrlBase}/items/type/{0}/brand/{1}", catalogTypeId, catalogBrandId); + builder.Path = $"{ApiUrlBase}/items/type/{catalogTypeId}/brand/{catalogBrandId}"; string uri = builder.ToString(); CatalogRoot catalog = await _requestProvider.GetAsync(uri); diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Order/OrderService.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Order/OrderService.cs index 0da0942ad..fb9a0c627 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Order/OrderService.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Order/OrderService.cs @@ -44,7 +44,7 @@ namespace eShopOnContainers.Core.Services.Order { UriBuilder builder = new UriBuilder(GlobalSetting.Instance.BaseEndpoint); - builder.Path = string.Format($"{ApiUrlBase}/{0}", orderId); + builder.Path = $"{ApiUrlBase}/{orderId}"; string uri = builder.ToString(); From adf46ff83749bea845127bccc460674bb1a9d2fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Coben=CC=83a=20Moria=CC=81n?= Date: Fri, 23 Mar 2018 10:28:30 +0100 Subject: [PATCH 43/78] Clarified endpoint style --- .../eShopOnContainers/eShopOnContainers.Core/GlobalSettings.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/GlobalSettings.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/GlobalSettings.cs index 492dc1ca6..e1637d7be 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/GlobalSettings.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/GlobalSettings.cs @@ -4,7 +4,7 @@ { public const string AzureTag = "Azure"; public const string MockTag = "Mock"; - public const string DefaultEndpoint = "http://YOUR_IP_OR_DNS_NAME"; + public const string DefaultEndpoint = "http://YOUR_IP_OR_DNS_NAME"; // i.e.: "http://YOUR_IP" or "http://YOUR_DNS_NAME" private string _baseEndpoint; private static readonly GlobalSetting _instance = new GlobalSetting(); From 1d8c6178de2830ad809eae138a0a99011c26ac2c Mon Sep 17 00:00:00 2001 From: Alex Kryvdyk Date: Mon, 26 Mar 2018 22:25:00 +0300 Subject: [PATCH 44/78] Improved encapsulation of DomainEvents collection in Entity class --- .../Ordering/Ordering.Domain/SeedWork/Entity.cs | 13 +++++++++---- .../Ordering.Infrastructure/MediatorExtension.cs | 2 +- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/Services/Ordering/Ordering.Domain/SeedWork/Entity.cs b/src/Services/Ordering/Ordering.Domain/SeedWork/Entity.cs index 11b940218..a1f2fa1c8 100644 --- a/src/Services/Ordering/Ordering.Domain/SeedWork/Entity.cs +++ b/src/Services/Ordering/Ordering.Domain/SeedWork/Entity.cs @@ -21,17 +21,22 @@ } private List _domainEvents; - public List DomainEvents => _domainEvents; - + public IReadOnlyCollection DomainEvents => _domainEvents?.AsReadOnly(); + public void AddDomainEvent(INotification eventItem) { _domainEvents = _domainEvents ?? new List(); _domainEvents.Add(eventItem); } + public void RemoveDomainEvent(INotification eventItem) { - if (_domainEvents is null) return; - _domainEvents.Remove(eventItem); + _domainEvents?.Remove(eventItem); + } + + public void ClearDomainEvents() + { + _domainEvents?.Clear(); } public bool IsTransient() diff --git a/src/Services/Ordering/Ordering.Infrastructure/MediatorExtension.cs b/src/Services/Ordering/Ordering.Infrastructure/MediatorExtension.cs index 521f85ae8..82a7235a2 100644 --- a/src/Services/Ordering/Ordering.Infrastructure/MediatorExtension.cs +++ b/src/Services/Ordering/Ordering.Infrastructure/MediatorExtension.cs @@ -19,7 +19,7 @@ namespace Ordering.Infrastructure .ToList(); domainEntities.ToList() - .ForEach(entity => entity.Entity.DomainEvents.Clear()); + .ForEach(entity => entity.Entity.ClearDomainEvents()); var tasks = domainEvents .Select(async (domainEvent) => { From 7c446d9ffd801ca0590f67f99e19f23b74601175 Mon Sep 17 00:00:00 2001 From: Cesar De la Torre Llorente Date: Mon, 26 Mar 2018 16:23:00 -0700 Subject: [PATCH 45/78] Upgraded to version: '3.4' in docker-compose files because since recent versions, VISUAL STUDIO FOR MAC requires docker-compose '3.4' in order to be able to F5 or Ctrl+F5 a Docker solution. --- docker-compose.ci.build.yml | 2 +- docker-compose.override.yml | 2 +- docker-compose.prod.yml | 2 +- docker-compose.yml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docker-compose.ci.build.yml b/docker-compose.ci.build.yml index e941c6ec1..747e8e583 100644 --- a/docker-compose.ci.build.yml +++ b/docker-compose.ci.build.yml @@ -1,4 +1,4 @@ -version: '3.3' +version: '3.4' services: ci-build: diff --git a/docker-compose.override.yml b/docker-compose.override.yml index 4f2e31123..4a3ffdd97 100644 --- a/docker-compose.override.yml +++ b/docker-compose.override.yml @@ -1,4 +1,4 @@ -version: '3.3' +version: '3.4' # The default docker-compose.override file can use the "localhost" as the external name for testing web apps within the same dev machine. # The ESHOP_EXTERNAL_DNS_NAME_OR_IP environment variable is taken, by default, from the ".env" file defined like: diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index fac480f2e..1be627e76 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -1,4 +1,4 @@ -version: '3.3' +version: '3.4' # The Production docker-compose file has to have the external/real IPs or DNS names for the services # The ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP environment variable is taken, by default, from the ".env" file defined like: diff --git a/docker-compose.yml b/docker-compose.yml index b237ad04f..f6f59db25 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,4 +1,4 @@ -version: '3.3' +version: '3.4' services: From 0c7671ea3664441666cdd712331236b0f52dc41b Mon Sep 17 00:00:00 2001 From: Cesar De la Torre Llorente Date: Mon, 26 Mar 2018 16:41:46 -0700 Subject: [PATCH 46/78] Updated rest of docker-compose files to v 3.4, so it works in VS for Mac --- docker-compose-external.override.yml | 2 +- docker-compose-external.yml | 2 +- docker-compose-windows.prod.yml | 2 +- docker-compose-windows.yml | 2 +- docker-compose.nobuild.yml | 2 +- docker-compose.override.windows.yml | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docker-compose-external.override.yml b/docker-compose-external.override.yml index 5a4957115..4637385a1 100644 --- a/docker-compose-external.override.yml +++ b/docker-compose-external.override.yml @@ -1,4 +1,4 @@ -version: '3.3' +version: '3.4' services: sql.data: diff --git a/docker-compose-external.yml b/docker-compose-external.yml index 43a1559be..22fe4ce89 100644 --- a/docker-compose-external.yml +++ b/docker-compose-external.yml @@ -1,4 +1,4 @@ -version: '3.3' +version: '3.4' services: sql.data: diff --git a/docker-compose-windows.prod.yml b/docker-compose-windows.prod.yml index c9e9825e3..ead977f29 100644 --- a/docker-compose-windows.prod.yml +++ b/docker-compose-windows.prod.yml @@ -1,4 +1,4 @@ -version: '3.3' +version: '3.4' # The Production docker-compose file has to have the external/real IPs or DNS names for the services # The ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP environment variable is taken, by default, from the ".env" file defined like: diff --git a/docker-compose-windows.yml b/docker-compose-windows.yml index 35f3ff7be..cec7323d1 100644 --- a/docker-compose-windows.yml +++ b/docker-compose-windows.yml @@ -1,4 +1,4 @@ -version: '3.3' +version: '3.4' services: basket.api: diff --git a/docker-compose.nobuild.yml b/docker-compose.nobuild.yml index bf1d9d24e..b2ebcf903 100644 --- a/docker-compose.nobuild.yml +++ b/docker-compose.nobuild.yml @@ -1,4 +1,4 @@ -version: '3.3' +version: '3.4' services: basket.api: diff --git a/docker-compose.override.windows.yml b/docker-compose.override.windows.yml index b4828607a..76ccda8b0 100644 --- a/docker-compose.override.windows.yml +++ b/docker-compose.override.windows.yml @@ -1,4 +1,4 @@ -version: '3.3' +version: '3.4' # ONLY NEEDED WHEN RUNNING WINDOWS CONTAINERS # From 885703c921989a56b2d476992e99b4b7d1482619 Mon Sep 17 00:00:00 2001 From: Cesar De la Torre Date: Wed, 28 Mar 2018 16:48:46 -0700 Subject: [PATCH 47/78] Update README.md --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index b9b28ca81..e7a8dff0f 100644 --- a/README.md +++ b/README.md @@ -4,8 +4,6 @@ Sample .NET Core reference application, powered by Microsoft, based on a simplif **NEWS / ANNOUNCEMENTS** Do you want to be up-to-date on .NET Architecture guidance and reference apps like eShopOnContainers? --> Subscribe by "WATCHING" this new GitHub repo: https://github.com/dotnet-architecture/News -**Note Visual Studio 2017 version required**: Please, use VS 2017 15.5 or later. - **Note for Pull Requests**: We accept pull request from the community. When doing it, please do it onto the DEV branch which is the consolidated work-in-progress branch. Do not request it onto Master, if possible. ## Updated for .NET Core 2.0 "wave" of technologies From a627d1f9e24d8526cf3bebc12f75805d1c4c7059 Mon Sep 17 00:00:00 2001 From: David Britch Date: Thu, 29 Mar 2018 13:26:26 +0100 Subject: [PATCH 48/78] SettingsService now uses Application.Current.Properties dictionary. Platform specific settings code removed. --- .../Extensions/ObservableExtension.cs | 1 - .../Services/Settings/ISettingsService.cs | 9 +- .../ISettingsServiceImplementation.cs | 13 - .../Services/Settings/SettingsService.cs | 109 ++- .../Extensions/LocationExtensions.cs | 2 +- .../Services/SettingsServiceImplementation.cs | 149 --- .../eShopOnContainers.Droid.csproj | 3 +- .../eShopOnContainers.TestRunner.iOS.csproj | 454 +++++----- .../Mocks/MockSettingsService.cs | 95 +- .../Services/SettingsServiceImplementation.cs | 128 --- .../eShopOnContainers.iOS.csproj | 849 +++++++++--------- 11 files changed, 811 insertions(+), 1001 deletions(-) delete mode 100644 src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Settings/ISettingsServiceImplementation.cs delete mode 100644 src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Services/SettingsServiceImplementation.cs delete mode 100644 src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Services/SettingsServiceImplementation.cs diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Extensions/ObservableExtension.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Extensions/ObservableExtension.cs index ad10bd941..800f9a031 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Extensions/ObservableExtension.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Extensions/ObservableExtension.cs @@ -15,7 +15,6 @@ namespace eShopOnContainers.Core.Extensions } return collection; - } } } \ No newline at end of file diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Settings/ISettingsService.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Settings/ISettingsService.cs index 5e2732bf9..69ede7b72 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Settings/ISettingsService.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Settings/ISettingsService.cs @@ -1,4 +1,6 @@ -namespace eShopOnContainers.Core.Services.Settings +using System.Threading.Tasks; + +namespace eShopOnContainers.Core.Services.Settings { public interface ISettingsService { @@ -10,5 +12,10 @@ string Latitude { get; set; } string Longitude { get; set; } bool AllowGpsLocation { get; set; } + + bool GetValueOrDefault(string key, bool defaultValue); + string GetValueOrDefault(string key, string defaultValue); + Task AddOrUpdateValue(string key, bool value); + Task AddOrUpdateValue(string key, string value); } } diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Settings/ISettingsServiceImplementation.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Settings/ISettingsServiceImplementation.cs deleted file mode 100644 index ef9d14ed6..000000000 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Settings/ISettingsServiceImplementation.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace eShopOnContainers.Core.Services.Settings -{ - public interface ISettingsServiceImplementation - { - bool GetValueOrDefault(string key, bool defaultValue); - string GetValueOrDefault(string key, string defaultValue); - - bool AddOrUpdateValue(string key, bool value); - bool AddOrUpdateValue(string key, string value); - - void Remove(string key); - } -} diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Settings/SettingsService.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Settings/SettingsService.cs index a13f53187..ca3e03c04 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Settings/SettingsService.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Settings/SettingsService.cs @@ -1,21 +1,11 @@ -using eShopOnContainers.Core.Services.Dependency; +using System; +using System.Threading.Tasks; +using Xamarin.Forms; namespace eShopOnContainers.Core.Services.Settings { public class SettingsService : ISettingsService { - private readonly ISettingsServiceImplementation _settingsService; - - ISettingsServiceImplementation AppSettings - { - get { return _settingsService; } - } - - public SettingsService(IDependencyService dependencyService) - { - _settingsService = dependencyService.Get(); - } - #region Setting Constants private const string AccessToken = "access_token"; @@ -37,52 +27,113 @@ namespace eShopOnContainers.Core.Services.Settings #endregion + #region Settings Properties + public string AuthAccessToken { - get => AppSettings.GetValueOrDefault(AccessToken, AccessTokenDefault); - set => AppSettings.AddOrUpdateValue(AccessToken, value); + get => GetValueOrDefault(AccessToken, AccessTokenDefault); + set => AddOrUpdateValue(AccessToken, value); } public string AuthIdToken { - get => AppSettings.GetValueOrDefault(IdToken, IdTokenDefault); - set => AppSettings.AddOrUpdateValue(IdToken, value); + get => GetValueOrDefault(IdToken, IdTokenDefault); + set => AddOrUpdateValue(IdToken, value); } public bool UseMocks { - get => AppSettings.GetValueOrDefault(IdUseMocks, UseMocksDefault); - set => AppSettings.AddOrUpdateValue(IdUseMocks, value); + get => GetValueOrDefault(IdUseMocks, UseMocksDefault); + set => AddOrUpdateValue(IdUseMocks, value); } public string UrlBase { - get => AppSettings.GetValueOrDefault(IdUrlBase, UrlBaseDefault); - set => AppSettings.AddOrUpdateValue(IdUrlBase, value); + get => GetValueOrDefault(IdUrlBase, UrlBaseDefault); + set => AddOrUpdateValue(IdUrlBase, value); } public bool UseFakeLocation { - get => AppSettings.GetValueOrDefault(IdUseFakeLocation, UseFakeLocationDefault); - set => AppSettings.AddOrUpdateValue(IdUseFakeLocation, value); + get => GetValueOrDefault(IdUseFakeLocation, UseFakeLocationDefault); + set => AddOrUpdateValue(IdUseFakeLocation, value); } public string Latitude { - get => AppSettings.GetValueOrDefault(IdLatitude, FakeLatitudeDefault.ToString()); - set => AppSettings.AddOrUpdateValue(IdLatitude, value); + get => GetValueOrDefault(IdLatitude, FakeLatitudeDefault.ToString()); + set => AddOrUpdateValue(IdLatitude, value); } public string Longitude { - get => AppSettings.GetValueOrDefault(IdLongitude, FakeLongitudeDefault.ToString()); - set => AppSettings.AddOrUpdateValue(IdLongitude, value); + get => GetValueOrDefault(IdLongitude, FakeLongitudeDefault.ToString()); + set => AddOrUpdateValue(IdLongitude, value); } public bool AllowGpsLocation { - get => AppSettings.GetValueOrDefault(IdAllowGpsLocation, AllowGpsLocationDefault); - set => AppSettings.AddOrUpdateValue(IdAllowGpsLocation, value); + get => GetValueOrDefault(IdAllowGpsLocation, AllowGpsLocationDefault); + set => AddOrUpdateValue(IdAllowGpsLocation, value); } + + #endregion + + #region Public Methods + + public Task AddOrUpdateValue(string key, bool value) => AddOrUpdateValueInternal(key, value); + public Task AddOrUpdateValue(string key, string value) => AddOrUpdateValueInternal(key, value); + public bool GetValueOrDefault(string key, bool defaultValue) => GetValueOrDefaultInternal(key, defaultValue); + public string GetValueOrDefault(string key, string defaultValue) => GetValueOrDefaultInternal(key, defaultValue); + + #endregion + + #region Internal Implementation + + async Task AddOrUpdateValueInternal(string key, T value) + { + if (value == null) + { + await Remove(key); + } + + Application.Current.Properties[key] = value; + try + { + await Application.Current.SavePropertiesAsync(); + } + catch (Exception ex) + { + Console.WriteLine("Unable to save: " + key, " Message: " + ex.Message); + } + } + + T GetValueOrDefaultInternal(string key, T defaultValue = default(T)) + { + object value = null; + if (Application.Current.Properties.ContainsKey(key)) + { + value = Application.Current.Properties[key]; + } + return null != value ? (T)value : defaultValue; + } + + async Task Remove(string key) + { + try + { + if (Application.Current.Properties[key] != null) + { + Application.Current.Properties.Remove(key); + await Application.Current.SavePropertiesAsync(); + } + } + catch (Exception ex) + { + Console.WriteLine("Unable to remove: " + key, " Message: " + ex.Message); + } + } + + #endregion } } \ No newline at end of file diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Extensions/LocationExtensions.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Extensions/LocationExtensions.cs index 41ea2ad3e..031c186aa 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Extensions/LocationExtensions.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Extensions/LocationExtensions.cs @@ -32,7 +32,7 @@ namespace eShopOnContainers.Droid.Extensions { return new DateTimeOffset(Epoch.AddMilliseconds(location.Time)); } - catch (Exception e) + catch (Exception) { return new DateTimeOffset(Epoch); } diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Services/SettingsServiceImplementation.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Services/SettingsServiceImplementation.cs deleted file mode 100644 index 7cdce4555..000000000 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Services/SettingsServiceImplementation.cs +++ /dev/null @@ -1,149 +0,0 @@ -using Android.App; -using Android.Content; -using Android.Preferences; -using eShopOnContainers.Core.Services.Settings; -using eShopOnContainers.Droid.Services; -using System; - -[assembly: Xamarin.Forms.Dependency(typeof(SettingsServiceImplementation))] -namespace eShopOnContainers.Droid.Services -{ - public class SettingsServiceImplementation : ISettingsServiceImplementation - { - #region Internal Implementation - - readonly object _locker = new object(); - - ISharedPreferences GetSharedPreference() - { - return PreferenceManager.GetDefaultSharedPreferences(Application.Context); - } - - bool AddOrUpdateValueInternal(string key, T value) - { - if (Application.Context == null) - return false; - - if (value == null) - { - Remove(key); - return true; - } - - var type = typeof(T); - if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) - { - type = Nullable.GetUnderlyingType(type); - } - var typeCode = Type.GetTypeCode(type); - - lock (_locker) - { - using (var sharedPrefs = GetSharedPreference()) - { - using (var editor = sharedPrefs.Edit()) - { - switch (typeCode) - { - case TypeCode.Boolean: - editor.PutBoolean(key, Convert.ToBoolean(value)); - break; - case TypeCode.String: - editor.PutString(key, Convert.ToString(value)); - break; - default: - throw new ArgumentException($"Value of type {typeCode} is not supported."); - } - editor.Commit(); - } - } - } - return true; - } - - T GetValueOrDefaultInternal(string key, T defaultValue = default(T)) - { - if (Application.Context == null) - return defaultValue; - - if (!Contains(key)) - return defaultValue; - - lock (_locker) - { - using (var sharedPrefs = GetSharedPreference()) - { - var type = typeof(T); - if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) - { - type = Nullable.GetUnderlyingType(type); - } - - object value = null; - var typeCode = Type.GetTypeCode(type); - switch (typeCode) - { - case TypeCode.Boolean: - value = sharedPrefs.GetBoolean(key, Convert.ToBoolean(defaultValue)); - break; - case TypeCode.String: - value = sharedPrefs.GetString(key, Convert.ToString(defaultValue)); - break; - default: - throw new ArgumentException($"Value of type {typeCode} is not supported."); - } - - return null != value ? (T)value : defaultValue; - } - } - } - - bool Contains(string key) - { - if (Application.Context == null) - return false; - - lock (_locker) - { - using (var sharedPrefs = GetSharedPreference()) - { - if (sharedPrefs == null) - return false; - return sharedPrefs.Contains(key); - } - } - } - - #endregion - - #region ISettingsServiceImplementation - - public bool AddOrUpdateValue(string key, bool value) => AddOrUpdateValueInternal(key, value); - - public bool AddOrUpdateValue(string key, string value) => AddOrUpdateValueInternal(key, value); - - public bool GetValueOrDefault(string key, bool defaultValue) => GetValueOrDefaultInternal(key, defaultValue); - - public string GetValueOrDefault(string key, string defaultValue) => GetValueOrDefaultInternal(key, defaultValue); - - public void Remove(string key) - { - if (Application.Context == null) - return; - - lock (_locker) - { - using (var sharedPrefs = GetSharedPreference()) - { - using (var editor = sharedPrefs.Edit()) - { - editor.Remove(key); - editor.Commit(); - } - } - } - } - - #endregion - } -} diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/eShopOnContainers.Droid.csproj b/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/eShopOnContainers.Droid.csproj index 7d699f9d2..92e2df581 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/eShopOnContainers.Droid.csproj +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Droid/eShopOnContainers.Droid.csproj @@ -19,7 +19,7 @@ Off Properties\AndroidManifest.xml true - v8.0 + v8.1 armeabi,armeabi-v7a,x86 @@ -211,7 +211,6 @@ - diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.iOS/eShopOnContainers.TestRunner.iOS.csproj b/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.iOS/eShopOnContainers.TestRunner.iOS.csproj index 4a83a29a8..250d836a7 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.iOS/eShopOnContainers.TestRunner.iOS.csproj +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.iOS/eShopOnContainers.TestRunner.iOS.csproj @@ -1,232 +1,232 @@  - - - - Debug - iPhoneSimulator - {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3} - {FEACFBD2-3405-455C-9665-78FE426C6842};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - Exe - eShopOnContainers.TestRunner.iOS - Resources - eShopOnContainersTestRunneriOS - - - - - true - full - false - bin\iPhoneSimulator\Debug - DEBUG - prompt - 4 - false - x86_64 - None - True - False - False - False - False - False - True - Default - HttpClientHandler - False - - - false - none - true - bin\iPhoneSimulator\Release - prompt - 4 - None - x86_64 - false - - - true - full - false - bin\iPhone\Debug - DEBUG - prompt - 4 - false - ARMv7, ARM64 - Entitlements.plist - iPhone Developer - true - None - - - false - none - true - bin\iPhone\Release - prompt - 4 - Entitlements.plist - ARMv7, ARM64 - false - iPhone Developer - - - none - True - bin\iPhone\Ad-Hoc - prompt - 4 - False - ARMv7, ARM64 - Entitlements.plist - True - Automatic:AdHoc - iPhone Distribution - - - none - True - bin\iPhone\AppStore - prompt - 4 - False - ARMv7, ARM64 - Entitlements.plist - Automatic:AppStore - iPhone Distribution - - - - - - - - - - - - - - - - ..\..\..\..\packages\Xamarin.Forms.2.5.0.122203\lib\Xamarin.iOS10\Xamarin.Forms.Core.dll - - - ..\..\..\..\packages\Xamarin.Forms.2.5.0.122203\lib\Xamarin.iOS10\Xamarin.Forms.Platform.dll - - - ..\..\..\..\packages\Xamarin.Forms.2.5.0.122203\lib\Xamarin.iOS10\Xamarin.Forms.Platform.iOS.dll - - - ..\..\..\..\packages\Xamarin.Forms.2.5.0.122203\lib\Xamarin.iOS10\Xamarin.Forms.Xaml.dll - - - - - - ..\..\..\..\packages\xunit.runner.devices.2.3.3\lib\xamarinios10\xunit.runner.devices.dll - - - ..\..\..\..\packages\xunit.runner.devices.2.3.3\lib\xamarinios10\xunit.runner.utility.netstandard15.dll - - - ..\..\..\..\packages\xunit.abstractions.2.0.1\lib\netstandard1.0\xunit.abstractions.dll - - - ..\..\..\..\packages\xunit.assert.2.3.1\lib\netstandard1.1\xunit.assert.dll - - - ..\..\..\..\packages\xunit.extensibility.core.2.3.1\lib\netstandard1.1\xunit.core.dll - - - ..\..\..\..\packages\xunit.extensibility.execution.2.3.1\lib\netstandard1.1\xunit.execution.dotnet.dll - - - - ..\..\..\..\packages\Newtonsoft.Json.10.0.3\lib\netstandard1.3\Newtonsoft.Json.dll - - - ..\..\..\..\packages\SlideOverKit.2.1.5\lib\Xamarin.iOS10\SlideOverKit.dll - - - ..\..\..\..\packages\SlideOverKit.2.1.5\lib\Xamarin.iOS10\SlideOverKit.iOS.dll - - - ..\..\..\..\packages\IdentityModel.3.0.0\lib\netstandard2.0\IdentityModel.dll - - - ..\..\..\..\packages\Acr.Support.2.1.0\lib\Xamarin.iOS10\Acr.Support.iOS.dll - - - ..\..\..\..\packages\BTProgressHUD.1.2.0.5\lib\Xamarin.iOS10\BTProgressHUD.dll - - - ..\..\..\..\packages\Splat.2.0.0\lib\Xamarin.iOS10\Splat.dll - - - ..\..\..\..\packages\Acr.UserDialogs.6.5.1\lib\Xamarin.iOS10\Acr.UserDialogs.dll - - - ..\..\..\..\packages\Acr.UserDialogs.6.5.1\lib\Xamarin.iOS10\Acr.UserDialogs.Interface.dll - - - ..\..\..\..\packages\WebP.Touch.1.0.7\lib\Xamarin.iOS10\WebP.Touch.dll - - - ..\..\..\..\packages\Xamarin.FFImageLoading.2.3.4\lib\Xamarin.iOS10\FFImageLoading.dll - - - ..\..\..\..\packages\Xamarin.FFImageLoading.2.3.4\lib\Xamarin.iOS10\FFImageLoading.Platform.dll - - - ..\..\..\..\packages\Xamarin.FFImageLoading.Forms.2.3.4\lib\Xamarin.iOS10\FFImageLoading.Forms.dll - - - ..\..\..\..\packages\Xamarin.FFImageLoading.Forms.2.3.4\lib\Xamarin.iOS10\FFImageLoading.Forms.Touch.dll - - - ..\..\..\..\packages\PInvoke.Windows.Core.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.Windows.Core.dll - - - ..\..\..\..\packages\PInvoke.Kernel32.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.Kernel32.dll - - - ..\..\..\..\packages\PInvoke.BCrypt.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.BCrypt.dll - - - ..\..\..\..\packages\PInvoke.NCrypt.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.NCrypt.dll - - - ..\..\..\..\packages\Validation.2.2.8\lib\dotnet\Validation.dll - - - ..\..\..\..\packages\PCLCrypto.2.0.147\lib\xamarinios10\PCLCrypto.dll - - - - - - - - {FDD910BC-DF0F-483D-B7D5-C7D831855172} - eShopOnContainers.UnitTests - - - - - - + + - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + Debug + iPhoneSimulator + {B68C2B56-7581-46AE-B55D-D25DDFD3BFE3} + {FEACFBD2-3405-455C-9665-78FE426C6842};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + Exe + eShopOnContainers.TestRunner.iOS + Resources + eShopOnContainersTestRunneriOS + + + true - - - - - - + + true + full + false + bin\iPhoneSimulator\Debug + DEBUG + prompt + 4 + false + x86_64 + None + True + False + False + False + False + False + True + Default + HttpClientHandler + False + + + false + none + true + bin\iPhoneSimulator\Release + prompt + 4 + None + x86_64 + false + + + true + full + false + bin\iPhone\Debug + DEBUG + prompt + 4 + false + ARMv7, ARM64 + Entitlements.plist + iPhone Developer + true + None + + + false + none + true + bin\iPhone\Release + prompt + 4 + Entitlements.plist + ARMv7, ARM64 + false + iPhone Developer + + + none + True + bin\iPhone\Ad-Hoc + prompt + 4 + False + ARMv7, ARM64 + Entitlements.plist + True + Automatic:AdHoc + iPhone Distribution + + + none + True + bin\iPhone\AppStore + prompt + 4 + False + ARMv7, ARM64 + Entitlements.plist + Automatic:AppStore + iPhone Distribution + + + + + + + + + + + + + + + + ..\..\..\..\packages\Xamarin.Forms.2.5.0.122203\lib\Xamarin.iOS10\Xamarin.Forms.Core.dll + + + ..\..\..\..\packages\Xamarin.Forms.2.5.0.122203\lib\Xamarin.iOS10\Xamarin.Forms.Platform.dll + + + ..\..\..\..\packages\Xamarin.Forms.2.5.0.122203\lib\Xamarin.iOS10\Xamarin.Forms.Platform.iOS.dll + + + ..\..\..\..\packages\Xamarin.Forms.2.5.0.122203\lib\Xamarin.iOS10\Xamarin.Forms.Xaml.dll + + + + + + ..\..\..\..\packages\xunit.runner.devices.2.3.3\lib\xamarinios10\xunit.runner.devices.dll + + + ..\..\..\..\packages\xunit.runner.devices.2.3.3\lib\xamarinios10\xunit.runner.utility.netstandard15.dll + + + ..\..\..\..\packages\xunit.abstractions.2.0.1\lib\netstandard1.0\xunit.abstractions.dll + + + ..\..\..\..\packages\xunit.assert.2.3.1\lib\netstandard1.1\xunit.assert.dll + + + ..\..\..\..\packages\xunit.extensibility.core.2.3.1\lib\netstandard1.1\xunit.core.dll + + + ..\..\..\..\packages\xunit.extensibility.execution.2.3.1\lib\netstandard1.1\xunit.execution.dotnet.dll + + + ..\..\..\..\packages\Newtonsoft.Json.10.0.3\lib\netstandard1.3\Newtonsoft.Json.dll + + + ..\..\..\..\packages\SlideOverKit.2.1.5\lib\Xamarin.iOS10\SlideOverKit.dll + + + ..\..\..\..\packages\SlideOverKit.2.1.5\lib\Xamarin.iOS10\SlideOverKit.iOS.dll + + + ..\..\..\..\packages\IdentityModel.3.0.0\lib\netstandard2.0\IdentityModel.dll + + + ..\..\..\..\packages\Acr.Support.2.1.0\lib\Xamarin.iOS10\Acr.Support.iOS.dll + + + ..\..\..\..\packages\BTProgressHUD.1.2.0.5\lib\Xamarin.iOS10\BTProgressHUD.dll + + + ..\..\..\..\packages\Splat.2.0.0\lib\Xamarin.iOS10\Splat.dll + + + ..\..\..\..\packages\Acr.UserDialogs.6.5.1\lib\Xamarin.iOS10\Acr.UserDialogs.dll + + + ..\..\..\..\packages\Acr.UserDialogs.6.5.1\lib\Xamarin.iOS10\Acr.UserDialogs.Interface.dll + + + ..\..\..\..\packages\WebP.Touch.1.0.7\lib\Xamarin.iOS10\WebP.Touch.dll + + + ..\..\..\..\packages\Xamarin.FFImageLoading.2.3.4\lib\Xamarin.iOS10\FFImageLoading.dll + + + ..\..\..\..\packages\Xamarin.FFImageLoading.2.3.4\lib\Xamarin.iOS10\FFImageLoading.Platform.dll + + + ..\..\..\..\packages\Xamarin.FFImageLoading.Forms.2.3.4\lib\Xamarin.iOS10\FFImageLoading.Forms.dll + + + ..\..\..\..\packages\Xamarin.FFImageLoading.Forms.2.3.4\lib\Xamarin.iOS10\FFImageLoading.Forms.Touch.dll + + + ..\..\..\..\packages\PInvoke.Windows.Core.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.Windows.Core.dll + + + ..\..\..\..\packages\PInvoke.Kernel32.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.Kernel32.dll + + + ..\..\..\..\packages\PInvoke.BCrypt.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.BCrypt.dll + + + ..\..\..\..\packages\PInvoke.NCrypt.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.NCrypt.dll + + + ..\..\..\..\packages\Validation.2.2.8\lib\dotnet\Validation.dll + + + ..\..\..\..\packages\PCLCrypto.2.0.147\lib\xamarinios10\PCLCrypto.dll + + + + + + + + {FDD910BC-DF0F-483D-B7D5-C7D831855172} + eShopOnContainers.UnitTests + + + + + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + + + + \ No newline at end of file diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/Mocks/MockSettingsService.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/Mocks/MockSettingsService.cs index 23e1cedc5..37bfc125f 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/Mocks/MockSettingsService.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/Mocks/MockSettingsService.cs @@ -1,65 +1,110 @@ using eShopOnContainers.Core.Services.Settings; -using System; +using System.Collections.Generic; +using System.Threading.Tasks; namespace eShopOnContainers.UnitTests.Mocks { public class MockSettingsService : ISettingsService { - string _accessTokenDefault = string.Empty; - string _idTokenDefault = string.Empty; - bool _useMocksDefault = true; - string _urlBaseDefault = "https://13.88.8.119"; - bool _useFakeLocationDefault = false; - bool _allowGpsLocationDefault = false; - double _fakeLatitudeDefault = 47.604610d; - double _fakeLongitudeDefault = -122.315752d; + IDictionary _settings = new Dictionary(); + + const string AccessToken = "access_token"; + const string IdToken = "id_token"; + const string IdUseMocks = "use_mocks"; + const string IdUrlBase = "url_base"; + const string IdUseFakeLocation = "use_fake_location"; + const string IdLatitude = "latitude"; + const string IdLongitude = "longitude"; + const string IdAllowGpsLocation = "allow_gps_location"; + readonly string AccessTokenDefault = string.Empty; + readonly string IdTokenDefault = string.Empty; + readonly bool UseMocksDefault = true; + readonly bool UseFakeLocationDefault = false; + readonly bool AllowGpsLocationDefault = false; + readonly double FakeLatitudeDefault = 47.604610d; + readonly double FakeLongitudeDefault = -122.315752d; + readonly string UrlBaseDefault = "https://13.88.8.119"; public string AuthAccessToken { - get { return _accessTokenDefault; } - set { _accessTokenDefault = value; } + get => GetValueOrDefault(AccessToken, AccessTokenDefault); + set => AddOrUpdateValue(AccessToken, value); } public string AuthIdToken { - get { return _idTokenDefault; } - set { _idTokenDefault = value; } + get => GetValueOrDefault(IdToken, IdTokenDefault); + set => AddOrUpdateValue(IdToken, value); } public bool UseMocks { - get { return _useMocksDefault; } - set { _useMocksDefault = value; } + get => GetValueOrDefault(IdUseMocks, UseMocksDefault); + set => AddOrUpdateValue(IdUseMocks, value); } public string UrlBase { - get { return _urlBaseDefault; } - set { _urlBaseDefault = value; } + get => GetValueOrDefault(IdUrlBase, UrlBaseDefault); + set => AddOrUpdateValue(IdUrlBase, value); } public bool UseFakeLocation { - get { return _useFakeLocationDefault; } - set { _useFakeLocationDefault = value; } + get => GetValueOrDefault(IdUseFakeLocation, UseFakeLocationDefault); + set => AddOrUpdateValue(IdUseFakeLocation, value); } public string Latitude { - get { return _fakeLatitudeDefault.ToString(); } - set { _fakeLatitudeDefault = Convert.ToDouble(value); } + get => GetValueOrDefault(IdLatitude, FakeLatitudeDefault.ToString()); + set => AddOrUpdateValue(IdLatitude, value); } public string Longitude { - get { return _fakeLongitudeDefault.ToString(); } - set { _fakeLongitudeDefault = Convert.ToDouble(value); } + get => GetValueOrDefault(IdLongitude, FakeLongitudeDefault.ToString()); + set => AddOrUpdateValue(IdLongitude, value); } public bool AllowGpsLocation { - get { return _allowGpsLocationDefault; } - set { _allowGpsLocationDefault = value; } + get => GetValueOrDefault(IdAllowGpsLocation, AllowGpsLocationDefault); + set => AddOrUpdateValue(IdAllowGpsLocation, value); + } + + public Task AddOrUpdateValue(string key, bool value) => AddOrUpdateValueInternal(key, value); + public Task AddOrUpdateValue(string key, string value) => AddOrUpdateValueInternal(key, value); + public bool GetValueOrDefault(string key, bool defaultValue) => GetValueOrDefaultInternal(key, defaultValue); + public string GetValueOrDefault(string key, string defaultValue) => GetValueOrDefaultInternal(key, defaultValue); + + Task AddOrUpdateValueInternal(string key, T value) + { + if (value == null) + { + Remove(key); + } + + _settings[key] = value; + return Task.Delay(10); + } + + T GetValueOrDefaultInternal(string key, T defaultValue = default(T)) + { + object value = null; + if (_settings.ContainsKey(key)) + { + value = _settings[key]; + } + return null != value ? (T)value : defaultValue; + } + + void Remove(string key) + { + if (_settings[key] != null) + { + _settings.Remove(key); + } } } } diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Services/SettingsServiceImplementation.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Services/SettingsServiceImplementation.cs deleted file mode 100644 index ee17b8ff7..000000000 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Services/SettingsServiceImplementation.cs +++ /dev/null @@ -1,128 +0,0 @@ -using eShopOnContainers.Core.Services.Settings; -using eShopOnContainers.iOS.Services; -using Foundation; -using System; - -[assembly: Xamarin.Forms.Dependency(typeof(SettingsServiceImplementation))] -namespace eShopOnContainers.iOS.Services -{ - public class SettingsServiceImplementation : ISettingsServiceImplementation - { - #region Internal Implementation - - readonly object _locker = new object(); - - NSUserDefaults GetUserDefaults() => NSUserDefaults.StandardUserDefaults; - - bool AddOrUpdateValueInternal(string key, T value) - { - if (value == null) - { - Remove(key); - return true; - } - - var type = typeof(T); - if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) - { - type = Nullable.GetUnderlyingType(type); - } - var typeCode = Type.GetTypeCode(type); - - lock (_locker) - { - var defaults = GetUserDefaults(); - switch (typeCode) - { - case TypeCode.Boolean: - defaults.SetBool(Convert.ToBoolean(value), key); - break; - case TypeCode.String: - defaults.SetString(Convert.ToString(value), key); - break; - default: - throw new ArgumentException($"Value of type {typeCode} is unsupported."); - } - - try - { - defaults.Synchronize(); - } - catch (Exception ex) - { - Console.WriteLine("Unable to save: " + key, " Message: " + ex.Message); - } - } - return true; - } - - T GetValueOrDefaultInternal(string key, T defaultValue = default(T)) - { - lock (_locker) - { - var defaults = GetUserDefaults(); - - if (defaults[key] == null) - { - return defaultValue; - } - - var type = typeof(T); - if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) - { - type = Nullable.GetUnderlyingType(type); - } - - object value = null; - var typeCode = Type.GetTypeCode(type); - switch (typeCode) - { - case TypeCode.Boolean: - value = defaults.BoolForKey(key); - break; - case TypeCode.String: - value = defaults.StringForKey(key); - break; - default: - throw new ArgumentException($"Value of type {typeCode} is unsupported."); - } - - return null != value ? (T)value : defaultValue; - } - } - - #endregion - - #region ISettingsServiceImplementation - - public bool AddOrUpdateValue(string key, bool value) => AddOrUpdateValueInternal(key, value); - - public bool AddOrUpdateValue(string key, string value) => AddOrUpdateValueInternal(key, value); - - public bool GetValueOrDefault(string key, bool defaultValue) => GetValueOrDefaultInternal(key, defaultValue); - - public string GetValueOrDefault(string key, string defaultValue) => GetValueOrDefaultInternal(key, defaultValue); - - public void Remove(string key) - { - lock (_locker) - { - var defaults = GetUserDefaults(); - try - { - if (defaults[key] != null) - { - defaults.RemoveObject(key); - defaults.Synchronize(); - } - } - catch (Exception ex) - { - Console.WriteLine("Unable to remove: " + key, " Message: " + ex.Message); - } - } - } - - #endregion - } -} diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/eShopOnContainers.iOS.csproj b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/eShopOnContainers.iOS.csproj index 6ea0a4465..3d18f3a5c 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/eShopOnContainers.iOS.csproj +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.iOS/eShopOnContainers.iOS.csproj @@ -1,429 +1,428 @@  - - - Debug - iPhoneSimulator - 8.0.30703 - 2.0 - {6EEB23DC-7063-4444-9AF8-90DF24F549C0} - {FEACFBD2-3405-455C-9665-78FE426C6842};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - Exe - eShopOnContainers.iOS - Resources - eShopOnContainersiOS - - - true - - - true - full - false - bin\iPhoneSimulator\Debug - DEBUG - prompt - 4 - false - i386, x86_64 - None - True - False - False - False - False - False - True - Default - HttpClientHandler - False - - - none - true - bin\iPhoneSimulator\Release - prompt - 4 - None - i386, x86_64 - false - - - true - full - false - bin\iPhone\Debug - DEBUG - prompt - 4 - false - ARMv7, ARM64 - iPhone Developer - true - Entitlements.plist - None - - - none - true - bin\iPhone\Release - prompt - 4 - ARMv7, ARM64 - false - iPhone Developer - Entitlements.plist - - - none - True - bin\iPhone\Ad-Hoc - prompt - 4 - False - ARMv7, ARM64 - True - Automatic:AdHoc - iPhone Distribution - Entitlements.plist - - - none - True - bin\iPhone\AppStore - prompt - 4 - False - ARMv7, ARM64 - Automatic:AppStore - iPhone Distribution - Entitlements.plist - - - - - - - Resources\fonts\Montserrat-Bold.ttf - - - Resources\fonts\Montserrat-Regular.ttf - - - Resources\fonts\SourceSansPro-Regular.ttf - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ..\..\..\..\packages\Xamarin.Forms.2.5.0.122203\lib\Xamarin.iOS10\Xamarin.Forms.Core.dll - - - ..\..\..\..\packages\Xamarin.Forms.2.5.0.122203\lib\Xamarin.iOS10\Xamarin.Forms.Platform.dll - - - ..\..\..\..\packages\Xamarin.Forms.2.5.0.122203\lib\Xamarin.iOS10\Xamarin.Forms.Platform.iOS.dll - - - ..\..\..\..\packages\Xamarin.Forms.2.5.0.122203\lib\Xamarin.iOS10\Xamarin.Forms.Xaml.dll - - - ..\..\..\..\packages\WebP.Touch.1.0.7\lib\Xamarin.iOS10\WebP.Touch.dll - - - ..\..\..\..\packages\Xamarin.FFImageLoading.2.3.4\lib\Xamarin.iOS10\FFImageLoading.dll - - - ..\..\..\..\packages\Xamarin.FFImageLoading.2.3.4\lib\Xamarin.iOS10\FFImageLoading.Platform.dll - - - ..\..\..\..\packages\Xamarin.FFImageLoading.Forms.2.3.4\lib\Xamarin.iOS10\FFImageLoading.Forms.dll - - - ..\..\..\..\packages\Xamarin.FFImageLoading.Forms.2.3.4\lib\Xamarin.iOS10\FFImageLoading.Forms.Touch.dll - - - ..\..\..\..\packages\SlideOverKit.2.1.5\lib\Xamarin.iOS10\SlideOverKit.dll - - - ..\..\..\..\packages\SlideOverKit.2.1.5\lib\Xamarin.iOS10\SlideOverKit.iOS.dll - - - ..\..\..\..\packages\Xam.Plugins.Settings.3.1.1\lib\Xamarin.iOS10\Plugin.Settings.Abstractions.dll - - - ..\..\..\..\packages\Xam.Plugins.Settings.3.1.1\lib\Xamarin.iOS10\Plugin.Settings.dll - - - - ..\..\..\..\packages\Newtonsoft.Json.10.0.3\lib\netstandard1.3\Newtonsoft.Json.dll - - - ..\..\..\..\packages\Acr.Support.2.1.0\lib\Xamarin.iOS10\Acr.Support.iOS.dll - - - ..\..\..\..\packages\BTProgressHUD.1.2.0.5\lib\Xamarin.iOS10\BTProgressHUD.dll - - - ..\..\..\..\packages\Splat.2.0.0\lib\Xamarin.iOS10\Splat.dll - - - ..\..\..\..\packages\Acr.UserDialogs.6.5.1\lib\Xamarin.iOS10\Acr.UserDialogs.dll - - - ..\..\..\..\packages\Acr.UserDialogs.6.5.1\lib\Xamarin.iOS10\Acr.UserDialogs.Interface.dll - - - ..\..\..\..\packages\PInvoke.Windows.Core.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.Windows.Core.dll - - - ..\..\..\..\packages\PInvoke.Kernel32.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.Kernel32.dll - - - ..\..\..\..\packages\PInvoke.BCrypt.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.BCrypt.dll - - - ..\..\..\..\packages\PInvoke.NCrypt.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.NCrypt.dll - - - ..\..\..\..\packages\Validation.2.2.8\lib\dotnet\Validation.dll - - - ..\..\..\..\packages\PCLCrypto.2.0.147\lib\xamarinios10\PCLCrypto.dll - - - ..\..\..\..\packages\IdentityModel.3.0.0\lib\netstandard2.0\IdentityModel.dll - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - false - - - false - - - false - - - false - - - false - - - false - - - false - - - false - - - false - - - false - - - false - - - false - - - false - - - false - - - false - - - false - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {76C5F2A7-6CD5-49EA-9F33-EC44DE6539C7} - eShopOnContainers.Core - - - - - - - - - + - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + Debug + iPhoneSimulator + 8.0.30703 + 2.0 + {6EEB23DC-7063-4444-9AF8-90DF24F549C0} + {FEACFBD2-3405-455C-9665-78FE426C6842};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + Exe + eShopOnContainers.iOS + Resources + eShopOnContainersiOS + + + true + true - - - + + true + full + false + bin\iPhoneSimulator\Debug + DEBUG + prompt + 4 + false + i386, x86_64 + None + True + False + False + False + False + False + True + Default + HttpClientHandler + False + + + none + true + bin\iPhoneSimulator\Release + prompt + 4 + None + i386, x86_64 + false + + + true + full + false + bin\iPhone\Debug + DEBUG + prompt + 4 + false + ARMv7, ARM64 + iPhone Developer + true + Entitlements.plist + None + + + none + true + bin\iPhone\Release + prompt + 4 + ARMv7, ARM64 + false + iPhone Developer + Entitlements.plist + + + none + True + bin\iPhone\Ad-Hoc + prompt + 4 + False + ARMv7, ARM64 + True + Automatic:AdHoc + iPhone Distribution + Entitlements.plist + + + none + True + bin\iPhone\AppStore + prompt + 4 + False + ARMv7, ARM64 + Automatic:AppStore + iPhone Distribution + Entitlements.plist + + + + + + + Resources\fonts\Montserrat-Bold.ttf + + + Resources\fonts\Montserrat-Regular.ttf + + + Resources\fonts\SourceSansPro-Regular.ttf + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ..\..\..\..\packages\Xamarin.Forms.2.5.0.122203\lib\Xamarin.iOS10\Xamarin.Forms.Core.dll + + + ..\..\..\..\packages\Xamarin.Forms.2.5.0.122203\lib\Xamarin.iOS10\Xamarin.Forms.Platform.dll + + + ..\..\..\..\packages\Xamarin.Forms.2.5.0.122203\lib\Xamarin.iOS10\Xamarin.Forms.Platform.iOS.dll + + + ..\..\..\..\packages\Xamarin.Forms.2.5.0.122203\lib\Xamarin.iOS10\Xamarin.Forms.Xaml.dll + + + ..\..\..\..\packages\WebP.Touch.1.0.7\lib\Xamarin.iOS10\WebP.Touch.dll + + + ..\..\..\..\packages\Xamarin.FFImageLoading.2.3.4\lib\Xamarin.iOS10\FFImageLoading.dll + + + ..\..\..\..\packages\Xamarin.FFImageLoading.2.3.4\lib\Xamarin.iOS10\FFImageLoading.Platform.dll + + + ..\..\..\..\packages\Xamarin.FFImageLoading.Forms.2.3.4\lib\Xamarin.iOS10\FFImageLoading.Forms.dll + + + ..\..\..\..\packages\Xamarin.FFImageLoading.Forms.2.3.4\lib\Xamarin.iOS10\FFImageLoading.Forms.Touch.dll + + + ..\..\..\..\packages\SlideOverKit.2.1.5\lib\Xamarin.iOS10\SlideOverKit.dll + + + ..\..\..\..\packages\SlideOverKit.2.1.5\lib\Xamarin.iOS10\SlideOverKit.iOS.dll + + + ..\..\..\..\packages\Xam.Plugins.Settings.3.1.1\lib\Xamarin.iOS10\Plugin.Settings.Abstractions.dll + + + ..\..\..\..\packages\Xam.Plugins.Settings.3.1.1\lib\Xamarin.iOS10\Plugin.Settings.dll + + + ..\..\..\..\packages\Newtonsoft.Json.10.0.3\lib\netstandard1.3\Newtonsoft.Json.dll + + + ..\..\..\..\packages\Acr.Support.2.1.0\lib\Xamarin.iOS10\Acr.Support.iOS.dll + + + ..\..\..\..\packages\BTProgressHUD.1.2.0.5\lib\Xamarin.iOS10\BTProgressHUD.dll + + + ..\..\..\..\packages\Splat.2.0.0\lib\Xamarin.iOS10\Splat.dll + + + ..\..\..\..\packages\Acr.UserDialogs.6.5.1\lib\Xamarin.iOS10\Acr.UserDialogs.dll + + + ..\..\..\..\packages\Acr.UserDialogs.6.5.1\lib\Xamarin.iOS10\Acr.UserDialogs.Interface.dll + + + ..\..\..\..\packages\PInvoke.Windows.Core.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.Windows.Core.dll + + + ..\..\..\..\packages\PInvoke.Kernel32.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.Kernel32.dll + + + ..\..\..\..\packages\PInvoke.BCrypt.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.BCrypt.dll + + + ..\..\..\..\packages\PInvoke.NCrypt.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.NCrypt.dll + + + ..\..\..\..\packages\Validation.2.2.8\lib\dotnet\Validation.dll + + + ..\..\..\..\packages\PCLCrypto.2.0.147\lib\xamarinios10\PCLCrypto.dll + + + ..\..\..\..\packages\IdentityModel.3.0.0\lib\netstandard2.0\IdentityModel.dll + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {76C5F2A7-6CD5-49EA-9F33-EC44DE6539C7} + eShopOnContainers.Core + + + + + + + + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + + \ No newline at end of file From 8a32e3fe10f82c67d49d611b39b328102bdb2120 Mon Sep 17 00:00:00 2001 From: David Britch Date: Thu, 29 Mar 2018 13:42:49 +0100 Subject: [PATCH 49/78] Removed UWP SettingsServiceImplementation --- .../Services/SettingsServiceImplementation.cs | 99 ------------------- .../eShopOnContainers.Windows.csproj | 1 - 2 files changed, 100 deletions(-) delete mode 100644 src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Services/SettingsServiceImplementation.cs diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Services/SettingsServiceImplementation.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Services/SettingsServiceImplementation.cs deleted file mode 100644 index e13fafd9f..000000000 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Services/SettingsServiceImplementation.cs +++ /dev/null @@ -1,99 +0,0 @@ -using eShopOnContainers.Core.Services.Settings; -using eShopOnContainers.Windows.Services; -using Windows.Storage; - -[assembly: Xamarin.Forms.Dependency(typeof(SettingsServiceImplementation))] -namespace eShopOnContainers.Windows.Services -{ - public class SettingsServiceImplementation : ISettingsServiceImplementation - { - #region Internal Implementation - - readonly object _locker = new object(); - - ApplicationDataContainer GetAppSettings() - { - return ApplicationData.Current.LocalSettings; - } - - bool AddOrUpdateValueInternal(string key, T value) - { - bool valueChanged = false; - - if (value == null) - { - Remove(key); - return true; - } - - lock (_locker) - { - var settings = GetAppSettings(); - if (settings.Values.ContainsKey(key)) - { - if (settings.Values[key] != (object)value) - { - settings.Values[key] = value; - valueChanged = true; - } - } - else - { - settings.Values[key] = value; - valueChanged = true; - } - } - - return valueChanged; - } - - T GetValueOrDefaultInternal(string key, T defaultValue = default(T)) - { - object value; - - lock (_locker) - { - var settings = GetAppSettings(); - if (settings.Values.ContainsKey(key)) - { - var tempValue = settings.Values[key]; - if (tempValue != null) - value = (T)tempValue; - else - value = defaultValue; - } - else - { - value = defaultValue; - } - } - return null != value ? (T)value : defaultValue; - } - - #endregion - - #region ISettingsServiceImplementation - - public bool AddOrUpdateValue(string key, bool value) => AddOrUpdateValueInternal(key, value); - - public bool AddOrUpdateValue(string key, string value) => AddOrUpdateValueInternal(key, value); - - public bool GetValueOrDefault(string key, bool defaultValue) => GetValueOrDefaultInternal(key, defaultValue); - - public string GetValueOrDefault(string key, string defaultValue) => GetValueOrDefaultInternal(key, defaultValue); - - public void Remove(string key) - { - lock (_locker) - { - var settings = GetAppSettings(); - if (settings.Values.ContainsKey(key)) - { - settings.Values.Remove(key); - } - } - } - - #endregion - } -} diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/eShopOnContainers.Windows.csproj b/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/eShopOnContainers.Windows.csproj index b879d31c6..9a1a2d108 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/eShopOnContainers.Windows.csproj +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Windows/eShopOnContainers.Windows.csproj @@ -123,7 +123,6 @@ - From e83f87b62d90c54fc623371b511462ead243b16c Mon Sep 17 00:00:00 2001 From: Cesar De la Torre Llorente Date: Mon, 2 Apr 2018 12:54:21 -0700 Subject: [PATCH 50/78] Removed ENV ESHOP_API_GW from dockerfiles which is not used/needed. --- src/ApiGateways/ApiGw-Base/Dockerfile | 1 - src/ApiGateways/ApiGw-Base/Dockerfile2 | 1 - src/ApiGateways/ApiGw-Base/Dockerfile3 | 1 - src/ApiGateways/ApiGw-Base/Dockerfile4 | 1 - 4 files changed, 4 deletions(-) diff --git a/src/ApiGateways/ApiGw-Base/Dockerfile b/src/ApiGateways/ApiGw-Base/Dockerfile index f0ff49f43..7f0cf43a6 100644 --- a/src/ApiGateways/ApiGw-Base/Dockerfile +++ b/src/ApiGateways/ApiGw-Base/Dockerfile @@ -1,6 +1,5 @@ FROM microsoft/aspnetcore:2.0 AS base WORKDIR /app -ENV ESHOP_API_GW Mobile_Bff_Shopping_ApiGw EXPOSE 80 FROM microsoft/aspnetcore-build:2.0 AS build diff --git a/src/ApiGateways/ApiGw-Base/Dockerfile2 b/src/ApiGateways/ApiGw-Base/Dockerfile2 index f127b33d1..7f0cf43a6 100644 --- a/src/ApiGateways/ApiGw-Base/Dockerfile2 +++ b/src/ApiGateways/ApiGw-Base/Dockerfile2 @@ -1,6 +1,5 @@ FROM microsoft/aspnetcore:2.0 AS base WORKDIR /app -ENV ESHOP_API_GW Mobile_Bff_Marketing_ApiGw EXPOSE 80 FROM microsoft/aspnetcore-build:2.0 AS build diff --git a/src/ApiGateways/ApiGw-Base/Dockerfile3 b/src/ApiGateways/ApiGw-Base/Dockerfile3 index aff6cc920..7f0cf43a6 100644 --- a/src/ApiGateways/ApiGw-Base/Dockerfile3 +++ b/src/ApiGateways/ApiGw-Base/Dockerfile3 @@ -1,6 +1,5 @@ FROM microsoft/aspnetcore:2.0 AS base WORKDIR /app -ENV ESHOP_API_GW Web_Bff_Shopping_ApiGw EXPOSE 80 FROM microsoft/aspnetcore-build:2.0 AS build diff --git a/src/ApiGateways/ApiGw-Base/Dockerfile4 b/src/ApiGateways/ApiGw-Base/Dockerfile4 index 4686420d1..7f0cf43a6 100644 --- a/src/ApiGateways/ApiGw-Base/Dockerfile4 +++ b/src/ApiGateways/ApiGw-Base/Dockerfile4 @@ -1,6 +1,5 @@ FROM microsoft/aspnetcore:2.0 AS base WORKDIR /app -ENV ESHOP_API_GW Web_Bff_Marketing_ApiGw EXPOSE 80 FROM microsoft/aspnetcore-build:2.0 AS build From 5fd412174e40d7da3d938cb03f14ce93c00628be Mon Sep 17 00:00:00 2001 From: Cesar De la Torre Llorente Date: Mon, 2 Apr 2018 14:18:20 -0700 Subject: [PATCH 51/78] Eliminated multiple dockerfiles within the ApiGw-Base as they were not really used as a different image but the same. Also, updated references at the docker-compose.yml file. --- docker-compose.yml | 12 ++++++------ src/ApiGateways/ApiGw-Base/Dockerfile2 | 19 ------------------- src/ApiGateways/ApiGw-Base/Dockerfile3 | 19 ------------------- src/ApiGateways/ApiGw-Base/Dockerfile4 | 19 ------------------- 4 files changed, 6 insertions(+), 63 deletions(-) delete mode 100644 src/ApiGateways/ApiGw-Base/Dockerfile2 delete mode 100644 src/ApiGateways/ApiGw-Base/Dockerfile3 delete mode 100644 src/ApiGateways/ApiGw-Base/Dockerfile4 diff --git a/docker-compose.yml b/docker-compose.yml index 39a0217be..122123644 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -109,25 +109,25 @@ services: image: rabbitmq:3-management-alpine mobileshoppingapigw: - image: eshop/ocelotapigw-ms:${TAG:-latest} + image: eshop/ocelotapigw:${TAG:-latest} build: context: . dockerfile: src/ApiGateways/ApiGw-Base/Dockerfile mobilemarketingapigw: - image: eshop/ocelotapigw-mm:${TAG:-latest} + image: eshop/ocelotapigw:${TAG:-latest} build: context: . - dockerfile: src/ApiGateways/ApiGw-Base/Dockerfile2 + dockerfile: src/ApiGateways/ApiGw-Base/Dockerfile webshoppingapigw: - image: eshop/ocelotapigw-ws:${TAG:-latest} + image: eshop/ocelotapigw:${TAG:-latest} build: context: . - dockerfile: src/ApiGateways/ApiGw-Base/Dockerfile3 + dockerfile: src/ApiGateways/ApiGw-Base/Dockerfile webmarketingapigw: - image: eshop/ocelotapigw-wm:${TAG:-latest} + image: eshop/ocelotapigw:${TAG:-latest} build: context: . dockerfile: src/ApiGateways/ApiGw-Base/Dockerfile diff --git a/src/ApiGateways/ApiGw-Base/Dockerfile2 b/src/ApiGateways/ApiGw-Base/Dockerfile2 deleted file mode 100644 index 7f0cf43a6..000000000 --- a/src/ApiGateways/ApiGw-Base/Dockerfile2 +++ /dev/null @@ -1,19 +0,0 @@ -FROM microsoft/aspnetcore:2.0 AS base -WORKDIR /app -EXPOSE 80 - -FROM microsoft/aspnetcore-build:2.0 AS build -WORKDIR /src -COPY src/ApiGateways/ApiGw-Base/OcelotApiGw.csproj src/ApiGateways/ApiGw-Base/ -RUN dotnet restore src/ApiGateways/ApiGw-Base/ -COPY . . -WORKDIR /src/src/ApiGateways/ApiGw-Base/ -RUN dotnet build -c Release -o /app - -FROM build AS publish -RUN dotnet publish -c Release -o /app - -FROM base AS final -WORKDIR /app -COPY --from=publish /app . -ENTRYPOINT ["dotnet", "OcelotApiGw.dll"] diff --git a/src/ApiGateways/ApiGw-Base/Dockerfile3 b/src/ApiGateways/ApiGw-Base/Dockerfile3 deleted file mode 100644 index 7f0cf43a6..000000000 --- a/src/ApiGateways/ApiGw-Base/Dockerfile3 +++ /dev/null @@ -1,19 +0,0 @@ -FROM microsoft/aspnetcore:2.0 AS base -WORKDIR /app -EXPOSE 80 - -FROM microsoft/aspnetcore-build:2.0 AS build -WORKDIR /src -COPY src/ApiGateways/ApiGw-Base/OcelotApiGw.csproj src/ApiGateways/ApiGw-Base/ -RUN dotnet restore src/ApiGateways/ApiGw-Base/ -COPY . . -WORKDIR /src/src/ApiGateways/ApiGw-Base/ -RUN dotnet build -c Release -o /app - -FROM build AS publish -RUN dotnet publish -c Release -o /app - -FROM base AS final -WORKDIR /app -COPY --from=publish /app . -ENTRYPOINT ["dotnet", "OcelotApiGw.dll"] diff --git a/src/ApiGateways/ApiGw-Base/Dockerfile4 b/src/ApiGateways/ApiGw-Base/Dockerfile4 deleted file mode 100644 index 7f0cf43a6..000000000 --- a/src/ApiGateways/ApiGw-Base/Dockerfile4 +++ /dev/null @@ -1,19 +0,0 @@ -FROM microsoft/aspnetcore:2.0 AS base -WORKDIR /app -EXPOSE 80 - -FROM microsoft/aspnetcore-build:2.0 AS build -WORKDIR /src -COPY src/ApiGateways/ApiGw-Base/OcelotApiGw.csproj src/ApiGateways/ApiGw-Base/ -RUN dotnet restore src/ApiGateways/ApiGw-Base/ -COPY . . -WORKDIR /src/src/ApiGateways/ApiGw-Base/ -RUN dotnet build -c Release -o /app - -FROM build AS publish -RUN dotnet publish -c Release -o /app - -FROM base AS final -WORKDIR /app -COPY --from=publish /app . -ENTRYPOINT ["dotnet", "OcelotApiGw.dll"] From debecf1b8d0d4a32e739f765276e0123a8cf9bd0 Mon Sep 17 00:00:00 2001 From: Cesar De la Torre Llorente Date: Mon, 2 Apr 2018 15:03:59 -0700 Subject: [PATCH 52/78] Adding comments about the external ports in docker-compose.override.yml saying that a production environment your should remove the external ports kept here for microservice debugging purposes. The API Gateway redirects and access through each microservice's internal port (80). --- docker-compose.override.yml | 51 +++++++++++++++++++++++-------------- 1 file changed, 32 insertions(+), 19 deletions(-) diff --git a/docker-compose.override.yml b/docker-compose.override.yml index e656f753f..ac22fa4e7 100644 --- a/docker-compose.override.yml +++ b/docker-compose.override.yml @@ -24,7 +24,8 @@ services: - UseLoadTest=${USE_LOADTEST:-False} ports: - - "5103:80" + - "5103:80" # Important: In a production environment your should remove the external port (5103) kept here for microservice debugging purposes. + # The API Gateway redirects and access through the internal port (80). catalog.api: environment: @@ -43,7 +44,8 @@ services: - ApplicationInsights__InstrumentationKey=${INSTRUMENTATION_KEY} - OrchestratorType=${ORCHESTRATOR_TYPE} ports: - - "5101:80" + - "5101:80" # Important: In a production environment your should remove the external port (5101) kept here for microservice debugging purposes. + # The API Gateway redirects and access through the internal port (80). identity.api: environment: @@ -63,7 +65,8 @@ services: - ApplicationInsights__InstrumentationKey=${INSTRUMENTATION_KEY} - OrchestratorType=${ORCHESTRATOR_TYPE} ports: - - "5105:80" + - "5105:80" # Important: In a production environment your should remove the external port (5105) kept here for microservice debugging purposes. + # The API Gateway redirects and access through the internal port (80). ordering.api: environment: @@ -83,7 +86,8 @@ services: - OrchestratorType=${ORCHESTRATOR_TYPE} - UseLoadTest=${USE_LOADTEST:-False} ports: - - "5102:80" + - "5102:80" # Important: In a production environment your should remove the external port (5102) kept here for microservice debugging purposes. + # The API Gateway redirects and access through the internal port (80). marketing.api: environment: @@ -107,7 +111,8 @@ services: - OrchestratorType=${ORCHESTRATOR_TYPE} - UseLoadTest=${USE_LOADTEST:-False} ports: - - "5110:80" + - "5110:80" # Important: In a production environment your should remove the external port (5110) kept here for microservice debugging purposes. + # The API Gateway redirects and access through the internal port (80). webspa: environment: @@ -126,7 +131,7 @@ services: - ApplicationInsights__InstrumentationKey=${INSTRUMENTATION_KEY} - OrchestratorType=${ORCHESTRATOR_TYPE} ports: - - "5104:80" + - "5104:80" webmvc: environment: @@ -177,7 +182,8 @@ services: - ApplicationInsights__InstrumentationKey=${INSTRUMENTATION_KEY} - OrchestratorType=${ORCHESTRATOR_TYPE} ports: - - "5108:80" + - "5108:80" # Important: In a production environment your should remove the external port (5108) kept here for microservice debugging purposes. + # The API Gateway redirects and access through the internal port (80). locations.api: environment: @@ -195,34 +201,36 @@ services: - OrchestratorType=${ORCHESTRATOR_TYPE} - UseLoadTest=${USE_LOADTEST:-False} ports: - - "5109:80" + - "5109:80" # Important: In a production environment your should remove the external port (5109) kept here for microservice debugging purposes. + # The API Gateway redirects and access through the internal port (80). sql.data: environment: - SA_PASSWORD=Pass@word - ACCEPT_EULA=Y ports: - - "5433:1433" + - "5433:1433" # Important: In a production environment your should remove the external port nosql.data: ports: - - "27017:27017" + - "27017:27017" # Important: In a production environment your should remove the external port basket.data: ports: - - "6379:6379" + - "6379:6379" # Important: In a production environment your should remove the external port rabbitmq: ports: - - "15672:15672" - - "5672:5672" + - "15672:15672" # Important: In a production environment your should remove the external port + - "5672:5672" # Important: In a production environment your should remove the external port mobileshoppingapigw: environment: - ASPNETCORE_ENVIRONMENT=Development - IdentityUrl=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110. ports: - - "5200:80" + - "5200:80" # Important: In a production environment your should remove the external port (5200) kept here for microservice debugging purposes. + # The API Gateway redirects and access through the internal port (80). volumes: - ./src/ApiGateways/Mobile.Bff.Shopping/apigw:/app/configuration @@ -231,7 +239,8 @@ services: - ASPNETCORE_ENVIRONMENT=Development - IdentityUrl=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110. ports: - - "5201:80" + - "5201:80" # Important: In a production environment your should remove the external port (5201) kept here for microservice debugging purposes. + # The API Gateway redirects and access through the internal port (80). volumes: - ./src/ApiGateways/Mobile.Bff.Marketing/apigw:/app/configuration @@ -240,7 +249,8 @@ services: - ASPNETCORE_ENVIRONMENT=Development - IdentityUrl=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110. ports: - - "5202:80" + - "5202:80" # Important: In a production environment your should remove the external port (5202) kept here for microservice debugging purposes. + # The API Gateway redirects and access through the internal port (80). volumes: - ./src/ApiGateways/Web.Bff.Shopping/apigw:/app/configuration @@ -249,7 +259,8 @@ services: - ASPNETCORE_ENVIRONMENT=Development - IdentityUrl=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110. ports: - - "5203:80" + - "5203:80" # Important: In a production environment your should remove the external port (5203) kept here for microservice debugging purposes. + # The API Gateway redirects and access through the internal port (80). volumes: - ./src/ApiGateways/Web.Bff.Marketing/apigw:/app/configuration @@ -261,7 +272,8 @@ services: - urls__orders=http://ordering.api - urls__identity=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110. ports: - - "5120:80" + - "5120:80" # Important: In a production environment your should remove the external port (5120) kept here for microservice debugging purposes. + # The API Gateway redirects and access through the internal port (80). webshoppingagg: environment: @@ -271,4 +283,5 @@ services: - urls__orders=http://ordering.api - urls__identity=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110. ports: - - "5121:80" \ No newline at end of file + - "5121:80" # Important: In a production environment your should remove the external port (5121) kept here for microservice debugging purposes. + # The API Gateway redirects and access through the internal port (80). \ No newline at end of file From 5378d20d784e996a77c0de1b2d8716290bdb1628 Mon Sep 17 00:00:00 2001 From: Cesar De la Torre Llorente Date: Mon, 2 Apr 2018 15:08:39 -0700 Subject: [PATCH 53/78] Added the .env file to the solution's "Solution Items" folder. --- eShopOnContainers-ServicesAndWebApps.sln | 1 + 1 file changed, 1 insertion(+) diff --git a/eShopOnContainers-ServicesAndWebApps.sln b/eShopOnContainers-ServicesAndWebApps.sln index c1fe125a5..d75a644ff 100644 --- a/eShopOnContainers-ServicesAndWebApps.sln +++ b/eShopOnContainers-ServicesAndWebApps.sln @@ -9,6 +9,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{932D8224-11F EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{3AF739CD-81D8-428D-A08A-0A58372DEBF6}" ProjectSection(SolutionItems) = preProject + .env = .env Local.testsettings = Local.testsettings NuGet.config = NuGet.config EndProjectSection From 0906ae6195713eba8aa0ab2c479b2115cc62e9c8 Mon Sep 17 00:00:00 2001 From: Cesar De la Torre Llorente Date: Mon, 2 Apr 2018 15:22:26 -0700 Subject: [PATCH 54/78] Fixed comment for the identity.api microservice. --- docker-compose.override.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docker-compose.override.yml b/docker-compose.override.yml index ac22fa4e7..c862bd5f9 100644 --- a/docker-compose.override.yml +++ b/docker-compose.override.yml @@ -65,8 +65,7 @@ services: - ApplicationInsights__InstrumentationKey=${INSTRUMENTATION_KEY} - OrchestratorType=${ORCHESTRATOR_TYPE} ports: - - "5105:80" # Important: In a production environment your should remove the external port (5105) kept here for microservice debugging purposes. - # The API Gateway redirects and access through the internal port (80). + - "5105:80" ordering.api: environment: From b6d09a24394b269051e362bc73c89aa919adf8da Mon Sep 17 00:00:00 2001 From: Cesar De la Torre Llorente Date: Mon, 2 Apr 2018 16:43:50 -0700 Subject: [PATCH 55/78] Fixed comments not right for Pi Gateways services --- docker-compose.override.yml | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/docker-compose.override.yml b/docker-compose.override.yml index c862bd5f9..9b8cac7b9 100644 --- a/docker-compose.override.yml +++ b/docker-compose.override.yml @@ -228,8 +228,7 @@ services: - ASPNETCORE_ENVIRONMENT=Development - IdentityUrl=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110. ports: - - "5200:80" # Important: In a production environment your should remove the external port (5200) kept here for microservice debugging purposes. - # The API Gateway redirects and access through the internal port (80). + - "5200:80" volumes: - ./src/ApiGateways/Mobile.Bff.Shopping/apigw:/app/configuration @@ -238,8 +237,7 @@ services: - ASPNETCORE_ENVIRONMENT=Development - IdentityUrl=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110. ports: - - "5201:80" # Important: In a production environment your should remove the external port (5201) kept here for microservice debugging purposes. - # The API Gateway redirects and access through the internal port (80). + - "5201:80" volumes: - ./src/ApiGateways/Mobile.Bff.Marketing/apigw:/app/configuration @@ -248,8 +246,7 @@ services: - ASPNETCORE_ENVIRONMENT=Development - IdentityUrl=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110. ports: - - "5202:80" # Important: In a production environment your should remove the external port (5202) kept here for microservice debugging purposes. - # The API Gateway redirects and access through the internal port (80). + - "5202:80" volumes: - ./src/ApiGateways/Web.Bff.Shopping/apigw:/app/configuration @@ -258,8 +255,7 @@ services: - ASPNETCORE_ENVIRONMENT=Development - IdentityUrl=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110. ports: - - "5203:80" # Important: In a production environment your should remove the external port (5203) kept here for microservice debugging purposes. - # The API Gateway redirects and access through the internal port (80). + - "5203:80" volumes: - ./src/ApiGateways/Web.Bff.Marketing/apigw:/app/configuration From 4b1948d067b5e3327f6e2f2030dbd3c9d8b78c23 Mon Sep 17 00:00:00 2001 From: Cesar De la Torre Llorente Date: Mon, 2 Apr 2018 16:51:00 -0700 Subject: [PATCH 56/78] Temporal docker-compose.prod.yml still to be reviewed and updated. Pending area is the identity.api config. --- docker-compose.prod.yml | 133 ++++++++++++++++++++++++++-------------- 1 file changed, 86 insertions(+), 47 deletions(-) diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index b8630ef97..2b6893ba0 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -11,7 +11,7 @@ version: '3.4' # Set ASPNETCORE_ENVIRONMENT= Development or Production, depending if you want to show up errors while testing. # # You need to start it with the following CLI command: -# docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d +# docker-compose -f docker-compose.yml -f docker-compose.prod.yml up services: @@ -31,7 +31,7 @@ services: - UseLoadTest=${USE_LOADTEST:-False} ports: - - "5103:80" + - "80" # The API Gateway redirects and access through the internal port (80). catalog.api: environment: @@ -50,7 +50,7 @@ services: - ApplicationInsights__InstrumentationKey=${INSTRUMENTATION_KEY} - OrchestratorType=${ORCHESTRATOR_TYPE} ports: - - "5101:80" + - "80" # The API Gateway redirects and access through the internal port (80). identity.api: environment: @@ -64,13 +64,13 @@ services: - MarketingApiClient=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5110 - BasketApiClient=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5103 - OrderingApiClient=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5102 - - MobileShoppingAggClient=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5120 - - WebShoppingAggClient=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5120 + - MobileShoppingAggClient=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5120 + - WebShoppingAggClient=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5121 - UseCustomizationData=True - ApplicationInsights__InstrumentationKey=${INSTRUMENTATION_KEY} - OrchestratorType=${ORCHESTRATOR_TYPE} ports: - - "5105:80" + - "5105:80" ordering.api: environment: @@ -90,25 +90,7 @@ services: - OrchestratorType=${ORCHESTRATOR_TYPE} - UseLoadTest=${USE_LOADTEST:-False} ports: - - "5102:80" - - ordering.backgroundtasks: - environment: - - ASPNETCORE_ENVIRONMENT=Development - - ASPNETCORE_URLS=http://0.0.0.0:80 - - ConnectionString=${ESHOP_AZURE_ORDERING_DB:-Server=sql.data;Database=Microsoft.eShopOnContainers.Services.OrderingDb;User Id=sa;Password=Pass@word} - - EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq} - - EventBusUserName=${ESHOP_SERVICE_BUS_USERNAME} - - EventBusPassword=${ESHOP_SERVICE_BUS_PASSWORD} - - UseCustomizationData=True - - AzureServiceBusEnabled=False - - CheckUpdateTime=30000 - - GracePeriodTime=1 - - ApplicationInsights__InstrumentationKey=${INSTRUMENTATION_KEY} - - OrchestratorType=${ORCHESTRATOR_TYPE} - - UseLoadTest=${USE_LOADTEST:-False} - ports: - - "5111:80" + - "80" # The API Gateway redirects and access through the internal port (80). marketing.api: environment: @@ -132,21 +114,18 @@ services: - OrchestratorType=${ORCHESTRATOR_TYPE} - UseLoadTest=${USE_LOADTEST:-False} ports: - - "5110:80" + - "80" # The API Gateway redirects and access through the internal port (80). webspa: environment: - ASPNETCORE_ENVIRONMENT=Development - ASPNETCORE_URLS=http://0.0.0.0:80 - - CatalogUrl=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5101 - - OrderingUrl=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5102 - IdentityUrl=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5105 #Local: You need to open your local dev-machine firewall at range 5100-5105. at range 5100-5105. - - BasketUrl=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5103 - - MarketingUrl=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5110 - - LocationsUrl=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5109 + - PurchaseUrl=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5202 + - MarketingUrl=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5203 - CatalogUrlHC=http://catalog.api/hc - OrderingUrlHC=http://ordering.api/hc - - IdentityUrlHC=http://identity.api/hc + - IdentityUrlHC=http://identity.api/hc #Local: Use ${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}, if using external IP or DNS name from browser. - BasketUrlHC=http://basket.api/hc - MarketingUrlHC=http://marketing.api/hc - PaymentUrlHC=http://payment.api/hc @@ -154,17 +133,15 @@ services: - ApplicationInsights__InstrumentationKey=${INSTRUMENTATION_KEY} - OrchestratorType=${ORCHESTRATOR_TYPE} ports: - - "5104:80" + - "5104:80" webmvc: environment: - - ASPNETCORE_ENVIRONMENT=Development - ASPNETCORE_URLS=http://0.0.0.0:80 - - PurchaseUrl=http://webshoppingapigw/shopping - - LocationsUrl=http://locations.api - - IdentityUrl=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5105 # Local Mac: Use http://docker.for.mac.localhost:5105 || Local Windows: Use 10.0.75.1 in a "Docker for Windows" environment, if using "localhost" from browser. || #Remote access: Use ${ESHOP_EXTERNAL_DNS_NAME_OR_IP} if using external IP or DNS name from browser. - - MarketingUrl=http://marketing.api + - PurchaseUrl=http://webshoppingapigw + - IdentityUrl=http://10.0.75.1:5105 # Local Mac: Use http://docker.for.mac.localhost:5105 || Local Windows: Use 10.0.75.1 in a "Docker for Windows" environment, if using "localhost" from browser. || #Remote access: Use ${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP} if using external IP or DNS name from browser. + - MarketingUrl=http://webmarketingapigw - CatalogUrlHC=http://catalog.api/hc - OrderingUrlHC=http://ordering.api/hc - IdentityUrlHC=http://identity.api/hc #Local: Use ${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}, if using external IP or DNS name from browser. @@ -207,7 +184,7 @@ services: - ApplicationInsights__InstrumentationKey=${INSTRUMENTATION_KEY} - OrchestratorType=${ORCHESTRATOR_TYPE} ports: - - "5108:80" + - "80" # The API Gateway redirects and access through the internal port (80). locations.api: environment: @@ -225,25 +202,87 @@ services: - OrchestratorType=${ORCHESTRATOR_TYPE} - UseLoadTest=${USE_LOADTEST:-False} ports: - - "5109:80" + - "80" # The API Gateway redirects and access through the internal port (80). sql.data: environment: - - MSSQL_SA_PASSWORD=Pass@word + - SA_PASSWORD=Pass@word - ACCEPT_EULA=Y - - MSSQL_PID=Developer ports: - - "5433:1433" + - "5433:1433" # Important: In a production environment your should remove the external port nosql.data: ports: - - "27017:27017" + - "27017:27017" # Important: In a production environment your should remove the external port basket.data: ports: - - "6379:6379" + - "6379:6379" # Important: In a production environment your should remove the external port rabbitmq: ports: - - "15672:15672" - - "5672:5672" \ No newline at end of file + - "15672:15672" # Important: In a production environment your should remove the external port + - "5672:5672" # Important: In a production environment your should remove the external port + + mobileshoppingapigw: + environment: + - ASPNETCORE_ENVIRONMENT=Development + - IdentityUrl=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110. + ports: + - "5200:80" # Important: In a production environment your should remove the external port (5200) kept here for microservice debugging purposes. + # The API Gateway redirects and access through the internal port (80). + volumes: + - ./src/ApiGateways/Mobile.Bff.Shopping/apigw:/app/configuration + + mobilemarketingapigw: + environment: + - ASPNETCORE_ENVIRONMENT=Development + - IdentityUrl=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110. + ports: + - "5201:80" # Important: In a production environment your should remove the external port (5201) kept here for microservice debugging purposes. + # The API Gateway redirects and access through the internal port (80). + volumes: + - ./src/ApiGateways/Mobile.Bff.Marketing/apigw:/app/configuration + + webshoppingapigw: + environment: + - ASPNETCORE_ENVIRONMENT=Development + - IdentityUrl=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110. + ports: + - "5202:80" # Important: In a production environment your should remove the external port (5202) kept here for microservice debugging purposes. + # The API Gateway redirects and access through the internal port (80). + volumes: + - ./src/ApiGateways/Web.Bff.Shopping/apigw:/app/configuration + + webmarketingapigw: + environment: + - ASPNETCORE_ENVIRONMENT=Development + - IdentityUrl=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110. + ports: + - "5203:80" # Important: In a production environment your should remove the external port (5203) kept here for microservice debugging purposes. + # The API Gateway redirects and access through the internal port (80). + volumes: + - ./src/ApiGateways/Web.Bff.Marketing/apigw:/app/configuration + + mobileshoppingagg: + environment: + - ASPNETCORE_ENVIRONMENT=Development + - urls__basket=http://basket.api + - urls__catalog=http://catalog.api + - urls__orders=http://ordering.api + - urls__identity=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110. + ports: + - "80" # Important: In a production environment your should remove the external port (5120) kept here for microservice debugging purposes. + # The API Gateway redirects and access through the internal port (80). + + webshoppingagg: + environment: + - ASPNETCORE_ENVIRONMENT=Development + - urls__basket=http://basket.api + - urls__catalog=http://catalog.api + - urls__orders=http://ordering.api + - urls__identity=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110. + ports: + - "80" # Important: In a production environment your should remove the external port (5121) kept here for microservice debugging purposes. + # The API Gateway redirects and access through the internal port (80). + From 5b38d2bf9867c1e2f22d5f8d0adc4729a87885c5 Mon Sep 17 00:00:00 2001 From: eiximenis Date: Tue, 3 Apr 2018 18:01:38 +0200 Subject: [PATCH 57/78] Updated k8s file to use only ocelotapigw image --- k8s/ocelot/deployment.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/k8s/ocelot/deployment.yaml b/k8s/ocelot/deployment.yaml index 516f91b2f..3a114e4ce 100644 --- a/k8s/ocelot/deployment.yaml +++ b/k8s/ocelot/deployment.yaml @@ -12,7 +12,7 @@ spec: spec: containers: - name: apigwmm - image: eshop/ocelotapigw-mm + image: eshop/ocelotapigw imagePullPolicy: Always env: - name: PATH_BASE @@ -51,7 +51,7 @@ spec: spec: containers: - name: apigwms - image: eshop/ocelotapigw-ms + image: eshop/ocelotapigw imagePullPolicy: Always env: - name: PATH_BASE @@ -90,7 +90,7 @@ spec: spec: containers: - name: apigwwm - image: eshop/ocelotapigw-wm + image: eshop/ocelotapigw imagePullPolicy: Always env: - name: PATH_BASE @@ -129,7 +129,7 @@ spec: spec: containers: - name: apigwws - image: eshop/ocelotapigw-ws + image: eshop/ocelotapigw imagePullPolicy: Always env: - name: PATH_BASE From 2181e1c9a6cf5f310d9ac37d51d0038c01be95ff Mon Sep 17 00:00:00 2001 From: eiximenis Date: Tue, 3 Apr 2018 18:27:47 +0200 Subject: [PATCH 58/78] update local config to use apigw when downloading catalog images --- docker-compose.override.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.override.yml b/docker-compose.override.yml index 9b8cac7b9..093612225 100644 --- a/docker-compose.override.yml +++ b/docker-compose.override.yml @@ -32,7 +32,7 @@ services: - ASPNETCORE_ENVIRONMENT=Development - ASPNETCORE_URLS=http://0.0.0.0:80 - ConnectionString=${ESHOP_AZURE_CATALOG_DB:-Server=sql.data;Database=Microsoft.eShopOnContainers.Services.CatalogDb;User Id=sa;Password=Pass@word} - - PicBaseUrl=${ESHOP_AZURE_STORAGE_CATALOG_URL:-http://localhost:5101/api/v1/catalog/items/[0]/pic/} #Local: You need to open your local dev-machine firewall at range 5100-5110. + - PicBaseUrl=${ESHOP_AZURE_STORAGE_CATALOG_URL:-http://localhost:5202/api/v1/c/catalog/items/[0]/pic/} #Local: You need to open your local dev-machine firewall at range 5100-5110. - EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq} - EventBusUserName=${ESHOP_SERVICE_BUS_USERNAME} - EventBusPassword=${ESHOP_SERVICE_BUS_PASSWORD} From ee113b2118cffa4ddc9b5ba120ead5cf8ebbf92f Mon Sep 17 00:00:00 2001 From: eiximenis Date: Wed, 4 Apr 2018 16:25:13 +0200 Subject: [PATCH 59/78] fixed error on deploy k8s (image names) --- k8s/deploy.ps1 | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/k8s/deploy.ps1 b/k8s/deploy.ps1 index 0739d7ef0..27c5d3fde 100644 --- a/k8s/deploy.ps1 +++ b/k8s/deploy.ps1 @@ -65,7 +65,7 @@ if ($buildImages) { docker-compose -p .. -f ../docker-compose.yml build Write-Host "Pushing images to $registry/$dockerOrg..." -ForegroundColor Yellow - $services = ("basket.api", "catalog.api", "identity.api", "ordering.api", "marketing.api","payment.api","locations.api", "webmvc", "webspa", "webstatus", "ocelotapigw-mm", "ocelotapigw-ms", "ocelotapigw-wm", "ocelotapigw-ws", "mobileshoppingagg", "webshoppingagg") + $services = ("basket.api", "catalog.api", "identity.api", "ordering.api", "marketing.api","payment.api","locations.api", "webmvc", "webspa", "webstatus", "ocelotapigw", "mobileshoppingagg", "webshoppingagg") foreach ($service in $services) { $imageFqdn = if ($useDockerHub) {"$dockerOrg/${service}"} else {"$registry/$dockerOrg/${service}"} @@ -171,10 +171,10 @@ ExecKube -cmd 'set image deployments/webspa webspa=${registryPath}${dockerOrg}/w ExecKube -cmd 'set image deployments/mobileshoppingagg mobileshoppingagg=${registryPath}${dockerOrg}/mobileshoppingagg:$imageTag' ExecKube -cmd 'set image deployments/webshoppingagg webshoppingagg=${registryPath}${dockerOrg}/webshoppingagg:$imageTag' -ExecKube -cmd 'set image deployments/apigwmm apigwmm=${registryPath}${dockerOrg}/ocelotapigw-mm:$imageTag' -ExecKube -cmd 'set image deployments/apigwms apigwms=${registryPath}${dockerOrg}/ocelotapigw-ms:$imageTag' -ExecKube -cmd 'set image deployments/apigwwm apigwwm=${registryPath}${dockerOrg}/ocelotapigw-wm:$imageTag' -ExecKube -cmd 'set image deployments/apigwws apigwws=${registryPath}${dockerOrg}/ocelotapigw-ws:$imageTag' +ExecKube -cmd 'set image deployments/apigwmm apigwmm=${registryPath}${dockerOrg}/ocelotapigw:$imageTag' +ExecKube -cmd 'set image deployments/apigwms apigwms=${registryPath}${dockerOrg}/ocelotapigw:$imageTag' +ExecKube -cmd 'set image deployments/apigwwm apigwwm=${registryPath}${dockerOrg}/ocelotapigw:$imageTag' +ExecKube -cmd 'set image deployments/apigwws apigwws=${registryPath}${dockerOrg}/ocelotapigw:$imageTag' Write-Host "Execute rollout..." -ForegroundColor Yellow ExecKube -cmd 'rollout resume deployments/basket' From 97f81c29398ae1b7bac97e65ff9ce29c75f47061 Mon Sep 17 00:00:00 2001 From: Miguel Veloso Date: Wed, 4 Apr 2018 21:29:07 +0100 Subject: [PATCH 60/78] Merge pull request #536 from SychevIgor/rudementsinidentity drop rudiments from identity api --- .../Identity.API/Services/IEmailSender.cs | 9 -------- .../Identity.API/Services/ISmsSender.cs | 9 -------- .../Identity.API/Services/MessageServices.cs | 22 ------------------- src/Services/Identity/Identity.API/Startup.cs | 2 -- 4 files changed, 42 deletions(-) delete mode 100644 src/Services/Identity/Identity.API/Services/IEmailSender.cs delete mode 100644 src/Services/Identity/Identity.API/Services/ISmsSender.cs delete mode 100644 src/Services/Identity/Identity.API/Services/MessageServices.cs diff --git a/src/Services/Identity/Identity.API/Services/IEmailSender.cs b/src/Services/Identity/Identity.API/Services/IEmailSender.cs deleted file mode 100644 index 95a4f99ee..000000000 --- a/src/Services/Identity/Identity.API/Services/IEmailSender.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System.Threading.Tasks; - -namespace Microsoft.eShopOnContainers.Services.Identity.API.Services -{ - public interface IEmailSender - { - Task SendEmailAsync(string email, string subject, string message); - } -} diff --git a/src/Services/Identity/Identity.API/Services/ISmsSender.cs b/src/Services/Identity/Identity.API/Services/ISmsSender.cs deleted file mode 100644 index f842e7ae9..000000000 --- a/src/Services/Identity/Identity.API/Services/ISmsSender.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System.Threading.Tasks; - -namespace Microsoft.eShopOnContainers.Services.Identity.API.Services -{ - public interface ISmsSender - { - Task SendSmsAsync(string number, string message); - } -} diff --git a/src/Services/Identity/Identity.API/Services/MessageServices.cs b/src/Services/Identity/Identity.API/Services/MessageServices.cs deleted file mode 100644 index 18ab35a7c..000000000 --- a/src/Services/Identity/Identity.API/Services/MessageServices.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System.Threading.Tasks; - -namespace Microsoft.eShopOnContainers.Services.Identity.API.Services -{ - // This class is used by the application to send Email and SMS - // when you turn on two-factor authentication in ASP.NET Identity. - // For more details see this link http://go.microsoft.com/fwlink/?LinkID=532713 - public class AuthMessageSender : IEmailSender, ISmsSender - { - public Task SendEmailAsync(string email, string subject, string message) - { - // Plug in your email service here to send an email. - return Task.FromResult(0); - } - - public Task SendSmsAsync(string number, string message) - { - // Plug in your SMS service here to send a text message. - return Task.FromResult(0); - } - } -} diff --git a/src/Services/Identity/Identity.API/Startup.cs b/src/Services/Identity/Identity.API/Startup.cs index f16f90965..f564043ae 100644 --- a/src/Services/Identity/Identity.API/Startup.cs +++ b/src/Services/Identity/Identity.API/Startup.cs @@ -73,8 +73,6 @@ namespace Microsoft.eShopOnContainers.Services.Identity.API checks.AddSqlCheck("Identity_Db", Configuration["ConnectionString"], TimeSpan.FromMinutes(minutes)); }); - services.AddTransient(); - services.AddTransient(); services.AddTransient, EFLoginService>(); services.AddTransient(); From 9bdbbcc1130376d851e7d1d2bb7e0b1b3987f79e Mon Sep 17 00:00:00 2001 From: eiximenis Date: Thu, 5 Apr 2018 17:52:29 +0200 Subject: [PATCH 61/78] Readme.md updated to note that vs15.7 is needed --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index e7a8dff0f..c6b29b229 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,8 @@ # eShopOnContainers - Microservices Architecture and Containers based Reference Application (**BETA state** - Visual Studio 2017 and CLI environments compatible) -Sample .NET Core reference application, powered by Microsoft, based on a simplified microservices architecture and Docker containers.

+Sample .NET Core reference application, powered by Microsoft, based on a simplified microservices architecture and Docker containers. + +## IMPORTANT NOTE! +**Visual Studio 2017 15.7 Preview 2.0 or later is needed to run the solution** Due to the configuration used in `docker-compose.yml` file, VS15.7 (currently in Preview 2) is needed to run the solution. Trying to run the solution in VS15.6 (current RTM of Visual Studio 2017) will generate errors (complaining about invalid values in docker-compose file). **NEWS / ANNOUNCEMENTS** Do you want to be up-to-date on .NET Architecture guidance and reference apps like eShopOnContainers? --> Subscribe by "WATCHING" this new GitHub repo: https://github.com/dotnet-architecture/News From d0ccc19b42098f1fd7e103e9ce8532fbaf1bb304 Mon Sep 17 00:00:00 2001 From: Cesar De la Torre Date: Thu, 5 Apr 2018 10:20:17 -0700 Subject: [PATCH 62/78] Update README.md --- README.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index c6b29b229..b163b4422 100644 --- a/README.md +++ b/README.md @@ -2,15 +2,17 @@ Sample .NET Core reference application, powered by Microsoft, based on a simplified microservices architecture and Docker containers. ## IMPORTANT NOTE! -**Visual Studio 2017 15.7 Preview 2.0 or later is needed to run the solution** Due to the configuration used in `docker-compose.yml` file, VS15.7 (currently in Preview 2) is needed to run the solution. Trying to run the solution in VS15.6 (current RTM of Visual Studio 2017) will generate errors (complaining about invalid values in docker-compose file). +**Visual Studio 2017 15.7 Preview 2.0 or later is needed to run the solution from the DEV branch (current evolving code) which now includes API Gateways features** Due to the configuration used in `docker-compose.yml` file, VS 15.7 (currently in Preview 2) is needed to run the solution or you can also run eShopOnContainers (DEV branch) with Docker CLI with "docker-compose up". Trying to run the solution in VS15.6 (current RTM of Visual Studio 2017) will generate errors (complaining about invalid values in docker-compose file). + +If you want/need to run eShopOnContainers in **Visual Studio 2017 15.6 RTM** or previous, you'll need to use the code at the **MASTER branch** which is the previous stable version of eShopOnContainers. + +**Note for Pull Requests**: We accept pull request from the community. When doing it, please do it onto the **DEV branch** which is the consolidated work-in-progress branch. Do not request it onto Master branch, if possible. **NEWS / ANNOUNCEMENTS** Do you want to be up-to-date on .NET Architecture guidance and reference apps like eShopOnContainers? --> Subscribe by "WATCHING" this new GitHub repo: https://github.com/dotnet-architecture/News -**Note for Pull Requests**: We accept pull request from the community. When doing it, please do it onto the DEV branch which is the consolidated work-in-progress branch. Do not request it onto Master, if possible. - ## Updated for .NET Core 2.0 "wave" of technologies -NOTE: We have migrated the whole server-side solution to .NET Core 2.0 "wave". Not just compilation but also new recommended code in EF Core 2.0, ASP.NET Core 2.0, and other new related versions. +eShopOnContainers is updated to .NET Core 2.0 "wave". Not just compilation but also new recommended code in EF Core 2.0, ASP.NET Core 2.0, and other new related versions. The **dockerfiles** in the solution have also been updated and now support [**Docker Multi-Stage**](https://blogs.msdn.microsoft.com/stevelasker/2017/09/11/net-and-multistage-dockerfiles/) since mid-December 2017. From a9676b4b5667eeebe0aa8ff5f64c604e9bd3971a Mon Sep 17 00:00:00 2001 From: Cesar De la Torre Date: Thu, 5 Apr 2018 10:21:54 -0700 Subject: [PATCH 63/78] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b163b4422..888471783 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ Sample .NET Core reference application, powered by Microsoft, based on a simplified microservices architecture and Docker containers. ## IMPORTANT NOTE! -**Visual Studio 2017 15.7 Preview 2.0 or later is needed to run the solution from the DEV branch (current evolving code) which now includes API Gateways features** Due to the configuration used in `docker-compose.yml` file, VS 15.7 (currently in Preview 2) is needed to run the solution or you can also run eShopOnContainers (DEV branch) with Docker CLI with "docker-compose up". Trying to run the solution in VS15.6 (current RTM of Visual Studio 2017) will generate errors (complaining about invalid values in docker-compose file). +**Visual Studio 2017 15.7 Preview 2.0 or later is needed to run the solution from the DEV branch (current evolving code) which now includes API Gateways features**. Due to the configuration used in `docker-compose.yml` file, VS 15.7 (currently in Preview 2) is needed to run the solution at DEV branch or you can also run eShopOnContainers with Docker CLI with "docker-compose up" or deploying to Kubernetes/AKS. Trying to run the solution in VS15.6 (current RTM of Visual Studio 2017) will generate errors (complaining about invalid values in docker-compose file). If you want/need to run eShopOnContainers in **Visual Studio 2017 15.6 RTM** or previous, you'll need to use the code at the **MASTER branch** which is the previous stable version of eShopOnContainers. From e04533acc4d51af8af96712f402df4be0659818a Mon Sep 17 00:00:00 2001 From: Cesar De la Torre Date: Thu, 5 Apr 2018 10:32:48 -0700 Subject: [PATCH 64/78] Update README.md --- README.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 888471783..aa8ca7635 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,13 @@ # eShopOnContainers - Microservices Architecture and Containers based Reference Application (**BETA state** - Visual Studio 2017 and CLI environments compatible) Sample .NET Core reference application, powered by Microsoft, based on a simplified microservices architecture and Docker containers. -## IMPORTANT NOTE! -**Visual Studio 2017 15.7 Preview 2.0 or later is needed to run the solution from the DEV branch (current evolving code) which now includes API Gateways features**. Due to the configuration used in `docker-compose.yml` file, VS 15.7 (currently in Preview 2) is needed to run the solution at DEV branch or you can also run eShopOnContainers with Docker CLI with "docker-compose up" or deploying to Kubernetes/AKS. Trying to run the solution in VS15.6 (current RTM of Visual Studio 2017) will generate errors (complaining about invalid values in docker-compose file). +## IMPORTANT NOTE ON VISUAL STUDIO 2017 VERSION NEEDED! +**Visual Studio 2017 15.7 Preview 2.0 or later is needed to run the solution from the *[DEV branch](https://github.com/dotnet-architecture/eShopOnContainers/tree/dev)* (current evolving code) which now includes API Gateways features**. Due to the configuration used in `docker-compose.yml` file, VS 15.7 (currently in Preview 2) is needed to run the solution at [DEV branch](https://github.com/dotnet-architecture/eShopOnContainers/tree/dev) or you can also run eShopOnContainers with Docker CLI with *"docker-compose up"* or deploying to *Kubernetes/AKS*. +Trying to run the solution at [DEV branch](https://github.com/dotnet-architecture/eShopOnContainers/tree/dev) in VS 15.6 (current RTM of Visual Studio 2017) will generate errors (complaining about invalid values in docker-compose file). -If you want/need to run eShopOnContainers in **Visual Studio 2017 15.6 RTM** or previous, you'll need to use the code at the **MASTER branch** which is the previous stable version of eShopOnContainers. +If you want/need to run eShopOnContainers in **Visual Studio 2017 15.6 RTM** or previous, you'll need to use the code at the **[MASTER branch](https://github.com/dotnet-architecture/eShopOnContainers/tree/master)** which is the previous stable version of eShopOnContainers. -**Note for Pull Requests**: We accept pull request from the community. When doing it, please do it onto the **DEV branch** which is the consolidated work-in-progress branch. Do not request it onto Master branch, if possible. +**Note for Pull Requests (PRs)**: We accept pull request from the community. When doing it, please do it onto the **DEV branch** which is the consolidated work-in-progress branch. Do not request it onto Master branch, if possible. **NEWS / ANNOUNCEMENTS** Do you want to be up-to-date on .NET Architecture guidance and reference apps like eShopOnContainers? --> Subscribe by "WATCHING" this new GitHub repo: https://github.com/dotnet-architecture/News From c40770762648bd2aad41e6ca294c3e92a8c43e1a Mon Sep 17 00:00:00 2001 From: Cesar De la Torre Date: Thu, 5 Apr 2018 10:36:06 -0700 Subject: [PATCH 65/78] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index aa8ca7635..cfbd378cf 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,8 @@ Sample .NET Core reference application, powered by Microsoft, based on a simplified microservices architecture and Docker containers. ## IMPORTANT NOTE ON VISUAL STUDIO 2017 VERSION NEEDED! -**Visual Studio 2017 15.7 Preview 2.0 or later is needed to run the solution from the *[DEV branch](https://github.com/dotnet-architecture/eShopOnContainers/tree/dev)* (current evolving code) which now includes API Gateways features**. Due to the configuration used in `docker-compose.yml` file, VS 15.7 (currently in Preview 2) is needed to run the solution at [DEV branch](https://github.com/dotnet-architecture/eShopOnContainers/tree/dev) or you can also run eShopOnContainers with Docker CLI with *"docker-compose up"* or deploying to *Kubernetes/AKS*. -Trying to run the solution at [DEV branch](https://github.com/dotnet-architecture/eShopOnContainers/tree/dev) in VS 15.6 (current RTM of Visual Studio 2017) will generate errors (complaining about invalid values in docker-compose file). +**Visual Studio 2017 15.7 Preview 2.0 or later is needed to run the solution from the *[DEV branch](https://github.com/dotnet-architecture/eShopOnContainers/tree/dev)* (current evolving code) which now includes API Gateways features**. Due to the configuration used in `docker-compose.yml` file, VS 15.7 (currently in Preview 2) is needed to run the solution at [DEV branch](https://github.com/dotnet-architecture/eShopOnContainers/tree/dev) or you can also run eShopOnContainers with Docker CLI with **"docker-compose up"** or deploying to **Kubernetes/AKS**. +Trying to run the solution from [DEV branch](https://github.com/dotnet-architecture/eShopOnContainers/tree/dev) in VS 15.6 (current RTM of Visual Studio 2017) will generate errors (complaining about invalid values in docker-compose file). If you want/need to run eShopOnContainers in **Visual Studio 2017 15.6 RTM** or previous, you'll need to use the code at the **[MASTER branch](https://github.com/dotnet-architecture/eShopOnContainers/tree/master)** which is the previous stable version of eShopOnContainers. From 0a4967fc64bcb6de2d7e099be210cfc2785e839a Mon Sep 17 00:00:00 2001 From: Cesar De la Torre Date: Thu, 5 Apr 2018 10:36:40 -0700 Subject: [PATCH 66/78] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index cfbd378cf..56ec07518 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # eShopOnContainers - Microservices Architecture and Containers based Reference Application (**BETA state** - Visual Studio 2017 and CLI environments compatible) Sample .NET Core reference application, powered by Microsoft, based on a simplified microservices architecture and Docker containers. -## IMPORTANT NOTE ON VISUAL STUDIO 2017 VERSION NEEDED! +## IMPORTANT NOTES! **Visual Studio 2017 15.7 Preview 2.0 or later is needed to run the solution from the *[DEV branch](https://github.com/dotnet-architecture/eShopOnContainers/tree/dev)* (current evolving code) which now includes API Gateways features**. Due to the configuration used in `docker-compose.yml` file, VS 15.7 (currently in Preview 2) is needed to run the solution at [DEV branch](https://github.com/dotnet-architecture/eShopOnContainers/tree/dev) or you can also run eShopOnContainers with Docker CLI with **"docker-compose up"** or deploying to **Kubernetes/AKS**. Trying to run the solution from [DEV branch](https://github.com/dotnet-architecture/eShopOnContainers/tree/dev) in VS 15.6 (current RTM of Visual Studio 2017) will generate errors (complaining about invalid values in docker-compose file). From fac72aebc770646b3b007c24132a1201c6732736 Mon Sep 17 00:00:00 2001 From: Cesar De la Torre Date: Thu, 5 Apr 2018 11:51:07 -0700 Subject: [PATCH 67/78] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 56ec07518..f22216f86 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ Sample .NET Core reference application, powered by Microsoft, based on a simplified microservices architecture and Docker containers. ## IMPORTANT NOTES! -**Visual Studio 2017 15.7 Preview 2.0 or later is needed to run the solution from the *[DEV branch](https://github.com/dotnet-architecture/eShopOnContainers/tree/dev)* (current evolving code) which now includes API Gateways features**. Due to the configuration used in `docker-compose.yml` file, VS 15.7 (currently in Preview 2) is needed to run the solution at [DEV branch](https://github.com/dotnet-architecture/eShopOnContainers/tree/dev) or you can also run eShopOnContainers with Docker CLI with **"docker-compose up"** or deploying to **Kubernetes/AKS**. +**Since April 5 2018, Visual Studio 2017 15.7 Preview 2.0 or later is needed to run the solution from the *[DEV branch](https://github.com/dotnet-architecture/eShopOnContainers/tree/dev)* (current evolving code) which now includes API Gateways features**. Due to the configuration used in `docker-compose.yml` file, VS 15.7 (currently in Preview 2) is needed to run the solution at [DEV branch](https://github.com/dotnet-architecture/eShopOnContainers/tree/dev) or you can also run eShopOnContainers with Docker CLI with **"docker-compose up"** or deploying to **Kubernetes/AKS**. Trying to run the solution from [DEV branch](https://github.com/dotnet-architecture/eShopOnContainers/tree/dev) in VS 15.6 (current RTM of Visual Studio 2017) will generate errors (complaining about invalid values in docker-compose file). If you want/need to run eShopOnContainers in **Visual Studio 2017 15.6 RTM** or previous, you'll need to use the code at the **[MASTER branch](https://github.com/dotnet-architecture/eShopOnContainers/tree/master)** which is the previous stable version of eShopOnContainers. From ab1df0fa007ceb9f1ac9b8eaa5361e6e51a49d66 Mon Sep 17 00:00:00 2001 From: Cesar De la Torre Date: Thu, 5 Apr 2018 12:35:55 -0700 Subject: [PATCH 68/78] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index f22216f86..85819e4f7 100644 --- a/README.md +++ b/README.md @@ -26,17 +26,17 @@ For a list on the new .NET Core 2.0 related implemented features, see this [blog > > This reference application proposes a simplified microservice oriented architecture implementation to introduce technologies like .NET Core with Docker containers through a comprehensive application. The chosen domain is an eShop/eCommerce but simply because it is a well-know domain by most people/developers. However, this sample application should not be considered as an "eCommerce reference model", at all. The implemented business domain might not be ideal from an eCommerce business point of view. It is neither trying to solve all the problems in a large, scalable and mission-critical distributed system. It is just a bootstrap for developers to easily get started in the world of Docker containers and microservices with .NET Core. ->

For example, the next step after running the solution in the local dev PC and understanding Docker containers and microservices development with .NET Core, is to select a microservice cluster/orchestrator like Kubernetes in Azure or Azure Service Fabric, both environments tested and supported by this solution. +>

For example, the next step after running the solution in the local dev PC and understanding Docker containers and microservices development with .NET Core, is to select a microservice cluster/orchestrator like Kubernetes in Azure (AKS) or Azure Service Fabric, both environments tested and supported by this solution. > Additional steps would be to move your databases to HA cloud services (like Azure SQL Database), or to implement your EventBus with Azure Service Bus or any other production ready Service Bus in the market. >

> > Read the planned Roadmap and Milestones for future releases of eShopOnContainers within the Wiki for further info about possible new implementations and provide feedback at the ISSUES section if you'd like to see any specific scenario implemented or improved. Also, feel free to discuss on any current issue. **Architecture overview**: This reference application is cross-platform at the server and client side, thanks to .NET Core services capable of running on Linux or Windows containers depending on your Docker host, and to Xamarin for mobile apps running on Android, iOS or Windows/UWP plus any browser for the client web apps. -The architecture proposes a simplified microservice oriented architecture implementation with multiple autonomous microservices (each one owning its own data/db) and implementing different approaches within each microservice (simple CRUD vs. DDD/CQRS patterns) using Http as the communication protocol between the client apps and the microservices and supports asynchronous communication for data updates propagation across multiple services based on Integration Events and an Event Bus (a light message broker, to choose between RabbitMQ or Azure Service Bus, underneath) plus other features defined at the roadmap. +The architecture proposes a microservice oriented architecture implementation with multiple autonomous microservices (each one owning its own data/db) and implementing different approaches within each microservice (simple CRUD vs. DDD/CQRS patterns) using Http as the communication protocol between the client apps and the microservices and supports asynchronous communication for data updates propagation across multiple services based on Integration Events and an Event Bus (a light message broker, to choose between RabbitMQ or Azure Service Bus, underneath) plus other features defined at the roadmap.

- +

> ### Important Note on API Gateways and published APIs From 131ea4ec0fbf747a5c1a17cd4e4f4b2cf7912e36 Mon Sep 17 00:00:00 2001 From: Cesar De la Torre Date: Thu, 5 Apr 2018 12:36:55 -0700 Subject: [PATCH 69/78] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 85819e4f7..8227becb1 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ However, this sample application should not be considered as an "eCommerce refer The architecture proposes a microservice oriented architecture implementation with multiple autonomous microservices (each one owning its own data/db) and implementing different approaches within each microservice (simple CRUD vs. DDD/CQRS patterns) using Http as the communication protocol between the client apps and the microservices and supports asynchronous communication for data updates propagation across multiple services based on Integration Events and an Event Bus (a light message broker, to choose between RabbitMQ or Azure Service Bus, underneath) plus other features defined at the roadmap.

- +![image](https://user-images.githubusercontent.com/1712635/38387692-8af1355e-38cd-11e8-8e1f-0082ac0a6556.png)

> ### Important Note on API Gateways and published APIs From c84dff96ea0243d87388c2db4816c2b985a7479d Mon Sep 17 00:00:00 2001 From: Cesar De la Torre Date: Thu, 5 Apr 2018 12:38:12 -0700 Subject: [PATCH 70/78] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8227becb1..011900f68 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ However, this sample application should not be considered as an "eCommerce refer The architecture proposes a microservice oriented architecture implementation with multiple autonomous microservices (each one owning its own data/db) and implementing different approaches within each microservice (simple CRUD vs. DDD/CQRS patterns) using Http as the communication protocol between the client apps and the microservices and supports asynchronous communication for data updates propagation across multiple services based on Integration Events and an Event Bus (a light message broker, to choose between RabbitMQ or Azure Service Bus, underneath) plus other features defined at the roadmap.

-![image](https://user-images.githubusercontent.com/1712635/38387692-8af1355e-38cd-11e8-8e1f-0082ac0a6556.png) +

> ### Important Note on API Gateways and published APIs From 22e36bfb3872f2d085bfecc4a9fd473685db5c4d Mon Sep 17 00:00:00 2001 From: Cesar De la Torre Date: Thu, 5 Apr 2018 13:02:00 -0700 Subject: [PATCH 71/78] Update README.md --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 011900f68..1daf91af2 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,10 @@ The architecture proposes a microservice oriented architecture implementation wi

> ### Important Note on API Gateways and published APIs -> Note that the previous architecture diagram shows how you deploy eShopOnContainers in a local Docker development machine. For a production-ready architecture we recommend to keep evolving your architecture with additional features like API Gateways based on AzureAPI Management or any other approach for API Gateways explained in the related documentation/eBook, so you can filter APIs and apply security in a single tier while hiding/securing the internal microservices to the client apps or outside consumers. +> Since April 2018, we have introduced the implementation of the [API Gateway and BFF (Backend-For-Front) patterns](http://microservices.io/patterns/apigateway.html) in eShopOnContainers architecture, so you can filter and publish simplified APIs and URIs and apply additional security in that tier while hiding/securing the internal microservices to the client apps or outside consumers. These sample API Gateways in eShopOnContainers are based on [Ocelot](https://github.com/ThreeMammals/Ocelot), an OSS lightweight API Gateway solution explained [here](http://threemammals.com/ocelot). The deployed API Gateways are autonomous and can be deployed as your own custom microservices/containers, as it is currently done in eShopOnContainers, so you can test it even in a simple development environment with just Docker engine or deploy it into orchestrators like Kubernetes in AKS or Service Fabric. + +For your production-ready architecture you can either keep using [Ocelot](https://github.com/ThreeMammals/Ocelot) which is simple and easy to use and used in production by significant companies or if you need further functionality and a much richer set of features suittable for commercial APIs, you can also substitute those API Gateways and use [Azure API Management](https://azure.microsoft.com/en-us/services/api-management/) or any other commercial API Gateway, as shown in the following image. +

From 17657a21ecdc83dbdee368b35c059baac4dacff7 Mon Sep 17 00:00:00 2001 From: Cesar De la Torre Date: Thu, 5 Apr 2018 13:05:54 -0700 Subject: [PATCH 72/78] Update README.md --- README.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 1daf91af2..26d848e28 100644 --- a/README.md +++ b/README.md @@ -42,22 +42,24 @@ The architecture proposes a microservice oriented architecture implementation wi > ### Important Note on API Gateways and published APIs > Since April 2018, we have introduced the implementation of the [API Gateway and BFF (Backend-For-Front) patterns](http://microservices.io/patterns/apigateway.html) in eShopOnContainers architecture, so you can filter and publish simplified APIs and URIs and apply additional security in that tier while hiding/securing the internal microservices to the client apps or outside consumers. These sample API Gateways in eShopOnContainers are based on [Ocelot](https://github.com/ThreeMammals/Ocelot), an OSS lightweight API Gateway solution explained [here](http://threemammals.com/ocelot). The deployed API Gateways are autonomous and can be deployed as your own custom microservices/containers, as it is currently done in eShopOnContainers, so you can test it even in a simple development environment with just Docker engine or deploy it into orchestrators like Kubernetes in AKS or Service Fabric. -For your production-ready architecture you can either keep using [Ocelot](https://github.com/ThreeMammals/Ocelot) which is simple and easy to use and used in production by significant companies or if you need further functionality and a much richer set of features suittable for commercial APIs, you can also substitute those API Gateways and use [Azure API Management](https://azure.microsoft.com/en-us/services/api-management/) or any other commercial API Gateway, as shown in the following image. +> For your production-ready architecture you can either keep using [Ocelot](https://github.com/ThreeMammals/Ocelot) which is simple and easy to use and used in production by significant companies or if you need further functionality and a much richer set of features suittable for commercial APIs, you can also substitute those API Gateways and use [Azure API Management](https://azure.microsoft.com/en-us/services/api-management/) or any other commercial API Gateway, as shown in the following image.

-> The sample code in this repo is NOT making use of Azure API Management in order to be able to provide an "F5 experience" in Visual Studio (or CLI) of the sample with no up-front dependencies in Azure. But you should evaluate API Gateways alternatives when building for production. +> The sample code in this repo is NOT making use of Azure API Management in order to be able to provide an "F5 experience" in Visual Studio (or CLI) of the sample with no up-front dependencies in Azure. But you could evaluate API Gateways alternatives when building for production. -The microservices are different in type, meaning different internal architecture pattern approaches depending on its purpose, as shown in the image below. +> ### Internal architecture and design of the microservices + +> The microservices are different in type, meaning different internal architecture pattern approaches depending on its purpose, as shown in the image below.

> ### Important Note on Database Servers/Containers -> In this solution's current configuration for a development environment, the SQL databases are automatically deployed with sample data into a single SQL Server for Linux container (a single shared Docker container for SQL databases) so the whole solution can be up and running without any dependency to any cloud or specific server. Each database could also be deployed as a single Docker container, but then you'd need more than 8GB of RAM assigned to Docker in your development machine in order to be able to run 3 SQL Server Docker containers in your Docker Linux host in "Docker for Windows" or "Docker for Mac" development environments. +> In this solution's current configuration for a development environment, the SQL databases are automatically deployed with sample data into a single SQL Server container (a single shared Docker container for SQL databases) so the whole solution can be up and running without any dependency to any cloud or specific server. Each database could also be deployed as a single Docker container, but then you'd need more than 8GB of RAM assigned to Docker in your development machine in order to be able to run 3 SQL Server Docker containers in your Docker Linux host in "Docker for Windows" or "Docker for Mac" development environments. >

A similar case is defined in regard to Redis cache running as a container for the development environment. Or a No-SQL database (MongoDB) running as a container. >

However, in a real production environment it is recommended to have your databases (SQL Server, Redis, and the NO-SQL database, in this case) in HA (High Available) services like Azure SQL Database, Redis as a service and Azure CosmosDB instead the MongoDB container (as both systems share the same access protocol). If you want to change to a production configuration, you'll just need to change the connection strings once you have set up the servers in a HA cloud or on-premises. From 1b4e76170779390827fc7b1028c0e56026749b36 Mon Sep 17 00:00:00 2001 From: Cesar De la Torre Date: Thu, 5 Apr 2018 13:16:40 -0700 Subject: [PATCH 73/78] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 26d848e28..916d65ab3 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ For a list on the new .NET Core 2.0 related implemented features, see this [blog > This reference application proposes a simplified microservice oriented architecture implementation to introduce technologies like .NET Core with Docker containers through a comprehensive application. The chosen domain is an eShop/eCommerce but simply because it is a well-know domain by most people/developers. However, this sample application should not be considered as an "eCommerce reference model", at all. The implemented business domain might not be ideal from an eCommerce business point of view. It is neither trying to solve all the problems in a large, scalable and mission-critical distributed system. It is just a bootstrap for developers to easily get started in the world of Docker containers and microservices with .NET Core. >

For example, the next step after running the solution in the local dev PC and understanding Docker containers and microservices development with .NET Core, is to select a microservice cluster/orchestrator like Kubernetes in Azure (AKS) or Azure Service Fabric, both environments tested and supported by this solution. -> Additional steps would be to move your databases to HA cloud services (like Azure SQL Database), or to implement your EventBus with Azure Service Bus or any other production ready Service Bus in the market. +> Additional steps would be to move your databases to HA cloud services (like Azure SQL Database), or switch your EventBus to use Azure Service Bus (instead of bare-bone RabbitMQ) or any other production ready Service Bus in the market. >

> > Read the planned Roadmap and Milestones for future releases of eShopOnContainers within the Wiki for further info about possible new implementations and provide feedback at the ISSUES section if you'd like to see any specific scenario implemented or improved. Also, feel free to discuss on any current issue. From b541d2c7906d652479bcd083377c29753242ab28 Mon Sep 17 00:00:00 2001 From: Cesar De la Torre Date: Thu, 5 Apr 2018 13:17:37 -0700 Subject: [PATCH 74/78] Update README.md --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 916d65ab3..10f79b203 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,8 @@ However, this sample application should not be considered as an "eCommerce refer > > Read the planned Roadmap and Milestones for future releases of eShopOnContainers within the Wiki for further info about possible new implementations and provide feedback at the ISSUES section if you'd like to see any specific scenario implemented or improved. Also, feel free to discuss on any current issue. -**Architecture overview**: This reference application is cross-platform at the server and client side, thanks to .NET Core services capable of running on Linux or Windows containers depending on your Docker host, and to Xamarin for mobile apps running on Android, iOS or Windows/UWP plus any browser for the client web apps. +### Architecture overview +This reference application is cross-platform at the server and client side, thanks to .NET Core services capable of running on Linux or Windows containers depending on your Docker host, and to Xamarin for mobile apps running on Android, iOS or Windows/UWP plus any browser for the client web apps. The architecture proposes a microservice oriented architecture implementation with multiple autonomous microservices (each one owning its own data/db) and implementing different approaches within each microservice (simple CRUD vs. DDD/CQRS patterns) using Http as the communication protocol between the client apps and the microservices and supports asynchronous communication for data updates propagation across multiple services based on Integration Events and an Event Bus (a light message broker, to choose between RabbitMQ or Azure Service Bus, underneath) plus other features defined at the roadmap.

From 4f5de739179a8454809ec66eba55e1fa2532f5f6 Mon Sep 17 00:00:00 2001 From: Cesar De la Torre Date: Thu, 5 Apr 2018 13:28:17 -0700 Subject: [PATCH 75/78] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 10f79b203..3530f9e72 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ This reference application is cross-platform at the server and client side, than The architecture proposes a microservice oriented architecture implementation with multiple autonomous microservices (each one owning its own data/db) and implementing different approaches within each microservice (simple CRUD vs. DDD/CQRS patterns) using Http as the communication protocol between the client apps and the microservices and supports asynchronous communication for data updates propagation across multiple services based on Integration Events and an Event Bus (a light message broker, to choose between RabbitMQ or Azure Service Bus, underneath) plus other features defined at the roadmap.

- +

> ### Important Note on API Gateways and published APIs From 5511340c81da4eca96a1a00dbea20979cecef77e Mon Sep 17 00:00:00 2001 From: Cesar De la Torre Date: Thu, 5 Apr 2018 13:33:02 -0700 Subject: [PATCH 76/78] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3530f9e72..11e80346a 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ The architecture proposes a microservice oriented architecture implementation wi

> ### Important Note on API Gateways and published APIs -> Since April 2018, we have introduced the implementation of the [API Gateway and BFF (Backend-For-Front) patterns](http://microservices.io/patterns/apigateway.html) in eShopOnContainers architecture, so you can filter and publish simplified APIs and URIs and apply additional security in that tier while hiding/securing the internal microservices to the client apps or outside consumers. These sample API Gateways in eShopOnContainers are based on [Ocelot](https://github.com/ThreeMammals/Ocelot), an OSS lightweight API Gateway solution explained [here](http://threemammals.com/ocelot). The deployed API Gateways are autonomous and can be deployed as your own custom microservices/containers, as it is currently done in eShopOnContainers, so you can test it even in a simple development environment with just Docker engine or deploy it into orchestrators like Kubernetes in AKS or Service Fabric. +> Since April 2018, we have introduced the implementation of the [API Gateway pattern](http://microservices.io/patterns/apigateway.html) and [Backend-For-Front-End (BFF) pattern](https://samnewman.io/patterns/architectural/bff/) in eShopOnContainers architecture, so you can filter and publish simplified APIs and URIs and apply additional security in that tier while hiding/securing the internal microservices to the client apps or outside consumers. These sample API Gateways in eShopOnContainers are based on [Ocelot](https://github.com/ThreeMammals/Ocelot), an OSS lightweight API Gateway solution explained [here](http://threemammals.com/ocelot). The deployed API Gateways are autonomous and can be deployed as your own custom microservices/containers, as it is currently done in eShopOnContainers, so you can test it even in a simple development environment with just Docker engine or deploy it into orchestrators like Kubernetes in AKS or Service Fabric. > For your production-ready architecture you can either keep using [Ocelot](https://github.com/ThreeMammals/Ocelot) which is simple and easy to use and used in production by significant companies or if you need further functionality and a much richer set of features suittable for commercial APIs, you can also substitute those API Gateways and use [Azure API Management](https://azure.microsoft.com/en-us/services/api-management/) or any other commercial API Gateway, as shown in the following image. From 1b8806e43d80c6ef6be76d3f3cc5ab98c1d77b65 Mon Sep 17 00:00:00 2001 From: Cesar De la Torre Date: Tue, 10 Apr 2018 19:05:39 -0700 Subject: [PATCH 77/78] Updated eBooks Azure Getting Started for Developers --- docs/Azure Dev eBook_Booklet.pdf | Bin 0 -> 395883 bytes docs/MicrosoftAzure_StartGuide_Developers.pdf | Bin 0 -> 762293 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/Azure Dev eBook_Booklet.pdf create mode 100644 docs/MicrosoftAzure_StartGuide_Developers.pdf diff --git a/docs/Azure Dev eBook_Booklet.pdf b/docs/Azure Dev eBook_Booklet.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ad55dd3d5ad92cf6d39370eb20d5c4ee21acf2f2 GIT binary patch literal 395883 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

a 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�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%0Djd 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 literal 0 HcmV?d00001 diff --git a/docs/MicrosoftAzure_StartGuide_Developers.pdf b/docs/MicrosoftAzure_StartGuide_Developers.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b843ec51ce0087f30cd749e64b47a954f4160d61 GIT binary patch literal 762293 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

_nkInD}<#&rd2~ zo$=4AnO?zd)8YZP4v29DokS667(ayYgCDKLYd8aVt_6Hyox^@k@-el@$_XgXM$ z+KVciI^)dkzLO+e`bqUigEsNKi4@-8<7KXF4n$`7^AYVf-TZDHe$_DG>h~MwrlJxq zSj)e&Eusp5z<_M!*lUe`WZG2)1nGcL}IDVS&RRWo)e+ ztpA}5wy6f+_M$i~v4PM-$lEf?kM64b}sGq>_=7)ZECy@wV{y*su#xgO4|5k`_ zRh_f(R5$4S{xJT|f{%{2vtZ zTl+UXvPE0|K+hg;(3Dk`B&5{TzLh6j+D1vd1%g5#KL#8@viA6^e_z-FIQCamLP10R zTb+dOe_zZ17&W4QsF85(?~7Ux$I>55f4}_q1Y8J%?2qNYUH$vw`uM>oibC)Ma1RDU zOekaoiC6!!^wxv*M;8Jg{<|urYHDBtBA5x_fMP!4U!aTshbR^tPSjeipe;{RdFWnqWMY51&cEsX(_C4dA_Q^0Qh57DjPGg<=3U#;vvR;@qj z#y`}pKd}FQre?|5S^`IK1FrCYl42qM&^7sH+|7)=}g=v3^-M=Z;X>$i0aD+KAfd8N33jgGb{x_SfKbXA#UwOg{ zCidUb!T%}R^oQR3pQ}q-K{!85(6=c2uOW=BGtI4N5=h~(FCz5vC*(&MnCcP)kWNDf z1Dx$Q^j;ZQ1YvHfZ;Q2c0YUMeK^Q+r{PU@AeuY@wrj-r^B!PGpSVsXY;Q;?w!vTEx zu?hs3)DdB^1=e_Mxy}Unb8D9Gv$`NO2EY15RaBG;D2v~>Wz$iB;+B?H_I4or5iY7= zaa;S-R?b?0mVxm9fTbV6{{k4`e;x2?a~#g_FYiiNS=s~W9Y6@bH;gJ+!q&?AFCSLG z8Jc4M@~$!-q_qd3QAA4LX94Ymg~5a#RRdPT;P7A6Aix?Le0zbGfu)@7WdK;&9)CxM za0m76jx@j;a8X?yXbKcf;7(l~3KD>Q6ABpUJ_9wJy%regIIud-* z5V7eXD3J<`NCifu0wYk-`K}&#V&As+5eE^)1U{_>2ty6{LukcmD_cXHE%*Wm0*Hk8 zMGH?6&=Xm(B3KoWofaHGr$Hzbj2{YtfnYE+KN^Jqp%4Jz<(0WmHszqOtOqXh%B5kFAjz&tn-@FOtPc0DQ~`uWMlZ<$UQ;KlGg0tJi}u=)&e zt=n~}gy8EZ7r$jXVeoH06%N=76cmWJw(C;~vENTFe#>;iU__@11=cVik-%7iY}ct0 z(uQwb{Ph`<7zpa;x_DXN+VeU}-4HtW*36>dbi}K-HsvR4ca2DNYa;HN2%Edk(iFbv zsDEs8eY$hzo!l9&BV?XFEbON4Q!#eIGjnA*SB$fF4!^PmF)k_^Qy-I`s1`hvrpvth z70t0|&&fWfXL%P}C)j;=?z$Z+#ff$vtl8%teQ=0$&f@-QSgv4R^jZPM*z>c-5BJo2 zPe`0%5wiW*Sk4>Hsh-Rc^BS_6{Tb26AdPVxAm3rL(et!=saa+T=5bB@;L?d$jn&qB zb&<#8G@+_b=|4(cpAzE>hpxU>J|bGc{bBLMp0H~tq*R;bnT-?vNlqJ#Ov-TM$BY`Nu5)EoTtI&?{_ zm)Php-M`Nk;%f%IW0yTPO;)fwHs=fcv!}Jr(Dm{!%4Jr=4&0?dRr0{gJZK}=45MR1 zD^bPZgjr_Zj46RqehzK%XZxP)8KO{aeuOQ){d_+%$yj!PER9B8ZC+352K=GAZorB2 z$KZ+*ROfstEp3t4soc--QP}0Nbh>b#alXzQH)?6)tff)T?|<4(itOWy`q2f`INLkV z<2~0D!G7UXRYE6SuRIjd{}QL0M)m3FI* zI{xdLBvb;gC=Q(F*tssxf2eu>wXByHe{}pxbo{6kIai$DvCj-QPX>x_+^09Kxw>Fa znm~4c58J1t>U2p#uJ`Iec5Lx47%g_(ef-kls=-P1BdR(o`zdG0?!L&1xY*6~Fmtpk z`?i06Fiv|;VZ!$4#FaRK5|tv74vYM2L;fVkSkv`Ndj_i?dDXb@G|{^Y*QlOrqYl?C z8LyqHZYY6uk=9>V7UO)Z(^|;7c|W&~!xQ zwT)!M)OEM=I@PNQJSPWvG}B}w{F4^_?x=$y+Ru6{#-{SalAmR&g!LS#rd4{R8UD0H zd+M#TO6ps&3$2ITCdefPU~ZUm!K{gVd72Ws4+L-uVp>kQ%<#oL?Q@Kxa%oqAJ!1FM zGRJHIL=dvZZ{t~#Q~Zhp@LGu^&Jlz=ZDnN!;sZIt_)RSh4Fv&*jz%H`1t0=kKyE2x zrEc{z1B7jgA^wgA3IfnTZ$V>I1n{>s@O)slps~q+|1Ax)pa2xI1&vMK_wQ&3zyKQ1 zEof}YJpPsj3ZMb|GYvw%vaNmrVqU1A01CbZ4ZOeH77aKW4agLV*n-BUfc@{;qb z_^q511%m*!1F`_nTNGLVgaR@g$o9C{fh=G5-mWK1(5XtSSEmIBep3E!l?Mk#c$=DNCDstUwn@Mm;efxhCw0)wkwNG zwjJmZ!f^W6vH(y3f?fc!Kmfrn5&_6$TY7=q;g;@ z0PAjRq!LWh&mJKdlYc7<{2L5}9s%?L0YKV#7J5rdI5}BAmBwn0F-EZviQYzqJPVF!Z849NU-3* z>U01=#lyMVVuIj{e~RL_OeY)-K-mBjcz_H8U|(<)W}BiQgaSXg_$|{3N8wE--mydY zF+f-YN8;CnZ)b=QB9Wh5{Fdp219OlBwLk&2Ls5W(2jJZ8aq)}kME{oQgafV=FAEp| zX(J%OR0rVbwwn7Pw@fE~a)DsLp#Yc+7%dnIFzDMd;3$0Se{%6#rW1xDx>Ohv zn2!UnWMIB_n;r6tafV`#reJnp8D~d%fIGyu+vv=ss!-`<=gj0?(%1*rl#{t1 zpKr;&KkBy9^SOG$qgf)-1iWkcvC!qy4BRu`PPL`eJE**FK|p1ns%Y&`Tn_YaPEqN?{Lk`^vk-mG}m)^fFNHK;F zRWSYF;Zj5F%+t>S&%b`1#$q*f;Wie_G7SkT47a}GLE|ITl?zp$XX(5VvM_(oJAL4d z=zD&cW9t^9Of+P>+(>Nj0 z)@bWm1WU+!m~CqYmFHLM)xC6Y&9poaI;6R!3+=+WcumG?PaS?SV2QB@rJ zUq1<;9b_N^7B6f{Nz9isF6~aK>PYPQqAEw?|AFM_{T&tt<=GYEWju>2Jo~zHOxdzu zft@)&mPl7JbM|sl)g+Y6I>WxM&M1TK270vEUZ893PT|*i$Vp~2sKEM2<8V2>y3Lh} zX{p7j6z4wuT?VhE-BYOqsK?ZGG??Np?M@3szS2EaB@k~PQ2+b@P3Dt+#GXzU^A%^& z{=S-8%F9(2xxqU3^8)=!O00{Yrq`iPoHx8q?{)d{^$6zU<12@q&dIF4(1dKvYUh*B z-r6HQTd#oa69aZWx>+{bzXcFXNIk#VrN05#FmM3qgKYt@5faC3(m((}A8ZSNjga;_!a;gAz9fj4M3*wEdVxwO)lf_+9H6L=@tN+z$SzLw>0p4Yyq$VGq>CB7c`!a zE%cNSq;FFmXaI18Z=t7z5PQ2c01y|xg`N@u{GK)&i1LfU_US zF5&Ap1rP^e{%rz?1aduKYzY8Z4Pb&%z?dST1*6YC&-?13F8@F{{e*S`~#51x);u3SSt!w2{R$eSQgZu2&)7 zaC+B1iIZIsDIZhRl2Y`H3$K2e^oy|k;I{-WY|ZBpEyz{M^K1l1rA-qnj(-&Z7 z)oDg=Fwxt*;N>qS9FK4;h4^~W3uS{lmduayck~-6O?2^iRxpsosh%>(@X3a1d>#TB z>q)}xn81fJX!R>5*u>-W%15GVWlo!>~ZQ-3#c+PWOUaQL%aeaNhi`sb2F#7mz z#Urc9vhlC?+=OHWI6+E1c?Ax=X?Ch^q?IosEoT&y6FmE5?9oBRb&tvh)<-jqbFzI) zD@9fN2S+aHUs7kph|_5vKJkDgma>|ZW0vN+%;c*MeR8W^zTmsFq^}1d*|~eqe<(Rp zp~De0<~mZFI@X({!6fK0sdu%y1(Y9N(!z}^3BL^2$!aChj$ze+2Asa7l2TQo>$*43 zqfxwy6$D|YxHNE3e*;;uF=Ku4Q%0nGw%Pvb&kgOG<|EN*@5+REFJ0vR&^y#WQ6V8e zP{s9$dEb&{Ua36QtD(fZckeq5y{2Xn;swq|<1JBTe-M-CZp{9{MP(T_Qn#>+1q89J;vd^(ntuE+eu~r(~9fbymDbhvr`h3bc zg&qb;%mocgrioQoDs+3$N3t+izPeu?l{B>jOn$E@fDhH8Phn;I{bgi{@Vx3eHoq?oF`|i)V)`B~ReOH6r z*0R8U=^~$~^C^!c<(Kk5m4KWkalob|1^R?1=KIvD9{iXs!`|^^pe%zAm0$M?u3gOU z$mP%chCwT8E&FjP81;t*eWH*#vdnn;$ySPWlDN3wRVk6Vz zw|A{*oQn_MnXFhXukg{2+S!sj6Mob|>v>|*fCJ4@zcgc$k#j=kR_MjOizmpwZdAvG zU`Wc!TG+1@f)^fE8`G$*_Cl@{q&JbvjBco>&(q~QpXF1bm}UxF-*->pb^xE-YVO;L zb)WP6jk^w#yXz|7J#(W>aZSMRLK1Bi-1OzquU=`(eply9(^t-Q9g1&>qJ3<%@Cu`^ zBm3yt2{YZw8@o_J9Jp; zTC%WQNO#Q*;eEm^yN);8?0O$d$D}~@Qt4N6=xmH=eK5n&&6ZQ0EH~BNyG?O9h|*53!&%z7A%|Aeb-lc@LSpDuCOYzI*#680*H_I<40Eekx!ADR^!v2vBJu2l z9b(wG?folfyc72#d?zX(!{otET)1iPT)q#KX?oq3E!Y-R96aCWP1$0YMyt)0^P`uJ z(w4P;v7*AICtfPL^hJgWT zW^9XnAsLFiA0GHVDjz!@`PrY6{kqdl*Y~`AIxtk%4bPP(att1wztB^l^9O?Qu*2moD%DW@a~L2UK+U>YoGYoCtbA4UR250 zH@qk9g}qE?Exqnk*@e5@_r!LYdK-bk9yA-;*O;D^CwowzusZO?ZO5v5W-%C-k<}PG zKJD&>)qef@TzDBn)V#yMQ>kc zPo@kn)>ywjpD+^7^l|cv!afJplvmTKnstn~&OGhraykBZ&!O3eo%gDx3vOonXg`d$ zo-Q;=JKr+bh_PaKdTruF{#Mtx$O!Rv-eJ8vv$wPEMYx2r$rsAh#vM;87*ip-!L||^ z=Nl+KB|Zukf23L%O>@sUYC%#-ko!p+gSzFbd)6Tzq`DPec^zsCiX!LjjaEy2VmQf| z7xsE;idv(S`BrIR>1Tf76Zex&1{$wDIqFq>DvMo`&d%P#9ZQkTq`P-ct1FaVY^A2a zoTH}nzwDn9Zds{4SYCN`Dm5jffWU7wSU{>ZC=7HJHo^zPNo1iEzY7n!*6aK*0ds%Y5a#j_`U+!4>F z$<~CFbehjcJex{vu_T`gtmRqm5aaf^!h8OCD__iIOv6;UY0~uFxC|{?%HSg1wo>Wi zy%$5+J)tLq4_6A#o;%Q_ID3|{w{n&`m(-eHf&T!LN^9_vETUcHfGT6Q-snBfXA$u^ zA-!04M@}tBpMFysvI+gp&p=3B%YhG>nARBX%0`x<#3X*T-%&@-;+7oc5N+6$!!5Zy zluq2a2zZQOix(B(<~MdR?C5=d5xNB|L5Q2S7e)gMzXb)5Tcjq0x9Yw}V&B4OA_o0m z2&178V%+%uu{iplyjAxP<7i@D@sH!^@3^=Yh7kFKFocL5gdu>_AmF72Ah^cAmHumx zy(!xh2ksK<{^v81zZ+$5N*M8M{M%rkuv{MhG6()u62i7|K;D9Xtpd57$sU5JzUw)_ z#lN2I!B2Vta~i;I2^fG61TYZ?2d0OC?ZtuR1KY_tHm9usAHOx<1A`E`0H%idfvE<< z9N4zFAganHaS#*Af36!aV7?0mKzZLeLEv9s0H%oXvvJ$x1aBg~aq=IMFksGk^Grv; zh3=qkG!2l1&9;@9z*!u2AEC03F@*ZZ?#Z#ZbR6dIrI~19Vc2BRG_~aRHEu{M5iCbe zRVW$ifSr4tJY+UIJ=1zZYe~HE!-m_6DQ(VvomqBgvHg87ASz2|$HY1=OcgEnx*Z?t zc4MSyI=wa+`kpJ;%O_ISg}cj*_U!GF&sT2-FAN-dcA@1OgnUe^QI*2T%TVahTFX1o zdlusp!6%sKd7lNmxe)nE`r>Vz_9I?@RsLKE?v1or*RIpEyz;Z$WWj7a&Y^V6I%oKY zJ>5AZvjB7pX{&3u@I@!ux@ad_m=dx;#SA5DyI@oG(FPFE; zV1aglURykGgV{1QL zV*(pgp>aJvc#8EMW4M$s4Py-}m7F~j=!nY6E;^NK81s`OQtCxE@F0n}lL&riO|}aX zg@PYocOoP{F^S#Bk-9r{_4Z+M3G`41wf_zd;AK#bW&I$6Wo~K8>8%k4uzTq~tJv7P40f7F_fI9!lzcg+G{c z56ohuwb^&b)+K5I(qx%-7)w$lIdm(aGFeqN!;tM7S1xBcyPBc)VSPGME|3qYa^*(& zJtw95KD7h2D&d#U(Xu`d9M% zpE!h}+od&AnmpnTw4f z$+Z3h^Nq~?*vLm%hEeB}!D=8D>|%OlA)|*Sbt|OWHNfe*u~B^pNtsB@VRjm^1WK8x ziR7b#LrM(Zju>AJcf+v7*3)LjMjvE#pEn;LChhiqHyh?K*rc`Gm-6{i+3dN7WsQqY zag%6dO2d?gaB);jZ8IAV%IH2;!B!)p3v`m^~=q6QLS3WYNo75$6HZwct628l_&tKpI~w(%)#&#ip9 zK=pr$Hotw z>QH5+@I&FWxNhFH<4oPax}=*Nu51^b%2x~b3|o&grM)DU&rPLCf8_ZNed)Uq&Ba6t~Q&8E7}Rrl%5uF7k;FSP6n=TjWbFUsE? z{gz(%fe6Ez^TVJ#CbOrGj~!PR-<}>!J1nrWEdTsjUHtKn8ILKZSa7vhmXg1m~W;Sc8lkPuw>GTTsWeqBs(_MhXLnYJ zsJI?js_c+ju&xH*PgA1(Fr`}R4D^P(*}W7{B5WxSgfc(&JXCz%>7r9vKg;F&qgQXH zUevyTJU5VYL~!cl?f6mia_O^_nM`zFIvjTw)bGDn?69YgDut9J`{ZqkP7SbVPBpPz82&6V@u&|)(KuVmwSWwkLY&BUXG=Ik?vprw&7?dlUSW7 zv_-ME)1lKLw5f9Z5%W{NhXw{(x2`nYVyYs4yi25c>5ZzMtPR$1!7sM+-u@JB`e&`j zGUcx=>z@0_+D*rex^=U%0yvXi&ph4+U$N%3?U>7|DrE;xKtuG2W7#3PmOYo7gJLZ4^O9K{6_ zuZA5N?aW`?E-P|3R(fRk3vrwn_uQ2r#zYA4NRZB>q{t%-YcdL5RT3?X))wOuq5yyVo=VLrxx~7~8GQROp^kg68gMCAG z`wO{r`gf+`){)j2BG1NNXN{$%v|ejU7Jq03w;AGiAv2?tel1aa@3^z}Jte`R z9ImGy(Qf7PlbQ|Bf+|WU?v~^P_BMwtA(tDQOZ-+>H!jmVYxuGl^N4icJuI)&9?p0` zG^${5u=aJtKmu=$ICQFSzw6`vr!_if-&4ItT>d0+#wEf~{gUfT)#8Wot`|G+-1L^K z$nH|Ce_mrsJ=JL257BECmYeaFay6uBVCl&={*ErH&9OS4{}&z;}9AB zfnev*`is8)D&pNbPhAcs3b)!7?nsUpF{;`iW7sjU^X1$Y=_oP7_!i3j%{13v=A*>? z;2RM+I|ZyY$Oyk@Ht=HAIaN9QKTiCqF?PU-JXrh-S^O5?&lDk?dt(LcwC!k$a{}Aj z0;j^@4EYSqtsD%&Tt8pPB8L9kssK0u!R`GBHEi)! ze&^wrO221tz`OnbxmEwoN;f5d|F}||C7**GQN}--N&L$9z4^a1aC4SN#1Wtn;@YYI z29N-xSpTgFIb!Dbdpq&~yYm3^X2f^#fmyR}yYu`qIR|{fKSC72U(D12`}x4W@8JV{ zhJ(7FONTH0z23 z>osneYkO0c%E2xaw$^k>Cg2wjjfdu|`1eL7@}gkLKI+;lo&A&iT&g*|{-O+bWv82k z7nUhy`fubigSmR%ka)ds?`m+}%bYUMIp9tc^I{g1dc9ceNvs>aw`|JzXY#w~_ z*5iI92|IbsG#2mF&x_5jigt3*i^<6A|h@# za!Thfv+PSO;b?#O%D#2Lo&weT^wLJor6B0KpuNsM8oA@wRSt%p_Pf5Yi&?4daNs3I zYnDSdxe`h3a?A2N+PoeIs$<_PF9S}xfIE{_Ie;w=skyh zb|c~l=<2g*vzE`2rv4fd>!X)7(m4WXrv_5K981{)uRVqKHfp;9g1&3RlZgG zNv6v-Nq6oRj-4scU_Q;rMlB-|8HQ5wc5ZRgh~)9V8z9;Je$AL+*Jrm-;iJAw<0gDY zYbz3UFC#VD2Fo6+Tc0_Upe{{kH5*l7aPY&PV8b3!nDf_i`g?;BsxyfN*EkdN=(A;B zIYWJ0-#6bco;h6CHxn6Nmhthupps^0PsR9BT0lvnuAVMsso0E8{_5_jf^|W2%A3P6 zwl$c!j>pIX-DRpTA%FeQe9e;?Ry(%_C@n^c{%mO#2&<* z36r(zTcYop3!Z~C-gi4*%d03=dM@+iyrOsIT|06Ksg^fEOAJLgksjgW`n53kyx5Bt zN1QLxb?JLcWR1E`Wnp}eIi3?xw(>h!rg6pc%1()=h~U&7vaquZ=kBg5M!NJ}iZ4>4 z%ipP+(~)FIldL$;9M&7Ym!-E<-csd2Ii-$A(_nO|1HZCR8X_5<{- zEtlME;2Ed(Q1ab~#ONxX3$Sv)MeL~0rpXcNe8N0+Oa`6m;*{p;YO~yM%vkzr%2WzO zI52eZimQ1UbIj1u;M%XIXJ^R}=)03HnUAucR}Wl#68j)alPxDK;|oLL=_3ksCm%ld zs(nKqv2#L&2gJ!QR7$Tb`8hE8(1Fk%xkR1N_(9AEb!_%-it2sMUxNfnJl%JLjqkUa zs(b7xS%j7>E|oM_!VezpvVs-K4j#<48h#!-m6SfgK&AKb;F0oG13EW}fR`rGhMu>k zqM<|Occe`?dlXoqDGV0PZ`F62PEvFA1{H!!EpmKPbQX#@&UmDClpKgdE1l5vf*x?U zn>_s~)OtrXPr$XY64U)vfp?N9bUi3f^}D-LIKr5A%+9kOAn$$ZJ&@RaUDMU;-~k=i z`{zw~MCzTDZqZKRFEF{*8=fnqjR?B5-?8ZM$s}5_T{J~5lFhMkmexT^l&?>`DTu37iPR`}_-esm=84N!siazDcb$dM3|mQDmZhsB zzx`!^TUalB0H&vuNE2a8Q9-Xk9oB#Qe%t!%MBdNWPV1f24xy-CBUdhW9DQqXB&K!> z3U7)Atv!Cqb+`C}!a4<_P2xobYGTj&hkd*EG7I23=+2GTQaxNQj4K!#O!}D7Sa6rJ zD^A;MgYQ6G!zWI2)VS@A`$qop&018~eJd}fWow*6amA%o9e+4>?rj~Yn<1lS;i`_V zlE+(3R~FTphCPZK4AqN9I)*hp!Z&Hw)jJe4jrv&6gov0ZbSnoyET(QtUSbM!IZ*Pk z&auI+!Z3R%R0o=UCGu^K=HVBlYOlH!pKE;*R`4UyeyYjm&)a))ktO?u#G|TdmQcDK z5xK3`ukB`lQO?ng9FCwhSR6EjT$0}&<~1v_;HCpkcT0#?Px~#4a~_) zQrZsH<#U!NO^|1EGeaT@GkhImK7<>L4w;0h)6%kDUvIT7t!_?zc3nAO(4R}+9V2a| zJVrr}2=p3~wUdXIFa9pyf&a*~De^dk>A_O;)8ja-`)$J+|7U8p4o zkM7ohoiU7bJC6noYAJI{v9-5NTs}d@pA^RhoNdL& z1M*i!KV|ldSPb!7sUHZ8amMY3iw{w7w3{^xTZjmKnPs{$Qxp5y8+_Gh7I)*OVOGV! ze!3>=vUQcHDS3aN*`kR0s3qa?6k{jKK+A?6XOC+f6u@pV-U$uoK4ojxPh?}xF%8wFd*%FjCyjDa`z_9l zDeQG>5lX}6YZT8~%r33xwDGHA>FqPJi?4Hm2YRilkuqD@|dbz8D{W?06vV z>W436xnuLO=T=hL3si1utUMmj;YvAY=}mT~GuR=lUx;;grJrrNV%uW9k`C7Y9q+kVtdpij8kLR3jWUT?}_<6M%E*`zRP@(&YLR(@n{fRqI%R=7x zK3!JhiXon>3u1TPkCN8#F`8)UQ@`9Pxc6LgR&!)#^liPk-8r;lD>q`+p7p#gy{*qQ zDV|EQXv5xEO8I~#JaX6G5qjMD>r$6a#Hz*YXS1DuE`E`Z$VhV2$TJM>g4 z=Gu;(J4PjY9k#*l=&iaBp)PS<%z)X8YMY{ESYWwt-ixH!!}-?1~xLv^>3qtoG|3$y+v zw=OtVp&XlQF0d7exRrNbh z11ZJ0y_okDxK1~}6MnZoJ~`biGGkS4XS7U8vSUBpDbK|8o4)y9f|>emM6Jw4bi01i zc>JL=|HuxF>#(D-Jx&92De|ok+?Xoo`pUn81NsD4Vehobc67I7hpx@8T_{u{QC}nb zs@0%;@YB78lh?#N=TowGwu)}l=L>0sYmxMTr^WIF^wch9Q$AQFtxw%O->P)R;yq`j z!N%#UBbU}I8$(xv!6dKsOJ_g7FO)tBF32mTI#A}#a07J4dl!@WKwfMCJ9Nlmg1ZsI z9Uw?nHGF_AnvG(J@j%}>@h*}PgM|n2*Y=iY?kYj(?Hi4e@d_uMJzOYvN$5rD&g>Vb zcNNiHkNB)X8Zs(Fzm6R_m3$3VW0{{Y;Pqll;%Q1(nnsjNd@Nw<2Nu$t}O)EfD95{IDVG0dt@(q)$v z`8c)*_NO_(;)fhrCGK$Ll<74rHBlnz9J{rxP@Sr=T%VMEq@mT4b#2^7o*zHXa~V@B zd*--PRH95zAeFMMtMz!*AuRmpu zzlK&w&9=x~-1)+Uw9OjAe0-Npep;pO@5gRp%gmE7#piEMfX0HR=-e!J``3{feFKrBFmA_w+LrO-iym zL7v!EZl4rmXKieOAlsgVvC)gBK|;j0BlJPTVE^-tKMITtL^^yAQ&6&#KAyj%4M{iT6@+d1qTk4R+@r ztD}kftj(nfjmQSgYUk-yP&RqBo_XQt2Ho@Gl3|hExg$wwiaZ}{64Fo{`-klWQpRk< zlgS<5K3MgsYM^FJ**J^xu7MciWM`Njm3{4AT815XUfC`OoeD*$N2DXr*P0paxSxXj z$py)k9~#<-tHnAS1x3JF?q&pIWzCUiMR#zM_`|yIj;AtwsL`c5U=t})K zRD(YZYpXl`=B31|orWhA4oEG;S2h`T6|I4a&2MsneS3o=T@SxF(eFTUJDivf zJ=Lb{s;SkH9qS29M_+*{BxOfcrA-gLTYUcMeo~a?b+h8z`}Wd1Cz8;`Bv!a-ka0$y zZ&Ht(@8cp(Y$<-in&osR%bp}vIaWiKjD+ttPKCaV{WXS9r|R`RnLTJ+N_V2*xrmR4 z+-_*IXgiP~+l%yU4i=5Ei?T#OE?256g`RGD{Oqm_iHQ2X!EB2ad8_UWy+zVn_l$YN zhjs_a8&XCGUge2`HSZpgGDwSrf2tur*C^_-ht*!h@n(h$$PsMU9!j_HlCIOq#y#S3 zpcsi!NCDZ9w! z$qj&tie-CbdqBR1EX9dji~-~ZZI|*u)!O3MTnaIRxD+liP4u@7_`^j04g`78}O5V%;FqMZoG{YIPiz&2Lt;9(r zKb2LH#nhc960@c4jU=DPdf@Y)2`tLF3>CATlG9D0#!Rrj8=374F@ zt%cf4t9Q$bW95Fi?Rub-e19FIrG&m%w!AXgi_3xS)Ru+)Nmr^*cTmtqWL8HYCl7h- zmkAHpeZu!aNI_Ka?WW45_cCTtJ{qMk4Y`}2OyyWyW#8EjhAnp}NEBMSueS)5cnD@& zr1Po7_J94jSY`?p`np=HeC1^=2lT2h6Dx@n~F;qLQ_ zjt7ySK+0kFBW;W1H z$DY~QP)xX7!qmP#;9U0RM9K5}NNtjXNvG3D%^1>bMsST4U74!`PcpdIU1!Qy9BEZ6 zLyW3+bcLK$hM(|c-*tvd4|>Xz;clfTg8{AMiR+$J(K~L^b?>E<=TNsN7rfpDJIE?^ zgzsi()tTKYjFOKiS>nl#O~?w}WUAad)|gRYmm960$TY>=@}#Ek^Au*K+)k`z)E!LK zm7t6uDW9|M9rfU$``Q~TCY8z9_m;|FAW$c|;#FJrl-HEeyk0^D3}#su&@+}lc75h} z*GAwBlb_jT-9lBy(DHFs^2!n0{nnWmq;JAf?m#avhSAYpwtfXFym&ckW?^3bkPPLz zR}9OFhfaQHX40w*+5Py8go1NoagSllXT*x8`o0`iO)A0_dWF0H=qrA@3rP!Fd`b| zS{PuLLPFDqD>xV8^m%djR)))JH>evj@TOkH^ z(1`vs{B9j+0$Q@~F8gisSUQ-9sj^824*e6s-`{5U=Cs-k)}`b0l3tb_aNBy8mQ8@5mBZ=P`UTTWH&nlEVr=RQ+Dvu^jE-oLat zpH(^~ja7ZBO1hK8{@poiE&7)Ry;6_A(!MfhVH8>0o1T|BNBL$<#YMQA@0C;A@Vjfr zlR~VOO__Y!b7R789Xh|`o}<8WmxgsokU^Hi(Wdjer%IR^Uk~ST2lawttKr(p9v`P= z7+1KnTUg^2m4g=~p=%%H=*-qZEJlY5qBOEKQzaJ;c2Y>DSq>H54fcs~iC!>{uP^mF zE!u5J<=HJK!EF(H*=69#&ROezju&pnPV$Ycb4XgH3oRXvr4?-YymU`=*J?oB24x&q z^Fo=_+HG{7Q^9(OUGMIZDg=(@)W$J(RElL zBbB%91huXhu#jXxy99kj&ci>vJ?R&FY&Gjx4cf!AAX%A-(+Q?LG5LVMAyj7Lg6!n@ zXHkS&hH5waHMdm1Yzg#H6IbSttUHqvnhLK~nd`IO?=o;=JP2c|PrDf+`W*UEs>FXL zu*1aD%)7aa^U%f4F|E^!0*dkX>@K4#PL8t->#m9Gu|2sqSNJ9^sFy9{fK&do&Dcf% zn;vfsq@iz0{djYk!d}pan#K&SicYr&o?c+_3plQ>YIJfKU6s3Md95Z}blud6-E ze5ZvrK3s5y>1A=FCg?L~NYts~C7abWWh9H}x|1YZCL719nyc!hjJtuVL?r9icOTDI?n8FGmmiOSbMS%ia8`^r#r-} zYNauJ-#A7nJfEFEt-m1yt&`1jnPI&AEmH}{^3GA&$)IAvf}~99=*2J89XsYYR%ov_ zy;JqBn_j*w9QCB?yu(a6^~_$Tq-dz7eT1FRp=M-%L&Prfb`! z3~BEriAPNgW-_&!wEmi-5T&@><9B=l9OxGEdd`TpO5Anu&5LunO1e-h<0#tdeq(8} zaPt1iXR}YzO#44XQ9)wwIlt>_6f72W6rW-DV7~*6owzX0@v%8dnX4eo?y22?O{ZD| z*3D7A!K}cYMCYCK=*u_898FXigY$LMnkR&twAQ|mS|mjb928=oV6 z%BvtW*vzUmQAp$alEfagd+PZ$}wtajIS6x-*#gtoCS{_qkd+7VqrA3wonW&eUper0UO7`CWvk$nm_fST%+kB;T6Z zJ@w>#>}wIm&zhD{)i?bn6PhgdY|k~{(G0hF(Ii>rK9<_9>OJhLq&NwNxi9JSA6FrH z)D52nKru%Q?OarPmVEapZ60oy+@pf8I5)M<7AKSYgI}p#gs354jOkG#k}S- z;twip*+}j9`ar~F|GN$Sn^i*dI9|_v@|S9AFVQ`?)sL>3w&R&VT#?q@Gb6HMz>dfZ7vv9B4&ffm0ZtzR;ue>$>c z$8Ss=n;xoH@zHNE<9d^ANW>Dg^WYOKQ<=-++Jr6Bo=U;aeZbsAv*#L&*k~9=T-y7- zd#rHk19I#oPro^Gtv5_|p{~aXY;7gPW8o$5+Pji3Q)91rTYF>%Yr~9(#~vB0upfzq z1>Ro~^@+Wto2D7RWUjR2cO^GDd=`)AmV7S*4|;z8fKd7sChHUB2dDJ(6!*1Wwlg(V3P&=clPU<^o*lB;&c=N(#B3dE)L+3A78lK?3Y8?At-AP{Q=tasnaHUxC6MGQ=g zfXp;jIyzcV?iA>i)C_D4w9n0TjO_53Zp0Y;p!_0gdO(;CdJ1?q(1{G%oW{+w&vh(J z%w5Rj42-M{@PJln^4mvE%nd*M!J=J0FTOB35yB>QYzX% zKr5}F5-=Y?i9c5XyyvzNK+ZuIlqn9Heb6gFaY=W|rd3j7RAXRd(qLgzW2R%)V5L`M zp<~ow1@192YOv9(F#~1=%oE4sptFkZbIwHeytjENnt(lZTq_^>zppoLmSU0p%c8<~Q z1SdK;vW?ZJD$9Uf@3l-$qQWb&J2>lK^odo9Ay|LUPaxbgq+fj~40I2ZiHA>|Kc_8n zu@Jt8(=Ao?&1PjRs^qliyE+^{^3!2D-AJ}X#WahfSB0-H$kS`jaIQbS z?$Ne45v*KzMEPhQ(Xq^e&&2&A`Yr7D{Oxirz|w}UEs*-pK5%#ABYs<~cQ^gvKP$}s zOsr=I((36M04g(UYd}7Dm!x`sx_Myjz{=L1*4)4d_-xvl>-;p1BfS>g z&x3(JE`P|Eekj;}INarC!&b|C52?c=vD7Qp=*B^GddbAbeIZ%X<1Rp+i}KOkiL z(c<^_go^2u`vTlP@qZ}fZ#9&;35yixczD+e|%Zogk;hG7ZE_9mO0>S z3P=IEnG=w4BXEK+1C4yYI45_$n}D{r%IG9%Kd$m=)dFtpbj^Ou&75;6e^^K4oP16%FXkCFb8BoEr!H-_d{qk%z#i zl?Cw91Wr@Xc>>%5U8sPmCH*gbfNw5wck1}vwo`f_M2!KkUIH0eg6aS{jj{pOW%R6U zzgo#Jt*-;;z)%0COHwkkTCPXBq*=In2yv;4PA?!!L=4XN%G}Wo2*Po!v1uT44CXJ3 z5!6t#rDD%J-*ofO#IZ@5$@nNh(D9c25Qpb^&a-(a$9X~TzH58eDzq&T$=Y@~^fwvd(fotX|MW20gl1(2?zVoQ@h5tJbl)xh?_aV#9N-^vwi^oBzX0 zQbAYzO49iI7LnxD)EOm(LHFXwAFKQLEr=#Le|i(X`h_lvNL@9yJ+?qlxmuZ%W>Z8g zh3G+v*nx6ch!F|Qu9!_0oSL8qhMA=+!h{#ttBn?jWvhcw#-EpCNPq)IJxlOVltUxDhvQh#2$E)P z#QU7;C-=nKy7wbOH8U5>1_=fCOe7M#RC@K^(s32y4Fy1ry?)$bSPIe3htX5PwmDYd zL0!vS*mdiXUeeira=X!-aN~TS;6^x18)+a&+?4GH-sNqDehz z*Lc~I60~iPMyN8WKadhU8YFp5e@$5W&R#jO^i()ftdNE!QK9Z5_Q_^G`7Z9%sxSEG zC9myGY_%__)6DnH%&LnE%8P0Wt!Jw6^xa}v6Lkm6T`A;nDn4P$Sg15jCY5q72y;VR z9nqg+=@K#uD=d?}n9xsFf*~~@|8jC4L0>rW&B$Cz!j_3-=kQ$0VL)qOthsEdyR!w9 zYm;uz!A`Mtr@}evpe(6U2#CS+l&rFZOvGX*#_1v7VAjXU+5?^F5rR!Z9(_fuyb zgTe%yo22r*m$zeySi(*a>7oOZRBI~6wD{G(gj}DQz~{^%XUsW4p?6{Ao9c#&e4Ww% zBq=nvwegwr0o;VN5*HJK?Y(Wds%A+x?D782E4CgaWMTD`O~~(NQ0YKp*E5+HhsytISfZk2TY@Vsn6SRJCi+Re4E*v}-Tl$+EUJeQs{mwkPV zK5`0QuVle{#bcGPZ*`dR-C9{r$QWpvd_Pc_doVrPaDm2btG4P8a$r5>L3NMzNIn9}g43zxXv+IzI%vVG=s3z8$g%di!YKlj zrF^gmT9LLY?+*)S+BCkOrvjwHD3 z?;dY`9YzK3?jIPK40sbq)hYxroMKOGwxs;>tiu9Et9^C2T{;gYuPG<9=XE7|#>@T0_+$5WDYI;Pg8mQE|CqI=^h9c00nT9B#Y63PnT zS$2+zv>s_pRLNcHiZ125&)8?fMy%ump$X-E#y(7HuZ>PrhM@_+T8I8-$OUs;}eswofV($Q)-MuEscvOR(91t z`%biC;HWa|^1nqd;;1|>?u56atozzitbVZ$IT`u3YmR4%m$tsvdE>O$rwIVvXqb{G zn)@0GJUh8ZR<=(mrX$6^kCw$gBd63ZG#12svu?#{F5gPu8&C8kRjiJ~smQNe(?5tz z*nk?lJ7wc|>-7B7lT3+vO5fdxJ~9M#cLEv#E2_o+o^!SE>6$tEsbozNXMKX&K0{T8WT~KX`gRo*m!sCMUg)K5fzJikzFd@u~ z5^@5sbSbgj;#=9?(^aPJj_DIVjv}Af+x;+xMxyvSkIe@zwA!c0NE+pU=t>Pjs7L>O zG#!*!eXoDkDmjL@cZ@+iUr0KQ4ib(BcrE6t+$^h)Sh9n>$0EBdo4-NGQpMNUpaPW6 z@fo}nB8i2kMyR9bR5nd->dL;%NpMaR+)Jt{!du&mZhg}=btLfRku@i&4(($(m5{H~7ymv(z4;n)!)D$h;# zBs4d!vB9FZXC*WrjUfy1;gOvVD?h7s!uv$sey@(yCc@e-UV80=#;7R2Qu`+z2<+2J z2ak#z9UnI|a7eTPo2)1jCmASkJ}~W24!>g3=A+j9my<8@R~0{ME3^bH=)R~~+Jzn@ zeqN>^A2RJvq)kuzMd|1Ryhz(YA4+D>JL*p;vjHpPr#X($L^0Bm(6sC@kTU)4RFs|Z z{Df~+6PjEzG403tRm(>NoWCFpGT0q+^lGz{!W%Gty_%Elr0#^N=8_p1kuISLN$@qd z*C(YWz+KKrLB#JJK*Z9&Shi`=BoBg1r=#l_*02Su@@9E>NTp!5s77qBB|+3p1Rdrz z?vTD3tD8!aKW&<4LEFkap`p7W&83XP!0f7~WZP45As-9}TYll6j5o}KgDx?|A|b>3 z%1lhXMhLa2=ScghCv^}+JB#jT5jW3G3v4XZW?XB@@kXmXDC^Xy`i-r#Yv+YobgT>W zS4#JUTKY?`GPn^tuNmN+HWd5ApQmz;&*B||%Xyoi&n%5MU%D;y`Kg&M^s#F*raH4a zVg@=@UGBQQGAf&gqJ^4mYe5}gcme?okBgW>-3 z5Kc}`G$tl?G?oVTKX2jAkN*F>g}?0My$d^m0;%mx><#Rw?euia4emD7-VKlY2S&Ox zDz%P-y)j5|t*2veVrBWK{mOS^=l+4w@9d|&juFr!ZSA0IZenK)h`)c@=R3dK|AA5O z?z0}SjA3HwVC7&(t#4p$ZslSD%)n1$-@(6sJvPvGE(|P3{b=>Z({;hq13D&wEgRwK zSmN=?Nz+IP$>RxF0ZF02KH~uu;F$oAgF4lJ8Vp1ne|%v6da%E0a{p6qZegVhEMWa~ zvi>XN?f09`?@r;55&q{x)K-Ru<|dW~)cQL1I@ES9mU=(!>)n;TA6)%5ZSJ3l{iDCl zq5DUyn*ZN$b%4D8iBJD4U~v`@?E`|hK=_{-pnj~s#QSaz+nq9g7uYj`vYh~U$OzD2P$i6@ zi2&9|K>0?$SjnAhI>2I?Z%hP!;{>4xLdXD@mLee8$7;D2>53-pTIZFA zO;9`%d1Pb|9`9JhVhXwqu`r~R9Z zj3eU_yk865hy3nXfBTz`43Xw5?3Nu>x>bvB8v*tAsWap@$%Vi>9aMeXZ#w;^JL<olOe61^FCkXy^Aq3SV`uLk`nt%@6a9(NNY1md>m9%1VWGSNZ`Or`}tn)2W$s8Ym7Ncgri*6S#m+Ao&q>Fqk!SFNr*;Vz;Ux%gAx z*>B}qJG;VF;*2kPk3z1bG#r+A2p@5U@WmcZo$e2g&o8ByGzWAH(9LJlHx9NN2BN6& zQiNuRatl84>8(%V<{dln>sWeDuFX6K?Ls8z{~j5EpJYpC3-!5-tE~uWYv$Kpj6Aso zYDuUVw|uA#Z>+Yr&tm!CW~5zdMY4&`+4K{gwb-B#?6BK#_<~bE!4Yfo$k;eFTHBeh zx8WJfEuB!^sRjCRpUG*K1c^^+q^YCy1+DdRizO6|2@OlX#Mjd?J{H^-=bLsI;~8y$ zv9`=LH>oN4AUn9Ga{4AfyuL_r$DY5UUR`5|)}ShXK4Aden@2vnNYOyeyP;@fX}+hq z1&ImHOi#5bfI560rLv^ECuOHz5vIX zcUDj8+Rwq5>Bd=HO`l_Yeb91UNWEUzXCU;!S+U4CN+AHA(C9-=fBxFbWA)m{*Hl=U zu{cwg`GvDOo;z*l4V@A9UxiS_cNM-z`c@Kr4;!9*N-nJT{dV^lMjckN-3RV>6IdUG zz@dUucVq3FdssTu09Gwumvui{bel0W(yT`kyvRxAioqtvE_GZXF{YSA2GNLnb|i|! z8eh)*jLEprX|q=P`;l24zw#71UU|C1>3y>4Hf7}qBOWVlE!1g;mlN7C2@bO?8RH=^ zfm=+pT0zSUPnoM}-N5Zx5Th!xtc})yuWtW)@~yx zch0RiZY!n$?iK$Cccxbcq`{ls7MDpSO0bI$>IO%ZJqeCA1Ji+Tp{mv_56t1J?RKt} zL&|8_KgzrJuuMDbkCS_FIr<-5@vwd@KP>sK_=T*>KS-%qKw``{)X-e|xx)TxW3y`R zwSC;~J6`pGbWPuMzWE`{>zeN`cm;K87pl%99NovBVHLjpxQjKK9Li05&5<&(yI;}T zvMrL*awjUu=K3lPRrV#hGnRFInc*Pf=WtdwN!+95T{^Sr5@ z?zJ^tx|c`i6@q)_E1V%U+^OGU2c^ScvAzoSaXK`5QhJ(fmely`c zQ06m2nLR8d&W|)ne?9=KCV&jH`XXZsO*DBznBxNz^_X+e0o#{eU3lI zd?wES%sTLse`4H$)3}a%Se#B6Vz&C~B8(F*4CdFi06pRf@5~x)+YUH(0?&mM&bREB zG3c}M4x!b%zMWxkSd!yfekBc6pV$VC8x04!)#lUQmGPatoMl$rIInx$9M7c7D8-_< z5)g=O!Hz9AXfKjiIUSx1-pIoIma9h3Y|Ui(ff7f*)UZna?u!RnYq@bw49JE}A9iD% zyH6zww!V`}!--E5ka zg@G7T5zEX3A;e}PaJpHwlS{0q51wf<$-*Yfwwr7%wTbFt4GF$5CW3(T*P|9z8Qej<8vY2U^6B_!zOEul1lxf+sW-*^GO<#Ex%{RDs8 z&##%Yllc$>l=9^p3`Hz5Dk2l#$dn^sY>*eiX4SsACa$ZxElf|)vCeYSemOfWB@Nf zj@*3MhWp%+_nYs@r;gSr4Os3+R9JC_$=1BXWMB2xAH^LAW?!bDAj3Q6#A|z{AGoKl z(2=k3LxF*Vy~bQdsg-gb@K>*T?8#;N+_zm_A+mrTNzwo83I190mZG>+2OaE8vz#?} z=7dzzmnTW-$do(HhMiL9IMQVTP$Q$8?^nn7of$Bbr2R7AZdT(UBVs)qdgrG7FjMEN zF0`zWi8zDMiOxB@XTBU>o-alEUStIw;RM+#wp{C&s#qH zCMH7#<>y7N=;ROCuJHN!8oPLC<6bdxz7$S-Hy#5(CSB69BXx0+~Y{#&{*@2Tn1sleu74;fV(eC zkK|9CKGDD%fXs%-*4TTjCADi6Z^_3J=RX$E$3^&sJFEmrLiR_j+gSHgNN z^@}YCV&5e1?FGSz^%Hz(09*^|TlZG~3~=7fbpCC?c{h^zKSQ5iVTaUzjbn5y^=++8 z^zWJy-UTwucSOa%TL%beQ5!l~>VXKN9qqsV`cs(5d`GkOj}K^XYhq+%U~5OMYhtMn za5%f4cJ&{?wST#*{{z|H4Ojlh_w$A`8c@4fIoMJgn%LUe|7-fG9Zl>Ubj$(&Ne6us ztGm1ZQ_k`a^mdbaEc=h3x0^`IeSE{|1J;g-(AP!~H9WS`CnO z-QqUDLjMN4-6SFdl2(?RO#`<-B(67!q<1jf&HMh%dv1b4e@AEb-(t9%y6@ESyJ|#G zd;q|l@R*nY&IH_obdl`9q68CQ!w5vM|BCeP=P+sdo6OSRnG!}IT!9JbBw+%SqD%lW zWdic$=s?0qKq<=1_G_iwMc{x|?zi=bK*~5Ppt%QSo`XtZU;t!+KxYgnef(ETxpVOc zFc`2Ozh_Db7=r?Uk{+bn1rC|e_QveI0+g=t46HBw()*C+1rSMJz%H3$*zeaM5tPBiyk(@6eNt|Xw zyQI;+f_yd=oPb2mlPQFR=a4vy(d%f4sP{0~u}oT@SdmiAlBlci;*2{k6UXs=#m6=R zp}DoXHBHap;wwk=iY}I*$**e#(-ysRtb#{99rBa9bY31o>)ZiaF}U6mOpllr_F8 zWHWFesvGjAMucuRRF1TdmyXK8Olh7A|1MoQrXK$O@W`5vLXf?#ls=SRN19xQ>YX3E z!a2QpGK|tZ!OwN$sXv;cvJ5@Rpo)vM&2^4#@o@Fa!xKpB36Wfp()7C6kLbk|KEy*=#wOvN(Zq<5<9N@&_hhq?TsOZA zKJI_Pf{6bVj@4LTS%F1_=nFLSI-`hSMiTcPIy9ARge0t#O!wn}!Y|MD8`~~^}ccgjR53{1H(XquTmIvrpsf&1_pk9WbE_4iW8 zg4AN*z#$x~urmVUbG~i7Q%f5|gB~@Ad508eZ@!3G7(KP94%He!kl|DHREW2QvFyH@ zD)C4D#|=!ausTda{rk)-f?46_P^4q73k3Oyu)EBQ_uLJ1U`KL$+18lXQ9eNzCLM$j zQQ)5W@;;A_tnZU6a7%G)v~+pc`H{iyAa$1dnYTPF^vOpO`|u7fDMXkUkq_8b55=U> zwpL_Z9u9g*i1a#RNehK#36&*j4al~O!jE@xLVPYm#`m47;A8=pjoO#G7rq|i6A~@@ z_S1(J!>uy_a}LJY!V*VlXGBd?A`p`)Hy%*wz< zYUeJ)GNcPi*}gVeKQJbUj=P`GrkueqOMmX3FneL+oZtgvNPJ%BQV8u>F<*1&S>lm_ zc3*JFv+bfHjyXh@NF2f=PJb51QAmloA$Fy*V|G=~Inik=-9>lhq@2xubSI)}`hD?a z6Gd>jL0^)xS09e@V4?V!g|)jDPaitL3VAh_$YN|?b>U1{z3xVRJIcG_L;<7LH|RYdv+k7(BB-&R?7nwvRdlLvh8(y*&$pv?E2*Yee({sg4Iic~nHyNLdoq8V>ETx@|B@XYN7`f&oeYLlJ_R-d9 z0Rz+Tu(tUHACh;!X2UwXmhJ0vx>H}G`O>KtlKI_95@GD}ojlij5^Kg&6|6W<9geCp zBiCEV$N~}49VhF_y}CxTO|if1^hk4C2syYAY(sP>Z7pXLv2Aw~Hk2f~J&-wd)hM1v zd}XT`jYFHT2NB}1auU{W-&MZV&1}>R<~o~}Y;lOKL$^+XAw}O}8vABCvs_505P>=W zSlavvgfveSgHYSt)_sd0i-Os7LIk&E(!p~Br4Sm~Lji4Vd!9$8ah~_p6f`(>(6z+K z@?){{LMXeageqpoSNxz?wzLjMBKdN^!rYq<0{hIUxsBGBy*z?nD5m*uJt z>Mh6&wCk%H)(Y)MmI$3&)b61&q+5zbIX~xr^J;yz#LmkE{Otnnv%-nB$ss$uQaO*5 zhf$hYwwYX+#qHV)Y-JeGs3=M|rVd^Sw8Y_AXkXL2u z9xI*9=V6)IF1|Qv9XIj|w6B(nN181mZ-|PtfkXWCj7LF3NtX7|QKIQ8xpL0QK5siA z=b{WY^djRhe#~zhn~!x1B7^*>KQN*ieQ~QD4l!~hW#%c;S6;*RF#>CY7p7j5%t*5h z5k?y>wTz1v)FkIN>+r0EE*w`)aGTS^Zuz7#d-h8%Q#NL49+w{K2AGg{Vf`%@bhraqn{LXUHpTSamv_$ld{`P82mO%t_OoI~O%=9$B^Al#KTQTlYo8!f+(9v!f-aRff= z=q@7l8tO6g+hs+0g>TVQwwv5_WE)mIkoIEO_glo)xht-Qmyy@Yh_Fv0>vk@eInjvf z7fkP7S7za2_D~x~v5-ZdVm7|B)r))Ap42LZT4;l5R%{De81vl9ERF?DO&O9C6**6+?AihXe>t*Br$&-rMLvFhil23 zQ*o>&_Iv6Gvkup%0iVEj`iB?n@DaQyHYu7*zUI5>Ae1_OOP$G%uZ2r6<9x;@g8B3q z?#xEWXa_+74$`T~WHwGn3J!*awc*T<8~Zc#?Dyry_|o^^+S)1GW=Qu$a4WX9VLrE-KubUjjJ$xD077R@+;jmtw7#&+;0Ac&Gdr|C-6%Ij_d%` zkBd%L+*GcVh-tjEjg>(@8Y9Onn?&a)=X0__XSfZ{igp!+^=NiEU~D|C^mt4z(7*HT zY*rULuq1aQ{(duY^tpegmji1J`MvLHOcoQ>HM+Ej#Rv&T=~b=bt)U7l9cPFO~$ zV!m70O{l4f8*g44Bqt@gmKQt5XJxgFb-!?B^Gxw{d3lv~cr`HCGnVA} zQWK%ak|zJ^`+=iOs27-(fe%HgYm@uwW_c6OyZQDLNYXImF^Ky2NuOCNo~PjH2UM_R zOesTTBwT+P8=OhK{=NuFeQ~&QFfv`t2)!jdvMJgn9p#LcYsR6Ct+7}XZlS-)z2;6? z;$!jnv}->5#bcl3#@?(?7q0OhsRLgE^Kl79cbx5_|ey|$FlCH__#W^kV;omZsvaQ%vrv0$M+ z1X}kSkxXP*pSYA?Il8^Ms`|cqI!I|M zo&ukE@k1Ne4>S&6{q>F6jChrH@tgdU#1@{%Zj3jA)ye{#XBE$iy%N!((;CP z?o;!zPsJO2pkl!0g#8@0{0eaj`oJcbpT|Wy&8vt1(nLt_jU^%Dduoar5%5q)N7#PZ zw;tlJr?B?t{DWbQ7B$M&nTf`b3Rjfjy2@S(4}}ds9_LNhxrC0B^39OgpW#AQgpKK_ z@F4Jyts~6d6!pBo~Ch z2mgS1h~lDgO3kUbZTT#gS^v<92oi`GPGB1@q-oA-{ix>N7(9EAR(a(#_NH-SMLSCpN-jt(pMSC)>3~em3#vKZI zOGspueVQ83<6^;ol?=ReD`%2Q-zu$noslgzsGgxfnE7s0ia6(sp89LZR^K?C49JRR zDW!PAs0;x#qeP6^Z0Iy$zI;EA`dmPeON3%#PgE<0!uCKl4wZO6c59S!G>^E)!X`*> zVFNkgfe=KGfKcdE>}VZ{qK9hmBS4ZHg!^GeGl!CCh@&!-7os}AO&(oyq?f>9Kjk$3NClPxyNz??g?Kf~ zgz#{dZX?f5Zx+56moDq`7jHH9>)FEwD9wyY!=tFIk30IC7u ztAVACt%=o7-1Y|6{HXsw5B;Z&|9|)j*x6gz0&-JYU2`j4yPu?yHwfmJ2KY-B4=744 z4fKE!>}db}C-o0Zt7B~fQbhvp28=As)K(7m=2li_chT$(c=_)N`1g#`+Blf#ncav| z|0v)V5&!EY)J|5mW`^cgPCwOfrxo+Rm}LV;KuSw(WNY$s&JrNj`j^J_hPc=Pl;;Lt z{v+@iXv+nWtN;J_Dg18$=iBN0+rateFn~@zHK1?z7BmAIwj1Eg_QNZI?T79YaL>7Y z{0Eo@GPng$*$6VPXIE zI__N7fg{6ybAW&2$bh7m3{0S=cz}-s3>XAn0k0os_FtZmpOv9EY39Fkirk`T#y?Or z8>nX=VB)`yqHjXC?i`ulW#S9~ie>^lYZ%x7aVQASGqV9*`@nrx0Nei>6~Fm--6`d_ zsW?bJ%mAF6pgQPT>47k2Kr9QmZ~STV%19DwZDNIa^ zz(N5a0|wHpesM!^FaT8oTGn9$RPTTr%rBP$8vD+{ zx%~$E`=x+F%mMqAKPq7Y{4Ur5{rcajL|&$%2azCE(>3p$@f8;Z$lsHSoXL@tT=1!&lNwH;DhjQT3% z5?%BNaKVIa22`*;}O3rYMWG^C{*&gI#@tr@xUmsBuF89TdGW|E<}MzK2XLDNgGkBfLAw!p9l`E zJxm+ODX$!ng&7MhSU8iZn&BWf4?B4BQKUUho?I6)#W7(Xg2D;?$UqnDjM52~`vpQz{ zxBIZ&u*IBMuX$g+Wiq5S|MCQtU)3B@;TwU?3@1tFOFTjUd2C<-tv54g1iG5&0Je&W zo}iOA`q7IWU+<(ee{pc-oP;)417t&3b7lcYsM0SG;5|C~CYD50VuUH#h$DxoqOz}> zHYyNi60=2o1si0`Gy<$V9ofZ5EwB$T+1EblLJz{cXQ5Q zyUUE7CWBsf9~h{h_I;Z_Z1%E2F@;7R5j)voJLyPZ6Zaka@OB%9PTpIbg}qeh^!sZE zG8bqag&xgv$buXl{sWvzMSRg-dy zmf7~h1y21t{amDnF`G=g3e~Yn zj7Op$*Q=E;dU1ld0G9=fPFr>5m^Z^JPY$1~$rXvdRZ*li>>I-69gRh8j*}EeYaZI4 z*7uca!zprklsIBm?R4z2IW~tjMpH2s^suwA@M(K+VV`Yn`b6Yvv&VscO1oHNZN&9H z_o;}NIDRHFe{&aUi?9~HM`>OulmNb<@AZ>SC(8k3FoYNUU1AQ?i_U5=p7&_ZI(LPz z^L9iOwo(N7GG|jzlcoZqY#B@C$2BpQCmo?FPApGeYjPB9y=2VQ8@PN~uv3&%=U_V$ z&=Rsf)dQcb8M}6b$H~A=7mee;HDpq=X3Wne;L7h2KQxDWs(*zZe66xwHBR@G=o8jS zU@z2(HE+S%;2@98GAkq zLr=av+Bgr&*H2a23u!ZX17g%tg`COar{Mfy;(Ymg04K3X8A%slkyG8 zjgWS8Er$Hk*Y?qPM3yqlBHagr+4|Mxr@^{1`oWNDhHlZ-`PwH@3a4rsU>he`L za%H8MdyN5BX2tz2vmOVVVhZY@zI>iS8QEMK8g-ps$AutDDWv`@W=UiQZ>n7;GBAEQ z#$W*nS=L;$m9}n`=1-~=dM^|kUFFOxaAP`FKUa24b!P{gjniWqg^{pVx2AhWlSMal za!}ycB-x?lpIZuKA^DXr7=6A{XOG#d@|&lKJ}a+6bhD14ucb9;sQfl5P)DIQP4h~+ zjw3Bkzo3;Jj;Gb56Q?_e)SBB!{}h{{=ALdNSQD77YIJhNpa)w2_ahoD zTSpD*9Zv#i7_b=~&O<7aodoI z)dv?pWgr1L;SSE{(m40c5NtYIFmmo?<-2bp-Hu+eDjoD$62c&?4D z-%GW3gD=-Ydp4@A1p`DYATQrE`QRRx;wpmtDa$E_Lr!m8 zQ}Hw|if~>NMQSY2Gci9lG#B76JGzaxtTpiEb2)ihcZQ7zTYf94<51emj3b$|qy#G; zSCyxov$@>n?kZIdQLds&Gjmj!UF0j=FUJNn8oVw~i<_}80(2Z^k zeeSnV{26`>167)|Cd!l+<@HNeeThpZcCXWwSebd}8HM7^+T&RnmW~GoDDTlbnv_Se zO!s5;*S~*zw|bRB@a#)Lh7IcOgycJ|w^#@;RnNa^@68w{m*W%rE7d&ToU@X~!Et7o>Oq8|`@?=KlM!P+ypZf~i7Q-qY65v-?FA>6d$P`MOA=S;C;K??C1 z_iS!RRh^h8d!7(1k`m$SRQRkR`FVA{KEgD^HRE=>G}&)5-4WFe z0lM&KW1WKqm`0B*3aQ07gTBiPYQsV1l|$y;U#NmPzmj;I5&C4tN?bkdo5qMG!{U}5 ztAXQ`bnWy`ob(BniD51-3sWiAZnxuSi76Jogd?A>DGYYqDY#tR)fPKm;;FRfU3vP` z1mC-*DQfZJV+eL#*0?J^E7+kye*rgjl|bPybGL9QEb4oNp4a*q+z`1^Oj%C~$Axa# zo0Q}0Nhpc`r9lmf;JW5EIMhWIp(XbV+MyyLCt+otH!X2Cskr8%{3+SqA%QlWL7ko2 z!hFJQ3f_rG;o)O+dC02%fCmIJM|wfT^gTG~2f8-Q{5@HIviM$PRawk4>+ug>e;gvf zHD33oWiE}B58soh>uf9Qq*eY1>yp%ohHHzw5l&)SDOD?&iS(c?3@xDuLa;P&pm?LR z^nox^6v>dFly;`b0MTHkv_5|ij!=fREn zO+Ss-YqP(#+F$ogu&j}@5^7EOtBhF~A3KTeU8oRl7Zk2UZ(k?EcQts0j|-1D9*=K+ z_sdLv(>&A0%Tm~q<>^b4?F`BNh&205rx&+Ug{{sn9&dn%2H6t+F@KMwPH~hk&AO*u zJTHD~bum3B?8BJ?DC1J+e#&H~x?p}NC<7KYA1T}mgm5$9NUys6e zB|mv|Qh9un>{%8f@Zi(uSN%9dOeV@rZ@uM_rXnTE&gd>Vu1#}zWgm@Z?nM^RA#F(X zR%V2fGezcQtrQ67^OZTSMrPr(5^4#G4~%9d46)mMOq4ls7RRW0f;+*Gv7n#Zg{msa z&*Ey(OiqA%n4yVC(o6doEAw)E8O|+>jK#P01IoJwdGHbFsi)s6C{NcXsikb>sGDntZvd;68^@db{-RU< z%DDhv3<)lR%bR3H-t+^9KYf%d~vCFjT06pQsi$y#`wZL z$q@~C*YwD3Chhy#k*df5SmgVQYy3^PCpGW*llKnph zaRQ{&R!(-eSosg44D!;|G5={oL7?Qf51N%D2-6!lf#|ut4sf&pkp9!w?;wcZ+%X+n z;54uYAU&W~r!{gg(Kn#I`w*a*b^(?lXe~_iY_0w9@S<@2(cy9v#rfTnzw-pgIANc)KdVKzCF3zo`H1^FOW#e89_o7hnFD)c>}= zJ9YdnzPv@tEC6L^0yX;sF02fISf2$T-ORsY!*Dx4ck1|EcnR210Hzcyf0RK_!%okJ z#{xJa{9+k*F4TXG3z?aJ_R+6YlC+y(+;HzC5i5_b5ua+?FkUaV}PRS~8$H4|Qy-cB$DI zuQWhYS~|msaXsNtNA8x|w+7MNS3;2&{{a`LdTb_tif*G;&fG&zGBc_Fx=^#Ppycya zUKw80{WD3rhnWaL+lr%V)p_^gm>mO5^3sLsE4rJ+Rau&b0Hg|bkH6t%; zyGyMZ^F_7ngAd%P26=IaK@UaXly!m1oE0pq0~l2^Re_49!Pxyic$EJ7PQ#A-XKIQ{ zulG-iH>D1zauZzC?B0d$unp`V!qyA+6;pPE#+dud{fxR&D9_;$`wBzJS;Y{i@D z(Ub~L-MBAalCh~u=MA$2x3CYa((0VMzN}Kcs(MdydF|~H4yoy`wmUuzH(iJ`;aK4G;qHhvgY-Pzl=R=K1RibAC?r#5d;6_d|ruO33hs0w#P&jB0~`NN=gxy;<;vr!$BW!pUv1oJ;Z!-L(p5y^F8NFioW$=amV%Pl@6@$ z1ypX@OqIlN+m0wgjmBCBJ)-k(1&vX@HKpTQPbO;CymLDibg_g;x8kWX905&|$AW($T4n=9v16w7Fs8<*ri(#I{7g9P@-78IbpT1Mf zBwkJt$D|y|Q7kI-lbvO``!>d~etjpgR+wqI9_1UBNhr$MSPa7~JfNtmUOY-_-P#z< z9@yJrs(a~xjm(IZ7(7rhK_V=)$6Ec^ttZLyuhQ@|>%k?*mOXJ9e0zKlxi#VWzp=5v z4zBdz36>nUAf>LHC>U6A zxOfRoJ85X=U zjhp$Znv(b2%x^}wH93#O7{}gXKwdA)&DHXAL_qXsvbV8c?-A2fr!l%FLp2(!A~CTk zSQgZVTSn8iYqZs06TahEd7LtiDVCaXDU?Ck{lZ>Ii6t3d)<`6#kSv704;7ng%JpkH z@7wr`Z!i0Ck$Sm5waMM%d?ATHpRzRdfP#Poz=?>}c z?hZj3X-VlW=>|cX{{}th_`Lu5&gbL%et%q-UYosvb&q?lwdUT;vE~?|wMxu8v}uBs zZ?h%wy|I?bn#GA)=b2jNW5M4zS#-PWSRdT0NzOJp(kZO~5-W#lb7JLdl8L915l_?< zK1ZC6WB8}!=9%L}&+hYGCzTe(77<(hwxj}|j{Z4zCxprOc227=W z`JuYvGI}Y%Un%-6^QkP0>WC3~i-eQi;4(Q&?;!Y4h{Nh(7*E*Hp>xd%6Rp5_Lgx(~ z@}$Sg&yf`3<%2`gvW78)fv$5pW(frQHeb+Gev6Haf7irGx>Em24GzqSQ&3VLjT*6T zDk)ibFw{G1;LV^d2Fr-o`wH9yX4b*#zaS$dJOrJs&fec?AXwKJuF>t0P9@ zU{!AcSB2u~bBGn+mqZR+SxZfCR@n}4sd&SKFw&!DNj_shR;boJVJWJefK2bgkbFB# zkBeg~VH;(LV$2;xCZ^b}Y?MD%@Ikl-cA(4(MgMt4S_-VVsmwqILRNiNY#(RP#_2wi zTQi)wHl)^jgRkG~eHA~C1R_W{VHL7w?=yrzInrTeZ@YUV$OQPK%sLolvL_`C>qkk4 z!ig*zOlP`j<(wBbAb%{$4#If<6=F~nfwXn_i>%}z()iHx=01y4pWe1;Rvd+X8hr$c zH#TI;-O*4vVc=eG8HT~pgXL}Yd9>yZgjJuyJfN3-n~zy!1}2$8n^c{!!NKrS%Xqwx z$ELynhHQ#w<`rV`0uRT9bZ&SyWFO2M{#ZkB3flLY^5e>JtS%4&>|7zN{x^#BiS})% z@?6iOg~h|DqG{MxbM6z+xR&+R)fF(ZH(OVRC^be{^b1&z4a`TVXon0VI%7=`%)NHa zdhm-i)>4Vfl(bW>Y z81q!dNnI;L3!_2tTbc%1Nq%*KJQQ%z<(yNRf+{nXT@{jvVFAgcupZ-#YY_tI&UZ;< zMZL6zY-p5+%Hy$l%hd^QNt!of5%@>u=@jFt8Q6Bzaf+aZ5e`U@vTF~*$+Nsjp}P9K z-hO!sf~=R*nK4b`q9yqTkwdN!Vq1Wj0>eu^n;kY%$e1OF3{>$W5elac+bc0_igzQ; zk`s||WJAJ~s}fSYGt$Q$+xI>06W{7=DMp`oNDx!%OE@WcK>K6AHzLLg^zwtn2_b<_ z$|El`S4E|z?=K&AeJb!NQ=G5mkVyQEg2&UR8qIIl`&mLLf)N7iYJ-Xz-_M0wJ>j$G zQDs&itwZz>Q)stu-_#PaNS!4J@5e8pZgHk%(PxQjD)3rPt{u=Y$r5e_iF`Is zci9W>J6%z@x`UddGY`cS&3R0_K8Hc=8<9kN)@Yp5b9u7e=mJq^;TiEcM-xhahHd|= z%3Tb0QN-yWM$TI3*yyd;v#&`~&p4PB7xk`kk|g9;VVaO#;52KO9S~CF1kb#mQv`Fd zet1XM%^(Mwc_i02=)q^o1N+88jRmw>b54x(xG85Nr?=;Gdm+9>W~J!yh%RrphY3ko zsf+hUp(4GNlkY%>x**(p8lv_JmSh(OH4yH2KIw}o+Db3nuk1WD1^v8F zM}JNt$ic)O1S|R!9T|^HWMZR(s;DQafYnPlXvMaewoe8=^AO#J?6Vk`ci{8y1#r=d zsDU{o*YamRRqz=pF>PGB^2>!>y1O{bTIND%2ayt z!ur{A%)2!;A1)j*e;D@+hnPJC!4I|(Am3=^uuMs+WOu2yW%&hy)O=QX_ zG7NLSf~PK*ocEs8-jB9b+OUHNy!8WdwD)6#8WzOIGec|d8`~liYU$NxB!8K&721Dk zUe6bA|I9gAoac!GMadpk6}mB^S6B3n4G$6MX_!k6f#@S z_t+li@@%jJXlwt(r7aSgn%HL%LLW7@_fr-NbTeYFB8-tg?H+>4E1mm%iK2IWvo;`Q zsKFc`<*}J0B_)W6yYv(?0KpDZ!SXCKX0iB|9}PLeJz+R}BXZQ{;L>Frg3_E} zpMsR94L)H4Pqr!BUJ?vl>fWI++@N<^qJ~@dK!OcwY$ip8qEJ?7X}!T-kPeo)EDjvu zbuoEED}ZWpEWP9FQ=Lvwoo2frUKwOO4ZGe$JoU=1p66oJkAknNYV?KPCuzD|mo&q6 z$)!4#GO*=aQp}AV?IY({Y0Wp{>!|*8X8qfagu9~*P7?4b8S3Z-QF}!Au4T@RvWn6r zMwV1c_-9zOMrAi|P8N_xtg<7GTT$Q||CuD4(dzKTrs7g-*WT31L7T&B@ zdyHpz1em$f4rPUYr%-`Pw7vJ0a~qx2@K*~n8WFtd49uvI_ahVSUXWc;>ny>ym;#W! zX3@QHDxK2bzxjNkG8W?D0395K%RHxy4qs`AJdxmWg#_c7$IqcWvT!m08LbP_MEaD4 z_^Ih-nLh8#o`~JJlHy@2NgLUs{WKE&!iqy=4sJ|jTOIk=AZN%_drD-9!)L1^-S;#$ z^By2i{IzE{#!yE_={di+&=^kwgyJRz&l508m7wxrB4zw%a)hi}=7DWw*G*+&BOFQc zBA>Gva$r32{Dpb@c1@M|2Y9%?lf5ROeMPuIE`W|J^!}r`xQ+>Ohnb~z99 zZDCw&N{ehxp-*5JY%PrY&SswkgV7Xe8;waEfqFYlF{(diBxy4fJkBcVm%9EY5Iwq~ zGqTrIb5R@v*!6Mm1)^8P)N|*s6eFqa8DH1d|PU8$= zfAP7soJ`L}SPDf^m=-H?kL8LF_KqZTJ0##Ko7Hvej=aV!-s}3|)$23cZRhVh`{Kzl zuIyhXwZ0L~c+p*{n12tfjKNG?B3utF30ImTmwbUcdC!x~@9M<9#P4ypw{Gactv4L! zv6tTJa=Q^$Ti4=z+;MX;M$c}}nF<3N7k;J8&SGF8^m=^uBRro5lTe6PM_!GHk8@0^)y1( zhuoZ5687qyc<<|HZ%ogp_?Yn=V~ znsDI`lhoXD12`zQHCeZOvC=gXV$|rBbiRdqz|wTZ6ArtvG&UyV=YU3d5`R}?Z*<@q z-9JU%&D|b22~Xxcx4o3L(|2la&i6S8*VA&~&Fr=*pAniDUSF)p&Og*^+(pFa#V=yW zw>zqyL6{gG5R}n^hWJ2l8gDZ4J-|J8B9;V}_MFyuF@3}ZW+1@Y&%`H4%78Y$IW3i{ zn!1mh=5x(tM@#G=I@CQi{Jp)g7qb$}n@B|CJzI+xObg?VM@nEp((UiFeDPunW4R@& zh12$*poOh@xKYGhZ3P^{x*sAXKdm_tW{U|L`Zo7o5r4=+qsZb~zzA=g5FL`=Jzkl8 zrhO<2ZeCM$Ax=ZM5-l$PG{8-7|xTDg|U0Y?7f(ma-P&g;IbG zC(&1)RTrm;L)U#N!XX$k^K9L0}(fT(L4XurvNE5y$u| zRrf1}#K!X9=fwW>%D<3g|0J(|v^M-tkXNifdIJ9cMqWLVK>(@sPx1=*nw{h)sr7%N z?d3!Ro~^>9lk}v( zxJ(rza^EDs6mU6R;iCNhG%D(5Em@D7wqb@cJ?ewY$p#@`9Hzltfcj@k?sJ8-{EIjb zIUH(Q_aiAS$uQ+$76ne~OR7Xx!Qp%P#mzpajHM3MY5Cy5r(F>G?G zbf6JngX1+z?dw{BZ2oKtp(DUi>FD+DYzs6fyX+(8m+CfAqw*$$_bF;jm|9eC)TDtk zM%{8Uxq~Q^H`Vf3Jpv&tX0~AUFnw4H81utym;RjYaQS7BwNcuJF}bSJsPbv6r(l|e zl)Juag*aNmaAsqignW4wj`UA8FOR@`h_`2h*#ewq55Veu`&S17-m9u)8nciCGR^eh z2^rqF-a>qDGLd1&QT(GJ)jY5K`X(#$?*^AgY&FZo#*OSt@bPQ)a`EwJ` zPKyfX4xr0<*|2w65|zle$9lPDk~d3+o-^I%Er;9m8CQ6DH^khsH45yV7w-$WEDG%R z>DbcrzLLAU{XXVC#Ma+el5!t;4+Ygu0^|N#^?r#B!EFUc6`y6^c_bL)YvuGX_PnZs zX~4vZxz66yuyL)+e8X_szOn^!P65&9b+5gR0aXdpCF#m{RLKiE4e4SaY;$N=*Vic+ z;o-XzRXin*b9yXa-q1v@iva zA(nqt4`t82Tq4Zh2)L1Y_x1x4# zc7CA-&&tGPc0xxzxCh=H>2zqf?5-lleJN{#TvAa#ULiJW&8<%vWvXv~bbH0_RmT?J*edu%P9KLBF7e3M z9bb_2_T#nW8dG%9B;$0Hj0i}JU`5dng-c)d*JkvbV_F9e=EI;-7>7~~9+_Q`yfa!(UO7I}sY-|YRAqnU z?#yu&$*GuM4iKW)sDr4^+rA!5j_?a7<=bjv>7A4Pj*ix4 zYIM>};jt9v5Yw;Z@#i8*%RHS{&SX`SL?__2s1L+`fvbRCZz0U~>a(-|WbE1DzV}vFTWyvHvFvr769@`{OXa6=MTLgtR2>&4? zF+WLpTqPUhiWRbM1zaU`XJAazeprMsT57Xh2ifD8P_EqNnDh%B&7v;ID?C68D)D>Wan9#8Z7b<5)_py2Gylj*XUa42k6vQuQ|g}yXX zz%92dMGq0AZRk4K9*}II3RpHOO95MK3{~Kzr&g{}G#U+9$2eMiX?w*1icSNT-KD|- zsz$??k0^mxxdGu%o{kvLdN2sf?==O*V6>4UI$CcZ+*12YQWoD_$-F@RvhbAmiAOY{ zclfM5nDb#B`VICTuF@#p0ffgu8hV@Shpz20s7^HqtB`Cna4Ka7EBs&%(_v?S@?ymJ zV{d^q7qAbAnv(mxURkx95bs`>*0VCFrj@>XAE3*jZS5cJ34dT-eQo@WlKEQ$9(Ov) zDH-@je!QVAi&et)&WJS&B1moiKp4AK%QTjJTG9!-TC}y3M&olU4NFJN1{ZCQsgIX;j?LFQg1AX1S7Y&7f-eiH zs(~c&kO{FmZazMT?p5xCzHwqgFfpzxM*4ouyT(CYeR4k5qZb&i)aR`-a6pxKyNR2Q zFKAqRkD%#BVYS-%X8j)Q>q}unIAO6bAo~X2)z7N8$={9ltd>_HHw)~&!0~?N7@SR; zt7`Oa9HjOc+c2d1U@K+f6dSqfCA+jiyoqTT`swFA4|@a98YZOTg*wgXCqgpN*Md&h z61naEhLYY9b55<)-ZvDPnDbs1e$_7}UHTPT2mRp!n>?)~jmmi)b!4Jca))1#s}A&a zjB9k5NwT|hh8iXyD(OM{xCvqs@RlTQ)GpsIJqx%cxFqY_Gk0f8n;p*-ex2cIac4mw@ol#jMU@ zeWTRij;gX?nTDLl437rlM|o*mJn7fvgTBCE^7Tl0pMftv%Gbl?4*P1fy(oZspw##ffa1Go)$jd%#A(JOr|gg0mr1ukEtVst!`**X)|Uad~MpV zxj<{vlkt2!lI+u+a@lSrTK0=_yVcBG##1Bq8j$JQc}+RW&ew1Kim^KzqH4qZToEra z6||R+xAT;tnIiT-(`MUTB#hrPL|gYz zr-;TGPjhx<#vn3j!ha|~poLvmTdDja&-aQOG_>1FpYXu)way%BW-j}OCmhB3OEnp_ z#5+lo&6L>kss1BjEPX||uhutQTMe=_X`fLQ%sDv?q>kY7^u`9e686$9C zp=j%qH(1e6)t+)d^l2b!W(X5=&bAfi$f`3bsHh;x#%7eM*MQi2^j@uk* z$n;cJ*t8OZRULQrW&zaE+BfIO2CERMwD{fBSDCcj(<}UfSNzIKTW|)LQ8?pSQ8=dH zW?!o0+3|~Lu8)!jWl8tRrYw`7Zh~L(eUi(I@n<9>m2OcrEU=LD!yn_cE5Wi^eC=IQ zb{CTH)!AUAc2Bs8G1)P!dw8o8;u{8+f?wQ`=g0RUqQP-H&_z0@F59&q&Bk}EJxgyG zUgm8o2d9Q`iMabBB?WHs>Fri2sz6YPdFC29^K2fL(ZZ2qr%I4|(skD$>2E;smVNRI zLo=GZP@lqC+l`yLCZ|`rQ#=Kim#y*@9N(ZGmPU>@12N8xR&g2Xi&HmRg~8iQuZj}v zhQ1@uQPM!eiQQiim4fc?2vhc19Z2?jDY? z`(kwmH#);pUZM)Beyv6o`&zqtmX#|FRYEb!fY8|ljCUrc?xK{Jmwci z|K*U^dtHp*R&BrLa-Mv_a@l4$(d99me4kTFeqK+0{t@)38?}137soNNeQNttj8uFX zql>@KjJK7(GAlPrLBt#)h1r_Wkm=5FZ|aG#x_wv3O}uWhmdvjWOb zz>jXW@lLGAm0!dv&#No*YY7{1D~=DtbMN(s)!2U8YhYy}B6c2LK!jW2oaGnlM&9uC z5|Nl|%gC~vT85bQj{Kf*3u5W1g|5HS==vA6xb4?vpIl)!qOoqw8BoE5aMDM$)gs|(B#j!-?j?kzI{4_qoW(y zAAlWwaN6myJ4W}eYb^L6rB{u7kmxK=BKEVy|e4rY1 ze9!~eKnv~J4$ro)HyjI;0(vT0_QU;FNS2WSKSp%b`RoUs|zSE^~eX=X=Xv2_dUva z=581D>%QMY^t&Z^!-g}`q-@mPLzxBKIEPHTb4*&Snj|7s<89C;fldRsEPvuU+StPo zJHNmF(19xCK9ui$9DU|go$L|DjZU5W3B($>`w#DY{67G9?_3@1w%tR$;J7T~B&4k? zE!3{I5fSgQKqU_H`oGvi|f>?UUZ^c@UusQ z9cj9Lb7m+UaZ^}NI}!3S#X0Nag4LF6%h?Q1dF@PDNeGYYA0;QPYL?)wvfDgOb%0_S z$rjWma&l1EPZz}KI?c3%Hl-998+U6ZGj@Fwo3E+BTNRMR(=$~r*iSg^hFX=Z5cwv7 zUu~9AC38Ne!nw@(vxR{rHl%#NJni68ZLs))4&t`7H-2gVjoi2FDU){D=#L^8tTJws zRbijOrfDmMmtW$vtD4*A5g07wlpI!-*ckNpF=Gj$DOc}}e4W76S=*|&^n*n7q*nHp zc*dfi*}3D79pz9(20as9f=}?Jl7g7mD}UNV3zgMGI+;;A5e3_I18juKD0U||32b>& zwawB;J4F=s>65I!sw}@Ob3tYSy$~{Q>>2yg<%24GN`?&fXvGc)RTu+F`*KwJaeo(oLd*3>w%V#U8kpa03(VHOY`((AIzSod$Oz%kTw}0*ud013qQt6{-7l8!1+so`_TRV_VOD^9Sj8Z>e-eg{1)+Y+5-Sdo_P}KZ; zo_$*bn_6dNE$#R*6U{k{qm+v8&R1hSUcsyYB`!3FfjJg7jivhy&p0V{|LklFb? zCjhp`_4o^vA6xG4M}-}bTY50c-~{w^9!&`Vr7SK$zl;-5hWbq?k6YpwD1X|o!@&g@ zwgPq)|Ag`|VL;Q=-+}V5D}RCVqj~EOqVmH?_D4tn-iV0{$mpEEtH& z`#6Ao$HevEVfzocFkt0yvh)5eD8IfHk+A(tm46=!Cp#1C!(~IzF!l$nFaXJe$1XRZ)WyyQ zSdRQ=P<}Zf@Gw7roM_ounb?8fepn%oD+O>L<^eSCfX2Sxj>@k`1^_63nrH#TVZi$s zuvh`aVyf$4aN2?x*-$pYjQ03RpM@3lrge*XLk8pRHR}g8sVwA zHk}W56U*DzudgGBc1d!!mExT~M=U;V&tKl>sBdZ)(T#QxQr|4TJ6LzXGqmPI&dEX% zx-degHMC^xlNJxo`>aoK=6sdD?1<+E`MpQc`x}}wa}G?5ZIPK8MC%A0jGsIW1{8v* zO-S=}dBl27M3@mNdGH$wbppv4X2N(A5>o!U3w2d9i9%`1S$BHMn93Mv_rkD>q}l6k znCKjm*Fq=yRUT}(XbMO;ivAr`&2Tr-(Du_8<^^waBn;I>D;0c4C6QyWr_($&5=O|B zJ2Yj`>%m&K;|B=o7^YR>KZkQ;+~MeIlO`^$e56)}(w(H{dK>x7>@^e~X;u;=I6Gra zD6B_TgiJb^vsh0s)e%@{dxCTh-~MEXJ7I9|2_L4)tMIr5OLFxbr1%ugK4E8?FP+=# z5>7ozLz_&N)(6`>u?NKZj2N?v%NP;WY<`3jS-;yjB>&FpA6@ z$%8cQ=z>aDc>ZuyHz%b&{Wv z%Kzd6xJL#hWq?F}7)It|7uMSDH=4-qYSxs~%F31#))IF@o%_0l(8!}~?*pM*@xv-A z*WMk&oAT|YHhHy>%uC{#Or5VWduM`}w zTo_L*B$D_0Kd07E;6R}EFO05y@qZ6FCRck|RZxW+TWl{Y7g}9Ew&HQbLofJ_?sZ3N zCf4L@(3L?ok;|;vA$@~SQ_i1~*Zh!63#(1M;MaFhTdTVpJO|64MRTgN53zr)VtVy< z+FM&}0!Jch#7yvIA8Su}UMN=VlU4A3)8Uz-KBAE4HD${N7Ay^Uha{)zM(Pgo*^_hC z!GhsK&IshawP;&U`msJ2SqX;YK6^JMqRxLPdb$&4-vF`iO0L~!)yh42-hJ?b{+%vm za2S?DbCQm8Hk0*ut2PSHF&`4aH5J030?u<>|IBWu;CrZh^1ZI<#?xyzE3}*D^Veba zVXiw?9~?K&;m%R&XKUtgZ4~*PHY{!}DJGK74aapkprNg*Cq}n(`8A52mIyVdNf+~1 zth+W39aTrq1NM*yRgOI=8?(_-_s!ZC67k{J_xAZG6M-I@`Tf_^*Ev&1{g6e_y9UH$ zLt(+mzA~gSf6D^Td=|ZRg@9EFFlMf)5gDw$l*^_xcPBN0nk2kCa* z5`J_(Cs66HQ>YzCLbD*8W6m$iN`%`WyXsoa76H5Zdj4UNrfMGEC*Wn24=_@dMEM&~cxva)i@X<$8H zH8#2FsYee^+xP~bf$eaa)Z!h+ll1fLqhEUKrpaziHcqRxH?S*~NDPLCL=2v}8} zp}Ts%$jipY4qw)_Z@QZAF;`;>sZ*EI8PHl~ij+#=da1hqZd7@p?HWC{A_0o%joqV#PgVX8VOLxTibePhK^o{%1HR&6@o08J*=6j7z#9R~hylYgVF10V1gZ+!$x0;BDg%j4Du0j#LjECjhbfU~MR&H8?6`2BCH-P_!cTYmn zNMh!tF_Vt%T_^ET-gcIAZo-x@LrL0I9eSe3f-Zgq_9f4g+TEd7)2R)ud@;Lqw={?A z4Y-r-7IADTsmf5Jl5XGMUh=5UGjzFtgnrOXxzRJ&aU1*ibsk?PL|UTpYP*Q{**1%# zyXIjSdsAK&?xxr}TJ@lI;9+;9M(M%J9VaR}YwV>H!@-pKHv4^n4nbYNgraXpvekxZ zme^rDqN}capn^NQSV(N*ZgXIB#vrs$mgxmfIHm{_2tC(!-(8qP-<%)J@00MJ+8ou) zRX0L=HdvZ$5%PW5fzw)Vx1Y6IKp5YT*gpgr5f}*=_E#3-YrChee8=WyaFi@oe_ayt z#KToIUqIa*%Qn7v9+KUp0`aTA%b=NQZ@fXhsb z^5~npLw<;P5`$*ec?tNKghLbp53_=jZ5QY!y~5rdjk3cPwatR{agOh~2*qq@#Mb$~ zK@%cWBFVHHThY;~)_}C6bl(kAe^Xd~37^ zeERW277Yd=T2mj*gK^Kqe1Tu36t)skgL(<)dP%p3lv@$3>a&!Y=eDiMkjjpZnuoxL z*c7ah){XNX>F#TLr$1Tc$E9$F)7_w3wyz;~V}#41a&*7GYa;%^X~`=D8>phGtJ4TzXCGj5Wsjv-g&j<2g_TPkTv|D2C2HY3E}w zY}92ttRPi;(VI-J@rL_LC3Tm23#@3n35NNwW+B^;LrXG4z^0dPCO@0KHWWF&Bi{(d z|3voO(K*YiA@k`K??_4qsXgpzMwVaekSWaC;)ai*>T!!li|zg`4V=uNt$eY&+AaKM zr=z!CzLM`PETo(8F`KpKXde<)xpyWMSoSNv@yKOk?)R>C;hgG;4H}fvA?j=1{(G%l z<6_YD0o|n3px~(78k0pcbnM&mx-JaKFfxcNNPI_L|r^XSoAGp zir9EVQFeXdm!ebNIxp77`Ka-RCtn%!VszN3h^XV6NSJrDTmbBee7i(Pmw~8sgG9_O zN#>Y^eF6!Ypz#4K$2HILbHGzX!d}<*OAa1}s8FDgX0|-(ZaXWp{A`blD#r(5zG&Hm z(7>@y+7_CeS2m)kQKqw&0u&@%g3>~LKCguF@|f~6)P3tH)EEQ@1UIw!Afsdp(7>1* z;LtBcHnrT%j39RU#zWV~7$;CFpXEj65Xm#@Y03?|jOjyG^H%zCHKa$D^TA{<|+@79!>Cy&6X0ot!Z4J?Y*rL{qZoe$7#O|ic zJn@0BWAf?cfzBNQ=ZwX;j>z~p7&p5SCXyEB6fy`Cj5kL93QsOMz+R30mJAyo$N1{a z49S9^9&thrV?vfE$R>>K0%lQX%RI8*nyX(Hh%G`*Y;B`Q!wkVD!rP^SL_9{hmk=YB ze)U>YYxkEO3fAy1;N@Z9J->I{yq^@0x$R-|@-Ruph-+v*1lvXqgiDz4roOpdTVFU{ z2!wjQ%xNwWzQRDhW4nGovqm@ty7neq?)^QsK1gB`&&9vv5+19!KmShp~hQW)+2A$0XK%z#ac4Ip=AV#jD` z2Z+I$0HS(U0O#-*Fu#;p{xg_|`TSv1{llgDaY`NSneFY39sU~NU&$bnWn%i5J^ENU{L}da#xer3%3lZk?L6{t!uG4k;jiiR zamW56(f+zL8UJremTW+E`CnwqgFCc6P#*okbo@_{++2^$=>LdU(U0=+e@~R~zmnWP z%i{p!4QLhqKhJpoAW!}_+3IbqN9_#-P?8?vA zA1mL$^T)C?@c2ls0gsPU{x1gmaonE^9VnP{{V~l0FirqH%gqB28Gu(03sAx50cd1E zO^}=QHw?u*lYFCS1JaQrE=!v?T_EWptc;M2nozaC!TU;!5o5E`!EUar5qtvo<^ z+~t380EL5<17Ky@{|SWypsoQi>A!>I*Y_6y$&a^|zrRQxH!wiSKSqT0!HNu^;ebx; z-;T&HABBO4JlaJ5$&s9&v>QO>Kbkr{Y+T@=1uJl>;5ReL<2&NdO!6OSH{d$I(r!(F zfzezq=IxLks~()RA7>ghaj8LD+}a*f6~Mb`V#uhlU|1HTN=W7G)wi~64j~XnVRB1+ z@FR^r{W#3Nsp}r5xU>l4I3@1QxR|P|;jJ?<8n9)DnmSae%pw0#Xc8mY{cziml;uNx zSdJl>hx4?$U370uUqVkXW04uzpu=(a)*#sx+_qCH)Hdfxiax6%Rifb>+f|q)Sv#q) z4LB%ZAaMMuRWyFA!y?KCw_3dC1tpoO#Cnc;WDLIy!=oZ;=u0m6Ls?rB26{4~aewW> z4tJw^8Fm7AW(kfty~Hr&K_rNw?tar|*l!x*AC8VcO@Gro9WRKX>dJCmR zX0j`7Yebn$iV>(FM6u0cppf?5`OZ#s#lXy>fx;zV?aq@euu70^w7BMlHhUEe?!;GI zU-L4Pj-x=6LdyyQUBlC9{~{ zONwL|E1u9^W+YN<3~Z;zFFuF4!6phsOyQYE?ZbF6lga zy%8;VJ~#5^#@^nyEHkIew<_+hhs%~;=)sd#ou1k|x^TWE)v$K&qAw~yc#08Gp~Jwe z33c`PuFYyu;bs4f%StSgiPMSss;WB%H8Hg!2t~viX+E#_nX=U>7O%Ok-0s&gj!ql3 z5~t5q2D?{5rKffC81$in3X>*cGeg`U-#q!_2|9EqSaO=fHCrt11|+2zPVv*~it8){ z6Y+_LYmw1b;KfkR@%_{hm6L3~!3k?dBLQJQi5n=s^qyuG^BQoDGH%dVWBsh)80jibzkNQ z>m)6y6xaXldwq-jnbYyfT^ej=^eIFb?Wf{eQ5+vVs!oC^`A`qM(~e62S^d{jR zvrl2MwCL$>!DKetcT&Ch09d7}n$t-y_BSJLz3J`!ZMGT=bFQ0`^2JWyksISwx~yj3 zCNKHX$$c4D{C>VDu&rnSEMd$|h`Dwwo`cbke1*NnWO%BlleVXk-le|! z$ze6&rW<^-Gqd1zrliiNE-_t_qSGex3ZrCu$BFCsup2St$~`!6wl9z(YR+b3YIpO_ znrbnk5RRQ^nb+dlGZ0PQufX(aNtQ9AA?{$5Rx!8_E+~(J8qQm>cL{qsb)k+i1{1C1 zchBejP8kAaJ4Q3UOp^#A8b0B~2H)4h(<3Tzs=@yH#;)Y#utr0+HE(khCfrWGsOf3* zS*6B8vIB1@rn=eNA>>K1PP6xMDfv3$8$L*EOM`vOZ*4qm);trxql&iSmWd~Oh|oX# zdJB0JPmwLBG*#UrKHQS+5Z>sd@f-!^)ipBMs$l{Wl+#c{?LdCi$P6L60WFcJwNE(4 zr7axcmybNV8Qp2a#v7-ro%H2kO?HmTa~~P}zBZP0iJY9lNT0H#1(Xa7my#GPiG@MG zocCc*c_)$9XEUrDjgzrN+x(G2Gs@SdXZxQuSKut+y@$K&3#y)3iVt>}XuL3~4D13k$5yK)tZeruPr3aA-@ za0(()fvawaF0^XDx4XrqVn^2tb5#;LOfAaoh!T5doZ>!)Pc<6cbubCdCl&5_pQOr2 z1u}j|*gu47h0D3Pg6_z9jnMkt;DmS^p)`W~?Yt~gUsfgZ13taXeWb~V}wo>%8mdODz%;EwZnl+~Y41P%G^ zFa6ukMy;_%HT1dlN_<2G$2uc$kcrjvz*g+GQREQ5m^q&}3?< z@Y2S9((ae=&x^*3!D0O9KY6jNBF^r1mGkWTY2`YTz)A%%-0YU#0vMOCk?WVYi6Xhg zAqSy0c2?QQYkLTbIZ??2`lONktk1(zWt`=g^nm&}S4OdHjJ?b>%QW9WHTkHr%@RTb&_G8I#tMm(JSue< zW#0R-Sfs0c1&am)haxr_iYO}7$~kPcl<|*0DAT2c6C(d?*UPOhVRHS>vt1jb0S%LJqnKJPY9@#`!&MY{qs?n>NQYpJ{j_s^O&=t`=Ovf zfK0~eX1uc<2+^fJyv}*G2$#si4^@on0yn>!Ec!7By(ogieu9vq5H%b5X(qUS;=+UifVEh4Uktg*i- zs#w7IdC{73e+793Wu(xp^>L^}lbQn_>dVnQ#H$qWa{EjJ&aRfC0wPw`ISbsc4VA4m z%Bm%m{Kl`oacS5XXt@`4fkJ7yR})1T0OQGj;gVMo_N=5R`yhdt`uS9!K!`E8%g1Qf zvm*cc!{SDL!A0{YP6ZD|DmBjl&vAv9Q{Oic-!)qv&5~p=fH?YJ1f7fH+{c?>g2q*w z^CMoFmZ9OgUm~u+|Js-*wVn}htCV+Kd-=OZ(+d5%M1MDWwbE?983VZ!p_9Nn9;z|z}&*X(A>h@ z!G+NPaBjD-HUvDA?2Qa8{#urOEUWws+<%7kZ_2Vi2!wy4VKz3mcd!GL{T)nxa0WlF zYT@#0k@~TC@;`OK|BJb|j>{@r+sA21Nl8JvyE`RBK#-R14(XN>kPrpwZlyyy1nExc zln!Y@$=`l}nS=A5nIFTM^M2p?=lSs9>~-&Z-D_?3b*<~Z09zqjU`zu`J!d*|z@y&$ z7l!5nANi+-0_>6uoInJKwH3h1nEYa_bBTc5Xe1CxW@&F^U`KCdW5fX1%$Naun=OO% zg*_372NeR*cJvRe^z1?8(?j83a(4}4`0L5~+r!X{0D%23V_kz0{@Y_+U=%k>-wlco z#1H6Ln*e+XsPP<#hqz7*T)#yCSNVOt|0a9mxWrxm2}S_W4S^2F|6l3!_D4qGf1d=n zOzqz$0WPKlR2^!}06=#E`g2@?{g>8E0LXO(_H$f;{Tx?dKOnQX`1hPwn-e zm)~Dq@4}M(>Ay&Ui*c?B62Q){H?(hHumI5b zaR3^W8wv|9QhhCy+XAgjfI&Sour$~?u5@hx-pR}cFeYp_59L?*`NEv=HV7wh;vYy0 zF!WU@tRQ91-wNbc@cF{v@K%9<^jquzQE?&q;AE%g1QsVCq`L9kTzf76<$7U)c$+u? ztqA~n149GU1Sk|{MnI(ltOa&J6?xM#x%Suqg>t#(|2_&1N&*wGELpFFe!xx9gQPL6 zHy8R{Ec$;{EZ4kbO5K887}^ zxSE^4pi3AzSg+G1??7}3C+2CsRzv7r6c%F9rvt>WZz{UAu?8VTgXu88>85np10IQG_I1c5=GrfmiG(y-ii22BVBn)22qg z@xW})CAsz)y$G*bJ|vN9fPlIkvD1B%Zr?ev;zjmoIQOCxt8EXQ6VLrtO&@FA71cIG z&UuAm4OBNndlZ|ug>PtJVTtG*OkW5_efey6-&RNEJ`VkSU!j{>hB+koVo^&T25%Vc z;s=@2+IQ;I-MjVpB+d3sytPl&$*4w8qzSr^XS%Ya_DH<;J{14dhB#epz~%RdjkP3B zq>L$4p->m4j>YcXak{Ij^Eq44CIdQ-1S6o^8emIOh@Y_W3b+$Km$MsIe^WERS5J5^ z^?rggOb%HSDuTBtLWBw0u^PNqbrEYRD6{GrMZ*au8ryxc@1L{HMW zjG_m4MSZXX`@utrw7#;?zM6X_fg!&#BZ7%zN&s&^oeit>3UXJ$#&;XA3WIxcZ!)Nf zDO8N6Szt#kvvo+A_=D+JM=<85*HqzzQgZ>sL<`#}E!GMxOn#(Nc&h$TqqVs<>4WdLhYQOAX>p1|wNx`Rx#u}^^{MTr zY82GCdmAZc4r6-HceWM<2r1BFy+fbc9m@1E(n_F&#kdHS^cs}wu+sLZZJ$#gF<0wL zYZNXCld2bw#oEVtTf~*=t-IHDl!;Cm+%pTBYQAruJGN2T6%-l4W*bP#A#2~R8OPUI z5?k5__x+)2q2jQ?!!=sMXjT}@8lQ2+N=>Xt0dNB(`zCRJi_Wnb9;LF}wsGZQHuD+b z25z(J$B|!XU}?{ssMpHe=qt)0>RF#h*SvZJ$d_6P^-D1Md9iqY4Ak;Bc(IVH=D*YJ zbK#mIUx(?{hQ?`k=}ZVMtmzKoo`^u&sLP{B{O8prwZ0m=yp%@H&Bj3 z7QOqs&z|o^5@{LsGzJK36*%BFUJV)OV|;JC@XO!TjM*dMT??sJ>xGF zp`UBtjMo?oAC$_k&vQt!QfVnu)ew0lnmSNc6j5S2R<%`b7&IdBE>wjz1Pf=`N3^nw z2Ht8Ue$eXMc==tXIT+mmb{}1e^XE}~LP|=C1?KV)=!pUMJK;m_BFw_BmgPQhF3^6u zz)rn`a_{pXLG9wl-H}rjPrYHvvz^nhsV&A}&Dbf&Ahd)2)SWr)@X^wZiS-YzCGH40 z>M!e>@0(I42|Q`f#Kf^^?t^j(&<+(|ez`{*#;_UHjEm z)X#S$=kVj*DdnaeKC;r0zt8+oAtp^a1csj^Hq;>TK-NQEFlTdM%g9y_= zRMnY7Ee7*emMCdvgH2Vj_c5jTl1Z3Ysin~GIC8wtdAIJE;dMj=c}%ROJhLW~S8o1< zHKk0o_>z4ADe|2_Vz!}*?|oy$YUwq0sB)-ao?)uV^N?CqIguJ<%*HlKOBeaAPSeRB z9{eI%T#>v@F7CXZxyc73IV3KsEvGBVmJR_wx948-eedDW2=(K(`>s^9~Fmpy49$oxG{(?j=vOl#Z=c7RiZVNdbgomi@R<%hf<^PS-b$T#s}v+ZLHlB+ zVwKX?biHt%RtyIU>_}s4CIlaEgrs_Zz1J(?IO#nHNv!ka5Bm%vaV^6M!%(HRwIFB7 zjOSs){Bd{WSC67vlDg#|q{;7^mYL)8ic=#)tjdX^tWttDQe3BqBFXGMZ0Q z%?`tVYWDw1>3iVybIhGEXYcd(8X~-B1~LU{E zGtcpv-QqPpSKXj+;)=18B`e(h=qV;rVMjA9&-xO42|Rt5h|T*4yeSbSclo7{jrYmm zoMZj0TeR2OC1etWh^R-6DEMR3F9SG|d^^ms*dvBSv*9?IyXxAl&xo<-V2pAHY-T6K->zEp&-hXE!>%r z%S93|tb|mM3y0UG)O+W#!VW6jZIL0zRFJ4nQL3U-D+ORFgijd{o`|me7!{U!V}ynU z$Kel`vY5#{@<>>@sa*#m!fl*8X-tQ6)+5Lh0kgMa;8A!rrLQL;SfN;g@JM*Ci_S=0 zJcZ((LR-C1WD%a6x7>*a(U)d8MTyu-OS~}8=9)KJQ;S~J!l4NPa1{Ffx04;h*CvWkMAbS z^(|>9W|%VY=J>uYc+gQPm8y+claIhwj&aN?H>LF0!WA{YVHNGM=#I8)+t7-IMmt^a zfjk2{W7`3qgSXVNN40iXnNA=Cgu47!muCw7fR3kSXC#$U@O~rBM&0)__6hF0)E++# z=Bfe_Beey=6gUzzK5cQR*XjDS!bGoQKvOgx1vwA~pD(hBcrU6Ctk^Es;py{hOEP}* z7C$+0^gwo?e1`CV%EvvxRV(YQ_U`kI7aHJ9v+6sz+Bn-Z^&UF1^V@|!0;KnU14 zTmMm4a{&}x<>j9p_Y!NSvo+SS0gmqL=m9hkAi6OzvedBy(0n>;9UD73rt8r21yuB3 z2?fBs9j$E40D+I5y$!(r{4(k_!26#~0C3y(fWHgC!~8PdHMrrg$NLk$LK$FP0A120 zCnA42$-k7+1*mhQJl?2E4Nc4eGUk_CxCRjX^)38qtvZ<4*x3W*n}v>^v56&ceaFkY zVz98X2l%>+!013D|0dJ=W&CSLe*d40e+_HB<@mp?)yw4mwp6c{3`pK$XGLcZXwNQw z|I5Aqvs;k8<)yk!pAO(D&HgaW*S4hJs35Kj^5CE7fXH&?HSTlCR7t;e;`f4nUm-G$`<0ZYr0(4;m(K{@Rm-G$`<0V}L^f0>m{vwIM z?=Rp!;PZma06s72B9=?%AOKjsxZdxy(B(K+yNwX=>)RsA{~;}Od7szfxGkc50po%+ zDqMj21k}}!5$JLTpxg9}TsM$KT&DS27`H`}FHu}}W{^|_IO+}{{#-!QtBZD+H;dyJ zG#P-yL9=`dpdZxd5TpTM12Vw|$_Pk~0F)UU=rI1xBDwao02RnZecd7wP~$HSP8NXu zxQqno^GVMNR52@{F1leP*Pa`oNG>Y;Hjx0-49Sq?rK) z0zmsf%>t|t@Oi^Pu0LpiKrVKeTLc0u62RaLAQ(VhC_#|`HOmSj99VB0$uCSD%VlTS zTSRiD69Fm$6bG>90-P!*A+VO1Ik`A*QX;?lvawvYroBxdz(&Rjy!(K3O+bG^K&k>P z9)Onu3BcG{Z&W7Nt=T|ja@&oS3FtZroUHmS5}@ZIJqti`{hdgz{pl=bVr~btL=ZFA zu`_sRpl79Tz#wH{X=GG%Alw(9yO?Z}`=O!_objmU+>}oFb zol?RTEKZ7H%YhL!tOjn%fixDQva(7VcCPRCPP2C^p1XRrJ_T%O~o<RRI2T47*AjNCAw=G>wx+$w86p5?iQIoRW z_mN#4?Ng)u<7C#F_@q%|QQSnlsXvf20oJc(d;~zuK(q(d7^4;3gx> zEqeOECB?dCDD(SglOzXqNuYONj2E+RsJto|W45gk#VGeCy#8DIyC$s0LtFQ})z#?F z_lepJp3g$58YfLZKms?8@SeZhr@s4niDI&VvRqV^S@k}es?*bIbk>YHNn*YX{;)LL zp~VwN_!tE;#}`L$9uXneg5BYYj;rz1gh$9A;_0vX?7EUQ_^RK-(``{*-j@oo*9h9v@25TtTZLnFMRz}-7ULhE?crH3*Xq;W>ej| zn;uyX$v#tT+Psu=G?L{~n(%2zWxD8S1V-xKPIlDyuOU;)6Mm;Pb(Lpt-ScL|7{2IY zk@iuEe~xR-*3ldtdw5zce~0`fxua5JdozE?+ zOPTacaW-mrvNiPYC3#p46eYG<53BpRTWnX4V~N_Gx}#B%)DFz>J9c0^b5%45&CGgo zG~97WZo=IDqG}~3qDGij`pIdVOjZe?C_z3-*-M+J%w6W|F-(d*I5vACX2fvVd#Jk| zcdtyNZK5v_vJ_2v>=~icTt=W~6MCUOR*@UC*s46x`zJX)EsFk)tE(>KNiY690}jk1 zS1+>$2PnY@FITm^_tJQtF^Day8HD>&%;iQA^se+KJZ>B-!eIY=4u!E-EA`5V-bI!s zJgAj~j`34dmm7n0`ab6O0wfDL?rP_3rR8NKtP(?Ix=c#KW#yy-LCTIDr!IN{X%#;q z)@8D#npF*U?K7C2@EOdHwmd&lEM?`hyRCisl?#RBXNpFg_u6zrMB>gZBk-)h{yjEE7r|p-=hR;3Qa_B>)x@zC`tj0aZr*^N) zbpJwwA&NX^qlG2R&3G?6C&-Kc(ixgTSroJL5JNja0U@8MD{!QxCfW-g%3%4GsoqXcSn|VayTf@C|8Sydk#aeWwQr9v#ZCgv0RdtFOU%4Qz?mdrj8bH zQs)rruJx^XIaUz5H%6j1{KXVc?5^x5XRmRyb~HU)y_!w<>M!`NL}_y03K8cKjU-mR z15zn+njP@>MY{=jzr`ANyV*-NkGa%xrjXFu50rB8emeAW$z@cL8-Pw&ZrYz-mx?*9 z$x%k~%Qa=sDOV$9UL}y9p*T2oX&kU)3q*6NQy*eYScE{EMhRVQjfhaMexLgQ8tYAO zl^jY(;zxG|UX9aa)BXohM}rS1*z|_`d!<^$Wb;c`Pk?@2tPoX}P`nZ;a;*8wSzEq) z4uUAul=n+oe|GkbbaP`@_F`d6F_E%29OiY(IBTV>Mu>Vhi7)z&#S?$>kCR>$3UP%D zSp-Lw6D%-C2F$=o^${|YD`?S7&t8+p6cBiS^psBTa9Pbm6t#x%8$D-StyAPMwnO08c;m-8D zPtS5-=Z%*>D}1%^{?p?|TP(bvo+Y8uWRfna)5bQnIga)(*nf6&G}f=4SE6nzRntwj z#Fl4qJB`1|l3zW1^e|vQc@lNNWj-*fQX^HXdHCZts z+Dm(5=v-ra>%t7GDb7xDtd3y6B~tI>6%xATPVaov;8WX5lr^ZelvBnouks-{%p>4m z^;1|a;>I2HW-8cN@t~;s&^U^&_rldAd{t%v!8}yoDv|sBEZ;z6dce!c?}iCy_#7by z*q`)q@^x!n<9RDu+htOaDQBzO(j6gV?OZie+Rw~mH_hwNE6=v?Re#BH!XabQP-{46 zjmDhXtHAqy%6B(~M}TV#|Dh!qtosK_FV9gcil5(Rvwr46w?#6ey@CvO+UD5E3LxvS zQ|Q{7+lG2)+3RZS5c@KGV#cJy!pJcTyl}bKfiM(tBFAz|Qu1`3SC|t&qBhNRqkswZ zF~2ZYf=U9h&0Aq!f(US9CTxnW0`CqV}XwgoCxoI_XNtqI#aO zYmoD0j@gPOJ7k9<4NGTJX!cn>=gK9U9zPSP0o%YoprRwV+x zWJnf_K9j*hAdl;Iv;hf;lg_Tg46ZsE&(}f>JI0zLWKNX!gNjn#w6;RbS7J{5hhz2v zVF`3E7cx)-7r9Q}@6}i#((~bRKf^|l3=WlXZo~-Adhf~8M7@%Jzp;Mq4FQP(5oUVj zkVi@>DFyX>?=#B~63&IQ+_}$>!enuOz@H5TkbxO*!{&NPiZy=rD0`dFqfRiJLG`%Tz=nkXF5G+|N(R+k$#-KBs@0GZ!t-eG<=feGLR2?O} zL}pT#247mzE?$m%DV_-58g~8Hgm?%Mzl2J7WlQ8KrjNR-c&Hk#NO@DDr=t6*O}%_c zX*5ntlh_}qi1C4X!t8DbOna#j9oM4Bw$KCL^h9}})AM4k1B#X8{TYgk=kSY74zY4W z?>thUC1!gD4?oK?q?y&z2nc^g5}))M8;S2lEoU@W7)Bc0iWf$SS_WhQMtWJ_6TC(G znjqHN0z1-KbSR}+-2EzArCpi!X>Kp>FX@v9N*mbk=~E=1x@kL0$m>~kepUbe%;RYg z9BlDPU>u^oD{xKtabs#K!TNFd%GY!q9kn&cA@dWMq7cNvo_9wh)f0`?#FD)WghuvL zt6oyoyAf>|8b!^lL+|qkw-~ZgM??E`$bKqqd1-t?F~N9`oCkk(bUD*iT;vq|sjg|Y zcEE$4HOGe5ME^e3E^H{wb7s6(y~M{OtT%s(3!3W(;YKa;A-L^)}K2hxqXNi;AEi0dFYup2{{&D+C&fj)FwKYmvN= z4wH-g+jchxFzgvUYYBn$^C9q>f))8J(Id3)4_F@u5Q)V0S54-g3n-q?IY14+Ba)cP zJuf*E`0~Odf~!nN_O)Esk-+*n!J0&t zV44q#q00qRvE6BP<&{nzQnuwr^p%h^mew^%kby+ui7NhKzmwjfky7may0?5t@zHAG zqJ?7%GPxAn9ekd>VD=xzRn?+cK!t*TyQ*^dM*aWvkEOm#aU@pm)#I6vIc zft$9@vD?}!q z=l##^QGtW%EmsqIj_SOhyv|jp%|`4Gv}fbFuN-4vBUJF|!Q8G`!Kx$8t8W_RKeRl- z!PXl+bpH(@cnMTq0d=<}1X+G}p8-0{|1}eEBdP^xy!QvL1pt-)6Uy=T-gXSOIu_QT zYyUfBz}R?o)dg2Df#k}nXs8_n{cC*`JL0XxNSy9Ax1iJdXszsb_I z9qWoVWVs^K{s9FU%S9*Be?~#}ze5`W8Z%iND?NDwJ2eK`hhhv022OSw3@T4_O%3$y zfaivo1z>On*uH@H88Hh`C%OxUgdg~i;i;7!fNv5qGAQT(yQVUOg0a1YE+OYt|oxcef(}0m~eEPJlT6Jrs~1A0R>e8(F#THv?ql)*e=u z%nIw3Srdr+yRb^Sv0D=$6#8X)Zf#)&jK~OBXI+{`F|z>tET9GiSvK8F6n43w{#CHI z_OD_BQoszTY(TUdNO=ShG(dMWHc*qZ8w!4a=6}DY9za6(3&ryh5d2J5p(~su7f(#KhXo-KU8ZnSb(KiUP6ITxvPo`+ z2?^LlQka6L)?}(JEa5L5sVay3=t!)nyF+w!>W0;`a3Wtu8L+x?G2=1B;&aA__;ep( ztjsW1H4+Gf%9jUbJs;QM63`e8H~O5(ezv4M?7q!Ki84b zkfqD!yif4QPa!^d703SQ^Ji7Z;p>2{p&rMHr^ zLIP0RWN{7ADM7m48oIIEyh!A@Ft zew2=pE_#{5ty?kA1l3tI?=xN)yNWo_k&ErtOG?IK>mo6hR$@d=PDY$qV$2d7Sn28- z{1KP-jkcfaCSUH0eG+CQTUpV-RDKw8e(@9^lx>pzWU7P}W$nlG!STXzOL2`qy~89# z1zyB%zQtmtGD#tbp&V*NP{tJzmiAR*pMNF2F+}W@ilZVj5x=RC6(l;sSbCU^gNis{ z4>8_P_d=lRN3VxtFyd=?2cRvP#WV&|b&li4;9mD~D8C_+?PvL<_qCJiqwg7{>`*Osaa2M7`b_qvj}6( zmv6*XNukq4tF-yG#ok&>9=oF>G+8J5f@~=wLbj^BKN2lM89a~nw>`+Rq7QA|uYc~p z|DY1o7X^E2BD{2Ud{ypEBJo7?$<1&HOX^bvG$?>K_mvw1kzXI7DBSk{=j=y{=x;fS zMKnnqUryiAvVWPPw;G@F7~>w7_&NJsxg&Yfjn1V`o*1L>b)a8Z>_~T+<>;b6I{Yw( z9w9f5l<$->9tEAUiL_>9+d0$ByPp=S@n8eIHF+F|X2ERD14cTty|#|!S)$;pkBBrE z1t)b8nF!sDaFhT1LhWt@xqCtiiY(Ua3N=r7;?1D!(Z!63MMM9UFU6vw z3yYcViR0QK-y(iOesNVTk3XH~l%{koJXYB1j6h(@&v1-=dm_W)T@h$X4L1;`=fy*? zTkQC@An`4@Noqbkau_V3j-x#rLWY_-$2+;%jwANjm=_)37;v;&d|&Ue2K(N5B?G_N zX5v;}pt;*xGc;D5d-#yNL*I?4&bck8q+}4mn3Vym`O`$ndd~Vf=j#%nYu&+|O%L(p zdyHP+oGg;%*|qTF`^WId8G@pvV36XJCNUV>A5BKQAPbHYeY_wXj=Lf)As&%fnJ7DB zo5J41FCnR)FJB`$m#AZ5GX;}}n{j|brPm0n%NhO{6wGY7H_*Dc^|5$I?tQW_k3EJ% zM0cIhU5{m7f=j`G^EVz2qDB41*K;RxDNW|47M7gE2#GJBT`To z)T&xo>xd{#Vd-JIUreFhJvbGUItFjvnAMJnl*O@rq}s)yVxoWNJ8JWeBWp;7k1e4+|~UJRY~>rP(L5 zNB7JaaJ$9|Daw(x>O||MyL$&Q;<$J`Id)QBF)y2@ zhn0Wk=KdyFDWB{SH$d;Vnz*FyGVJm#5K>3Ih9UUw`}Pe8CmGL?!9eUIb=48A(}Y-; zE`a`fraUwk6(!L4LPaE8acVvDylDFcR-c=o8!Z@XDHZseZ;`JUhfzo5-h`Msv!1`8 zBUt0A%g;IvjNhgx@Hs2+b6!gpH!e6%5wCgGlCwFG=c+6^SLgk>4`$iyWp#5JkAEnc zeW=B>-~72Ls(a8%i^20n$*V^$XP_>(&&N!3y8Fg6C@mU2*vv~}%oZ%KA7ZFkCWPia zCR%*%rx$1`!rp9;r_AQMts=&P4s;wnt7cm$)Y|BdCO=Z<@PyMDL$IptMH!fQUQX`d zv6d?mdi^HV*Bo8Yq{aRlo!^VIsg_+{^2IKM8n8AWEK|d*OniCB>zLUnEu5`KQS)Gq6D z1=|>`uD3VRIli_9c!+PN9R%XbGRR>TbBrCRv+{QsG3}!mU=P6)%o*7>MW{?PA&4QN zkk~{KoSh(7P3tMDnS9Ki4d?Cp9ZJ|BW(vDUB)od|2)u3y#s$r@9@U6U%x$K-kx#PA01mr_|WPH9~W&64&y$#6XR>c1hnLsr}%!;*6*^2*IS^l zEu;33Pr0z+ZsVAZJ3Gz z;SE+l-gTZE-kaK2T7H^tstJ!X+9r%aG+VD&mokD@g#BhqA)N5@|*rD>yb3xol zi%der`#{UFX#S5{+iB2%TaK|JJOdX3q>hp9cpzJ5pG0P4X2G_CPtW*DMy!kV-bsV2 zLyu<*;y71PPF(-NULx}*zh%YJtIzU!5|49Zea-FkPq5yGKA)BeK>N~zhNpiz|GdE% zquEauJNoM?J(*{|H~*buT4}R6RT5S;^QKNxo7Y0aFJ;SPb(0ho4!_7xDEY?iIqYPJ zFlF&!n0A%P+I9|j?CRd}`8e~QqOB~n6*~MQk~{{=Y%JOcO={rqq6_Tn-hfoFqL5+K zbiS|OED_8VPCSU%q#4|O#2E>}vg6wGw^|_?!0Q^eU=TVWX1fdd`w0SOKS}2p7siv( z*lwyj`fS{hf-_XN4iY$@p7FW+vXpyB{6Wta4k8+Y#&Pcmn260!cfoG(7Z8YGjX3C| z{|-*Sc=5k_ow+rf4%j6B6Z#qpXOMfzb>!~iCHyM7zeeu<9pL&q)M{;IYi9&t>VLfY zwKx91e{}#IHe#^Qu`$un*997B{Wb!fj-@`}X#wioWC7~eq-Sge>ZC?zWl8rtetM~s z_~lOj0SA`L^gXvX(KEXs1nBgD_Gv)-vddsV$pE}@em9t~w*@f=mx7J|VKBjR@p^ru z#Q!Na`HzNk?dAXP&(!aA0Gbp~0_Yq8ZIiJTAk_GE4sMJS|7EpZj9{)~cBz5+!w}bB z*)NSdSgtIV{|S&4=sg5NivI6uGZYj6u=MKSwt@l^A?Ib+s{aPY3PK{DGW>0f^^@Og!`UOKD*2UV{m8o&`@U?||{D~Sf%71nxX-@$Te-|;WW#dRMV z086`c^SH&~;QthJy|}Nd#SMz%)<`GdI>8R;0yvlegAmYpX`r7z=%(3$#xXZ?v%bvi zwMcFabOJ}T0WS(*woF71P z7*;@Wzyv&6*Z@fUX0n`L9b8y08js#a4g<7OqGtxMY(RKI5BRoR^qXP?BnB)1AkA^3 zFO(Ncx76Tz`fD|KH_?cZ*U5*a1cW zzh+^-jD#7m#{kr0z@ofqAlE=&P?20deExnQ7kU^bpyL(`kPjvRie~|YOH7==Qoh;D zfX2O=nZLlEIoVjQ%L{UqCoCr<(A<}m_tQ!Xx!tYUQJ~uF8F^yBArR1M4G+Cij348@ zvXkm~wY+|)z+n}}mPm^NRiv`9SryN%_~j&w?|4UXO{^9(T4$1}(R1@InZOJRVAiyp7V@@H|`r%8aZC9g5Uehq#r#Y1C+9N$7MuUk>{1JEphlqDu88AE$+an(jI8uk+ zc?aHc)D_g9zBnEmBi{Btvn^T5mX5D66y44)931J}Jv9jEXc5NOckp4HIXb*~9^1^) zkBWaSoUmRT`XJHNVblVR?7UACLlDV4|d_z#!21_L{e`QF1zD{Z;z z3+TJk5E2^w@FJ0UiH^YvPwDgmrm8|Kelw~Etn@@Y8D=D}Jyb5pX_n#iQ|~}HzMPN# ziRZI(DAulhf`IxH!sg|(6ZdCwjRb3CYp|vBeR&X6p($ZpQDU!Cl8iRfMSTh-(-!RC zs1u|GptZ{l8o{p1(!wZx6yRHcj56w#n6F@5DIe!&_Vo=aiSW{3R^}Dh=}b|ez{6%} zi~smeVC6|KQ^=rTgY!F7iG};p;R5t$rGm4G8mxDeFxigBC*2LT%BTDkMJsi>A>M1K zmsrY|-c!TUXc*70R0Bh8q|auz_!et8Qf$%fF;nKR+nQh1=rUn_P^?+vueqZGZc`k@ zeyU);lk`QP#9(1Eo77KYGu|kNWBbGV2cuv759PMVCM*P$bdEE#$GPry4&)!Jpc|Bi4f@o^6lG(J0QWDVq(j|71g+>t@)fs?<9vFVE5Z@>2nq zH%ACd)a`L$o1l({yeVazYgv*4#d{_z@8={vc2y1i-VkQ0@`qfOu5aF^A6uxF#*6wz zdl5zTcUnw2h-xTBJ$V@-L@5@scD!p{_G0HS!^Hg~WAES)RRow$p9PBY z{rD;W#cQ4r)`h(&HD_4djX3@ZPKJwEb7>pZ!K#-us?|E4QZjbkeOL|ru>%xHDT4G* zGxvNF4YuQtp^szL<+bh?dbfOvrk^Wz{HpoNqmFfEDl}%IbA;sqs*2-D#4^ zfB>mbXqzYlGM#}ggvdD(#(=+s8M?_-@59MKgQ_eV^a*MY<7C{AdqsJgii>lvgHxo_ zQw^KHeX~?M`0f`^inTi`kwko4xdl<|uOM@vsrbzy#KX<;{d)gKmu~ulQp;!Q{E4_K z8sNP9Zz3nZ?Tk8{U`wvq#6i;se2hOjv_$1{JJ!defHdJZ4}1;()uC@}(rToL{BE1* zRJVJ&^7d};e&$55_+5^;tk`ZjE$G^^!`XTV#8gtW{l@t@s*ifdBV6=5{HXMD)`-u? z3c8Oee}-(cf7vW+O=LV(S1gCxSP>a1F005#BcH+RU}#*ub8!5*bxHHS!xIPbVCY>~ zzA8ykZ{KE2*2-e?p&-tW)i8r3U&Gv4re#xEFyRBT+5|HPwFnN?PK~LI1rH+3L&1qqI?*YMEnF2?+E$6a zqB5}29V;{gw)OKxTRJtVh?S@F#KVWr=Y%Y#?6i?A-M>NJZDAjKvsLZnA5iXzvIVBs z8C|ZZ-daXAsK!d9tMwu(_RvR%;O;_o{61uO+37gqXo1m4RHuX*x=GyTU6B&Wsnv9U zbM2a`<mT*ugmVEqN-LF(Gcf5E)i0{;&n6YH% zPSV9U=gdc8;33&zp|N@Qc|b(B2lB{7aduF(#b72frb5A4jK(3GjnCS+fE0Y%2R1FJ z$8gP>;WaM6L$0ZS$KUd+kFKNQ!CS9zb(AEjnt*-Y1ox-#4SBjUIQhYagIL7SF}A3P z9!RO(Om%Ni9e3poAJcrL*xa60eacB7lbRf|%0#a%@?t|`;(ZB6j6PF5s$4HyowCv4 zXR65iNd!WK*mQEy<6S=B6o_tilM9@$;$81S%9B&b3G;MO|48R0S<}%UbPR>%%odVF zvwlK?5)tBx@5tKKkXJEcGe@Qhi>X4j2KfVN@+-v$%*eVFMt`5sAF^R>{%_)9f+O#m zMvR?=h#ETJJS*KZGT>%v@1x{(PK}p=@q#|-vVDBlgd)vFP$%sZ*t5Q>5*-*Op@vKW z3Kbr~w0bIkodsIK`$d`ScQ+oL*e_tb@}QRlOZAe8e%NRW@z@4BfEMNBkOcn9Tc`>% zuq51J+A1q-88RXhQtpFPv7HSV)G6vaKm63TA3=CWb8?2xdWTlFF8inL!=M*IL+h3$ zBrj~oue7oaM`FOIA@C=B=1D5X63oSywIzR2jPn@_YMg%J4H8^o3KIRdM+&G^N4jHg zqxER=mlOn|pIH}E=%PK9LJcB4z$QmkFJtN^rx5fRhV*+BK-Fu2J-prS1$Hb?`bIcq zfPW5_e4l6l8Nv%pFvJO7bNS=a!xR0uua9zLu)RBj5yP@kOKD$n83xFqqU#bhNV(*N zV!YvgK*pwoJPzJ~q7aJlK5!_|7sLJmwSc%l3#t$rdT=lz)+z>jYW$x&I#AxkJC#Of`YBX4*Jxb5INos7hzb6bnX zjj{^$#S!`Og#$rnA3{FB@Kd-YY$(VCEF7%L{f~o zDrLL>SSTZ#d&a5JAuE?#$VX~AR3>ZPXn6bq3m-@SxYW%P=is}I4~q$c%u`R#v>Iy&Iy-j0l)b-#P>zXa8s}l>NyaO4w%j&^Oz&LSQ zNS+}Oojl-g)C$Ye>y%31>Cw<`@sWa)shqv1C9~|P=bu{2oa5hguuOn~h7fW(GU4r; zJi2iR?M%;E3a@4Eg=f}Vf96GJJ?gF0pEiMcQbA{ZR)Q&OJK=4CAYq>=X`%O8IZm(`v%zzT*r?u3{r12(4WGXe?;^C@bmS4{B%ISB05`rv+EID zHxB&kTm91r{taq*h3x){Wdb0yjh&A9FQZ?3jsJfz`i)WBKfU)qWSij+KmU^be{=gc z26X>40Knef!~w7XF|h$oeOdv>o&Wd+oue^euKmlw-kbZ7{3VWTX5dWcpkr_Ti{bp` z>;8XM(to@K;0U(~ofW_iIG7kX{!%{I-mGs~KL2B^KYsD=@^_6+`t2n0l^NL3sL3jy;UpllBvRv4a z0MPiQ1qtwZ1&v>sU9eo4U9eo4U9eo4U9eo4U9eo4U9eo5UHl6|zZmDL`T@x4l0~=$ zF8QBA=+|9dKyh5$-Yw!_1^UecU3oYFZ=01LxdJlTh!s|V_Gh~>)pN1ZudUqMQax9U0^kC3Nw5H)0CmU4dQ)cOVyF36 z9Jls4VP*ze^8hFFS=ksbaeTnlngwX#$O?4sxfzasvDaOTQ1lwuG;>Ye|0q9N4YM; z2QxGIx(-thlhTk&R!;A+cSOP+w~pKJ#k&i{HLJwY5fiBf3%J>lI{|GqK>ihD)ZFMl z^$*nSSc2-jjzt)RIN?5GvOspQMwzRLek!!buzgz;O~V+_KxeP}NhmVnvt6u>j!G;x z{orV!jX`BDG5Fkv7Fqa2iO4^;{IaZl__kDga0d50wcMj*-qu}=nyFzoJJR zUn+j?01Y+z)oq1N?k+=mDF||L6)^@3@%B^q!D33U7-~muKTJn_fR4VZ2gMquP)sH3 z$*JD5&D(zb(~sh1@u3Vq5-;8|DRgyvL{o^n<7 z5!4+P=Z-{GZS0H`9fC&W2*2z{vx={LP0(F;s`>Q3%2J2QG@?-SWQG}4_EW%0wdgtR zF}jEV{}lU z5`QcyC4ij&$uteWIDg1nbSS~bPo*8mM4lv+Y{U-Z5n}XclJB7`5hp7~Tlqb@eV$6{ zn0!uujckIk-!3!pnA|@Lb%OWt8P8If1l;cVw04`~9ckE@P-r-KEX z(IJDmB14pYiKQwFD%Cf7m7+1)_2QKco9_x-!XmzVUkxB!McR0j3OW}pH47f79I6zx z<UM$vF9*O@#B-W|P#wNbf0ob<3IGyYPC?1pDTJ5^m=gZ5gp{&-%ua9H)v+>UN7& zE9DDzD2Mkre$;#lJ6}15Y?u!Y=7`E)>{PYn1v4diC;Zbi}H1H{LCfm6}r^QqemXAq^@Zz+*ukj8x!I7 z_f!PO8}80GIQ*iwqrjo&x(dPCjVsJq-TbuHvRYR|2?e1#T;6=l)<9Ge4GwAi2z+^j zm3BDAigT<)KyWlwxmeY!vv}u@puL`Z*!|2g1tmz%PF!k*?V9iTIitlZgdd~6a#D4! z+Kf1;si!%$)>!e}uW?k{@%kWv9u4cRn5+FDk74#X6_2A5u^C`jX;R*nhCV*1+~a*T zu+=}NcJj2`gN#w>hsKd@)0q#J&Lr-)Lp}WCz4FcA?_oJ_4+Ya|H6QT06T}aKYcZ`2 zbjoqusd8f2_&Mk{`}V;esYkXy71BbWoTKaTK4Ug`%TNgxiOG|%`3^eW%oRr-$&R75 zR&3S&;$`D>)h=?fHoDEPdDHfKn*CY9=RV8#k`p^vwy@J<$NF0oJ-hd?^r0-Fvm2TC zw<%F~aps5oY32t58!B*j#OqIFxJ7E2TPogp4jphG`Z8xC$UZ@bSuwEITIdV?ep+U2 z=e^>=S6!2sd=DbLGxU?pCg`@pr;B>D=DYma)ZGwg^29uf4@^J-Uj!`$D)B9R zLJrOMsvPb6uI28w>Vt{WJ)Dr$J}2h5O0pmD8=ZVtr+Y^e5D1^zLCTQ@ z|Mkh{@#iz{N6;p!^?TEwO$&OcYn+mc%Spfht^ zB%yg$Mm2s=S)>_OT;gojt<1j8cHb|I%m%+u7=PMc0i9Xcpkdtbef(nkfGYc5U`e$f zpMcTD$u^kIsypCdm>z>(z5Gjx9a;-lEXyEgiE?0<$2|X79XqGve_=m~YKE-;f z8G5njZ(vOQ$SCn1ch+Yygj6vk=*)eTTu-jg$O;@3QY_SHwB#!&>%{6n`R-Cgr`?2) z*55~Eb5Q;$GR(C;;)MuH{kXJrEy9F_`M&J&!-TGsn8R!sdkbZ(Sv@r`KHe_aQ=Omp zyBuX*j(21U_!5Vu>0Jk*HqqV>6T3W^pbdPURV2?@cF0OyYs%BIhI=O1+D8y z%4@4u5G4;Py392CQ5DvF-|hsUzcXs-5MoEOv|V#-4RhLTQe7UQPkxPBx2=98b~Nc| zQZ&MVK+MEwG4p-Ycn|xq-=rHg+PpxG+wN`C76mx@otU}zG@U+}RC}t8@r8%rQ_nwc zRR-2n79#EZjP^I?YG-)!RAVAXj4ZF;3X%eTV5TUocC7K`6EM7pxG9^lrz%fZsl6@1 z?DIw5JA8-lji*z5&&Efwx>A+Bl!r8pqsg~{vn3fJuloXv{Ad!h!-!YzNd$lEMqR3- zh!#aiUiiDSDO)3R%J(^V(4~xT)p59A#(f-MGszfp#69nar9KNYsclo zstJ-GB6zq4^YA;G>Q~E)2dts+X4Ypd*+z7ycA4WX9S4*b`P`gzx8y zu$4n)N5_HeIWqTHb)TaK#d`7?eYpx^=#=8<=@`RLadzs=s zf*NFf^c(p=sWrMIq{C8oDv=W#x|rd>Ebft9byWfyJQAEx+m{92Q_PdNbXi{b|5+c&g zraMLH?vieiZjh1`=>`F51?iOh*9PvnaPGN&9M1jz@sIJJG0uQ3u-07f`>uDd{mf_1 zsrR1FH9&vzJEv<@;;Wfj*c{}<;5AB#)m%`Ua85=!#q6y^)>I6MK2s_v1R}Hh#2G%i za1r0o@92|cQXb%zd&csr-q_Qs%?Qrei2p1>@WlKHk3EPv5OVv2vdmhFFl-F^P~e?FR8JzEFTl2Iat=e zo7%?v$`6CK{1PY5Sk^gK{U>(9>l1XohO*!u3xp;3LHl>!OUH-&y(W=7oC3To)}O+U z(GBQ@m@3dD#Rnv!cuXl?nBQXHtD!6xDQ6Q$peaMJct_gbVU2QEur*_kn>_ZLn;|AN zD|O7K*h7hIzI$+R(5}pj7?tq^OK+79*5c(mRPVu}nyItghg;nK$e#@lX}6!RF@6Kr zIPbRA3Q71jRRt2h5l$1n#cMkgMk#~j`NO4c+nz;vS(580n+4+Pk;)OZe^kl7r}5zn znJ8D3vU7d}t1iPQ#B>V{-!Z?+W|hz7Ber!RXhM?yXv)*MqOJTxKc&Qi0__xRyl4b> zX|P(4@*-h(#AK);3E#p)pP-X5irHBKQ-=x>QM4VbfvKRoA?069!l7k%SDM4I|HSmyPI?j;8#qCAw>*Wn3c_6t`CV zY_A`y)kq~F?HJn_+JG}8TGF=k#^gAb7k0B^ZTtDrn!<5U+5WQD)v@6!1zI_9(hcK#Xi+H}lm_3Hc}zc2Hi zmDp*|%GN+$#ijP?)7sPj;4l~J6~9LVwz4z=gAHkofC@b=1P$0m{W78}*RM^@!CF?D zmKL;N9UY)u|MY0U5rMD^Z5nkWpq2k$nbtICzd-Y^Ke$*fzk1AwE?~i7rEz)|K1fD3 zpWt~K`dM}S54M5k++>AD2Mo0CpN2qRIw7QU_evxFzdGTCLc#Cn=C7EI|8zC_4>I7~ zMa4#2L*3Mr25hQrqOS!6qniNa3k_f@a~^_yX_BuVKk`?Y{?G>eHQRC;KYOJS{%fZ4 zKf=(TYTGG5IGu~rcv^4yzkZSnrP1F{-GAl6{yjv0e0LUhVGcH?0j3OyDmMl4g7(l0Vs<{Q4Kji1-+>2VzoN3+Z zER8jiGpy_reN5<)PGd~k%RpJxnYUUINpgd0TBijSon!@e*UWT{+5VuHuk&bmI>O&cQXPbK2a`$DuXklWxj74zE0Enlt}N@e@d(P^1=GPq*ij1#$AbG z4wXY9Rhs0yZf71vFNfQp3_+MS(9m>&kMmutRIRvMWHcBQ(J{rW2biV9h<>Szl7a^4 zS#sfC=AV>VWC+?pR<;8LAmuvD$OD@XX{C~3GCUv!jt7VKhG`w$V0M&#;g-5axs)FxPMi z4gM5H$R7JJZ9{j`@6r>k=AKKhwcYk)M{_pG6{cd7N!Y)9n5dC2Ls`en`o3lH#JuN{ zrn?CIl2isbgUr)DQpGY|s9HdRJ)2cZ5?2^Y++$g$xq~m6>4&)!e=Et20->sGn6h`@@96NJyJb*E3YE4c;;|^60CKZ!8cf23aXEWJIXAMh+PyUDkibg zz9)3`-!BkHFSo&U;&}d{=R)l~VF64bi9`awQLrkq~;D=j*+d9s)Trc0ZHP3xJLAvMD^h=V)iAZpygL9AN zOYkrWh+5~s#3Pw^u+!mWq;zFw>&a31Xsr1rt~w8Lc(mEEaCTCFEX$Ob=z$n}U#1(6 z?__6j(sb6~5^E-m*_gcX5#5K9yy#psp`$|mas!Q=(CGwSC9xZClBs=_`#YGhGx9d% z-fiknKZ;!3NqjEy1J%Yi*&IZf3BNr(%@QM$EH20Mmg(zs-KWEhTMp3yFGD;XA|xco zCW@$6?1^LjDH+*MM0{m5X-gDXcSAA?_g^y9 zs)eVNU@dSo_)r%3;;S(AsCr_&1#W0{{j32p$M(mlG zz&qkFM$gBIwP$V3qP@c1eU)`kq`Em`QZE#;j&mITzPgJ_od(hKDL1azG3K}1w9fbJ z=yB_GZ90eAlbgu{@WPWRh*}kpifrU7`tk5zN?`gQ!<*!-JQ6>oZ=?54F?3}mf@0dn z$E!wbH#n-3c2_w03Q9!v%q_9xN6IzZUS)sSlvffMG8JSNQb`u%Y3Yz%uqOwaqOoqr z%+GczS%Bd=c{#4JUQH2sqT3fgXf|FA9jY9Tu%K8W^} zp-5uYMklI4mB1xAFdfBYsUeX}j_iwmF8SkbA}ck`P58DCkIj@mJeR8Z zxHcu^n91?Fc&Joz%$TU@aN|?H@#kfPIVU`)dcs0(t+(ax@LMJ8X1w|c*0cMW&`xr5 zk75kzEJ_~GiHFGNg|fwOfAz0b>gs_viE#MESG(}!3sc^%w!rZ$XBl2OsSEz#58V7w zM!V0t5eQH(3-lhg`5BU$!4_z>z=X8nm#>@%GcMq&i!4S}qcm=5JlR)dK^VjddoO^_ zx#`cCu9f)q9wlc}sFK7UQ8Rn%gNgY>$vrIdSG}cv+=2FL zG2?Y`-;#^5BM`*X!e-Z$bNZ%}N8h=rN%g@Yne%6FY7w<|?U7Z}d`)%rs_+eM+=!gm zkG&3$TN6x&%s#C$d>ELo-xOb4y0cpG%iFgM)m72bNrL*eCxZ(Kclq*n`3c5Cn3O2L z5BPy?4et7Hvlb9DKMIEq&9y6`_uf!0IG^nl!VF?sI}#O-XLzQi8jnLMz+S)JlUh#|zFMS^KO2Xvbo#_<8Kx`Vgd%MgEhe`IUQc}!2Z zUZGd7OhL+4rocuxglQ-6BUin3GTXW_5_Q@f#MxlAdB}x%rvgkQ0~5Pbhaa#|gwr*) zn!x9%+mBwt6Bp}%T{iKP?m!33@xmcy=ss~Atvg*pr_`t8ZVM!dRT$8g#CtB2d;21|F*~Ay499fiXBQFYHn67fTwc z4CJH=^00b_ycBg{Vxs4jITd=q$?1Nfe%jN^#?DOv(LsoUvK%ybWN;0&0l^?4zDbgJ z_Sb2BG^9I^QnX_TI6vzxhJA^{U8pxnGR0W&^ugN6JA}SnJse*ulfgO?I6#u3*rmF~ zQ0>0F6VmfhphrhmKZjvT$5g0zjUkxDJ(Z6X1Qs9j^I$0cL|w@O%W!izgG!i&l>WAi zy9z9Fjz6W>==!K2Ic-||yQvb%Y!LbF3V|Gu8)tllrR`R>%uxO<^VkdmVlnhzLAoqB zy0R%76!2BJ8F7kF*cL*!W}`^0HTC2v?UL{I;e#R$zc4;Q!F>@Y!o@!|Jo!e1qvjzk zD!+Krohp}`1(J90{A0{dG^>=&$Gy~txif4Z;wWxBZ~2Z3gQ1$bI~kGsQ*=UrRWvGC zJ35&Z)q1Ij?gIk-7CB68tUNKbnd5ouEGZZEq3@FxdC$+aCY$QP8uh~)=v z4ZmCGZ-2H2*4cq+uy-rzQJA(4P!kzlTK9CoY4u=zvlZFhBp=o5iB#WDr+Ea5>dd2Q zgtH?z3pTZgx}&@zW}!j~N<8UMhe>l(iqo~mMJa!d)~&u?{Ky?t;mePJ00U*%Pigsa z&j>?dxy4SF8T?k9fVA7E+cU4Z@Gw1Se)2+p?L9IOOWrMxNLPXAL7}S=f$2n@6fOQXq9rp6er{ChX@q^|%gw-1CUZ%IoLB4* zbA5D5kE%2L9NrNRGp1x_v8R#QOYpPU&u^!BISvn4le~x`#>P)QS(x!ik-@;{SAXR* zf@}rl|2n{sbty}qj??hXN{+A-lg~OPFfiKhF%6d)l7JNU=p*{1WlfY1QvHF_F|OaZ7opK2ohlMMl#1{43kceV@VkKYgJZ)pcjAV~X? zMG)wJlue@*z*V0@a!jJ(0;3n$2K#=2wI{#VW<)5EI6Rc~Zf2z9q zgPgf^mJ9WS-w(WnrInUG_>8SIHlhW{qswrw%%1&rL^QyF=f1Fz4IcV@Is0y;Hf1DKREpK;*pDZW3Llr#M2_Z(2@J9V+TPSf;1 zWKzz??*fkN)?gWcwt8UfSb$nN5Gn%1R{3ScP(>2beWiTrd1FCaNv-G9Fd%Lot# zOn{Xa3s7~1K!LcU1EbFZD0Z%jRdzWIe36K{u0P-V1o_UG{1c=Mn0m6w1qDH*hf<1j- zyKwJZdzS^Q;Q*l>;GuZ7UjM~IUVXh@PQd^i_pUi8AYf|)Qr`c70`U-J18zhh8|TV{ za(S0MbsxCShH`rA0Es83LjsV1fX)@b^*8RF%UkUA%?trW89nfX!t}2d3jkvVHa5n; zv1B0&eDOn>(` zM&}oc8JmscmxF$p|pSml7x{S!kx1Nk4=Cx=hbfHi^jviJJ0of4I#T3z%%~~ z3KNjP1kmSy2g&7q_S(LNfOs6ZWBxrTAO?2e?U?azLAj)823_CT5O`99RErpZy#z8p zkcShXw}Am@3%cs`TqrX@rsul*EI{G|aYMlS@cBXk?qoJ#gc*Q$!>b~>@HG41d3;7j zcDBnrzHwk&E7~!)?6H80)_p1bN_;%ahfjA#ZE705wK@bdS_AIGM-g^b``ujAIa=D3 zXQc;6jrSQ~;eEHa%U=AEo#z`_o2zO)N&TYq*V;y8uQqt8sii5lV|tG8B`Nae7h=N@ zgTtLUotfzoow7AJi*-+5V*3|QCv{)e!Pc|PHK0wHZ?;U2>#Sq;uHHnBAK>kJf%PgQ z0PeAl@1#Wv+$CG8eeUy~zM=G(Tq%ckGN+UELoQryXZQ!slt6(PJ zI0WaXw{dVJL=*jHmV93!vcd`0k*89iT$XV=?c==(q$iOV3x0YtZ ztf1v4KA@0(OQmxa^XZQLdUr$Gi?Yg#fS+pg`yefxywqqKsW=qd2E3cJ1>wG2X8ltd z)r2;DD3F-41X%#TAQ}NP5bnIzib@~KdVJ7&WV&dG$~hy3ylL`vDC9uHAW)jfaw&_3 zo;Av+M&9-=e5eCPWH9S9Xx^r~-?WG3R-S>lR{;$Kh0J_xZCdhK_`I&fE09 z&CpGi0iBk#7J+$rrS?TK*$K_g0OK7ytI7PXPVn~prunagj!BXi_T3&Q&_%ln`?j0{ z_IH9;-M1!pm70i_0-Cy^HMAw0OI2T{26bo*_6rToTQ!xMg{C2~E^}+Ti`Ey5(hV=I zj*GrPe{Ph3c{8OsM$}WxHD{#y?JZQhDqUo_T&RSuIIvv^b53im*3nR?mwqk=**f`K zub0I7usA=R%HFxpgl@j(`njnE7I$w_>MLY4i8)kho-SO;E-jG!H7g&@Ea3+pM&W>K zN}~10OVQLu#w8HLmW)wCou+!*kEnvIccj^wi667`qdC|rvTP*o5emrBEw@_R6A#76 z*Kc_-#jWzg&22?O|IrRL$|Mro{NVh&s)#h^rpE_5$*$7er5K_`W)+AO-4Y5vBis^I zI$wS&anvpTsp+aPONJ!j-!XE6GQ!Z6P3oYI_FC4nhBUv5{DA3rQu~>MpRW>}hvGbM z+=m%kC$Uj$;xg*@8i~C~K|wc2N3{r}H#Q^>%fOm+8ymVq+p0s)Y|8DA!Uqv+)l46l zA+J$42Ik`Nn3XPkIEsjmEy*|M>{`Lhj(oq2moRKam*9Ln{^+f>TRleEbN$AT^@08S zdD5CbFZ+5GEp2;J(>td76%rF^S{XhIQ-~}U{>l(qmxV2-dDp0T5c3@sau1QV)5gylrDv0q%EZwreQUTm$@T^bF3e|@Rq zSSKBdo(GvTeKcZQX0K}94mPrNrR7XYla1e|Yl(6y@+*=F>6Y6!7u@^&omwPjeLga+ zpOjN_bQDJD8IKh61NR^wqHf6GPM zm9pvXhN)0j+D}gpr5vs_Qbj?DO>L-hTQbLA{G)3GVNiVYL$S{r4`;r|J&A%(i#Kgc zJc1^5is0?yjzxikEh+b-Z}EPwe*0j^;AkE8AZ3EZlB5f#Wbp%sjYV%UGntzm8yH{r zJ$tz5d2`TPRR2yK;tBc9Umt$(!YL_8IM;%8kN9s=e=Pvf z-c^Z5k9C8qwI0DFMyen*;|ao+Aub##4oQhMaXq1+8*lx7w0rdP! zC4<`0A=FG-mHS~49%@}U<%V8}<_2j*R8_kw6P9MdE@cTi15Pis3GzvtdgJ0hl5q2w zX-*u9DvuFu&bB*FAO!_z=}3}`3@>L6gY?N=jhEomd{J6@dge<~t2?uu{8n@#P~wI> z+3I_Wxf@&Pm~MJ(DtXnxPhkk%Mj9SB?F=24T|JS|U9NT+)BWlPok8#z+#{{h0i7Xj zQ{L=W$>-jUfKQk^ke&5JF62jX_0QY1cY9gdja9MN_Om)q`VewO%5UYP`WbO%z}Bl* zoc_zRu6QqQYbD(jBA%W!?jm!){-govL6x0!!(p8t73sU#s8aC)o7n`KTQ9o4#|07U zhO{d)tbvIS&|}AJIRa^!;Y-y|_Zuhb|~tczP2u{lj@J zobNnc3CdZ<7>Mc@)5loa7$$cJt2^G*d@j4e%rN%FGDP1%kzU&~cVuiLq~`b#d)U<< z^&lq3-hx7L#Tvc`*X(8h-s324rj@~p-8&4En>eelBnOL0KBc!YtTt+TAufWBl4w=0cp?Ppt6F6oY&M(KAn{xT`rs|CbbTId#ie?=Rf7H7{t3tgKwyci*`tlY0xfIXnub-$hc^j zLo$6%Z-&#gd}%3N`KJBTkt_glqamHT2B4z6bi6CyslUCg^t8^e`|?CysC)eWvafOQ z|AE!!zfnW-<&Ejo0SZ*_EXT+AuN)EqtEH=Mng3N)_wREWs_Pi4|LdHmFM!2kd8SOg zEU5#X7O$>!(_P`bdK&6L64Lp#p1%0&YrRm4_y>~*8CjrpfbJ}T{?hWex^d=zy{hw_ zkVeDGg2q_e!a`jah`FM>_^;;@Q$4T^jV1V0zi0_I1vWL{T}#74(_G&aB451d=LtHk zME$eDz6jvAuyi37vX<)RmfBi0Hh@Z)=4_ZQ-l3<}s4Kzw?MSZC7!Syn2ba~Dt0 zxr-;jYeK5_K=tyJ3k1HNH#3~Ocmh?;^PitqCxM@zaxlQxQz(EM@+>e5bmqJYygol3 zz-G6lT9GR9s=_k3?SeccbfUmO3w~(kdQni zK)ADblyE1s2Jvm>AM=0gy~ryKyc& z)rpnhYu2+cg=MIgdwu901b^my5cDk z1^@{w(A)>a;awHUr45$(%y!}$W5NhT-?2kx1489P_7h-dV+0yWAU+OP9Fq$h?0;uN z*?>^Wi)^Uhh0wWTFOHwLt3*iIIbY;sT5Y&a^&)oZQ-N4DeW zwzr6gV9lVad3V^RYd1hVV&_<5MA_Aj>GsS0YWVi;yGg3yIeep`Gdf7e!h5g>1sSj@ zeJea%qg1p%j)J@Aig~@~8tC66MY6Eu40BM9i6EF5zfO=fCBqdLEnHI(qqS=AX$=+I z6f7`RGtBKnGMajVMiY=goi6Ts*UdMput^W*2(#yb;~^*WI7PfcG-GV)i$@>Gn=J_F zNFGTl5sK#Ct;a&Rp}`aa(4hUZ`Y>HxsH8QZo?FNI+%j*z8Ty0n!9EoCer+=igL;@R8j)Nf zsYLB_KNMThl#<>WVX3JacxVd?pgm zEB>A-U2#qRMXwh1B0oZU6J_ArTag5^c)1*&or-S+2Yx)|^jQ=$NH3I&50hR*59IZe zDa2YY%}Cb|a8&&U{Q@VYtyvDs4JBZ^DPP}G)ni(ELmahRm{1Il*9F(|?M@+Rz~e^m zEh^Qz{h^Tz^JjBEYrb}1<2f4byuj3EJ?Yv|3rcGR{O-P->@+kpK&!*AGp6LzS-`Pr z7g_J>4&;pNW>4nx=&07lJ}4_nvX8t&$kbc=V> z(QCTijb+HX9bFwL zgS7fum@t*CZI$wsXNTrg3JBSGBInK>Y-exkNaUsL+B>Vxay9ws)X#IkGThIf>QLNm zW1NYPzZRu>yK!#0G_e^c(R%M+@%nDOlwgFJc#( zH%Zt1s+lZ)ENC(ZTe23D5j;^9Q;IPkP(;^X^juTNMKSwb<~j7B&atEi~1nOjKzM$lT{7`3kZ->U}O`! zn~cQ5w~$Tt4zoddXdp&o3~Y)ntAfNVKmYO5+am$BZF%yE&ski7%K>vnw-G2u1SGxn z(Y!Ozw;S^MTha71v!?XxMn*D9v+T9Dp9Ie$6j%x01s;!MX_og9ML?@zc&P6a%E z`uc^LpTX8x#ff_N0g-6QY&vXFRl7-ft0N~AQ5JXpQt(kS^TXD%!<#Z2xs$-||_ zwOMNO!m{obrC-BxyFpeC+=E})JVJJ)4Dd|GALQBX5#HnAlMjj29LUSY??<2sHLz8-8Y50Mk_>axe{^3%-u}kgnzMaw6mH$w!mDq zy8Awx%w?FS5>xEuDl*wu!-;Y&q`ezFJE0kJ}s-|OylsymuDoBed69XkqK;! zEyEl57W#cbOZQ%2q}<}A{VwGBQWbT|p4Bbp?y%_*Q3PF??T99VrLCETD{F%f+LI7h zVkO16FIxIA&fVD?wE4|>4^lpV9a5Ki3~gq^b9=tpCx2BcD0yC{QL^PcVHzT~lDDU^@!yOn%zpL`1-8J6`SzIn6y zTgp3vYRRAU&R^)AvptY+-CLXanG55n9;9yEN>QgH|Gzq zvgdo9$(6@H8;V(Mps~isv!wWBdQ8f+i#9|$H$1H;tLVAHR96+8S(EzNl3sg9W-#dT z9Arg>Zl}fi;^e8jaH`zVPZO@-3C7?v95jN792T9-M{Z_pPuR@vWUvk@u|p4CWYxr5 zFyV={dqv|~rE1Frd3zNqKElm$!Fp7e>sOOMA3p3N&{g#;SU=cQLaJn1$%m|Xn1ewD zuIG-jEZu-0j-QwhkF!Rbh+8s4S6F;^NK2NwkR@CF(|2Mct<~Kx6zhfC+-NDpk97%? z2vAu?rzyzqxJU5XKj3`+^VsJ*!#+|AGiJ})YNN4eY^1BSdnS${xyg(+)@o*P#;dqG ziyVXkjubK{Tx?tuSqI^zH&3;oEt}u=>lTN2xtec)A~nQRp3_gcl2@1F!eVLvaBGkb z>wU{X@Lh%rk!lc$@XiB2^g*q}Z(-|N24w64DzF9ZJ&%_Y9!9Iv-@DroOiv?SPJ<*S zf^xIuu{6SpDKV+=Acen3s6_D;@1jvLyb*2Qg#3#>VLK^wo5uvUYD=H^5O?~$rO-cN zFnYnEm~F{3G>`OYenqw8=bhQ|i=S08Me3e$mq(aHIo_CEfI0Ad4c2svBkZ1&ppaQjRQs)btv0g35rfj`8ItmWQF>0=u#vDbZb=n^|wT@NNWfyd+_k z7q*Q_dnJJJ>giPOqcV0x1k*P8m`5RwQ>635Z(dj_5vh0yAifE#NCV#vOJb%yq!50R zw?oqOGNs*3Uv_x*+oO1M+^RTOw%)C<7f{@?k#{@pz7PD)HlQVJkm+0zcI#ITrGV+{ z=>^J$z!SNbv=zamPwtElQ7*!ePM@%QqwpehzsA?+O9az7%tt>{((1~53++J|9ga4& zGOsi5)Mb&ymKhDW!?0s@_-~m#ju48*x2duJxvdrZR9@vM_UTcA%<^jcQ08J;=HgTN z$?97028l~+{{hfo}M9O^cQ zmLT1Z&*! z?&Zqe3g^)D-KlJa^%N>;D1iZ1ok~p_+R>lsAFZ8fi}Fm;QQPo{>MQf9dlgN3)4y_C z?DIGzEeQzi;df_>a|_wvDbz=%QHo#;ENv&;L?~BQ**w_zEO^ zlT+w0%Cn_p&;g7g@`L3W=~KCv+ghDEfXRjO?Q+^}>LV!;>9|j3N4d3+yg$a{7&i0y z>^ZdWX2GB&D60-vEW;sS2IJ_pZ+F+aTVqc8bB}&}@QRD4%XrE%m4}%aO#!s@i}zd1 zn!E`YZAx60LQz-Cl*?4tvGQ$*JpjtZ0IW5jWaRn959+&g-Sr_nmp8f_iR=?#?)U3g}xpAm@Czd#oxO-xm`98E`Yk=>A*!B;)*~z!$7d3yGS&(&V z7t=Xf9V$CMAnKclr4jxDg9D?hb;4&+iv>tQ2~lBy>$9Kk*X{jaZk7EtFR24w$Pf`eMU)L z7z7m?t)F9o8U)v#$Y`vaS-k8l)@w1V;ZG1kIX;$pE5T1`ziRH-EmcuEHnyn&9ya6% zG*~Sf3uqcKTBy>&{N+pe!fQK zlE&=aJ!2vYC;vi%*iePCIWv|a)j-2{@5{GZmKC3fCoC{d59AClvUZd8QVEM<%sH6M ztq&<6l37^gErn${ex9fLvQR7w9lN4v{3&A9p-u3Rt=T!7D5Cz~oz!5%C6l?OCFJqxGM#Qi-2*D2mIDG7fFtp?oo5jnHLsVyTW zy7U9uZa)?CJTJ`ixsn0pUI}fbtqgw(qdv?i%Z$5;xowFFd}hc{Li)5%sr%=k=P}0o zs_?%_ifi{idY*7n7GU-GEw5-M$R_v)dj!LC$h^J+hDQB?-p@1=x7lL8NpO^A zR(NByPKq6b1*Lct1jc4jV+=t(O z;au)DyXlB}$EWP6am<<}wsADS<3M-&OlQ!33qgVG!V+Pq*wDMj9s;g)?1=2jJFYqz zGAti(@`?QTnz#bK`94Hs!Q_{Y&wr0!NYSK*>N=r*S46s2jH+Ni@_}82)u0HiV;nPD zin-z|;#^TF-SJ<$2(D7*AgJjEO+O4G0nydhq>56_94$SIil08)Q5rejI!Qu8wkL@o zjxVo_*|OzLmuCa7*+L!6FTsv$aF=0tq2qrsC5m2A_wNX>&WT5uM5N{ME6bHYt7pa) zq_96sR#(AM-`^m5a1gV9@52+dR6Q3X`j3&HZp2KkWjyK(bEpqu>D%M?@yjEUp&v3$Ir+|kD z0aZUf!*62)4&_4~N!4cd_(u_Lz9Ue7+~A(ek=y6U4vZ{bChJM-c~W~00&G|_7>Poi zK7x5qW@t*5G6H7-L?rQk)_E$L#M0VnDQ087D(IoFV95~gG ztVa>#NZ(7xE%{Uo?<|6h>Bx%B ze#i+}vyyd#H`^xp;$D+PVVD*&HzY@zKl%v^>7*B#O3@f!a8Bm?QDqO_)|*8}u{{wS z*-R7uu{?avNc8fkhd*Yu#9_A7lS$M*l~6Ll%i&~>5RdVIipmOuRA!sK>o%aQl&X6C z>EI=4@coi{)BJ{%R&cnVsBmRgNNgl8b+Wih2zFC72gdyPMEkj2rJ}WRq)0D{$4+&m z{F97knpsSGzH!EfjJ~4uX~j@B@hFCTG>`9Y)UMe5-Pu8!wmwq0V>(PoqXgLbsZ>`qF=*zal6|s%kjCH(QaXF zS?#VxhvT>H=>@hQk3B?X-jEkQ-s~FVS;^aRsd|oB>X%2i!XpIjODmr9$t!CtMJC-U z)n%meVgKAG-BKdi;7AoT??&ctyn(FCdzSro40K2bokqf$Mr=JAo?FV1VJ@^A7Y>a| zKVdp_BZ`XJmto@JOGvw|)mB+|?@oCcd8Tn&Axfp&U9i@#1;l42#a{cUJ}?R1D`BX_ z(qytK)f1tNUrfa^i3*$iD?gY7*GIgSc#&aW=VO;Y(n-zg>l@?NR9I*6xNPfZpY}f6 zLb-ZlZ|c(H?*_8lcQ+Ak#XaA8Kh_MD?M1<9kbslI>)>fj8bl<|hdbk?KC0RJffQe< z0s3wJlm+!Ur2 zf|0M`IstrgM8R;fEoWOxC>m50^cVgi91o^D_w>icSv9Fr8?5XQ5Q_|4pNVI)D{w`9 zI+>4pqa~RECP%Tds-tUs@%lZEJxv-6l$mdrxn1%7x1lRXTF*r#l=qV|;pJ*ylA2Lx z>Sz`;dW9CriX&#fNzcV%4Z~UNB;3?*3bTBj$D!8Nnlefw z5Uq?Xbb9MerzSHFRITR3)Lf=Pk)M6l=x~|#B&G!7Sz5lMVk%G!%riaf_l2o<$0#oceKtrz!O(j_7_3yC@mU4Dw?awpjPx4|ajEjY9EU*2@o3U8sCw z+3h|`mFV^RukbM+4e;^t_QMo{A3(ew46p$2-A|2Fy zTkJLs;`gzoS})ib!7BI`3!pxu9j5$kQs~X@ zloc!7HWR~}SDhxiCz|W2y7)%c|0b>e99~eOc?xFvjeFU8O$KCZnalCzJ+P?Cx<8>=3Ghv3aV9x6fW51&XPrD+W8I^(u zr5@>HhNMDYHw$wFSBpi{YCUYn*6Ca+FG6Jd#gOPhPu1uC?3+Ky3|rLK@TYtlQy%0z zDT~9iAS~98!$cW$gaR*;d%dwvwTZ0P8oixun@#+1jwk2U^P=J9k3=DZ(eLWF9xG$g zF?#p<=v8Px;r&r)(@2rkOt4#>oW{a5AQ`)=QxR`>m#zhNd^L+x@pj9-Q7hOURc+^y zzWa~vsWS=9SB}XoW8Ui4ntS1o;?Tq>Pa11E!}rdhcJ^g-EUkDSj_W-++Bv%6yHZ*WH4TFf9C(b1a~~yA1bhWXB}PvhptHc6=EmsWQoEUu0uQ^L=Zs zV`J>zF;ZNgduL!gCJhT#IFINy@5%kAjCyIhVQ=~l#h;{gJdkLY!=7w5ts1h9b5_4^ z`H4&(X_~`kA&1gRtncf@4k?4xW2ScW>IcRn4{3^>oDqfcsL}KB96ZNCD;Acqu-f`j zezImU*>HF)Ieo+gLuKD&L%D-dh9W2_m8eDu1uJLkrbzV}^Gbt=hmLRb% zL=uK~R2KEIpUrtjbhC70#$!ix=Z^8TmYiR-;om5cPua@<4)rQgpj)>#tspr^_Iq1l zb(;a0a!!SirIt~mg3P|Ga6v_~cK4mZaL1NiGPPXA*xjzr+HgY2nVU)Pj{;%Z4-m<; zKNp10IBYyP#&Wkyko(HxL|H;43N|Zgu-au7l zy$2MEi6?1e&(?Zo;&L;?JdE(*xeSlL{sI&HM~x0YmX0}KjZEX zR;ftQKrdXq1#YMR5~Crf2bJzk#3bXHC*Y#&TVe{w4*KfG)?}q4z#rlp?a@p`*8i+* z0eyJ%%@5&%M6%*C>H3-$Db3MF>2Ztw7PO^gw4#9<4s9~p%3Y)7rLWpv?Xqur-hP1B z8;>(|ayZjEoX*q&QgJfKbMtx&qN1{#L}bi_M%YxBH%JqHpEbP^U@4IjWv?SJ-w{X4 z#!G57Z9h`V!|?cSX@9PbCzFYBZcGRKFtkbua*;&vyc9kHnW=KiCnP;|<}V+8!c&Jf zS7$;(I$@W?8S<1YINvyy%|9h@ApS@lg)@4HuVMYN$8z#V<3gShR73^5WjtK?52(F7 z{p^998w6SVtGm!x?TyPJy_MhXWvSwZm|dZIX~7bkuX_6lH__~m#Ip!tmDNP(7fW8l zr$?`Rbt|?g_|Cm!<5A!uVT&X(gjMU@NF}W;j2)M*inSxp{(W7wgv!bkZWYJ##RK|k zA^kBKok&b`(9LA^hp}mf7IbsptVqEqTE^|IDmHH@BboXSUNqv?sNh7JanazE7)(%6 z-%MKg;OFHKm4F8(>O>399y595(ofsJ{%gG;Gi=_+H#LDV%R%}BUZUW^&9sc^m4tCe z{=NS-Ba-i&9EliM^C+|g=o;WiMsBuyC8Vv z3oOiPbtBv6aD5se9OFnC-U^I-5Ww^?K^=G=@W64Q%760{?D+i`>J0@NK1(`P7^exP z0R4)vq_#BJ%Fi}GIxD>p)wPs*4R28-jEzFotMKvRxoRCAPIlXWU%7)<_pH*lQ0u{h zLPlc|hoVx{O1O9F4ofLYuJGz7ZyG(=e&TFHaJh(QT?cbe9zH^raDQHy6z&74!pw5w zf_#t0afFt*z@B7j9zy7M8NMrb^GrhC{#J51nbG;n%Dk;6ymUM2t;_qa493u6_|`pUV-jYOu6ZcFn8QP zGsl||=E_wwcD4#Rb7d~T>(N*5C!0QMp4%009B$*{=8m9|D6Pmds1Hu)A88)o=lXcV zP<~%NuC&Nl9v-~dH!kd8S(T)ibIV@WWC5`ORterX;bk`{MBqd#^ucF7Vw#C|CY2X) ztD^2Z)!fzagN>8eI#%Qodp`!Hd8%&oOE@6v$1+N!FM6yaxSTL$g=}ZKRvb_IZgu%O zI-n;_fVr}Ak2mg5e(zRW*9o6U5Q>zGaaDhB32qk2@0k14Hojl>Y9WZJki!X?sgX@2|Q zjTN1Eqn5S)O%QKggl2-Re02C^VnHd5@^i%!6e3MQ6%_?pw4!;XoCu9O9*~<&N3wT%z8&zq+ZaqaI+;pNz+v51`I0`=VRZKO| zRWbc2AH-A*?-{e;f5b298e)-IsTKZMQSQVeZTx5S`=9#p!L#3CbUXKswCjcsJT|&m zM>!fZ@M&gf-%nQBzb6injTDXueN;ex5dMZppdz%YjYj09?qjCjewxBA=x}|8 zvB+Km6J*00KZ>5^t_<_Tv8V8vJlc{I<~kB2WTXt_`lg{`Rj(8c8CtTeVq zdXdO3k(Q8-@uaLyKdCEf$f)b7Q+)TlTopE!(VOW96$AU;$Tx0QtK$2yPu3)0I7%$N z7v-rI^VoclB(!!&+jBYGeu+g$pv{+x74)W z%bcDLAXc*wLeABbdZ9j+(IHg?OPJQ#e$=qfJ8JEL0g`sS=R{IM6F<+9g34RN1NDo$ z&Q7f_p=|0D>~N$N2DI#Pm3Gt z$_hF?xq;Ed4_Y>O=b0lctDvighOtoW$<^W1ikk)bw8r5H?NR6hd3lpp@HFu1b>A}O z4uSHSy2Mo)GN2a^TH1}h7{BC|DK(N06vaJif}&GB@V=Lze#1{S@5ddQ&_v6Pc}>!Q z70WoyKzw_@ws;miUWZ5I0zdqNo0pckHC(4FO=vvoVEHH;Ej}v1tsZc%Gq05=T70KU zwmj%8oby4wcW3_M@In<_}kSc3tkI>U&Ch5No<}!fiN8 z&j`$SvtX>EI3l)l$1!M=-*8kE5zR`?D^$MKI+FUHeYiHF!!+nAjYBQkUf#`8nuu2E z2IMKUUtrf%^94;j6z=WnD~dy0$9o zv?cV~J=uR!j~Huf>8t;>rsuTb^V;V*??Shr`_mb;O*FxPUPJd%Bl!O)SLsiu0>Ydu zA${jSewHN=>IAgfUq0!DMzG&&4E|FmW@@Bv2MBz$E=#Sh9 z_0)lwDkF=(lun%XU;fXh?F`6Y%b8AFE&ur$FC;qswUFtL&>*0p|NlH;*7_D!>PF|j zjF7}Oh`lF7+xI6Y$S%DhI$)(gtj9NMoaJ3Fw3_yJ4O- zF<$!`{zi8w6GL-;8oEEd{>w#u){%In3;eI=H3kDtpI~!f z>jCCTiw4;CbWOk(r`o&=KLT4rcN-R2J>l7*7>2&WiZTVnOXk}84M7yblRc$TN%s~bFh^u3GBNmv0JMtW5`X&?sC#FB*V+avo&#Y8ozB+Z0dnC15(4D9z3NPWaDe`FI?kW~zM9O8 z{||d_9TnHo^oK?q79vclB)$%G<3F|F>oGm!$;% zd5XB;?aq9Eog!Xo0C!##CI7klsq5VXHj7Ihh%5!GMrMKOY;}08#o%kX1Zv|dM~T#I z)VH%X4v;Z;2}Sq%ZG!68LtmeEf7KP`fyYnX(!D9dz8`$;OYHGw3 zph8HJNh8QK;62z^{!1(LsxdnHc#>Z6 zuR%pB(Jo5V?}&3iB_TL3fZ6J_6v_&Q1cJ&K>n=hBBQQ}^mT6W)ueOvW*e3U3*m&lU z;v*+^t(4fe5+l%o5e2e5TK-S`@b~=dc08uJZ+fuRgorL4n59$c^57JWXDMoav(};4 z<(JCbIqotdj8%J1wQxM347H8UdZnz-rk(mSH5);ea9?wZrB+9|9+sgXitL^%#&bmV zhloGR2Yy0I;s<90s})~a-htDnS=a^_2I(|r5LI}YYrJ}})$%2nwech}uB&SLq4YG6 zz#!=bPjo1FQIvTJ#h9+=tv6Y{Km8qlwWjGrqNDq?<~s?W7$3`4!*k4HVBJwyd-9a8 z2uNReM@%=Nj>^=jCac^S1&?FN#){nywu}04=gSe+JlCE`yaseAk$HZSbgs?dO16GM z-ExFVU6OSRGlBZGAC!NugXh~J{$a%j-e*v`Ca3+9%&vfCf&8a1?Hb7UNa~oUwjvXu zELd`PoJzYlD({JX@n42V^{WI;nk4ng2gW+`e>*{03n3wrNIGE_4ri{169SQVqwbMgA47eGlGZl)#N5G}qsExsh9)I)t< z#j&uV05MNP_v8~lrbplE!k)ZZ9lbl@DWVg2lIc|=dchpp#UgkM$PO5&l{w5f? z^1fD}>uGC~>uTBi*MW@vLvNfpUOaB(Y>mu6FJEBGxVDQUI_?;a1~A9z z&O~4$`__T2nXrm(J(ii#4&|~JkHp}D{`?wc3oYl79wHLKH3zB3t#)e+`zvX}9(r}X z3p<%LW2FK=$A{zhu2Ef0i&=e6k|A{p1I0U6sva-(c*(3%3Ewy8fjw138suMes#{V$ zqGI5ZirT1ldo*%h?MA8iTsZTSS$u6jUHkc*)LHqnMIGwL_wTCk{U9K7rTdxVh~9c* z@udb`X-?NkUgHICWJ%Pq!oU`p3+VC;ih0`_A8n|iXm*U@f0G2d;?##5iFFH6+`}oRtT4C~h`T3k5{s{+g zICyzN_|h`7Rf9vZ)agJ(C=Oh{U7GiI5Y(=?p&=%YrVQI^1rd~ z#F8{RXA8Kq6XUHxOSx~gyiDtQ(&$5}C)D#wFxT$u+o~nR>q8zR;)}jT)syIXb=O_e zJ)bYVBax{Q(-|ekj9#Tkgw(5kshADsJY!0>9&sq5@3O`qt-TEud=sOK_6gNWfwO;9os60#Iwm+Z~*}tbg4D;5Lql z$8GQt0d;F9TaV|r;Uk5_1vJg!)&fribUiIRd|j-6Gr$F4znuPVg9{kgS>0YNDlYaf zVEZxm;}Ae9XXR{R4X^_Il71`#6acu`zogr5Tzp(yTzo=&JUo0tV!~e%@h^##^p`Jk za_T$8cc^X?Jp&UH6T{s<(~o5UHbDQ!TL2M0hA(Cf27m(aqZcp%z`y_iaBzOj=eI9> z3`{I+99%pCLL%~8+AqmW;kP3I@H-8kfRKXn4iz;GEgd}r8#@P(^BxyBh)3{tWtfPl zn7D+boV)7z}_VM+58T=|F^mSNx zL}Wr@QgTXaT6#uiL19rbqNKD8SzcG)fNDfHHMg{Ob@%l4^$!dV4UbPuPEF6u&do2Z zZ)|RT{ItEZyZ7bm@yY4g`Niec^^XMr{x4iV29(SG!Sr8`ct1Y;C&KuDB24@z!sLG< zO#LUq^nW7E{3pWfe{}vMAzldTOwl2+y8FS6yui!z{L0$*!~MmiO2yMSXh`?m^gTN zI9z(S@9Zx$01gH2EzGj93*u4B=@f7XLCr13*J*%ymWhQ^^7^hXH*SIW7YP0he*Xa9 zKcH6^X5i*|3#xU~x9Iyj^tyZeio5@U-K1Y2_Yc7R2fUq_{1t5f0ct63Sq5O?;@}bJ z^8H%LZVN|2$)+PHXZ|vw0L!(m{tG)av9N3WE4Gllg~A8VG;d2YQ`7_czkM^ zG3w&I>}pF^ZAzx}Dg>ds_=cI+TwsL;%X{{QT=h5#J2wuMMf0br=@T@?OB8ptjQQ_S z=`!1UA_MSw6_r^Gp`nU+E~F03r_RRHB~MIBN@MKWpPdcGl~@dnwz#oYx^Xhg z{B)pEDEZ-AE`K&Gxx}HW9!kByI3r1V?5eGgK|7+X%T%2}Q>-u7%5c&g@lj|_e*ocN zD*dT)l4#OTCbdw`#?ss2Rozqh;ucay%A#s%nkWJE%9aRkXf_hW3SUZI*Ew>yQQ-wk z__Pb#G|Ru)ZHw99Y*z6&-i;k*B8IH8^$t6R1v5dRV^o5%vvTM&|JA|lOh{vBFOe#} zx`qpSn%6{OR&rv!>TZM4{UNV+_Fnhx_T@PanS82L`9rHejZ`6|pHYVNd%J+UyJXV8 z9sB^8t+d}&nvUm3@4I_TpuO1#Y?wkH(!%&eF+B=+7d2o;^xsR8J`w2&QBp4SYh8F03;~WdKjus4@p=H)nU6ntSr+RArmjeD zTmAI0+mMZaT;EIT7bEY6esbrQHkhBko&Bt3XSZHtAE$$|Y&KZFbmim=1J*8%L~qlF ziieb;K23A@5#ZUQtH6W%!78a0=T+X$ZCOvE=ua=_g{Hd9x@r}kz~5c!^n*WdK3d_u z``LOf%MR&o?8n3f90_kZDs|L1d;J5z4?QVzGa}OFY!o06?_zs`%^M_W?;LEFZ73(1 zSVa^@F{GjC`g)o(gb$s^4R*zMDXs$PFb3)O9%6N3$xIt|Ts}stH!bDw&Ydr^A1!9S z8L?S;#SZh9?dcjo zkwSeZ2rsp8?n{P68t2Y9efo|K)&+}D(W4&z2VJt9h>k_Dw^SD-YbjCkke=S8m!Owd zyc~ANZ=AuVAhuDE1H5aOCf{kQTa+dL%dhr8*?^WR_Rth%%nUN-rspdIYy0aGRvA0b1 zkyG84j}~em^82)Lbys-pYUZ~ZV?-Yu-<(Z}@uN^T;dC}DFgs!DE9CN8xzUe^^#S^E8HXlar7x1Ab?Fi(_6G9LmIso7SpvIGeOQ(@CpnhqeXv0(u zX)Rlfz$u9;C)!W=!1Rozk!@69jx6)~9q~JRO!kVXBgo|+FO7NN+ZVGl_VN|~_MaVo z$7xO2gU)A<9QGf6qWz5bF2E-K-*5eY;j-Y{*Mf(e88^Ut#$j`l?aF!bi(ZH!s#1WS zY$Px*xbxA2tEcZ@P!+;bG9W!)!-jwMUn`A%WN@;I!<`)80D2Pm8~ry5f-;fDnwPBq zF7MS*aPIGSLghyh=9fJmf0Fs4`x_-0qH362`IzoS&2|T&{1ei!DC2W%{<@-gK z)^8LY5StCO_PhCUXYM8FHwuIkcz;;`?r#i8|3*mXb&8i_1iC8fEo#Oz&cCbe z_dN4K3Vj%$P?ZYl3u9Uh;S%R)i1zobRC!2jNwDZ>+&Byb^N+e2lkf;7v1)p1wuXMS z6o+CMB__s{1Fkpxrkj3$Bow#WA9?RnLO(xG?=q2H7CZFv*f2(NDa)#v56Oi01kR7B zhh*s@p$fxY@{_q4c+|(1a!Tr@wkG^djL~WEBV(d^{kOf|kpu(^6!VVURHyn&+2>8q zEau-n&DOomq}(B++KRsV^Q&@gJqkY#DrJu12=l631?YLumWxl!BoR-$7&&Q+f{ z(Mcr3C+E>kVD{EWIhfK;v@FTmU^)7Rc$7D$b({aly+z7SEj%Q{=>c?s**T;*e#$E< zjP9Tk>C4iFe3#jg{rf}I%K)^rV=1R=0%M?C&UN%o5COkD+=X_VO6kAr{Hy!nLZ`&z zlJe@(sjsN-aAZ#dGfUz7c+!LY0qs1n3|?}SLuJ{+hJ42c;gse6a;`@ey z?EYJo?=zxKMFKpwS7jV-kOMzwY1qq_P+4W(mZ&yFzIz zUcZmQ5rxdLzU^q=HAC*7rL%krNAEuhYh8p3J_)6Wazr&S2;13}blLTU6kvcurJ5+2jK^Ik56q&PaLv+sT&IgU zV=4!un#pUPCPdrfiDMoMta7lrH_~~@ljAI>pxn&s^=kehbJ&4IjfmAa;>f$dYILDd zfi$@%HY_^bNsQhtvGGwUghf7a_&9#j8u&8hS<=f=X>R)*wR?*~s{~GRZ*abFln;2> zCc+(?w{AD7_jZ)P=L8W!F!7x08{xwhQJJb8{C%D?fB^z5HO(sNsAqrbdFtz(RZg21 zqfZOUGvHrJB~1>5A}9>)ftMH~o6TlBNz6`icBp4aHZ~V4Hgm;zFVCU<5_onkG&=I4zT|i;SR*qu!%WQ|bLCuIY>x8-L09n;hxhE%7yqCIy&3|^nGrj;dvR%gVO9w~aECyvmizr5*YZQ! zQK0D}0Rd^zx@<~=U~;*WwHSR8g|*loXZb=?HX_Rhh`Q9R#$;4-a}V;Ml$8m@b6qF9 zEiN9_OCr?}AHK%+oI>heU6!wX!{r~f>@U(s6neZ)vNT%pWXY|+9a%P3i72Ggp^xcx zfqPjNqe2c3s2&P0X;*q@&x@oS={(_+UoX8M_}G(|z>6K|b{JAovgH?5;3KnHf@jvK z5JB?FLu3E-M;}FMR!kSVA#b+$&O2;F=%FCRD>B3tpi^A8O0ZVl+}| z7&{gy6SJS~p_tqvl^eU*ZiOzQ(S$P1t$g;AskTK{>>WYMR5~E7BNlxHcVDqE89N%jHc4ep z3?9wdiJpYBT@IgBmLVYqny>7Do6IrBNT*mM_{{lQUk1pV`y|Jgv}00p(Ns;%*iNky z1lAd&gy9eFf7n(oqH|tuBXrBui=ae7*p+)H{E4x!CG1E;MC6il)v&JPgDoZ&Fo+{?d+<0E#Hdj;zJ%=$9Xi?&4zDQQ!XYFhuo`Nwq-n0 znG%>w^(oW4*wkcoumpz&j7I)d4G|Sx( zce&Zymp+SXV3nh$Za63^r2Vs-)|Of2oL^C&-yv0xKQ2OHndnb-yBsbrg2BLNq#mP` z>VS=<7`vQ#d)^@62hy>1#`30rdIduf?Ob~rT9VWJ_r<8;Z&F<5M0p$T5%JnN39=0x zhV;ZIHL`(aWe?8vt6KC);{pTIC(>e6BtKfmd9^*Y>HivBl}PhFv`*4ku5eP<;GV^o z;PlT0U~VnBPG;!3u-<1kY+DFBPjy`)ldUJO^*?ctQ`*k4;sjrOl03qBA;O3TJC!pv zODiYg?1p<%Aj%$fkC7*)5w;go;ehcV@IgEY#Cgb2)Fa{Aj- zlFuxeg{Ke`<90SGEy3O{=J*)Zq9WU_2z`BO*FR;A+~Defj9#U8D(HE4eQT}SKdjU^ z-)3=qa$zmVoVqDJkttoN0)S*^uz{S3&R%jfrr1`Gdm}hVq}+`T1~t!E)k0%k2F;cJ zsWsJ40Z|1Nw*LdN@jDNl-xfqHW`48;Dsz9p6IMjc#tNUlmg*1XDs1ox2`MXlB zvEGEyWN37mGmT@wa|-94AQ(yx!{~K!ohaewAG07jGUg~WDP~2cA4+wpMKTZZJGwi) zxD+vb=|5#~L+#OQFLgJZ8D^P#Xr;$BNFxed&!e(!_7M$W`0`3OO_?J5&b@?UjB;$01K1XSZvCM2H#a9@| zsw!ZVG|`jcxw7R8rY2%=V97}Clp%~}ua!Q*g&3PLm%mQe!8uFA==+yQK;nGC+1$5i zryp>$dw=l*yL8#13_n$%5GGYI;z}J=AHSg=ePGxxSH_FY8*u*4vc*s%XUEmlvwukg z0p}>{lqo(r}%}P$pma-P($FXu;JFy|J`!iL2f# zKKhWYL|(gaBU`UsEQkp#<7c}dvOSQgaAMANdT;ua(=X;Ov}v92gs+XHRvsqLwlt{V zW-U$GPw(4XHGt(yNY8glzZ!YLvVgK+K)(r==3rx)8o z;VxUENCI;nNUoa^4IWOa9JWyI7kg+eX&`Uu*0am{<#_4bDwoRZ9bPQe`w06Vfa*B& z6d$tb_efM4)v7HxG~NXZ4C75cN%{JNQQDBOXq5U*JArz0d1lBBr;R&D9ayKxg!DB${~F ztsQ%dvO2l^x)F|E8Er8D4FwQ1^HX^h$|sgyhO2T0O%NS+taT^D7GxJ^0hkVwxJ4+F zocoHt*5ee&a(KU~ot^nd@et6hPX;7mCtG~}TJj~h+*wvaagXzI-Yd2W0!ewAR`YOF zoPs}AhI6pNk|0Kkg=z>xaFCF+rOUi~!o@vJ^yabf)?`b3ErOq*Neub4whW> zRgG3K$kie^rRqOOsA_;U9n?+PZkKS2U~)>>r?I#J z%M}$RPsSra{J4t>J`xAmoR4OB-2avXEJ!`67iroFN&Z-6g-?#7sMAMf$*D%O={YGT z^`gQtsuI@7mqzDOs30fD4=j!cbBN0bk*JJ0s4P7^k+j=yBZzz(Nr@VIChn_*-t^@H z?HMt)`hJbf+}iRdQ@z+78a!u7IGQS4*l)WNX$h;iS9ynS!xOV&m5)LH!qaarM)PBf zE;~C(S2}c~fN~RE3Jc-We7Ikg&~HXHoMqt9ncuIJiW^lYMX;0hI<<_Z#PPtD^MRas zA|b4*K*GHg`aq_<*3C^Otl0nb_bio~xU4A3Hd6@h9S+6~Mn^VbP8RZgL4C%pA>peM z!Vl|!xtZV!Cj=M(aJ)>p8k%YvCpx@{G_xk%=#|>^J2#pUJv5_R&5-c7W}n%3hzTI_ z-pt{~gXE3z-wHJOn-HtW2@)M9<-xEFBd)IAHktFmkDJ7M1pVur7Vaj>+5C9o zj@+;6-gGH);W4IcBN-c;)HIt#d{BG3=DABAJtkQm;VMz|*hmubr4s80`H5h8w3DVP zAt2tdJv+{Pm*qx6f~99d<~rG!LiA~^&J@y+>ybN`jQtxY^p1n^IgtXT;*i@IYi`Vqc{H-&7!xVkeHU`DtE-f z{3{{pFziO|f>P~9?C=R(mqbm;$nG|~t27WKf##b#nzKJ~VlLbwb!?)c-JQY;L?rbE zf#9i2NvFa~1=IW);Q`GGum79v2-Zr#n1sl`>>Oh9UoJ=FV7!c^wp%RQao#GC

1gaagyK>!ea2%ffanrfRze#0}0SK_D$TZ;Kgv<~xR@fIWp&Go2 z4)b2I%vlZqI(=5l(ED%AJVASG5QycA}12|EU`aTepqu$v{C(JB{L?O=Ho2j zN58PZIQQZ0+^YsxW`D&zKGnbHGeNTq%n^P|sGLt1hNHLDSlURMbh}V=Ro5|)^%ZB+ z=3}ZylV5|Waz|gUIu|g@$2%O@y+q`jD1F*RlALe7PGipSCJ@B14kIL7gqKzI$L90_ zkmhgp4tYQTBHF*Hq(P~1)*~r8Tq1;*>jB-%gzWM+!ILGYORsgDrfV*%K`wm_68w~f z4`|!)A+Io@@i_w)G<%7;LByQmSDmG&_EmNH-Bb3#r@YA(mEciGck6t%9l=l#})V5r9LPZ@TA9Z6=nu~xA7DnOg$JEOE$ThD^H&K zFhQ>yzOs<9P>hh%KoTlb$*O98$g678cpl|r6k7l*&24M+54gI+Q8mDc>T$F>kcX1z z&v6m}FkNzx80^b`YdVS_K3#O&5TxghehCJWJCFJ1xDLa$Q&DzNN{72X5oMG*-mU_J zK`nxM%tBc3hh}nfEQBCy*5b<2VM>B`>fd#Cj}qg50OT2d0Qk&WerqOvFG=AXrV~E( z3N0o$5njV^@>Qj@1EO$)e_MGUai3lcss26P!$=_NS9XOKH_b)XskIK(~tN8JU z*PSB<)xTAg?B8zSMo%TS|1Ep1NEw-9=-nNKrynb3|E9=fV|%b!;J-30?PJNk0+F4v z)f`Xn{|$#Ae2u`G$N$PycOy>gMRM3R`RtYb+1~_*pjk*X$oor{m^XoSZ!DYZ-}SRE znW#*JaGnn*7cK+=aIBJ`(tj(Y0vyb{sa-QibJoB4u*ngWL#=b%%($u#O_;l=N>UwpS|GFS?IDqFSVH`WzWcb2!TVz0$SC-oU(?qs{;NJXTXHjXI{B z#YUtKNy((9A>x9r8laJfhLm_%Ah@#u0D9om_TS_Z6cn$=*XI1n!+tTh_7V~IZn=mq z4xROiq<}9Om5nZ$O4Du^%Ke}(H$=A^*U7s!xjVYOtHQgpfIj|fOTGVKQB$WwUn3Hi zWO&|vnij7LI+s4oH*-D`EglA?V#)PN3|4lL8)(v{KL1;LJX36(qsqH!G_qgR@m;^> zrljcyK$lg2^0$lj^=>>yMVi*Mbl-$>Rg$dTKj6v@mn`*~oMeH-2J@Hm*Zi2=%M8sc z(Q)Z4{PI221zUl7=cNn_lkA2!uf+Uni}-=ZP`_Lzf&u_|=B>xFh^SF_m|Y1-CV5Of zdzg9_T3j}k9rEy4)Yb+6%=(Z6FKV)RdLx;d{;e`cEt9GPMX{GfLX5*ztKV98|SRygrM3mc)rNb0^2T|D}0El|`{6En8k#lElT^lW2VX!P^tcVOS7 z4*ZCDM}MBLiW7bgbC33p&0RLxHR4aBeG1IB61Tq%*Uql^42#Wft4Olkly&8EX5BkI z+otLxmQ9Lu-Syf{KJfE?-4W|gEn)Q5cG8}lcD!I_{P#MB-n_c416s}R#vU%JjgWpR zDsfL(27{n?`e6i&RHSY?Eq49Fv-!2qdRcchO=ih`BkV9Jt^EL|2o=dIuwsMV={)Ro z`l}^+Dl{u(7DkoYP2J@>FcKXnMqI=)ZDFTD!l*HtBbA=Hv6_5Ri5N+~;`@>f0c?nV z+ko?#KSuCW$KA}ipM(ZxBE8?YqXNg{b|K~DHH~3kegF>NAL>1e*w4NxGB}@p zTKn_eoB5mJN(veGJe2*<3ynTV3)sDinM`k`euayH>3;ts7DfQS!m{hUrZOJ75HCpr z=_^$9HiCWg{(5+H3)|!;1u&06zJBH;rKi1F#=8A(Y1SM1gXZtvSLj8(4k>BH_}4jF zIw7YZiN!N6aXpPV5?b%IcWrOSp}9@QOS(`i{--1wNIG636%0kHL&h)@U;CfHm(WSS zawwms=uP3L4Jf+c9iw=crJI`C4t2a7U@ec8y&{uCFUl+;%q|b%iPMt<9{_fY0^6r@ z9g%(aD>`12Ti2 zd!4u_jG^Zt3W5_fCy_e+Q$VByt5xosx0&BfMff@vae-5uLnRw1F^upo9yiF6oGVDq zD1MF+3WFgyS&5T0F6rLA&DwA!Dy2+C7$EE~SQoRh_=nu=6(%VN%CLI`ss?bk%DB}8 z&;4I$evQ_*4%1QTh|s{FU>ynGu`vOGWqlDKw&y_9W)+eLObCfbkU6skwTVk;TxuNg zcJSz@m`%2R8bMa+R-?aM)bb#swQBQJ>{CYN>v}f?ZlWuVvOGRX3s&q;2O1G#Z|lrPF}J} zJ??gaK^Gw5^sKg6h(L2Srx)BO8H6N*cBJ{d7;?O-+IZN}XZvam!CXxJ1!@n*p6BSD zBP>i06DrX|Vuo2!g2uX$5CE^fRD8TD4n&-Qeow=v-i-a}fuQpPZ(L3^6T}3-hkXjA z!C>VBQkB^jVCyEof2)-9ON}mTGrge=kGFjr#^(Ad4a4P&?pu-+;%1@(MapcFmntZ3s_f-(R%ybyT=c!Nd6TZLM4L9h`O9vCxl_LDB#`?nxzxpL|WGpIWyvg#mzQQEH6K^$o`f1KDo~REMmNU)Qdt{yT z<(-nhV0D2G?T@Lw%vV#HV_gWK(fV@UBF~9P_ybE0LeBvfSCYd8)$Tj()D?r$TS2zG zrpwa!cKb8UaW#i&4!uz!V8`Lu;gz@%6h||&U2?uMAql2nP-Sj$PH!groRIj(Fl=bh zd7n#EP%_SDL-TJ=EY1HNCsuWe3VPRJlHu$k&l*ds&+{ANjkz6YS334sDJobK2uRp@PBje-EX zmO(CHc8LxenWf6;w+7I#mAxIIPC|so-EUuisVb}lw3t^e{Tr7KBewd1N` zdr2FuEJ0G~DVuEQhhYW2=HYDD?u9Sn;RFQ0?R@d30|VCyn&+RcB^IM2_-ZFp_dRCm zp17Wmr--f!8EdQMkehHSdbw$i@9pAVSWU;;SIE5a_PL;o?#?3#qqkR67Rogi5E&I8 z;RSCZdBH}iJIa2Mmrp%L5A3r{`*nrkM3E;IZfq^8vGqZdL$)qW9VOmhsY0C~5d?J0 zQzZ=#FsNru>%{6DQ;P0{E9Wp?euO+f(2g;1_Vc3;h>s8uoeKn}w`HhBsX>^!DLT1T zfu;Fecz6gcm}tVJqR(|?cMnAF=HW|yxaoK>+%Ge@^?bwSdWmI;{ZD9 z?m=LL*w)AP|6_(tSLfTngHi#SvNoSd_;FEV^SacsovNl*ywzD%fPl^tsxhY%Pu&iD zoht3%8zW>a{p54|L_BmGAH6sX>H;m{OEB|VEWWVQ-!1LHDY;lRu&4Xl+I21N3dDERY ztQZSJ;(PwFJgu})`w$~%T4UTie#N$B+vPhhd7$R;47;8nSi+k=_CGIcA|+XJZ2pO9@<7l!-!e7-t{@0fo#v}cfg(?&N?p{UAL`%YCY+=G z^3plf?j^%C+)qMZuzsVSJRj(B!#j*u-iGy14muQv7fv zhLNoPL}F4la{+|#^+*HjMl<=0mq|E>>atPeNZ;X=L->?`wD0#4M06ke+A_3`uY=xz z96eH5&>afWKx%+MI^cfE$fkvjfl12bgJYi*&naC@wX$dR6HD+Emw7lU4MLte&&6vL zA#vb|S?Q5q?vk-=M2gm)vBf5?=Fqd(U-0WIWOq>IOF^f*nXedW`K=>oBkuw*VQ8wt znlY+c$&EMe=u2Hx{h?&ih8^L=LCD~SymO?t@|pBI>(jfBt*|CLsnH;v!dRUumzWhV zm5wDxi-K-XQ4FZ<$Lmc?9`VPRhMtmsHT z%6SDgC`A9v)=3{dh3Te>B{5)>g?NJOp1qTj?@UhT;`y?Ojmxh>G{6&a=sMT5SgPXm z3FR_r=MtiBJp~LE-Et4pK@}eY0e~^rnX;LJQs%~aJ#4|R0b>e!19Y_77tAaVJ_+xw z$KECPy3w-vkekKpJW+W7t9=zeYR7n)91f>&F*e<)v98d4--yf+K-Q$DCPqc2A@75; z8I0dII&V){6<{FP4(Vi}$*-pp{o>{Jb#qD9j5x-chijKVPg*oj61Z``=Hex3l5+{8 zy2Ee$LJzq9WWnW5+mOL9%xMBpS4Gc&3n^7EKPXFb$ac&4NYgl@-agi7)4f1txlh%j zP|N|sUD$Qggh@5k%KKfFv-LZ72zTr*-qF0LoD}1c=0w0ubu;D4Ml+CHz#DKoEL7D4 z3DTpr4_M)I=lp2XvWe%~mTWqVI?sD$Eol3`-t6-P6OBZ$l@yGYL)F{ej%}#Vy|^Me z#g+*cx>ZqAU0EgYm3!-k?JJY9-kM0(!h%FHJANeTJzoiTX)|(J?`jp>e38aoBU~oU zREy2{i7Fc&tQcE>W_l5{WFIL8x=`a!YY=2HK9t#%a0CZ9ij8zZsbWSHgs8IHOTNxY zET}Z;sZCXcc4|402nLup$0klM@IGMiQt3b5;)-T;sbjV_->P~-fK453gFbk+QbkdN zo~?45LOncxH|!WxP-pj~3ks8(kWNW2i?Y)cUnRca)HUOd*6ozSoP}JbnvQL~!L%%= zn>=~9JIKkI@~Eo4hOU$i>L(30aHd~g;oV03%*m8j{D>pUz8$y0-&jQ`M2Dl1tQ(Sb&CESE{Fz74PIB{a$P!luQ1Ptb2jb1yg8Rd?78_Gh&snmSHR!se@ z3_(DEy@rvSV~;NM$fB7t)8s3&P%&WoN&GpUW<^tK>*NdBnaKM=ChN=RShv$5`U9)$ zP`x*Iu{0$-U|w7fs_0z-Q_F4Z`5}Dy=+tF4&eQyw`e5Y`qMvusXao-iV4Wh%KX4%h zmjeUO=BwQ@ALWpk_E3{?U#xYNDT4jV&h@{5VF5>5<)SK5o$DvVZUJ-**3_j20~KR4jh5Zp24}js=3^y=Z{euH*!}^L`4=SZ$$Cn!Kts z7phrA^PIvb{W2|)aX!1wnZ=@&DlbwvZ^O)krD}^`H9qNsLtvO3(fyJdYzr>E$+mBxe?= zQ5cv$c^*|E`dWW1BmBD|?eqQgZ~LD0DJsF;rm@uz){Bww${J1%XII9K6pd$5nwrcE zpXc;&iFa*C7-GiCjQAB!_|FZY*}63{#T(-LQ4-LZQc75%78ERTuikda+z#%~^R+Bj zQ7T|&ndZLXQGEEp8|oom*Ocb!5hb~`;zL$mY~qB-Rwz=)%IKs;VnBp5H5{99{go>T zQ;I{CyR)rn$%xQkl*R(4RkM27L3s-&Tk4WWvSb7a5Z#DM9o8LJ+;r`q6kA(WZz=Iu zBnHP|K132Iyf48PBqM}ULYSEhe4@ZWryao$K#M9^nP|LhXYI!d_L6#nc8-8@Xyd@F zcEII3y{qZY>l{L~j6+;?{zt{Pbh`b{zZn@z08Foz6SDO9!+M(M#ep zGu47-s@l+asy$#RWg%&IGDVOi@7^9I&XPn(b{B_l_S-SN;FKE2pDCOT_{f*nFQZl7 zym7NxNDt-VL%5kagh13@s!Xw{g%O@?BAysj9MJSz4Y!+Q+`k<1Iv3Z;lTZAjspv^E zmS!@nNfm#)DT(a+fEI77@$d1&Nn#H^_CSK2P3+S6NX>c?B~nlcC3N#K1rR)_ zYMH7luR^tD&L~FihRcgNS#!`tFnjUTm!c|F-=ew6>fvXDOn$_)h0tlb$yDN!_!@Fx-_lA@yeDv0;C~o>Kqv&`NcM5G8CKFG7{1no1+}CBtU7g=b)5=LO;nJ9bksO zTp@NDdsoa2AS2&qz0o59djmIgsmiC`STaodz7c-mnVvcVGxq;J99*BG?s`6UO!)eP zu_h_55Lo>1ds|iIB-|TB)3U)abG*O;+Yx$c)h=siA6rNNvB2;%5{R`WLqcH)($U=W z=OEu6^8=F@-~DLAa;Gi+0=bTXfn(1VnbRgWrY!uF_N*j3&Vwe*s`>6FyHGa87LU+f zcSd@XWRzvWWD6^s8sQKYJqK?c?Z$(5?_f>XWB6?e8WR}ewi{)@-=joyA&PEt0SK4?EXx$s#gu*Y1AugSvPCXF?wBe~#EgkMew<-xS@QNHI|P`Lo1Tcc%udZF|M&@$-RGgdV=ZLeJ$-7q%BX zwcU)_MlW_aCV1YMe}DX~;akd+{D76m*?E(Z(;JAWqoHq|Dm`WsBjI#vIgg6gYpPxp zt3{EcfvvAcMo7?9x4!;E)sxJ(*h})Vl{N24jz&5qdAo~1fi2yE73<}F=VyF(nALB? zvy07PaA9$@{{Y;98hOsjk}Pqij0Du~aa5V+&$v*>InI`@-{pHp7P`bYE)LG$(URWe zM-=MG;-+Ugh|#7Leu>|a#2+_X11S=1Wew{lT?EFx&dzH)eIb$nxghF)^8J_dhg&zR zMeCK3Iy8^D4sY&~NIdr5xpZJpR*L(z6q;Jg*N+$m5fqlkfk)$CCVzcMJxK9?ZvKBH zFp-L%TVEaZ+t-X${Qyku=%IOaZ~p3-DU13s^JlYKuky(Ms3*l-xlQ7AzQ7#D3waCp7z^&8=AyifxN@WTO zp}NzClSY{@`?Zipo$_arg zgi0)~2$8(_wENEBCx2~|??!xM;J|nM*oFeAThB`rvjAV(RCk^{VWigt5YglB#?28*0tU@=h0ADNb)#A0?(9#5S@BR}exHsUYTvw+U0!39;9UxBZ+? zsUR-tgkorGMT3P@d5`21q;)ZEgfb)$AW)0df*=C0uJuRJc_Y{YDHSR>`)mxOZXzwH zPGAh*=zO!Zk@{zm^UpUeIxHk1x8r$@Ub6em@sBbq z)Sp%xz~$JfoH&H5Qk%cNr$B|aF<2h9W`mx^AYGWUv9gIXJE2)Z;cC6c^x;x{;MQGZ zRF%`nXSPQisawXOy@#5O2Nj6-^T31;v#nW?Am&H zV+y{7iTEZ6QdoeUq(enp=IX;Rju6i54B!`u$8Z(OQ0%qYB?R(*aBsVu)v-kWZA3>vER@%HK@y*(Wp!2sQ(5w8Fn_vGqU@9on#eZ=T10 z0NO|cU1}!v_^&Qf;}!&OKzj1j=YI?aX+Ju;JEpbUXW;la>~>n#Pi_@dWNiZ{N!PAM z?XbE)XM=PvZl0V6iDKBI3(By~$gwG)?-&pJeFDn}z^Gq5H|3Kn+5366z02!G679U~;k1QMLEYsFLPJzNCa-rmtiPPGJsC-%|@; z4K3sq;1k~?;Go~lp0ZxmSarUBM~m^uI+vuJmXs>IJu5Qc3UW`5JAO1jJ{cVn3{9F^ z+mr}$o2@}DC$1yzfBCe`@z{+stH@bSFwHL&793*@oYgu z*RNGjugQhK1o#BU6#;Rm-!iK9GPNre!HCW>3DZXggU$K-6PVQ~s21*u2b2shlu{<; zp2Q2kip$RNL~Ni(qLMd8)2wQH9Q)%>s@q6bh;|g<51XiM&1Mx^K5@rai|V>{&1sjAAEG~{6z>PK0sHYPLiZ0M(Cuoz%Ka$l~X{^rr%>-lln+X;_9vh~) z6%=}(7f5UseKkXC{HB`k4UJO2z52ITxbN5jqVH_Q;3+?)c~zE@ZvbH7IY zk!|ZzX5i<~GusWmo^8JHUFiwfsjf^R&AdJ#bal6m$G9>PTPV&$o0jM`IAU)IDtAZCW7zMwzq@#D+95tWWA zE`D^PeBag*g-+Ksx8igLFX;BkN<1|=Wxni9sy;=*9+YxcL6Se0a6FvyC2c*a&E`{8 zfTJgtj1u$xfJ{NEgVn|h|yL2a^vJzhm^pN}xR-SEdte_;s6A3pm?JBi4G z#EPuJtl&LkI(vvKyO!kzIF(M6pCXYK%FiB!f{xDDH9|^P!I$>aAI+&VWDO~ZK5EE+apv-`kqv0n^q{y^fx$i6YUiq-rgj|BradYuR15d$i zBS&mJRF!G$4eXw{h13uvT&K^42u~riFlhiBAF zh8;Fi6gB|rY#KgIZ=sERAAJEL1o)kQoLi5?aGNlC?RNs0H!JX_Zu^?6eY&~yYGj_7 zOYrF5!N>cs$qD#m`2k+~yR}SX_kat?`vIx;N!2N~rAkdmg0rTrG2VDB_UyP}zoT(; zU-w{9(dtcD1aB$KG(({1e!Xdul(k=Q!5oHWqP3I)Q9S9NR&QL&XU{ulR#_i4uHj9e z$+_6i5U%mXw0=!CE%&lS!G`Ic2uR@vDjxDqs{fD>r^@khW^);PYJKnSXosG6jBeZH z2Sy_{TzmI#o+<1}=pO@dq7#w{A@hYg8b5(Q%?IrBo&>^iKRt<4rrFkk-VYVF1odQc zIwWT_PWdl3mt)H`)_BYf#Q8r1 z-5AaWIR2~GM2Cgx2lM{m*En{L{D(ujI?^=A$Kl^-II61WXf}ytw=KVJ$V7X%^nUqR z0sG$cHjL0H127ER7p}>9qZwz^Acx?-?@~6>dU$*qFEq_Aqj+$?>to$)8EztTh}b{G zK>$!6GqvkbVT>Jw5|V`VMDmn#!tOw1;bt7+Ljt?{5IOFtT^2lI%k~3r_WO{qRk+K&Io^eI{)U;09 zEjutZ^~sW$UXS!&|KEX|bi?8$tb+`f39^Y@baei+2#%L}oR#NAh%QG;q0Ew}yfA#v z)i|KDlv*Hhdr_IfV9%0}GE*^`WJ$ICyj0}|R(2_R+hkj7P_6E@BD*%PMR=djncvgG zT2Yl7U;di%2ST*%hk`{O){#hNSm6o*fyvmi1e}ci2Fi7t8=VVr)O2!m_RD7dW|NuMp;WCn`VKD3H4u{L|gWKHoZqSmm1(4)oF zJEmV)67Z1S%y|kkjKQ$D(QTo`*sW)8CnU^OU37X!;LMx$fG_b$!%r4FSl7`;4%)E& zH$>=`wdVJ9T>?NqF*ESQ+FHZN{0%0+3eMd9^Az5WD2>&-RMlWbHCFWQCD8%Y=`7gq zC-hbjVa`2Vg5+h&<{vu3j?)@Itqk6{hyO)A8ut7BpVXt}e_!S_ml^&te-zs8G)D^F zgE|t2p9t%Kw5@AzhWJ!X21`S-56uk?)K=YhVbH}tBSssU0f90WBw77N73+Yq78851 ztl|4&$nu&gNuFB9OZgnKgS0-Z%?xEKkGg(Rmd~e*=o=9B;?|J6*4b&E%EA!P3NDrV z#YqJ0#PFcv(n-zkm4M_x&tqS_;$55F{c)cWQ$p)N<{un|@gbtMfnlA8;9zuO5<5H1 z(;b)p+XYtRWL&p<@BNW-v#=HkPl~|eDMsI(J|=!8*p4;!G)v*2a&iULKI&&AfnOHX z6-!g6X9}6{HQp`F6!qR^(H?en4F40qqw&}2g@|(7#FQP^$KK{oZC9JupKnU@0B~_MdVjaZ33qqk&7(xl%p1eP% z=Zl;E`dZQPy&YPb`)9EeUE5>dy1$WeX}Cb;>XIHLa&nxFNs+OJM8|cr(9F=26*mtR z#|!e)l-E6v-^MzuE&t&>0vJR5U`yoEf5|+VBrDY)kL~ts|H<5m@Bd(nLf%K)KJ6?R z8J;k&T=g{@3mzWOQ?s?=sDrV1GO?iq6Pj@gHsPoD|Aa*-TtpO}u|jdv1evrzL&P!7 z6OShpQkSfJ+8&jXRC()U5cBY53Xz?+5p|=CuJTx=tA-3);=2c@7c?_g?BL>n&Mi*5 z@a=c>H4JpNqa67+V@u|*Yk{wO>@mz*uJ9CDg3xK2Q`vCp`=S*A8Ql<7&57c)==4x zkKx6=qufq{ag(1g+AP8~0$IQSEXXSmDD&B}nqAix%%Px4nGW$S-ku_bG=A0`YBa8Q zg_$i+$PG1=*R`sWcXciOXfp3KN)^oF`7qAZogc`rJdV`ue`F9OlyGXOaireZ{!=x~ zLGa1feYH=Sq>MCxyzLJYOPB&=EE97jBqpbRoOxAC$_?tw>asq3cS90yiax+&v^Xt3 zK|$Y$dbhea$t}sK^96fo3vh_};)&x3uklY!?2ofz-R;yG(s>Dtq2R%+%Azb|V`y4X z;O-Y42L@q3VWF1}3C}){y2T?*-nnPjvdbw(6qapIHPtQs0SoaOIV{MbmXp-aAAQDl zd-Bgs3UDzS3LOaqItaznjj4UldK^R?&Ae^{?R@r;=Scf{oCO@%-Wt>kx+^(ni;U*aWm}{mQuA9Trxnn`S89_@ z_Z=M>)6{pRf#O=FY!0lr!~C*QnJH@tca7>h0Hatb|IEywXP7Y<`u^~z7K z;Tm(XcHD*PO1L{d+-`~^i4sqokV$5wk!T}X0e==Z{|9o2znNf}9a{=3x{ zelepv^=47lPB2L~0!P(aNqYNzRZ-YVutw?5-G)K|&iZSuG%ocfr^M@j@cr{G zP=yc|@@7?F=&(U{RoU#B*3;QkoGdu--MZQx&lN=$8wN6(MX-u8A9 zQ(13G*|YYOGw@>7#KAr`P8=I-KQT4~k{> zjJXg>t3mbrZ`o5tPE$VYrxv�_Ird!0Jyxd5HeJ{#opA96S3YjImgjZ%K+z-e0e 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

{wcOy&+5Ep-}? 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ⅇRAC$+mJ5)5L$@3EN*IjD9 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

o$$D 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

M`l zG+pz{n=_W$-?6qYP0QXn*n}yyW*k`N)>TYI?YybFzrCscc~z|q1fzsPa*mudxqSy7NjY8JtyAL)@&*Y|>>DjJZ>ZN!P@h#049uSe_-j z>`3j_ks}><+4`9{ZY4!a$*9vqUkpKJN*q3_4RWqR($SA6K*PmudlY;gC9(xVK%ZWz z0y1o4H=vhGOHRq8OVE-$pzSE~0P>S?2}X@F?vm8wA)U{)SGom(iJUrK1yY_8uj-TyP2Q9(s4g?XhG<%yXYGS}8887DXfbaO?k z?yU6X1Se^=Ip@)PSDxK1lY0%Zw&cEjnlpBux8v_6?Kj*mw#X}iMt$m%3G2wJ=|YH& zBz;nn7jPm?VC?st_ouB@J{N!1H%9%a<W&09^t6_Lzz%rjiD8L{~6n5kd zQ=I-)hHcdUF2i=LXe||Efk~P#^UVhNCM$e;4y#hUoXbl2MKf1o+O(W)w=JglBKL+J z3(SBuE#MOsqJCNH9n{x{h#fSR!#HgaueINj&S%fAu=@!@h}R?c8%Ae;%d|bNs5*u( zPb$&HaPJYUxoxc*hpg1f7n!dgdV!zjr=U8EiE4jMwS{?$9m!*uSvB~i^v0tfVkvSW zc7nqEROgsdtZ3h{`0tVi%}~kvgwsiu#YmwMZOe7Jf0<#CrZZ1;e@sgK~m}E z?oVb|)TK@B#*v{^m#BARfggbfNhfXB0qv7MDVwjB?bqO|bs_b0g!okry`Wj@QTb@N zuycSgKM|fOTn%m~Z!ByuBVZ@ee}I$_Kq;k!cu6-EYRf4g<#rBg!|ejdu-w}dQilCs z{O{%~Ey@OObH_*wjn)|Z&gF3%-_GSFuhARcb2n#RBY`=vJq$BUL7Q`xIvEz zjW=fl_S^6qtcrWPD3?WE`EZbayr1^>k923OM%`)?O<)@aPh(ud$`dW8Xn?im zVeW`Xn+*?xcw8d7J61SZ_{cK?PL|iEG@0?)HU|SRqhoH<=QA z3d4ZF6^}zaMs5vJ!rB4oC$zr{uS8CE4V|gfhiKJkk&V~*c{+<#L^PCQGGNA(^EI^5 z7BxZrvStV!Uullt?oKcK0bPBE&TPLuGMe-y>A^IFWf?i-9+9 zxSfH(Tuj?zIKF;NM>-2cC;T-Lcd9NCYoi^kOd^4t&}T<)?ljNAAEj)#e(WA0F_)+7 z$8J27!z2qBYui4GA~?8Jm{&#~)uAI|;9DFv$5s5KZgBU7*4HiHDy!-{i*8}H1e4?s zy*`yMICtc>A`W^_^?@9ew?M^#GIPa)fppw?*)!GSTr2Z1^eZ=Rr^~>rJ=}?fxEHA7jsNc0E0~rC`f^<7{RZHF63_$1Moh z*BXwM%oR#0q*AMgxDF~0*DaF2S1Rj@{)jsp7XV#6Ok)?lg|8&m(=3x_t)vp3d+HkW zC_;lJWCuwT^XJlKQXAxqaF5LUp;VmXNWJ`<_ReQ`waCV~z^7^pZtqS~H@+KCWI`2L zkZpOnI;rRGb)}mtn8mlZ?%%8hd6RJF(YhC|4*@y;$~hIfbkTVW2tgaiTZ~@{mrv0K z6(==M#~82~*!;L<#Ss-sd�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 CX+G`% literal 0 HcmV?d00001 From 26c3b58e66ef742d628c846ee72757bf6ca87254 Mon Sep 17 00:00:00 2001 From: Cesar De la Torre Date: Fri, 13 Apr 2018 14:36:04 -0700 Subject: [PATCH 78/78] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 11e80346a..3b3aa9077 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ This reference application is cross-platform at the server and client side, than The architecture proposes a microservice oriented architecture implementation with multiple autonomous microservices (each one owning its own data/db) and implementing different approaches within each microservice (simple CRUD vs. DDD/CQRS patterns) using Http as the communication protocol between the client apps and the microservices and supports asynchronous communication for data updates propagation across multiple services based on Integration Events and an Event Bus (a light message broker, to choose between RabbitMQ or Azure Service Bus, underneath) plus other features defined at the roadmap.

- +

> ### Important Note on API Gateways and published APIs