Browse Source

Merge from Dev

pull/296/head
Ramón Tomás 7 years ago
parent
commit
2baedadc7a
261 changed files with 14486 additions and 16717 deletions
  1. +14
    -15
      .env
  2. +1
    -0
      .gitattributes
  3. +7
    -4
      README.md
  4. +11
    -0
      branch-guide.md
  5. +1
    -0
      cli-linux/build-bits-linux.sh
  6. +1
    -0
      cli-linux/docker-compose.local.build.yml
  7. +0
    -3
      cli-linux/prepare-spa-app.sh
  8. +0
    -1
      cli-linux/run.sh
  9. +2
    -2
      cli-windows/add-firewall-rules-for-sts-auth-thru-docker.ps1
  10. +1
    -3
      cli-windows/build-bits.ps1
  11. +0
    -20
      deploy/az/azurefunctions/azurefunctionsdeploy.json
  12. +6
    -2
      deploy/az/azurefunctions/azurefunctionsdeploy.parameters.json
  13. +5
    -3
      deploy/az/azurefunctions/readme.md
  14. +31
    -0
      deploy/az/cosmos/readme.md
  15. +1
    -1
      deploy/az/redis/readme.md
  16. +4
    -1
      deploy/az/storage/catalog/deploystorage.json
  17. +3
    -0
      deploy/az/storage/catalog/deploystorage.parameters.json
  18. +37
    -0
      deploy/az/storage/catalog/readme.md
  19. +4
    -1
      deploy/az/storage/marketing/deploystorage.json
  20. +3
    -0
      deploy/az/storage/marketing/deploystorage.parameters.json
  21. +37
    -0
      deploy/az/storage/marketing/readme.md
  22. +4
    -0
      deploy/readme.md
  23. +84
    -23
      docker-compose-windows.override.yml
  24. +97
    -17
      docker-compose-windows.prod.yml
  25. +30
    -3
      docker-compose-windows.yml
  26. +7
    -3
      docker-compose.ci.build.yml
  27. +39
    -23
      docker-compose.override.yml
  28. +35
    -14
      docker-compose.prod.yml
  29. +29
    -24
      docker-compose.yml
  30. BIN
      docs/Containerized Docker Application Lifecycle with Microsoft Platform and Tools (eBook).pdf
  31. BIN
      docs/Containerized-Docker-Application-Lifecycle-with-Microsoft-Platform-and-Tools-(eBook)_v1.1.pdf
  32. BIN
      docs/Enterprise-Application-Patterns-using-XamarinForms.pdf
  33. +3
    -1
      eShopOnContainers-MobileApps.sln
  34. +424
    -1
      eShopOnContainers.sln
  35. BIN
      img/eShopOnContainers_Architecture_Diagram - Old2.png
  36. BIN
      img/eShopOnContainers_Architecture_Diagram.png
  37. BIN
      img/k8s/deploy_script_task.png
  38. +24
    -10
      k8s/README.CICD.k8s.md
  39. +11
    -1
      k8s/README.k8s.md
  40. +17
    -0
      k8s/conf-files.md
  41. +1
    -0
      k8s/conf_cloud.yml
  42. +1
    -0
      k8s/conf_local.yml
  43. +15
    -4
      k8s/deploy.ps1
  44. +63
    -3
      k8s/deployments.yaml
  45. BIN
      k8s/img/blob_creation.png
  46. BIN
      k8s/img/deploy_script_task.png
  47. BIN
      k8s/img/get_kubectlbin_task.png
  48. BIN
      k8s/img/get_kubectlconfig_task.png
  49. +12
    -0
      k8s/readme.md
  50. +0
    -0
      readme/README.ENV.md
  51. +79
    -0
      readme/readme-docker-compose.md
  52. +19
    -0
      readme/readme.md
  53. +29
    -14
      src/BuildingBlocks/EventBus/EventBusServiceBus/EventBusServiceBus.cs
  54. +1
    -1
      src/BuildingBlocks/EventBus/EventBusServiceBus/EventBusServiceBus.csproj
  55. +8
    -0
      src/BuildingBlocks/Resilience/Resilience.Http/ResilientHttpClient.cs
  56. +5
    -5
      src/BuildingBlocks/Resilience/Resilience.Http/StandardHttpClient.cs
  57. +126
    -10
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/App.xaml
  58. +5
    -4
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/App.xaml.cs
  59. +10
    -1
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/Controls/AddBasketButton.xaml
  60. +24
    -0
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/Converters/DoubleConverter.cs
  61. +54
    -0
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/Effects/ThemeEffects.cs
  62. +23
    -0
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/Helpers/RandomNumberGenerator.cs
  63. +4
    -4
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/Helpers/ServicesHelper.cs
  64. +6
    -6
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/Helpers/Settings.cs
  65. +22
    -13
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Basket/BasketService.cs
  66. +2
    -2
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Common/Common.cs
  67. +21
    -3
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Identity/IdentityService.cs
  68. +2
    -2
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Marketing/CampaignMockService.cs
  69. +1
    -1
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Marketing/CampaignService.cs
  70. +14
    -12
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/SettingsViewModel.cs
  71. +3
    -0
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/CampaignDetailsView.xaml
  72. +1
    -1
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/CampaignView.xaml
  73. +5
    -6
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/LoginView.xaml
  74. +6
    -4
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/SettingsView.xaml
  75. +3
    -5
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/eShopOnContainers.Core.csproj
  76. +3
    -4
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/project.json
  77. +1
    -4
      src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Activities/MainActivity.cs
  78. +66
    -0
      src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Effects/BaseContainerEffect.cs
  79. +54
    -0
      src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Effects/CircleEffect.cs
  80. +1
    -0
      src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Effects/EntryLineColorEffect.cs
  81. +116
    -65
      src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Resources/Resource.Designer.cs
  82. +20
    -15
      src/Mobile/eShopOnContainers/eShopOnContainers.Droid/eShopOnContainers.Droid.csproj
  83. +6
    -3
      src/Mobile/eShopOnContainers/eShopOnContainers.Droid/packages.config
  84. +63
    -0
      src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.Droid/MainApplication.cs
  85. +10
    -8
      src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.Droid/Resources/Resource.Designer.cs
  86. +37
    -13
      src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.Droid/eShopOnContainers.TestRunner.Droid.csproj
  87. +9
    -3
      src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.Droid/packages.config
  88. +28
    -16
      src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.iOS/eShopOnContainers.TestRunner.iOS.csproj
  89. +7
    -3
      src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.iOS/packages.config
  90. +2
    -3
      src/Mobile/eShopOnContainers/eShopOnContainers.Windows/project.json
  91. +1
    -13
      src/Mobile/eShopOnContainers/eShopOnContainers.iOS/AppDelegate.cs
  92. +53
    -0
      src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Effects/CircleEffect.cs
  93. +0
    -24
      src/Mobile/eShopOnContainers/eShopOnContainers.iOS/PluginsHelp/GeolocatorReadme.txt
  94. +28
    -27
      src/Mobile/eShopOnContainers/eShopOnContainers.iOS/eShopOnContainers.iOS.csproj
  95. +7
    -4
      src/Mobile/eShopOnContainers/eShopOnContainers.iOS/packages.config
  96. +1
    -1
      src/Services/Basket/Basket.API/Basket.API.csproj
  97. +1
    -1
      src/Services/Basket/Basket.API/Controllers/BasketController.cs
  98. +1
    -1
      src/Services/Basket/Basket.API/Infrastructure/Exceptions/FailingMiddlewareAppBuilderExtensions.cs
  99. +32
    -0
      src/Services/Basket/Basket.API/Infrastructure/Filters/AuthorizeCheckOperationFilter.cs
  100. +1
    -8
      src/Services/Basket/Basket.API/Infrastructure/Filters/HttpGlobalExceptionFilter.cs

+ 14
- 15
.env View File

@ -7,18 +7,17 @@
ESHOP_EXTERNAL_DNS_NAME_OR_IP=localhost ESHOP_EXTERNAL_DNS_NAME_OR_IP=localhost
ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP=10.121.122.92 ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP=10.121.122.92
#ESHOP_AZURE_REDIS_BASKET_DB=
#ESHOP_AZURE_STORAGE_CATALOG=
#ESHOP_AZURE_STORAGE_MARKETING=
#ESHOP_AZURE_SERVICE_BUS=
#ESHOP_AZURE_COSMOSDB=
#ESHOP_AZURE_CATALOG_DB=
#ESHOP_AZURE_IDENTITY_DB=
#ESHOP_AZURE_ORDERING_DB=
#ESHOP_AZURE_MARKETING_DB=
#ESHOP_AZUREFUNC_CAMPAIGN_DETAILS_URI=
#ESHOP_AZURE_STORAGE_CATALOG_NAME=
#ESHOP_AZURE_STORAGE_CATALOG_KEY=
#ESHOP_AZURE_STORAGE_MARKETING_NAME=
#ESHOP_AZURE_STORAGE_MARKETING_KEY=
#ESHOP_AZURE_REDIS_BASKET_DB=<YourAzureRedisBasketInfo>
#ESHOP_AZURE_STORAGE_CATALOG_URL=<YourAzureStorage_Catalog_BLOB_URL>
#ESHOP_AZURE_STORAGE_MARKETING_URL=<YourAzureStorage_Marketing__BLOB_URL>
#ESHOP_AZURE_SERVICE_BUS=<YourAzureServiceBusInfo>
#ESHOP_AZURE_COSMOSDB=<YourAzureCosmosDBConnData>
#ESHOP_AZURE_CATALOG_DB=<YourAzureSQLDBCatalogDBConnString>
#ESHOP_AZURE_IDENTITY_DB=<YourAzureSQLDBIdentityDBConnString>
#ESHOP_AZURE_ORDERING_DB=<YourAzureSQLDBOrderingDBConnString>
#ESHOP_AZURE_MARKETING_DB=<YourAzureSQLDBMarketingDBConnString>
#ESHOP_AZUREFUNC_CAMPAIGN_DETAILS_URI=<YourAzureFunctionCampaignDetailsURI>
#ESHOP_AZURE_STORAGE_CATALOG_NAME=<YourAzureStorageCatalogName>
#ESHOP_AZURE_STORAGE_CATALOG_KEY=<YourAzureStorageCatalogKey>
#ESHOP_AZURE_STORAGE_MARKETING_NAME=<YourAzureStorageMarketingName>
#ESHOP_AZURE_STORAGE_MARKETING_KEY=<YourAzureStorageMarketingKey>

+ 1
- 0
.gitattributes View File

@ -2,6 +2,7 @@
# Set default behavior to automatically normalize line endings. # Set default behavior to automatically normalize line endings.
############################################################################### ###############################################################################
* text=auto * text=auto
*.sh text eol=lf
############################################################################### ###############################################################################
# Set default behavior for command prompt diff. # Set default behavior for command prompt diff.


+ 7
- 4
README.md View File

@ -2,6 +2,11 @@
Sample .NET Core reference application, powered by Microsoft, based on a simplified microservices architecture and Docker containers. <p> Sample .NET Core reference application, powered by Microsoft, based on a simplified microservices architecture and Docker containers. <p>
**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. **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.
## Moving to .NET Core 2.0 "wave"
NOTE: During August/September 2017 we'll be moving the solution to .NET Core "wave". Not just compilation but also new recommended code in EF Core 2.0, ASP.NET Core 2.0, and other new related versions.
>**PLEASE** Read our [branch guide](./branch-guide.md) to know about our branching policy
> ### DISCLAIMER > ### DISCLAIMER
> **IMPORTANT:** The current state of this sample application is **BETA**, consider it version a 0.1 foundational version, therefore, many areas could be improved and change significantly while refactoring current code and implementing new features. **Feedback with improvements and pull requests from the community will be highly appreciated and accepted.** > **IMPORTANT:** The current state of this sample application is **BETA**, consider it version a 0.1 foundational version, therefore, many areas could be improved and change significantly while refactoring current code and implementing new features. **Feedback with improvements and pull requests from the community will be highly appreciated and accepted.**
> >
@ -14,9 +19,7 @@ However, this sample application should not be considered as an "eCommerce refer
> Read the planned <a href='https://github.com/dotnet/eShopOnContainers/wiki/01.-Roadmap-and-Milestones-for-future-releases'>Roadmap and Milestones for future releases of eShopOnContainers</a> within the Wiki for further info about possible new implementations and provide feedback at the <a href='https://github.com/dotnet/eShopOnContainers/issues'>ISSUES section</a> if you'd like to see any specific scenario implemented or improved. Also, feel free to discuss on any current issue. > Read the planned <a href='https://github.com/dotnet/eShopOnContainers/wiki/01.-Roadmap-and-Milestones-for-future-releases'>Roadmap and Milestones for future releases of eShopOnContainers</a> within the Wiki for further info about possible new implementations and provide feedback at the <a href='https://github.com/dotnet/eShopOnContainers/issues'>ISSUES section</a> 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 either 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 either 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 current communication protocol.
<p>
It also supports asynchronous communication for data updates propagation across multiple services based on Integration Events and an Event Bus plus other features defined at the <a href='https://github.com/dotnet/eShopOnContainers/wiki/01.-Roadmap-and-Milestones-for-future-releases'>roadmap</a>.
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 <a href='https://github.com/dotnet/eShopOnContainers/wiki/01.-Roadmap-and-Milestones-for-future-releases'>roadmap</a>.
<p> <p>
<img src="img/eshop_logo.png"> <img src="img/eshop_logo.png">
<img src="img/eShopOnContainers_Architecture_Diagram.png"> <img src="img/eShopOnContainers_Architecture_Diagram.png">
@ -43,7 +46,7 @@ You can download them and start reviewing these Guides/eBooks here:
| Architecting & Developing | Containers Lifecycle & CI/CD | App patterns with Xamarin.Forms | | Architecting & Developing | Containers Lifecycle & CI/CD | App patterns with Xamarin.Forms |
| ------------ | ------------| ------------| | ------------ | ------------| ------------|
| <a href='https://aka.ms/microservicesebook'><img src="img/ebook_arch_dev_microservices_containers_cover.png"> </a> | <a href='https://aka.ms/dockerlifecycleebook'> <img src="img/ebook_containers_lifecycle.png"> </a> | <a href='https://aka.ms/xamarinpatternsebook'> <img src="img/xamarin-enterprise-patterns-ebook-cover-small.png"> </a> | | <a href='https://aka.ms/microservicesebook'><img src="img/ebook_arch_dev_microservices_containers_cover.png"> </a> | <a href='https://aka.ms/dockerlifecycleebook'> <img src="img/ebook_containers_lifecycle.png"> </a> | <a href='https://aka.ms/xamarinpatternsebook'> <img src="img/xamarin-enterprise-patterns-ebook-cover-small.png"> </a> |
| <sup> <a href='https://aka.ms/microservicesebook'>**Download** (First Edition)</a> </sup> | <sup> <a href='https://aka.ms/dockerlifecycleebook'>**Download** (First Edition from late 2016) </a> </sup> | <sup> <a href='https://aka.ms/xamarinpatternsebook'>**Download** (First Edition) </a> </sup> |
| <sup> <a href='https://aka.ms/microservicesebook'>**Download** (First Edition)</a> </sup> | <sup> <a href='https://aka.ms/dockerlifecycleebook'>**Download** (First Edition) </a> </sup> | <sup> <a href='https://aka.ms/xamarinpatternsebook'>**Download** (First Edition) </a> </sup> |
Send feedback to [dotnet-architecture-ebooks-feedback@service.microsoft.com](dotnet-architecture-ebooks-feedback@service.microsoft.com) Send feedback to [dotnet-architecture-ebooks-feedback@service.microsoft.com](dotnet-architecture-ebooks-feedback@service.microsoft.com)
<p> <p>


+ 11
- 0
branch-guide.md View File

@ -0,0 +1,11 @@
# eShopOnContainers - BRANCH GUIDE
Following are the most important branches:
- `dev`: Contains the latest code **and it is the branch actively developed**. Note that **all PRs must be against `dev` branch to be considered**.
- `master`: Synced time to time from dev. It contains "stable" code, although not the latest one. We plan to do periodic merges from `dev` to `master`, but we are not doing it right now.
- `netcore2`: Contains NETCore 2.0 (preview2) based code. All APIs and webs are migrated to netcore2 except `Identity.API` which still uses netcore1.1 (because of Identity Server). Dockerfiles are updated also. Use this branch to test the NETCore 2.0 code. You can also submit PR to this branch if they are related to netcore2.
Any other branch is considered temporary and could be deleted at any time. Do not do any PR to them!
Thanks!

+ 1
- 0
cli-linux/build-bits-linux.sh View File

@ -50,3 +50,4 @@ done
# No need to build the images, docker build or docker compose will # No need to build the images, docker build or docker compose will
# do that using the images and containers defined in the docker-compose.yml file. # do that using the images and containers defined in the docker-compose.yml file.
#

+ 1
- 0
cli-linux/docker-compose.local.build.yml View File

@ -7,3 +7,4 @@ services:
- .:/src - .:/src
working_dir: /src working_dir: /src
command: /bin/bash -c "chmod -x ./cli-linux/build-bits-linux.sh && ./cli-linux/build-bits-linux.sh" command: /bin/bash -c "chmod -x ./cli-linux/build-bits-linux.sh && ./cli-linux/build-bits-linux.sh"

+ 0
- 3
cli-linux/prepare-spa-app.sh View File

@ -1,7 +1,4 @@
# Build SPA app # Build SPA app
pushd $(pwd)/src/Web/WebSPA pushd $(pwd)/src/Web/WebSPA
npm rebuild node-sass npm rebuild node-sass
#npm run build:prod #npm run build:prod

+ 0
- 1
cli-linux/run.sh View File

@ -4,4 +4,3 @@ docker rm $(docker ps -a -q)
docker images |grep -v REPOSITORY|awk '{print $1}'|xargs -L1 docker pull docker images |grep -v REPOSITORY|awk '{print $1}'|xargs -L1 docker pull
export ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP=$(curl ipinfo.io/ip) export ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP=$(curl ipinfo.io/ip)
docker-compose -f docker-compose.images.yml -f docker-compose.prod.yml up -d --force-recreate docker-compose -f docker-compose.images.yml -f docker-compose.prod.yml up -d --force-recreate

+ 2
- 2
cli-windows/add-firewall-rules-for-sts-auth-thru-docker.ps1 View File

@ -21,6 +21,6 @@ try {
Write-Host "Rule found" Write-Host "Rule found"
} }
catch [Exception] { catch [Exception] {
New-NetFirewallRule -DisplayName eShopOnContainers-Inbound -Confirm -Description "eShopOnContainers Inbound Rule for port range 5100-5105" -LocalAddress Any -LocalPort 5100-5110 -Protocol tcp -RemoteAddress Any -RemotePort Any -Direction Inbound
New-NetFirewallRule -DisplayName eShopOnContainers-Outbound -Confirm -Description "eShopOnContainers Outbound Rule for port range 5100-5105" -LocalAddress Any -LocalPort 5100-5110 -Protocol tcp -RemoteAddress Any -RemotePort Any -Direction Outbound
New-NetFirewallRule -DisplayName eShopOnContainers-Inbound -Confirm -Description "eShopOnContainers Inbound Rule for port range 5100-5110" -LocalAddress Any -LocalPort 5100-5110 -Protocol tcp -RemoteAddress Any -RemotePort Any -Direction Inbound
New-NetFirewallRule -DisplayName eShopOnContainers-Outbound -Confirm -Description "eShopOnContainers Outbound Rule for port range 5100-5110" -LocalAddress Any -LocalPort 5100-5110 -Protocol tcp -RemoteAddress Any -RemotePort Any -Direction Outbound
} }

+ 1
- 3
cli-windows/build-bits.ps1 View File

@ -14,13 +14,11 @@ $projectPaths =
@{Path="$rootPath\src\Services\Identity\Identity.API";Prj="Identity.API.csproj"}, @{Path="$rootPath\src\Services\Identity\Identity.API";Prj="Identity.API.csproj"},
@{Path="$rootPath\src\Services\Catalog\Catalog.API";Prj="Catalog.API.csproj"}, @{Path="$rootPath\src\Services\Catalog\Catalog.API";Prj="Catalog.API.csproj"},
@{Path="$rootPath\src\Services\Ordering\Ordering.API";Prj="Ordering.API.csproj"}, @{Path="$rootPath\src\Services\Ordering\Ordering.API";Prj="Ordering.API.csproj"},
@{Path="$rootPath\src\Services\GracePeriod\GracePeriodManager";Prj="GracePeriodManager.csproj"},
@{Path="$rootPath\src\Services\Basket\Basket.API";Prj="Basket.API.csproj"}, @{Path="$rootPath\src\Services\Basket\Basket.API";Prj="Basket.API.csproj"},
@{Path="$rootPath\src\Services\Identity\Identity.API";Prj="Identity.API.csproj"},
@{Path="$rootPath\src\Services\GracePeriod\GracePeriodManager";Prj="GracePeriodManager.csproj"},
@{Path="$rootPath\src\Services\Location\Locations.API";Prj="Locations.API.csproj"}, @{Path="$rootPath\src\Services\Location\Locations.API";Prj="Locations.API.csproj"},
@{Path="$rootPath\src\Services\Marketing\Marketing.API";Prj="Marketing.API.csproj"}, @{Path="$rootPath\src\Services\Marketing\Marketing.API";Prj="Marketing.API.csproj"},
@{Path="$rootPath\src\Services\Payment\Payment.API";Prj="Payment.API.csproj"}, @{Path="$rootPath\src\Services\Payment\Payment.API";Prj="Payment.API.csproj"},
@{Path="$rootPath\src\Services\GracePeriod\GracePeriodManager";Prj="GracePeriodManager.csproj"},
@{Path="$rootPath\src\Web\WebStatus";Prj="WebStatus.csproj"} @{Path="$rootPath\src\Web\WebStatus";Prj="WebStatus.csproj"}
$projectPaths | foreach { $projectPaths | foreach {


+ 0
- 20
deploy/az/azurefunctions/azurefunctionsdeploy.json View File

@ -13,30 +13,10 @@
"SitesEshopfunctionsName": "[parameters('SitesEshopfunctionsName')]", "SitesEshopfunctionsName": "[parameters('SitesEshopfunctionsName')]",
"WebConfigName": "[concat(variables('SitesEshopfunctionsName'), '/web')]", "WebConfigName": "[concat(variables('SitesEshopfunctionsName'), '/web')]",
"Location": "[resourceGroup().location]", "Location": "[resourceGroup().location]",
"EshopAccountsDatabase": "[concat(variables('SitesEshopfunctionsName'), 'db')]",
"ServerFarmPlan": "[concat(trim(variables('location')), 'Plan')]", "ServerFarmPlan": "[concat(trim(variables('location')), 'Plan')]",
"StorageAccounts": "[concat(variables('SitesEshopfunctionsName'), 'st')]" "StorageAccounts": "[concat(variables('SitesEshopfunctionsName'), 'st')]"
}, },
"resources": [ "resources": [
{
"type": "Microsoft.DocumentDB/databaseAccounts",
"kind": "GlobalDocumentDB",
"name": "[variables('EshopAccountsDatabase')]",
"apiVersion": "2015-04-08",
"location": "[variables('Location')]",
"tags": {},
"scale": null,
"properties": {
"databaseAccountOfferType": "Standard",
"consistencyPolicy": {
"defaultConsistencyLevel": "Session",
"maxIntervalInSeconds": 5,
"maxStalenessPrefix": 100
},
"name": null
},
"dependsOn": []
},
{ {
"type": "Microsoft.Storage/storageAccounts", "type": "Microsoft.Storage/storageAccounts",
"sku": { "sku": {


+ 6
- 2
deploy/az/azurefunctions/azurefunctionsdeploy.parameters.json View File

@ -1,5 +1,9 @@
{ {
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#", "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
"contentVersion": "1.0.0.0",
"parameters": {}
"contentVersion": "1.0.0.0",
"parameters": {
"SitesEshopfunctionsName": {
"value": "eshopfunctionsapp"
}
}
} }

+ 5
- 3
deploy/az/azurefunctions/readme.md View File

@ -4,20 +4,22 @@ The ARM template `azurefunctionsdeploy.json` and its parameter file (`azurefunct
## Editing azurefunctionsdeploy.parameters.json file ## Editing azurefunctionsdeploy.parameters.json file
You can edit the `azurefunctionsdeploy.parameters.parameters.json` file to set your values, but is not needed.
You can edit the `azurefunctionsdeploy.parameters.parameters.json` file to set your values, but is not needed. The only parameter that can be set is:
1. `SitesEshopfunctionsName` is a string that is used to create the Azure function app name.
## Deploy the template ## Deploy the template
Once parameter file is edited you can deploy it using [create-resources script](../readme.md). Once parameter file is edited you can deploy it using [create-resources script](../readme.md).
i. e. if you are in windows, to deploy sql databases in a new resourcegroup located in westus, go to `deploy\az` folder and type:
i. e. if you are in Windows, to deploy the Azure Functions environment in a new resourcegroup located in westus, go to `deploy\az` folder and type:
``` ```
create-resources.cmd azurefunctions\azurefunctionsdeploy newResourceGroup -c westus create-resources.cmd azurefunctions\azurefunctionsdeploy newResourceGroup -c westus
``` ```
## Deploy Marketing azure function with Visual Studio. ## Deploy Marketing azure function with Visual Studio.
Alternatively, instead of using ARM templates, you can deploy Marketing azure function directly by publishing the project Marketing-functions in eShopOnContainers-AzureFunctions.sln with Visual Studio publish tool.
You need to deploy the Marketing azure function from Visual Studio 2017 15.3 from the the Marketing-functions project in the solution eShopOnContainers-AzureFunctions.sln (Visual Studio publish tool).
## Setting Azure function configurations ## Setting Azure function configurations


+ 31
- 0
deploy/az/cosmos/readme.md View File

@ -0,0 +1,31 @@
# Deploying Azure Cosmosdb
The ARM template `deploycosmos.json` and its parameter file (`deploycosmos.parameters.json`) are used to deploy following resources:
1. One Cosmosdb database
## Editing deploycosmos.parameters.json file
You can edit the `deploycosmos.parameters.json` file to set your values, but is not needed. The only parameter that can
be set is:
1. `name` is a string that is used to create the database name. ARM script creates unique values by appending a unique string to this parameter value, so you can leave the default value.
## Deploy the template
Once parameter file is edited you can deploy it using [create-resources script](../readme.md).
i. e. if you are in windows, to deploy a Cosmosdb database in a new resourcegroup located in westus, go to `deploy\az` folder and type:
```
create-resources.cmd cosmos\deploycosmos newResourceGroup -c westus
```

+ 1
- 1
deploy/az/redis/readme.md View File

@ -15,7 +15,7 @@ be set is:
Once parameter file is edited you can deploy it using [create-resources script](../readme.md). Once parameter file is edited you can deploy it using [create-resources script](../readme.md).
i. e. if you are in windows, to deploy sql databases in a new resourcegroup located in westus, go to `deploy\az` folder and type:
i. e. if you are in windows, to deploy a Redis cache in a new Azure Resource Group located in westus, go to `deploy\az` folder and type:
``` ```
create-resources.cmd redis\redisdeploy newResourceGroup -c westus create-resources.cmd redis\redisdeploy newResourceGroup -c westus


+ 4
- 1
deploy/az/storage/catalog/deploystorage.json View File

@ -7,11 +7,14 @@
}, },
"profileName" : { "profileName" : {
"type": "string" "type": "string"
},
"endpointName" : {
"type": "string"
} }
}, },
"variables": { "variables": {
"catalogstorage": "[concat(parameters('catalogstorage'), uniqueString(resourceGroup().id))]", "catalogstorage": "[concat(parameters('catalogstorage'), uniqueString(resourceGroup().id))]",
"endpointName": "[concat('endpoint-', uniqueString(resourceGroup().id))]",
"endpointName": "[concat(parameters('endpointName'), uniqueString(resourceGroup().id))]",
"profileName": "[parameters('profileName')]" "profileName": "[parameters('profileName')]"
}, },
"resources": [ "resources": [


+ 3
- 0
deploy/az/storage/catalog/deploystorage.parameters.json View File

@ -7,6 +7,9 @@
}, },
"profileName":{ "profileName":{
"value": "eshopcatalog" "value": "eshopcatalog"
},
"endpointName":{
"value": "catalog-endpoint"
} }
} }
} }

+ 37
- 0
deploy/az/storage/catalog/readme.md View File

@ -0,0 +1,37 @@
# Deploying Catalog Storage
The ARM template `deploystorage.json` and its parameter file (`deploystorage.parameters.json`) are used to deploy following resources:
1. One Storage Account
2. One CDN profile
3. One Endpoint
## Editing deploystorage.parameters.json file
You can edit the `deploystorage.parameters.json` file to set your values, but is not needed. The only parameters that can
be set are:
1. `catalogstorage` is a string that is used to create the storage account name. ARM script creates unique values by appending a unique string to this parameter value, so you can leave the default value.
2. `profileName` is a string that is used to create the CDN profile name.
3. `endpointName` is a string that is used to create the storage endpoint name. ARM script creates unique values by appending a unique string to this parameter value, so you can leave the default value.
## Deploy the template
Once parameter file is edited you can deploy it using [create-resources script](../../readme.md).
i. e. if you are in windows, to deploy a Storage Account in a new resourcegroup located in westus, go to `deploy\az` folder and type:
```
create-resources.cmd catalog\deploystorage newResourceGroup -c westus
```

+ 4
- 1
deploy/az/storage/marketing/deploystorage.json View File

@ -7,11 +7,14 @@
}, },
"profileName" : { "profileName" : {
"type": "string" "type": "string"
},
"endpointName" : {
"type": "string"
} }
}, },
"variables": { "variables": {
"marketingstorage": "[concat(parameters('marketingstorage'), uniqueString(resourceGroup().id))]", "marketingstorage": "[concat(parameters('marketingstorage'), uniqueString(resourceGroup().id))]",
"endpointName": "[concat('endpoint-', uniqueString(resourceGroup().id))]",
"endpointName": "[concat(parameters('endpointName'), uniqueString(resourceGroup().id))]",
"profileName": "[parameters('profileName')]" "profileName": "[parameters('profileName')]"
}, },
"resources": [ "resources": [


+ 3
- 0
deploy/az/storage/marketing/deploystorage.parameters.json View File

@ -7,6 +7,9 @@
}, },
"profileName":{ "profileName":{
"value": "eshopmarketing" "value": "eshopmarketing"
},
"endpointName":{
"value": "marketing-endpoint"
} }
} }
} }

+ 37
- 0
deploy/az/storage/marketing/readme.md View File

@ -0,0 +1,37 @@
# Deploying Marketing Storage
The ARM template `deploystorage.json` and its parameter file (`deploystorage.parameters.json`) are used to deploy following resources:
1. One Storage Account
2. One CDN profile
3. One Endpoint
## Editing deploystorage.parameters.json file
You can edit the `deploystorage.parameters.json` file to set your values, but is not needed. The only parameters that can
be set are:
1. `marketingstorage` is a string that is used to create the storage account name. ARM script creates unique values by appending a unique string to this parameter value, so you can leave the default value.
2. `profileName` is a string that is used to create the CDN profile name.
3. `endpointName` is a string that is used to create the storage endpoint name. ARM script creates unique values by appending a unique string to this parameter value, so you can leave the default value.
## Deploy the template
Once parameter file is edited you can deploy it using [create-resources script](../../readme.md).
i. e. if you are in windows, to deploy a Storage account in a new resourcegroup located in westus, go to `deploy\az` folder and type:
```
create-resources.cmd marketing\deploystorage newResourceGroup -c westus
```

+ 4
- 0
deploy/readme.md View File

@ -20,6 +20,10 @@ Using `docker-machine` is the recommended way to create a VM with docker install
1. [Deploying SQL Server and databases](az/sql/readme.md) 1. [Deploying SQL Server and databases](az/sql/readme.md)
2. [Deploying Azure Service Bus](az/servicebus/readme.md) 2. [Deploying Azure Service Bus](az/servicebus/readme.md)
3. [Deploying Redis Cache](az/redis/readme.md) 3. [Deploying Redis Cache](az/redis/readme.md)
4. [Deploying Cosmosdb](az/cosmos/readme.md)
5. [Deploying Catalog Storage](az/storage/catalog/readme.md)
6. [Deploying Marketing Storage](az/storage/marketing/readme.md)
7. [Deploying Marketing Azure functions](az/azurefunctions/readme.md)


+ 84
- 23
docker-compose-windows.override.yml View File

@ -12,9 +12,11 @@ services:
environment: environment:
- ASPNETCORE_ENVIRONMENT=Development - ASPNETCORE_ENVIRONMENT=Development
- ASPNETCORE_URLS=http://0.0.0.0:80 - ASPNETCORE_URLS=http://0.0.0.0:80
- ConnectionString=basket.data
- identityUrl=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5105. at range 5100-5105.
- EventBusConnection=rabbitmq
- ConnectionString=${ESHOP_AZURE_REDIS_BASKET_DB:-basket.data}
- identityUrl=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110.
- IdentityUrlExternal=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5105
- EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq}
- AzureServiceBusEnabled=False
ports: ports:
- "5103:80" - "5103:80"
@ -22,9 +24,14 @@ services:
environment: environment:
- ASPNETCORE_ENVIRONMENT=Development - ASPNETCORE_ENVIRONMENT=Development
- ASPNETCORE_URLS=http://0.0.0.0:80 - ASPNETCORE_URLS=http://0.0.0.0:80
- ConnectionString=Server=sql.data;Database=Microsoft.eShopOnContainers.Services.CatalogDb;User Id=sa;Password=Pass@word
- ExternalCatalogBaseUrl=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5101 #Local: You need to open your local dev-machine firewall at range 5100-5105. at range 5100-5105.
- EventBusConnection=rabbitmq
- ConnectionString=${ESHOP_AZURE_CATALOG_DB:-Server=sql.data;Database=Microsoft.eShopOnContainers.Services.CatalogDb;User Id=sa;Password=Pass@word}
- PicBaseUrl=${ESHOP_AZURE_STORAGE_CATALOG:-http://localhost:5101/api/v1/catalog/items/[0]/pic/} #Local: You need to open your local dev-machine firewall at range 5100-5110.
- EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq}
- AzureStorageAccountName=${ESHOP_AZURE_STORAGE_CATALOG_NAME}
- AzureStorageAccountKey=${ESHOP_AZURE_STORAGE_CATALOG_KEY}
- UseCustomizationData=True
- AzureServiceBusEnabled=False
- AzureStorageEnabled=False
ports: ports:
- "5101:80" - "5101:80"
@ -33,8 +40,14 @@ services:
- ASPNETCORE_ENVIRONMENT=Development - ASPNETCORE_ENVIRONMENT=Development
- ASPNETCORE_URLS=http://0.0.0.0:80 - ASPNETCORE_URLS=http://0.0.0.0:80
- SpaClient=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5104 - SpaClient=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5104
- ConnectionStrings__DefaultConnection=Server=sql.data;Database=Microsoft.eShopOnContainers.Service.IdentityDb;User Id=sa;Password=Pass@word
- MvcClient=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5100 #Local: You need to open your local dev-machine firewall at range 5100-5105.
- XamarinCallback=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5105/xamarincallback #localhost do not work for UWP login, so we have to use "external" IP always
- ConnectionStrings__DefaultConnection=${ESHOP_AZURE_IDENTITY_DB:-Server=sql.data;Database=Microsoft.eShopOnContainers.Service.IdentityDb;User Id=sa;Password=Pass@word}
- MvcClient=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5100 #Local: You need to open your local dev-machine firewall at range 5100-5110.
- LocationApiClient=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5109
- 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
- UseCustomizationData=True
ports: ports:
- "5105:80" - "5105:80"
@ -42,9 +55,12 @@ services:
environment: environment:
- ASPNETCORE_ENVIRONMENT=Development - ASPNETCORE_ENVIRONMENT=Development
- ASPNETCORE_URLS=http://0.0.0.0:80 - ASPNETCORE_URLS=http://0.0.0.0:80
- ConnectionString=Server=sql.data;Database=Microsoft.eShopOnContainers.Services.OrderingDb;User Id=sa;Password=Pass@word
- identityUrl=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5105. at range 5100-5105.
- EventBusConnection=rabbitmq
- ConnectionString=${ESHOP_AZURE_ORDERING_DB:-Server=sql.data;Database=Microsoft.eShopOnContainers.Services.OrderingDb;User Id=sa;Password=Pass@word}
- identityUrl=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110.
- IdentityUrlExternal=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5105
- EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq}
- UseCustomizationData=True
- AzureServiceBusEnabled=False
ports: ports:
- "5102:80" - "5102:80"
@ -55,11 +71,14 @@ services:
- CatalogUrl=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5101 - CatalogUrl=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5101
- OrderingUrl=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5102 - 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. - 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
- BasketUrl=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5103
- MarketingUrl=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5110
- CatalogUrlHC=http://catalog.api/hc - CatalogUrlHC=http://catalog.api/hc
- OrderingUrlHC=http://ordering.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. - 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
- BasketUrlHC=http://basket.api/hc
- MarketingUrlHC=http://marketing.api/hc
- UseCustomizationData=True
ports: ports:
- "5104:80" - "5104:80"
@ -70,8 +89,9 @@ services:
- CatalogUrl=http://catalog.api - CatalogUrl=http://catalog.api
- OrderingUrl=http://ordering.api - OrderingUrl=http://ordering.api
- BasketUrl=http://basket.api - BasketUrl=http://basket.api
- IdentityUrl=http://10.0.75.1:5105 #Local: Use 10.0.75.1 in a "Docker for Windows" environment, if using "localhost" from browser.
#Remote: Use ${ESHOP_EXTERNAL_DNS_NAME_OR_IP} if using external IP or DNS name from browser.
- IdentityUrl=http://10.0.75.1:5105
- MarketingUrl=http://marketing.api #Local: Use 10.0.75.1 in a "Docker for Windows" environment, if using "localhost" from browser.
- UseCustomizationData=True #Remote: Use ${ESHOP_EXTERNAL_DNS_NAME_OR_IP} if using external IP or DNS name from browser.
ports: ports:
- "5100:80" - "5100:80"
@ -90,10 +110,12 @@ services:
environment: environment:
- ASPNETCORE_ENVIRONMENT=Development - ASPNETCORE_ENVIRONMENT=Development
- ASPNETCORE_URLS=http://0.0.0.0:80 - ASPNETCORE_URLS=http://0.0.0.0:80
- ConnectionString=mongodb://nosql.data
- ConnectionString=${ESHOP_AZURE_COSMOSDB:-mongodb://nosql.data}
- Database=LocationsDb - Database=LocationsDb
- identityUrl=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5105. at range 5100-5105.
- EventBusConnection=rabbitmq
- identityUrl=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110.
- IdentityUrlExternal=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5105
- EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq}
- AzureServiceBusEnabled=False
ports: ports:
- "5109:80" - "5109:80"
@ -101,10 +123,49 @@ services:
environment: environment:
- ASPNETCORE_ENVIRONMENT=Development - ASPNETCORE_ENVIRONMENT=Development
- ASPNETCORE_URLS=http://0.0.0.0:80 - ASPNETCORE_URLS=http://0.0.0.0:80
- ConnectionString=Server=sql.data;Database=Microsoft.eShopOnContainers.Services.MarketingDb;User Id=sa;Password=Pass@word
- EventBusConnection=rabbitmq
- MongoConnectionString=mongodb://nosql.data
- ConnectionString=${ESHOP_AZURE_MARKETING_DB:-Server=sql.data;Database=Microsoft.eShopOnContainers.Services.MarketingDb;User Id=sa;Password=Pass@word}
- MongoConnectionString=${ESHOP_AZURE_COSMOSDB:-mongodb://nosql.data}
- MongoDatabase=MarketingDb - MongoDatabase=MarketingDb
- identityUrl=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5105. at range 5100-5105.
- EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq}
- identityUrl=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110.
- IdentityUrlExternal=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5105
- CampaignDetailFunctionUri=${ESHOP_AZUREFUNC_CAMPAIGN_DETAILS_URI}
- PicBaseUrl=${ESHOP_AZURE_STORAGE_MARKETING:-http://localhost:5110/api/v1/campaigns/[0]/pic/}
- AzureStorageAccountName=${ESHOP_AZURE_STORAGE_MARKETING_NAME}
- AzureStorageAccountKey=${ESHOP_AZURE_STORAGE_MARKETING_KEY}
- AzureServiceBusEnabled=False
- AzureStorageEnabled=False
ports: ports:
- "5110:80"
- "5110:80"
graceperiodmanager:
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}
- AzureServiceBusEnabled=False
webstatus:
environment:
- ASPNETCORE_ENVIRONMENT=Development
- ASPNETCORE_URLS=http://0.0.0.0:80
- CatalogUrl=http://catalog.api/hc
- OrderingUrl=http://ordering.api/hc
- BasketUrl=http://basket.api/hc
- IdentityUrl=http://identity.api/hc
- LocationsUrl=http://locations.api/hc
- MarketingUrl=http://marketing.api/hc
- mvc=http://webmvc/hc
- spa=http://webspa/hc
ports:
- "5107:80"
payment.api:
environment:
- ASPNETCORE_ENVIRONMENT=Development
- ASPNETCORE_URLS=http://0.0.0.0:80
- EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq}
- AzureServiceBusEnabled=False
ports:
- "5108:80"

+ 97
- 17
docker-compose-windows.prod.yml View File

@ -17,8 +17,11 @@ services:
environment: environment:
- ASPNETCORE_ENVIRONMENT=Production - ASPNETCORE_ENVIRONMENT=Production
- ASPNETCORE_URLS=http://0.0.0.0:80 - ASPNETCORE_URLS=http://0.0.0.0:80
- ConnectionString=basket.data
- identityUrl=http://identity.api #Local: You need to open your host's firewall at range 5100-5105. at range 5100-5105.
- ConnectionString=${ESHOP_AZURE_REDIS_BASKET_DB:-basket.data}
- identityUrl=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110.
- IdentityUrlExternal=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5105
- EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq}
- AzureServiceBusEnabled=False
ports: ports:
- "5103:5103" - "5103:5103"
@ -26,8 +29,14 @@ services:
environment: environment:
- ASPNETCORE_ENVIRONMENT=Production - ASPNETCORE_ENVIRONMENT=Production
- ASPNETCORE_URLS=http://0.0.0.0:80 - ASPNETCORE_URLS=http://0.0.0.0:80
- ConnectionString=Server=sql.data;Database=Microsoft.eShopOnContainers.Services.CatalogDb;User Id=sa;Password=Pass@word
- ExternalCatalogBaseUrl=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5101 #Local: You need to open your host's firewall at range 5100-5105. at range 5100-5105.
- ConnectionString=${ESHOP_AZURE_CATALOG_DB:-Server=sql.data;Database=Microsoft.eShopOnContainers.Services.CatalogDb;User Id=sa;Password=Pass@word}
- PicBaseUrl=${ESHOP_AZURE_STORAGE_CATALOG:-http://localhost:5101/api/v1/catalog/items/[0]/pic/} #Local: You need to open your local dev-machine firewall at range 5100-5110.
- EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq}
- AzureStorageAccountName=${ESHOP_AZURE_STORAGE_CATALOG_NAME}
- AzureStorageAccountKey=${ESHOP_AZURE_STORAGE_CATALOG_KEY}
- UseCustomizationData=True
- AzureServiceBusEnabled=False
- AzureStorageEnabled=False
ports: ports:
- "5101:80" - "5101:80"
@ -36,8 +45,14 @@ services:
- ASPNETCORE_ENVIRONMENT=Production - ASPNETCORE_ENVIRONMENT=Production
- ASPNETCORE_URLS=http://0.0.0.0:80 - ASPNETCORE_URLS=http://0.0.0.0:80
- SpaClient=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5104 - SpaClient=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5104
- ConnectionStrings__DefaultConnection=Server=sql.data;Database=Microsoft.eShopOnContainers.Service.IdentityDb;User Id=sa;Password=Pass@word
- MvcClient=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5100 #Local: You need to open your host's firewall at range 5100-5105.
- XamarinCallback=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5105/xamarincallback
- ConnectionStrings__DefaultConnection=${ESHOP_AZURE_IDENTITY_DB:-Server=sql.data;Database=Microsoft.eShopOnContainers.Service.IdentityDb;User Id=sa;Password=Pass@word}
- MvcClient=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5100 #Local: You need to open your local dev-machine firewall at range 5100-5110.
- LocationApiClient=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5109
- 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
- UseCustomizationData=True
ports: ports:
- "5105:80" - "5105:80"
@ -45,8 +60,12 @@ services:
environment: environment:
- ASPNETCORE_ENVIRONMENT=Production - ASPNETCORE_ENVIRONMENT=Production
- ASPNETCORE_URLS=http://0.0.0.0:80 - ASPNETCORE_URLS=http://0.0.0.0:80
- ConnectionString=Server=sql.data;Database=Microsoft.eShopOnContainers.Services.OrderingDb;User Id=sa;Password=Pass@word
- identityUrl=http://identity.api:5105 #Local: You need to open your host's firewall at range 5100-5105. at range 5100-5105.
- ConnectionString=${ESHOP_AZURE_ORDERING_DB:-Server=sql.data;Database=Microsoft.eShopOnContainers.Services.OrderingDb;User Id=sa;Password=Pass@word}
- identityUrl=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110.
- IdentityUrlExternal=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5105
- EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq}
- UseCustomizationData=True
- AzureServiceBusEnabled=False
ports: ports:
- "5102:80" - "5102:80"
@ -56,12 +75,15 @@ services:
- ASPNETCORE_URLS=http://0.0.0.0 - ASPNETCORE_URLS=http://0.0.0.0
- CatalogUrl=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5101 - CatalogUrl=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5101
- OrderingUrl=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5102 - 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 host's firewall at range 5100-5105. at range 5100-5105.
- BasketUrl=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5103
- IdentityUrl=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5105 #Local: You need to open your host's firewall at range 5100-5110.
- BasketUrl=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5103
- MarketingUrl=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5110
- CatalogUrlHC=http://catalog.api/hc - CatalogUrlHC=http://catalog.api/hc
- OrderingUrlHC=http://ordering.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. - 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
- BasketUrlHC=http://basket.api/hc
- MarketingUrlHC=http://marketing.api/hc
- UseCustomizationData=True
ports: ports:
- "5104:80" - "5104:80"
@ -73,6 +95,8 @@ services:
- OrderingUrl=http://ordering.api - OrderingUrl=http://ordering.api
- IdentityUrl=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5105 #Local: Use ${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}, if using external IP or DNS name from browser. - IdentityUrl=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5105 #Local: Use ${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}, if using external IP or DNS name from browser.
- BasketUrl=http://basket.api - BasketUrl=http://basket.api
- MarketingUrl=http://marketing.api
- UseCustomizationData=True #Remote: Use ${ESHOP_EXTERNAL_DNS_NAME_OR_IP} if using external IP or DNS name from browser.
ports: ports:
- "5100:80" - "5100:80"
@ -80,17 +104,73 @@ services:
environment: environment:
- ASPNETCORE_ENVIRONMENT=Production - ASPNETCORE_ENVIRONMENT=Production
- ASPNETCORE_URLS=http://0.0.0.0:80 - ASPNETCORE_URLS=http://0.0.0.0:80
- ConnectionString=Server=sql.data;Database=Microsoft.eShopOnContainers.Services.MarketingDb;User Id=sa;Password=Pass@word
- EventBusConnection=rabbitmq
- MongoConnectionString=mongodb://nosql.data
- ConnectionString=${ESHOP_AZURE_MARKETING_DB:-Server=sql.data;Database=Microsoft.eShopOnContainers.Services.MarketingDb;User Id=sa;Password=Pass@word}
- MongoConnectionString=${ESHOP_AZURE_COSMOSDB:-mongodb://nosql.data}
- MongoDatabase=MarketingDb - MongoDatabase=MarketingDb
- identityUrl=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5105. at range 5100-5105.
- EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq}
- identityUrl=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110.
- IdentityUrlExternal=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5105
- CampaignDetailFunctionUri=${ESHOP_AZUREFUNC_CAMPAIGN_DETAILS_URI}
- PicBaseUrl=${ESHOP_AZURE_STORAGE_MARKETING:-http://localhost:5110/api/v1/campaigns/[0]/pic/}
- AzureStorageAccountName=${ESHOP_AZURE_STORAGE_MARKETING_NAME}
- AzureStorageAccountKey=${ESHOP_AZURE_STORAGE_MARKETING_KEY}
- AzureServiceBusEnabled=False
- AzureStorageEnabled=False
ports: ports:
- "5110:80" - "5110:80"
graceperiodmanager:
environment:
- ASPNETCORE_ENVIRONMENT=Production
- 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}
sql.data: sql.data:
environment: environment:
- SA_PASSWORD=Pass@word - SA_PASSWORD=Pass@word
- ACCEPT_EULA=Y - ACCEPT_EULA=Y
ports: ports:
- "5433:1433"
- "5433:1433"
nosql.data:
ports:
- "27017:27017"
webstatus:
environment:
- ASPNETCORE_ENVIRONMENT=Production
- ASPNETCORE_URLS=http://0.0.0.0:80
- CatalogUrl=http://catalog.api/hc
- OrderingUrl=http://ordering.api/hc
- BasketUrl=http://basket.api/hc
- IdentityUrl=http://identity.api/hc
- LocationsUrl=http://locations.api/hc
- MarketingUrl=http://marketing.api/hc
- mvc=http://webmvc/hc
- spa=http://webspa/hc
ports:
- "5107:80"
payment.api:
environment:
- ASPNETCORE_ENVIRONMENT=Production
- ASPNETCORE_URLS=http://0.0.0.0:5108
- EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq}
- AzureServiceBusEnabled=False
ports:
- "5108:80"
locations.api:
environment:
- ASPNETCORE_ENVIRONMENT=Production
- ASPNETCORE_URLS=http://0.0.0.0:80
- ConnectionString=${ESHOP_AZURE_COSMOSDB:-mongodb://nosql.data}
- Database=LocationsDb
- identityUrl=http://identity.api #Local: You need to open your local dev-machine firewall at range 5100-5110.
- IdentityUrlExternal=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5105
- EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq}
- AzureServiceBusEnabled=False
ports:
- "5109:80"

+ 30
- 3
docker-compose-windows.yml View File

@ -9,6 +9,7 @@ services:
depends_on: depends_on:
- basket.data - basket.data
- identity.api - identity.api
- rabbitmq
catalog.api: catalog.api:
image: eshop/catalog.api-win:${TAG:-latest} image: eshop/catalog.api-win:${TAG:-latest}
@ -17,6 +18,7 @@ services:
dockerfile: Dockerfile.nanowin dockerfile: Dockerfile.nanowin
depends_on: depends_on:
- sql.data - sql.data
- rabbitmq
identity.api: identity.api:
image: eshop/identity.api-win:${TAG:-latest} image: eshop/identity.api-win:${TAG:-latest}
@ -33,6 +35,7 @@ services:
dockerfile: Dockerfile.nanowin dockerfile: Dockerfile.nanowin
depends_on: depends_on:
- sql.data - sql.data
- rabbitmq
webspa: webspa:
image: eshop/webspa-win:${TAG:-latest} image: eshop/webspa-win:${TAG:-latest}
@ -53,12 +56,19 @@ services:
- ordering.api - ordering.api
- identity.api - identity.api
- basket.api - basket.api
- marketing.api
webstatus:
image: eshop/webstatus:${TAG:-latest}
build:
context: ./src/Web/WebStatus
dockerfile: Dockerfile.nanowin
locations.api: locations.api:
image: eshop/locations.api:${TAG:-latest} image: eshop/locations.api:${TAG:-latest}
build: build:
context: ./src/Services/Location/Locations.API context: ./src/Services/Location/Locations.API
dockerfile: Dockerfile
dockerfile: Dockerfile.nanowin
depends_on: depends_on:
- nosql.data - nosql.data
- rabbitmq - rabbitmq
@ -67,7 +77,7 @@ services:
image: eshop/marketing.api:${TAG:-latest} image: eshop/marketing.api:${TAG:-latest}
build: build:
context: ./src/Services/Marketing/Marketing.API context: ./src/Services/Marketing/Marketing.API
dockerfile: Dockerfile
dockerfile: Dockerfile.nanowin
depends_on: depends_on:
- sql.data - sql.data
- nosql.data - nosql.data
@ -95,7 +105,24 @@ services:
# dockerfile: Dockerfile.nanowin # dockerfile: Dockerfile.nanowin
ports: ports:
- "5672:5672" - "5672:5672"
graceperiodmanager:
image: eshop/graceperiodmanager:${TAG:-latest}
build:
context: ./src/Services/GracePeriod/GracePeriodManager
dockerfile: Dockerfile.nanowin
depends_on:
- sql.data
- rabbitmq
payment.api:
image: eshop/payment.api:${TAG:-latest}
build:
context: ./src/Services/Payment/Payment.API
dockerfile: Dockerfile.nanowin
depends_on:
- rabbitmq
networks: networks:
default: default:
external: external:


+ 7
- 3
docker-compose.ci.build.yml View File

@ -7,8 +7,12 @@ services:
- .:/src - .:/src
- ./cli-linux:/cli-linux - ./cli-linux:/cli-linux
working_dir: /src working_dir: /src
# DO NOT USE the sln file to compile because msbuild issue (https://github.com/Microsoft/msbuild/issues/2153)
# command: /bin/bash -c "pushd ./src/Web/WebSPA && npm rebuild node-sass && popd && dotnet restore ./eShopOnContainers-ServicesAndWebApps.sln && dotnet publish ./eShopOnContainers-ServicesAndWebApps.sln -c Release -o ./obj/Docker/publish"
# NOTE: Using build-bits-linux.sh triggers the same MSBUILD error :( (but at least, less frequently)
# Next line is using the .sln file to compile all the projects.
# Sometime there is an issue in msbuild exits the process before finishing building the bits: (https://github.com/Microsoft/msbuild/issues/2153)
# Random error: error MSB4017: The build stopped unexpectedly be cause of an unexpected logger failure.
#command: /bin/bash -c "pushd ./src/Web/WebSPA && npm rebuild node-sass && popd && dotnet restore ./eShopOnContainers-ServicesAndWebApps.sln && dotnet publish ./eShopOnContainers-ServicesAndWebApps.sln -c Release -o ./obj/Docker/publish"
# NOTE: Using build-bits-linux.sh from Linux build container exits before ending.
command: /bin/bash -c "pushd ./src/Web/WebSPA && npm rebuild node-sass && popd && pushd /cli-linux && ./build-bits-linux.sh /src" command: /bin/bash -c "pushd ./src/Web/WebSPA && npm rebuild node-sass && popd && pushd /cli-linux && ./build-bits-linux.sh /src"

+ 39
- 23
docker-compose.override.yml View File

@ -7,14 +7,6 @@ version: '2.1'
# An external IP or DNS name has to be used (instead localhost and the 10.0.75.1 IP) when testing the Web apps and the Xamarin apps from remote machines/devices using the same WiFi, for instance. # An external IP or DNS name has to be used (instead localhost and the 10.0.75.1 IP) when testing the Web apps and the Xamarin apps from remote machines/devices using the same WiFi, for instance.
services: services:
graceperiodmanager:
environment:
- ASPNETCORE_ENVIRONMENT=Development
- ASPNETCORE_URLS=http://0.0.0.0:80
- ConnectionString=Server=sql.data;Database=Microsoft.eShopOnContainers.Services.OrderingDb;User Id=sa;Password=Pass@word
- EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq}
- CheckUpdateTime=30000
- GracePeriodTime=1
basket.api: basket.api:
environment: environment:
@ -22,7 +14,9 @@ services:
- ASPNETCORE_URLS=http://0.0.0.0:80 - ASPNETCORE_URLS=http://0.0.0.0:80
- ConnectionString=${ESHOP_AZURE_REDIS_BASKET_DB:-basket.data} - ConnectionString=${ESHOP_AZURE_REDIS_BASKET_DB:-basket.data}
- 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.
- IdentityUrlExternal=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5105
- EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq} - EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq}
- AzureServiceBusEnabled=False
ports: ports:
- "5103:80" - "5103:80"
@ -31,11 +25,13 @@ services:
- ASPNETCORE_ENVIRONMENT=Development - ASPNETCORE_ENVIRONMENT=Development
- ASPNETCORE_URLS=http://0.0.0.0:80 - 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} - ConnectionString=${ESHOP_AZURE_CATALOG_DB:-Server=sql.data;Database=Microsoft.eShopOnContainers.Services.CatalogDb;User Id=sa;Password=Pass@word}
- PicBaseUrl=${ESHOP_AZURE_STORAGE_CATALOG:-http://localhost:5101/api/v1/pic/} #Local: You need to open your local dev-machine firewall at range 5100-5110.
- 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.
- EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq} - EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq}
- AzureStorageAccountName=${ESHOP_AZURE_STORAGE_CATALOG_NAME} - AzureStorageAccountName=${ESHOP_AZURE_STORAGE_CATALOG_NAME}
- AzureStorageAccountKey=${ESHOP_AZURE_STORAGE_CATALOG_KEY} - AzureStorageAccountKey=${ESHOP_AZURE_STORAGE_CATALOG_KEY}
- UseCustomizationData=True - UseCustomizationData=True
- AzureServiceBusEnabled=False
- AzureStorageEnabled=False
ports: ports:
- "5101:80" - "5101:80"
@ -46,7 +42,11 @@ services:
- SpaClient=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5104 - SpaClient=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5104
- XamarinCallback=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5105/xamarincallback #localhost do not work for UWP login, so we have to use "external" IP always - XamarinCallback=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5105/xamarincallback #localhost do not work for UWP login, so we have to use "external" IP always
- ConnectionStrings__DefaultConnection=${ESHOP_AZURE_IDENTITY_DB:-Server=sql.data;Database=Microsoft.eShopOnContainers.Service.IdentityDb;User Id=sa;Password=Pass@word} - ConnectionStrings__DefaultConnection=${ESHOP_AZURE_IDENTITY_DB:-Server=sql.data;Database=Microsoft.eShopOnContainers.Service.IdentityDb;User Id=sa;Password=Pass@word}
- MvcClient=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5100 #Local: You need to open your local dev-machine firewall at range 5100-5110.
- MvcClient=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5100 #Local: You need to open your local dev-machine firewall at range 5100-5110.
- LocationApiClient=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5109
- 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
- UseCustomizationData=True - UseCustomizationData=True
ports: ports:
- "5105:80" - "5105:80"
@ -57,8 +57,10 @@ services:
- ASPNETCORE_URLS=http://0.0.0.0:80 - 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} - ConnectionString=${ESHOP_AZURE_ORDERING_DB:-Server=sql.data;Database=Microsoft.eShopOnContainers.Services.OrderingDb;User Id=sa;Password=Pass@word}
- 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.
- IdentityUrlExternal=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5105
- EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq} - EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq}
- UseCustomizationData=True - UseCustomizationData=True
- AzureServiceBusEnabled=False
ports: ports:
- "5102:80" - "5102:80"
@ -71,13 +73,24 @@ services:
- MongoDatabase=MarketingDb - MongoDatabase=MarketingDb
- EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq} - EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq}
- 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.
- IdentityUrlExternal=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5105
- CampaignDetailFunctionUri=${ESHOP_AZUREFUNC_CAMPAIGN_DETAILS_URI} - CampaignDetailFunctionUri=${ESHOP_AZUREFUNC_CAMPAIGN_DETAILS_URI}
- PicBaseUrl=${ESHOP_AZURE_STORAGE_MARKETING:-http://localhost:5110/api/v1/pic/}
- PicBaseUrl=${ESHOP_AZURE_STORAGE_MARKETING_URL:-http://localhost:5110/api/v1/campaigns/[0]/pic/}
- AzureStorageAccountName=${ESHOP_AZURE_STORAGE_MARKETING_NAME} - AzureStorageAccountName=${ESHOP_AZURE_STORAGE_MARKETING_NAME}
- AzureStorageAccountKey=${ESHOP_AZURE_STORAGE_MARKETING_KEY} - AzureStorageAccountKey=${ESHOP_AZURE_STORAGE_MARKETING_KEY}
- AzureServiceBusEnabled=False
- AzureStorageEnabled=False
ports: ports:
- "5110:80" - "5110:80"
graceperiodmanager:
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}
- AzureServiceBusEnabled=False
webspa: webspa:
environment: environment:
- ASPNETCORE_ENVIRONMENT=Development - ASPNETCORE_ENVIRONMENT=Development
@ -110,17 +123,6 @@ services:
ports: ports:
- "5100:80" - "5100:80"
sql.data:
environment:
- SA_PASSWORD=Pass@word
- ACCEPT_EULA=Y
ports:
- "5433:1433"
nosql.data:
ports:
- "27017:27017"
webstatus: webstatus:
environment: environment:
- ASPNETCORE_ENVIRONMENT=Development - ASPNETCORE_ENVIRONMENT=Development
@ -139,8 +141,9 @@ services:
payment.api: payment.api:
environment: environment:
- ASPNETCORE_ENVIRONMENT=Development - ASPNETCORE_ENVIRONMENT=Development
- ASPNETCORE_URLS=http://0.0.0.0:5108
- ASPNETCORE_URLS=http://0.0.0.0:80
- EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq} - EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq}
- AzureServiceBusEnabled=False
ports: ports:
- "5108:80" - "5108:80"
@ -151,6 +154,19 @@ services:
- ConnectionString=${ESHOP_AZURE_COSMOSDB:-mongodb://nosql.data} - ConnectionString=${ESHOP_AZURE_COSMOSDB:-mongodb://nosql.data}
- Database=LocationsDb - Database=LocationsDb
- 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.
- IdentityUrlExternal=http://${ESHOP_EXTERNAL_DNS_NAME_OR_IP}:5105
- EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq} - EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq}
- AzureServiceBusEnabled=False
ports: ports:
- "5109:80" - "5109:80"
sql.data:
environment:
- SA_PASSWORD=Pass@word
- ACCEPT_EULA=Y
ports:
- "5433:1433"
nosql.data:
ports:
- "27017:27017"

+ 35
- 14
docker-compose.prod.yml View File

@ -12,12 +12,6 @@ version: '2.1'
# 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 -d
services: services:
graceperiodmanager:
environment:
- ASPNETCORE_ENVIRONMENT=Production
- ASPNETCORE_URLS=http://0.0.0.0:80
- ConnectionString=Server=sql.data;Database=Microsoft.eShopOnContainers.Services.OrderingDb;User Id=sa;Password=Pass@word
- EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq}
basket.api: basket.api:
environment: environment:
@ -25,20 +19,24 @@ services:
- ASPNETCORE_URLS=http://0.0.0.0:80 - ASPNETCORE_URLS=http://0.0.0.0:80
- ConnectionString=${ESHOP_AZURE_REDIS_BASKET_DB:-basket.data} - ConnectionString=${ESHOP_AZURE_REDIS_BASKET_DB:-basket.data}
- 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.
- IdentityUrlExternal=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5105
- EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq} - EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq}
- AzureServiceBusEnabled=False
ports: ports:
- "5103:80" - "5103:80"
catalog.api: catalog.api:
environment: environment:
- ASPNETCORE_ENVIRONMENT=Production - ASPNETCORE_ENVIRONMENT=Production
ASPNETCORE_URLS=http://0.0.0.0:80
- 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} - ConnectionString=${ESHOP_AZURE_CATALOG_DB:-Server=sql.data;Database=Microsoft.eShopOnContainers.Services.CatalogDb;User Id=sa;Password=Pass@word}
- PicBaseUrl=${ESHOP_AZURE_STORAGE_CATALOG:-http://localhost:5101/api/v1/pic/} #Local: You need to open your local dev-machine firewall at range 5100-5110.
- 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.
- EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq} - EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq}
- AzureStorageAccountName=${ESHOP_AZURE_STORAGE_CATALOG_NAME} - AzureStorageAccountName=${ESHOP_AZURE_STORAGE_CATALOG_NAME}
- AzureStorageAccountKey=${ESHOP_AZURE_STORAGE_CATALOG_KEY} - AzureStorageAccountKey=${ESHOP_AZURE_STORAGE_CATALOG_KEY}
- UseCustomizationData=True - UseCustomizationData=True
- AzureServiceBusEnabled=False
- AzureStorageEnabled=False
ports: ports:
- "5101:80" - "5101:80"
@ -47,9 +45,13 @@ services:
- ASPNETCORE_ENVIRONMENT=Production - ASPNETCORE_ENVIRONMENT=Production
- ASPNETCORE_URLS=http://0.0.0.0:80 - ASPNETCORE_URLS=http://0.0.0.0:80
- SpaClient=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5104 - SpaClient=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5104
- ConnectionStrings__DefaultConnection=${ESHOP_AZURE_IDENTITY_DB:-Server=sql.data;Database=Microsoft.eShopOnContainers.Service.IdentityDb;User Id=sa;Password=Pass@word}
- MvcClient=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5100 #Local: You need to open your host's firewall at range 5100-5110.
- XamarinCallback=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5105/xamarincallback - XamarinCallback=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5105/xamarincallback
- ConnectionStrings__DefaultConnection=${ESHOP_AZURE_IDENTITY_DB:-Server=sql.data;Database=Microsoft.eShopOnContainers.Service.IdentityDb;User Id=sa;Password=Pass@word}
- MvcClient=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5100 #Local: You need to open your local dev-machine firewall at range 5100-5110.
- LocationApiClient=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5109
- 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
- UseCustomizationData=True - UseCustomizationData=True
ports: ports:
- "5105:80" - "5105:80"
@ -60,8 +62,10 @@ services:
- ASPNETCORE_URLS=http://0.0.0.0:80 - 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} - ConnectionString=${ESHOP_AZURE_ORDERING_DB:-Server=sql.data;Database=Microsoft.eShopOnContainers.Services.OrderingDb;User Id=sa;Password=Pass@word}
- 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.
- IdentityUrlExternal=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5105
- EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq} - EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq}
- UseCustomizationData=True - UseCustomizationData=True
- AzureServiceBusEnabled=False
ports: ports:
- "5102:80" - "5102:80"
@ -73,14 +77,25 @@ services:
- MongoConnectionString=${ESHOP_AZURE_COSMOSDB:-mongodb://nosql.data} - MongoConnectionString=${ESHOP_AZURE_COSMOSDB:-mongodb://nosql.data}
- MongoDatabase=MarketingDb - MongoDatabase=MarketingDb
- EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq} - EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq}
- 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.
- IdentityUrlExternal=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5105
- CampaignDetailFunctionUri=${ESHOP_AZUREFUNC_CAMPAIGN_DETAILS_URI} - CampaignDetailFunctionUri=${ESHOP_AZUREFUNC_CAMPAIGN_DETAILS_URI}
- PicBaseUrl=${ESHOP_AZURE_STORAGE_MARKETING:-http://localhost:5110/api/v1/pic/}
- PicBaseUrl=${ESHOP_AZURE_STORAGE_MARKETING_URL:-http://localhost:5110/api/v1/campaigns/[0]/pic/}
- AzureStorageAccountName=${ESHOP_AZURE_STORAGE_MARKETING_NAME} - AzureStorageAccountName=${ESHOP_AZURE_STORAGE_MARKETING_NAME}
- AzureStorageAccountKey=${ESHOP_AZURE_STORAGE_MARKETING_KEY} - AzureStorageAccountKey=${ESHOP_AZURE_STORAGE_MARKETING_KEY}
- AzureServiceBusEnabled=False
- AzureStorageEnabled=False
ports: ports:
- "5110:80" - "5110:80"
graceperiodmanager:
environment:
- ASPNETCORE_ENVIRONMENT=Production
- 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}
- AzureServiceBusEnabled=False
webspa: webspa:
environment: environment:
- ASPNETCORE_ENVIRONMENT=Production - ASPNETCORE_ENVIRONMENT=Production
@ -89,6 +104,7 @@ services:
- OrderingUrl=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5102 - 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 host's firewall at range 5100-5110. - IdentityUrl=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5105 #Local: You need to open your host's firewall at range 5100-5110.
- BasketUrl=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5103 - BasketUrl=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5103
- MarketingUrl=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5110
- CatalogUrlHC=http://catalog.api/hc - CatalogUrlHC=http://catalog.api/hc
- OrderingUrlHC=http://ordering.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. - IdentityUrlHC=http://identity.api/hc #Local: Use ${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}, if using external IP or DNS name from browser.
@ -104,9 +120,11 @@ services:
- ASPNETCORE_URLS=http://0.0.0.0:80 - ASPNETCORE_URLS=http://0.0.0.0:80
- CatalogUrl=http://catalog.api - CatalogUrl=http://catalog.api
- OrderingUrl=http://ordering.api - OrderingUrl=http://ordering.api
- IdentityUrl=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5105 #Local: Use ${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}, if using external IP or DNS name from browser.
- BasketUrl=http://basket.api - BasketUrl=http://basket.api
- MarketingUrl=http://marketing.api
- IdentityUrl=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5105 #Local: Use ${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}, if using external IP or DNS name from browser.
- MarketingUrl=http://marketing.api #Local: Use 10.0.75.1 in a "Docker for Windows" environment, if using "localhost" from browser.
#Remote: Use ${ESHOP_EXTERNAL_DNS_NAME_OR_IP} if using external IP or DNS name from browser.
- UseCustomizationData=True
ports: ports:
- "5100:80" - "5100:80"
@ -142,6 +160,7 @@ services:
- ASPNETCORE_ENVIRONMENT=Production - ASPNETCORE_ENVIRONMENT=Production
- ASPNETCORE_URLS=http://0.0.0.0:5108 - ASPNETCORE_URLS=http://0.0.0.0:5108
- EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq} - EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq}
- AzureServiceBusEnabled=False
ports: ports:
- "5108:80" - "5108:80"
@ -152,6 +171,8 @@ services:
- ConnectionString=${ESHOP_AZURE_COSMOSDB:-mongodb://nosql.data} - ConnectionString=${ESHOP_AZURE_COSMOSDB:-mongodb://nosql.data}
- Database=LocationsDb - Database=LocationsDb
- 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.
- IdentityUrlExternal=http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5105
- EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq} - EventBusConnection=${ESHOP_AZURE_SERVICE_BUS:-rabbitmq}
- AzureServiceBusEnabled=False
ports: ports:
- "5109:80" - "5109:80"

+ 29
- 24
docker-compose.yml View File

@ -1,14 +1,6 @@
version: '2.1' version: '2.1'
services: services:
graceperiodmanager:
image: eshop/graceperiodmanager:${TAG:-latest}
build:
context: ./src/Services/GracePeriod/GracePeriodManager
dockerfile: Dockerfile
depends_on:
- sql.data
- rabbitmq
basket.api: basket.api:
image: eshop/basket.api:${TAG:-latest} image: eshop/basket.api:${TAG:-latest}
@ -18,6 +10,7 @@ services:
depends_on: depends_on:
- basket.data - basket.data
- identity.api - identity.api
- rabbitmq
catalog.api: catalog.api:
image: eshop/catalog.api:${TAG:-latest} image: eshop/catalog.api:${TAG:-latest}
@ -56,14 +49,26 @@ services:
- identity.api - identity.api
- rabbitmq - rabbitmq
graceperiodmanager:
image: eshop/graceperiodmanager:${TAG:-latest}
build:
context: ./src/Services/GracePeriod/GracePeriodManager
dockerfile: Dockerfile
depends_on:
- sql.data
- rabbitmq
webspa: webspa:
image: eshop/webspa:${TAG:-latest} image: eshop/webspa:${TAG:-latest}
build: build:
context: ./src/Web/WebSPA context: ./src/Web/WebSPA
dockerfile: Dockerfile dockerfile: Dockerfile
depends_on: depends_on:
- catalog.api
- ordering.api
- identity.api - identity.api
- basket.api - basket.api
- marketing.api
webmvc: webmvc:
image: eshop/webmvc:${TAG:-latest} image: eshop/webmvc:${TAG:-latest}
@ -77,22 +82,6 @@ services:
- basket.api - basket.api
- marketing.api - marketing.api
sql.data:
image: microsoft/mssql-server-linux
nosql.data:
image: mongo
basket.data:
image: redis
ports:
- "6379:6379"
rabbitmq:
image: rabbitmq
ports:
- "5672:5672"
webstatus: webstatus:
image: eshop/webstatus:${TAG:-latest} image: eshop/webstatus:${TAG:-latest}
build: build:
@ -115,3 +104,19 @@ services:
depends_on: depends_on:
- nosql.data - nosql.data
- rabbitmq - rabbitmq
sql.data:
image: microsoft/mssql-server-linux
nosql.data:
image: mongo
basket.data:
image: redis
ports:
- "6379:6379"
rabbitmq:
image: rabbitmq
ports:
- "5672:5672"

BIN
docs/Containerized Docker Application Lifecycle with Microsoft Platform and Tools (eBook).pdf View File


BIN
docs/Containerized-Docker-Application-Lifecycle-with-Microsoft-Platform-and-Tools-(eBook)_v1.1.pdf View File


BIN
docs/Enterprise-Application-Patterns-using-XamarinForms.pdf View File


+ 3
- 1
eShopOnContainers-MobileApps.sln View File

@ -1,7 +1,7 @@
 
Microsoft Visual Studio Solution File, Format Version 12.00 Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15 # Visual Studio 15
VisualStudioVersion = 15.0.26228.9
VisualStudioVersion = 15.0.26430.16
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{932D8224-11F6-4D07-B109-DA28AD288A63}" Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{932D8224-11F6-4D07-B109-DA28AD288A63}"
EndProject EndProject
@ -473,6 +473,8 @@ Global
{A7337243-33B8-463A-87AD-944B75EFD820}.AppStore|x86.Build.0 = Release|x86 {A7337243-33B8-463A-87AD-944B75EFD820}.AppStore|x86.Build.0 = Release|x86
{A7337243-33B8-463A-87AD-944B75EFD820}.AppStore|x86.Deploy.0 = Release|x86 {A7337243-33B8-463A-87AD-944B75EFD820}.AppStore|x86.Deploy.0 = Release|x86
{A7337243-33B8-463A-87AD-944B75EFD820}.Debug|Any CPU.ActiveCfg = Debug|x86 {A7337243-33B8-463A-87AD-944B75EFD820}.Debug|Any CPU.ActiveCfg = Debug|x86
{A7337243-33B8-463A-87AD-944B75EFD820}.Debug|Any CPU.Build.0 = Debug|x86
{A7337243-33B8-463A-87AD-944B75EFD820}.Debug|Any CPU.Deploy.0 = Debug|x86
{A7337243-33B8-463A-87AD-944B75EFD820}.Debug|ARM.ActiveCfg = Debug|ARM {A7337243-33B8-463A-87AD-944B75EFD820}.Debug|ARM.ActiveCfg = Debug|ARM
{A7337243-33B8-463A-87AD-944B75EFD820}.Debug|ARM.Build.0 = Debug|ARM {A7337243-33B8-463A-87AD-944B75EFD820}.Debug|ARM.Build.0 = Debug|ARM
{A7337243-33B8-463A-87AD-944B75EFD820}.Debug|ARM.Deploy.0 = Debug|ARM {A7337243-33B8-463A-87AD-944B75EFD820}.Debug|ARM.Deploy.0 = Debug|ARM


+ 424
- 1
eShopOnContainers.sln View File

@ -1,7 +1,7 @@
 
Microsoft Visual Studio Solution File, Format Version 12.00 Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15 # Visual Studio 15
VisualStudioVersion = 15.0.26430.13
VisualStudioVersion = 15.0.26430.6
MinimumVisualStudioVersion = 10.0.40219.1 MinimumVisualStudioVersion = 10.0.40219.1
Project("{E53339B2-1760-4266-BCC7-CA923CBCF16C}") = "docker-compose", "docker-compose.dcproj", "{FEA0C318-FFED-4D39-8781-265718CA43DD}" Project("{E53339B2-1760-4266-BCC7-CA923CBCF16C}") = "docker-compose", "docker-compose.dcproj", "{FEA0C318-FFED-4D39-8781-265718CA43DD}"
ProjectSection(ProjectDependencies) = postProject ProjectSection(ProjectDependencies) = postProject
@ -40,6 +40,9 @@ EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{A857AD10-40FF-4303-BEC2-FF1C58D5735E}" Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{A857AD10-40FF-4303-BEC2-FF1C58D5735E}"
EndProject EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Services", "Services", "{EF0337F2-ED00-4643-89FD-EE10863F1870}" Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Services", "Services", "{EF0337F2-ED00-4643-89FD-EE10863F1870}"
ProjectSection(SolutionItems) = preProject
test\Services\LoadTest\LoadTest.csproj = test\Services\LoadTest\LoadTest.csproj
EndProjectSection
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WebMVC", "src\Web\WebMVC\WebMVC.csproj", "{F0333D8E-0B27-42B7-B2C6-78F3657624E2}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WebMVC", "src\Web\WebMVC\WebMVC.csproj", "{F0333D8E-0B27-42B7-B2C6-78F3657624E2}"
EndProject EndProject
@ -105,6 +108,30 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WebStatus", "src\Web\WebSta
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Extensions.HealthChecks.SqlServer", "src\BuildingBlocks\HealthChecks\src\Microsoft.Extensions.HealthChecks.SqlServer\Microsoft.Extensions.HealthChecks.SqlServer.csproj", "{6CCC4F1B-602D-4FAD-91A7-002CC86C7612}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Extensions.HealthChecks.SqlServer", "src\BuildingBlocks\HealthChecks\src\Microsoft.Extensions.HealthChecks.SqlServer\Microsoft.Extensions.HealthChecks.SqlServer.csproj", "{6CCC4F1B-602D-4FAD-91A7-002CC86C7612}"
EndProject EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "DataProtection", "DataProtection", "{CC0FD121-5E19-44B6-B23F-0FE3D1B821D3}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DataProtection", "src\BuildingBlocks\DataProtection\DataProtection\DataProtection.csproj", "{237CA273-8555-4944-B87D-5B65AB3A788C}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Location", "Location", "{0CF40BE0-A463-4E4F-A29C-C7427D04DC4F}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Locations.API", "src\Services\Location\Locations.API\Locations.API.csproj", "{B30E0E82-9EA4-49D6-BA0D-BA8E5FA48800}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Marketing", "Marketing", "{72704C77-5C90-4705-B2A4-7A6E3B02FF08}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Marketing.API", "src\Services\Marketing\Marketing.API\Marketing.API.csproj", "{5E319B6A-9F04-4113-ABF9-AB8CD1F7A0B5}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EventBusServiceBus", "src\BuildingBlocks\EventBus\EventBusServiceBus\EventBusServiceBus.csproj", "{26906157-98E3-4DF8-80F6-866B9686887C}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "EventBus.Tests", "src\BuildingBlocks\EventBus\EventBus.Tests\EventBus.Tests.csproj", "{8AE2AAA3-4507-4BEE-9250-4D16F87015B4}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Extensions.HealthChecks.AzureStorage", "src\BuildingBlocks\HealthChecks\src\Microsoft.Extensions.HealthChecks.AzureStorage\Microsoft.Extensions.HealthChecks.AzureStorage.csproj", "{1CFFC16D-0D4A-47B3-9316-2A04ABD4A7AD}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GracePeriodManager", "src\Services\GracePeriod\GracePeriodManager\GracePeriodManager.csproj", "{6C6A69FE-A484-4E75-AFEC-827EA354AF46}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Payment", "Payment", "{D5D3841D-F282-4E60-B9CB-267A1BF2D893}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Payment.API", "src\Services\Payment\Payment.API\Payment.API.csproj", "{2A795FEA-2EB7-45F5-9B30-35E0810CB238}"
EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Ad-Hoc|Any CPU = Ad-Hoc|Any CPU Ad-Hoc|Any CPU = Ad-Hoc|Any CPU
@ -1466,6 +1493,390 @@ Global
{6CCC4F1B-602D-4FAD-91A7-002CC86C7612}.Release|x64.Build.0 = Release|Any CPU {6CCC4F1B-602D-4FAD-91A7-002CC86C7612}.Release|x64.Build.0 = Release|Any CPU
{6CCC4F1B-602D-4FAD-91A7-002CC86C7612}.Release|x86.ActiveCfg = Release|Any CPU {6CCC4F1B-602D-4FAD-91A7-002CC86C7612}.Release|x86.ActiveCfg = Release|Any CPU
{6CCC4F1B-602D-4FAD-91A7-002CC86C7612}.Release|x86.Build.0 = Release|Any CPU {6CCC4F1B-602D-4FAD-91A7-002CC86C7612}.Release|x86.Build.0 = Release|Any CPU
{237CA273-8555-4944-B87D-5B65AB3A788C}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU
{237CA273-8555-4944-B87D-5B65AB3A788C}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU
{237CA273-8555-4944-B87D-5B65AB3A788C}.Ad-Hoc|ARM.ActiveCfg = Debug|Any CPU
{237CA273-8555-4944-B87D-5B65AB3A788C}.Ad-Hoc|ARM.Build.0 = Debug|Any CPU
{237CA273-8555-4944-B87D-5B65AB3A788C}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU
{237CA273-8555-4944-B87D-5B65AB3A788C}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU
{237CA273-8555-4944-B87D-5B65AB3A788C}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{237CA273-8555-4944-B87D-5B65AB3A788C}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU
{237CA273-8555-4944-B87D-5B65AB3A788C}.Ad-Hoc|x64.ActiveCfg = Debug|Any CPU
{237CA273-8555-4944-B87D-5B65AB3A788C}.Ad-Hoc|x64.Build.0 = Debug|Any CPU
{237CA273-8555-4944-B87D-5B65AB3A788C}.Ad-Hoc|x86.ActiveCfg = Debug|Any CPU
{237CA273-8555-4944-B87D-5B65AB3A788C}.Ad-Hoc|x86.Build.0 = Debug|Any CPU
{237CA273-8555-4944-B87D-5B65AB3A788C}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU
{237CA273-8555-4944-B87D-5B65AB3A788C}.AppStore|Any CPU.Build.0 = Debug|Any CPU
{237CA273-8555-4944-B87D-5B65AB3A788C}.AppStore|ARM.ActiveCfg = Debug|Any CPU
{237CA273-8555-4944-B87D-5B65AB3A788C}.AppStore|ARM.Build.0 = Debug|Any CPU
{237CA273-8555-4944-B87D-5B65AB3A788C}.AppStore|iPhone.ActiveCfg = Debug|Any CPU
{237CA273-8555-4944-B87D-5B65AB3A788C}.AppStore|iPhone.Build.0 = Debug|Any CPU
{237CA273-8555-4944-B87D-5B65AB3A788C}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{237CA273-8555-4944-B87D-5B65AB3A788C}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU
{237CA273-8555-4944-B87D-5B65AB3A788C}.AppStore|x64.ActiveCfg = Debug|Any CPU
{237CA273-8555-4944-B87D-5B65AB3A788C}.AppStore|x64.Build.0 = Debug|Any CPU
{237CA273-8555-4944-B87D-5B65AB3A788C}.AppStore|x86.ActiveCfg = Debug|Any CPU
{237CA273-8555-4944-B87D-5B65AB3A788C}.AppStore|x86.Build.0 = Debug|Any CPU
{237CA273-8555-4944-B87D-5B65AB3A788C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{237CA273-8555-4944-B87D-5B65AB3A788C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{237CA273-8555-4944-B87D-5B65AB3A788C}.Debug|ARM.ActiveCfg = Debug|Any CPU
{237CA273-8555-4944-B87D-5B65AB3A788C}.Debug|ARM.Build.0 = Debug|Any CPU
{237CA273-8555-4944-B87D-5B65AB3A788C}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{237CA273-8555-4944-B87D-5B65AB3A788C}.Debug|iPhone.Build.0 = Debug|Any CPU
{237CA273-8555-4944-B87D-5B65AB3A788C}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{237CA273-8555-4944-B87D-5B65AB3A788C}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{237CA273-8555-4944-B87D-5B65AB3A788C}.Debug|x64.ActiveCfg = Debug|Any CPU
{237CA273-8555-4944-B87D-5B65AB3A788C}.Debug|x64.Build.0 = Debug|Any CPU
{237CA273-8555-4944-B87D-5B65AB3A788C}.Debug|x86.ActiveCfg = Debug|Any CPU
{237CA273-8555-4944-B87D-5B65AB3A788C}.Debug|x86.Build.0 = Debug|Any CPU
{237CA273-8555-4944-B87D-5B65AB3A788C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{237CA273-8555-4944-B87D-5B65AB3A788C}.Release|Any CPU.Build.0 = Release|Any CPU
{237CA273-8555-4944-B87D-5B65AB3A788C}.Release|ARM.ActiveCfg = Release|Any CPU
{237CA273-8555-4944-B87D-5B65AB3A788C}.Release|ARM.Build.0 = Release|Any CPU
{237CA273-8555-4944-B87D-5B65AB3A788C}.Release|iPhone.ActiveCfg = Release|Any CPU
{237CA273-8555-4944-B87D-5B65AB3A788C}.Release|iPhone.Build.0 = Release|Any CPU
{237CA273-8555-4944-B87D-5B65AB3A788C}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{237CA273-8555-4944-B87D-5B65AB3A788C}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{237CA273-8555-4944-B87D-5B65AB3A788C}.Release|x64.ActiveCfg = Release|Any CPU
{237CA273-8555-4944-B87D-5B65AB3A788C}.Release|x64.Build.0 = Release|Any CPU
{237CA273-8555-4944-B87D-5B65AB3A788C}.Release|x86.ActiveCfg = Release|Any CPU
{237CA273-8555-4944-B87D-5B65AB3A788C}.Release|x86.Build.0 = Release|Any CPU
{B30E0E82-9EA4-49D6-BA0D-BA8E5FA48800}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU
{B30E0E82-9EA4-49D6-BA0D-BA8E5FA48800}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU
{B30E0E82-9EA4-49D6-BA0D-BA8E5FA48800}.Ad-Hoc|ARM.ActiveCfg = Debug|Any CPU
{B30E0E82-9EA4-49D6-BA0D-BA8E5FA48800}.Ad-Hoc|ARM.Build.0 = Debug|Any CPU
{B30E0E82-9EA4-49D6-BA0D-BA8E5FA48800}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU
{B30E0E82-9EA4-49D6-BA0D-BA8E5FA48800}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU
{B30E0E82-9EA4-49D6-BA0D-BA8E5FA48800}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{B30E0E82-9EA4-49D6-BA0D-BA8E5FA48800}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU
{B30E0E82-9EA4-49D6-BA0D-BA8E5FA48800}.Ad-Hoc|x64.ActiveCfg = Debug|Any CPU
{B30E0E82-9EA4-49D6-BA0D-BA8E5FA48800}.Ad-Hoc|x64.Build.0 = Debug|Any CPU
{B30E0E82-9EA4-49D6-BA0D-BA8E5FA48800}.Ad-Hoc|x86.ActiveCfg = Debug|Any CPU
{B30E0E82-9EA4-49D6-BA0D-BA8E5FA48800}.Ad-Hoc|x86.Build.0 = Debug|Any CPU
{B30E0E82-9EA4-49D6-BA0D-BA8E5FA48800}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU
{B30E0E82-9EA4-49D6-BA0D-BA8E5FA48800}.AppStore|Any CPU.Build.0 = Debug|Any CPU
{B30E0E82-9EA4-49D6-BA0D-BA8E5FA48800}.AppStore|ARM.ActiveCfg = Debug|Any CPU
{B30E0E82-9EA4-49D6-BA0D-BA8E5FA48800}.AppStore|ARM.Build.0 = Debug|Any CPU
{B30E0E82-9EA4-49D6-BA0D-BA8E5FA48800}.AppStore|iPhone.ActiveCfg = Debug|Any CPU
{B30E0E82-9EA4-49D6-BA0D-BA8E5FA48800}.AppStore|iPhone.Build.0 = Debug|Any CPU
{B30E0E82-9EA4-49D6-BA0D-BA8E5FA48800}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{B30E0E82-9EA4-49D6-BA0D-BA8E5FA48800}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU
{B30E0E82-9EA4-49D6-BA0D-BA8E5FA48800}.AppStore|x64.ActiveCfg = Debug|Any CPU
{B30E0E82-9EA4-49D6-BA0D-BA8E5FA48800}.AppStore|x64.Build.0 = Debug|Any CPU
{B30E0E82-9EA4-49D6-BA0D-BA8E5FA48800}.AppStore|x86.ActiveCfg = Debug|Any CPU
{B30E0E82-9EA4-49D6-BA0D-BA8E5FA48800}.AppStore|x86.Build.0 = Debug|Any CPU
{B30E0E82-9EA4-49D6-BA0D-BA8E5FA48800}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B30E0E82-9EA4-49D6-BA0D-BA8E5FA48800}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B30E0E82-9EA4-49D6-BA0D-BA8E5FA48800}.Debug|ARM.ActiveCfg = Debug|Any CPU
{B30E0E82-9EA4-49D6-BA0D-BA8E5FA48800}.Debug|ARM.Build.0 = Debug|Any CPU
{B30E0E82-9EA4-49D6-BA0D-BA8E5FA48800}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{B30E0E82-9EA4-49D6-BA0D-BA8E5FA48800}.Debug|iPhone.Build.0 = Debug|Any CPU
{B30E0E82-9EA4-49D6-BA0D-BA8E5FA48800}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{B30E0E82-9EA4-49D6-BA0D-BA8E5FA48800}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{B30E0E82-9EA4-49D6-BA0D-BA8E5FA48800}.Debug|x64.ActiveCfg = Debug|Any CPU
{B30E0E82-9EA4-49D6-BA0D-BA8E5FA48800}.Debug|x64.Build.0 = Debug|Any CPU
{B30E0E82-9EA4-49D6-BA0D-BA8E5FA48800}.Debug|x86.ActiveCfg = Debug|Any CPU
{B30E0E82-9EA4-49D6-BA0D-BA8E5FA48800}.Debug|x86.Build.0 = Debug|Any CPU
{B30E0E82-9EA4-49D6-BA0D-BA8E5FA48800}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B30E0E82-9EA4-49D6-BA0D-BA8E5FA48800}.Release|Any CPU.Build.0 = Release|Any CPU
{B30E0E82-9EA4-49D6-BA0D-BA8E5FA48800}.Release|ARM.ActiveCfg = Release|Any CPU
{B30E0E82-9EA4-49D6-BA0D-BA8E5FA48800}.Release|ARM.Build.0 = Release|Any CPU
{B30E0E82-9EA4-49D6-BA0D-BA8E5FA48800}.Release|iPhone.ActiveCfg = Release|Any CPU
{B30E0E82-9EA4-49D6-BA0D-BA8E5FA48800}.Release|iPhone.Build.0 = Release|Any CPU
{B30E0E82-9EA4-49D6-BA0D-BA8E5FA48800}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{B30E0E82-9EA4-49D6-BA0D-BA8E5FA48800}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{B30E0E82-9EA4-49D6-BA0D-BA8E5FA48800}.Release|x64.ActiveCfg = Release|Any CPU
{B30E0E82-9EA4-49D6-BA0D-BA8E5FA48800}.Release|x64.Build.0 = Release|Any CPU
{B30E0E82-9EA4-49D6-BA0D-BA8E5FA48800}.Release|x86.ActiveCfg = Release|Any CPU
{B30E0E82-9EA4-49D6-BA0D-BA8E5FA48800}.Release|x86.Build.0 = Release|Any CPU
{5E319B6A-9F04-4113-ABF9-AB8CD1F7A0B5}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU
{5E319B6A-9F04-4113-ABF9-AB8CD1F7A0B5}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU
{5E319B6A-9F04-4113-ABF9-AB8CD1F7A0B5}.Ad-Hoc|ARM.ActiveCfg = Debug|Any CPU
{5E319B6A-9F04-4113-ABF9-AB8CD1F7A0B5}.Ad-Hoc|ARM.Build.0 = Debug|Any CPU
{5E319B6A-9F04-4113-ABF9-AB8CD1F7A0B5}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU
{5E319B6A-9F04-4113-ABF9-AB8CD1F7A0B5}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU
{5E319B6A-9F04-4113-ABF9-AB8CD1F7A0B5}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{5E319B6A-9F04-4113-ABF9-AB8CD1F7A0B5}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU
{5E319B6A-9F04-4113-ABF9-AB8CD1F7A0B5}.Ad-Hoc|x64.ActiveCfg = Debug|Any CPU
{5E319B6A-9F04-4113-ABF9-AB8CD1F7A0B5}.Ad-Hoc|x64.Build.0 = Debug|Any CPU
{5E319B6A-9F04-4113-ABF9-AB8CD1F7A0B5}.Ad-Hoc|x86.ActiveCfg = Debug|Any CPU
{5E319B6A-9F04-4113-ABF9-AB8CD1F7A0B5}.Ad-Hoc|x86.Build.0 = Debug|Any CPU
{5E319B6A-9F04-4113-ABF9-AB8CD1F7A0B5}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU
{5E319B6A-9F04-4113-ABF9-AB8CD1F7A0B5}.AppStore|Any CPU.Build.0 = Debug|Any CPU
{5E319B6A-9F04-4113-ABF9-AB8CD1F7A0B5}.AppStore|ARM.ActiveCfg = Debug|Any CPU
{5E319B6A-9F04-4113-ABF9-AB8CD1F7A0B5}.AppStore|ARM.Build.0 = Debug|Any CPU
{5E319B6A-9F04-4113-ABF9-AB8CD1F7A0B5}.AppStore|iPhone.ActiveCfg = Debug|Any CPU
{5E319B6A-9F04-4113-ABF9-AB8CD1F7A0B5}.AppStore|iPhone.Build.0 = Debug|Any CPU
{5E319B6A-9F04-4113-ABF9-AB8CD1F7A0B5}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{5E319B6A-9F04-4113-ABF9-AB8CD1F7A0B5}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU
{5E319B6A-9F04-4113-ABF9-AB8CD1F7A0B5}.AppStore|x64.ActiveCfg = Debug|Any CPU
{5E319B6A-9F04-4113-ABF9-AB8CD1F7A0B5}.AppStore|x64.Build.0 = Debug|Any CPU
{5E319B6A-9F04-4113-ABF9-AB8CD1F7A0B5}.AppStore|x86.ActiveCfg = Debug|Any CPU
{5E319B6A-9F04-4113-ABF9-AB8CD1F7A0B5}.AppStore|x86.Build.0 = Debug|Any CPU
{5E319B6A-9F04-4113-ABF9-AB8CD1F7A0B5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5E319B6A-9F04-4113-ABF9-AB8CD1F7A0B5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{5E319B6A-9F04-4113-ABF9-AB8CD1F7A0B5}.Debug|ARM.ActiveCfg = Debug|Any CPU
{5E319B6A-9F04-4113-ABF9-AB8CD1F7A0B5}.Debug|ARM.Build.0 = Debug|Any CPU
{5E319B6A-9F04-4113-ABF9-AB8CD1F7A0B5}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{5E319B6A-9F04-4113-ABF9-AB8CD1F7A0B5}.Debug|iPhone.Build.0 = Debug|Any CPU
{5E319B6A-9F04-4113-ABF9-AB8CD1F7A0B5}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{5E319B6A-9F04-4113-ABF9-AB8CD1F7A0B5}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{5E319B6A-9F04-4113-ABF9-AB8CD1F7A0B5}.Debug|x64.ActiveCfg = Debug|Any CPU
{5E319B6A-9F04-4113-ABF9-AB8CD1F7A0B5}.Debug|x64.Build.0 = Debug|Any CPU
{5E319B6A-9F04-4113-ABF9-AB8CD1F7A0B5}.Debug|x86.ActiveCfg = Debug|Any CPU
{5E319B6A-9F04-4113-ABF9-AB8CD1F7A0B5}.Debug|x86.Build.0 = Debug|Any CPU
{5E319B6A-9F04-4113-ABF9-AB8CD1F7A0B5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5E319B6A-9F04-4113-ABF9-AB8CD1F7A0B5}.Release|Any CPU.Build.0 = Release|Any CPU
{5E319B6A-9F04-4113-ABF9-AB8CD1F7A0B5}.Release|ARM.ActiveCfg = Release|Any CPU
{5E319B6A-9F04-4113-ABF9-AB8CD1F7A0B5}.Release|ARM.Build.0 = Release|Any CPU
{5E319B6A-9F04-4113-ABF9-AB8CD1F7A0B5}.Release|iPhone.ActiveCfg = Release|Any CPU
{5E319B6A-9F04-4113-ABF9-AB8CD1F7A0B5}.Release|iPhone.Build.0 = Release|Any CPU
{5E319B6A-9F04-4113-ABF9-AB8CD1F7A0B5}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{5E319B6A-9F04-4113-ABF9-AB8CD1F7A0B5}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{5E319B6A-9F04-4113-ABF9-AB8CD1F7A0B5}.Release|x64.ActiveCfg = Release|Any CPU
{5E319B6A-9F04-4113-ABF9-AB8CD1F7A0B5}.Release|x64.Build.0 = Release|Any CPU
{5E319B6A-9F04-4113-ABF9-AB8CD1F7A0B5}.Release|x86.ActiveCfg = Release|Any CPU
{5E319B6A-9F04-4113-ABF9-AB8CD1F7A0B5}.Release|x86.Build.0 = Release|Any CPU
{26906157-98E3-4DF8-80F6-866B9686887C}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU
{26906157-98E3-4DF8-80F6-866B9686887C}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU
{26906157-98E3-4DF8-80F6-866B9686887C}.Ad-Hoc|ARM.ActiveCfg = Debug|Any CPU
{26906157-98E3-4DF8-80F6-866B9686887C}.Ad-Hoc|ARM.Build.0 = Debug|Any CPU
{26906157-98E3-4DF8-80F6-866B9686887C}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU
{26906157-98E3-4DF8-80F6-866B9686887C}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU
{26906157-98E3-4DF8-80F6-866B9686887C}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{26906157-98E3-4DF8-80F6-866B9686887C}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU
{26906157-98E3-4DF8-80F6-866B9686887C}.Ad-Hoc|x64.ActiveCfg = Debug|Any CPU
{26906157-98E3-4DF8-80F6-866B9686887C}.Ad-Hoc|x64.Build.0 = Debug|Any CPU
{26906157-98E3-4DF8-80F6-866B9686887C}.Ad-Hoc|x86.ActiveCfg = Debug|Any CPU
{26906157-98E3-4DF8-80F6-866B9686887C}.Ad-Hoc|x86.Build.0 = Debug|Any CPU
{26906157-98E3-4DF8-80F6-866B9686887C}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU
{26906157-98E3-4DF8-80F6-866B9686887C}.AppStore|Any CPU.Build.0 = Debug|Any CPU
{26906157-98E3-4DF8-80F6-866B9686887C}.AppStore|ARM.ActiveCfg = Debug|Any CPU
{26906157-98E3-4DF8-80F6-866B9686887C}.AppStore|ARM.Build.0 = Debug|Any CPU
{26906157-98E3-4DF8-80F6-866B9686887C}.AppStore|iPhone.ActiveCfg = Debug|Any CPU
{26906157-98E3-4DF8-80F6-866B9686887C}.AppStore|iPhone.Build.0 = Debug|Any CPU
{26906157-98E3-4DF8-80F6-866B9686887C}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{26906157-98E3-4DF8-80F6-866B9686887C}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU
{26906157-98E3-4DF8-80F6-866B9686887C}.AppStore|x64.ActiveCfg = Debug|Any CPU
{26906157-98E3-4DF8-80F6-866B9686887C}.AppStore|x64.Build.0 = Debug|Any CPU
{26906157-98E3-4DF8-80F6-866B9686887C}.AppStore|x86.ActiveCfg = Debug|Any CPU
{26906157-98E3-4DF8-80F6-866B9686887C}.AppStore|x86.Build.0 = Debug|Any CPU
{26906157-98E3-4DF8-80F6-866B9686887C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{26906157-98E3-4DF8-80F6-866B9686887C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{26906157-98E3-4DF8-80F6-866B9686887C}.Debug|ARM.ActiveCfg = Debug|Any CPU
{26906157-98E3-4DF8-80F6-866B9686887C}.Debug|ARM.Build.0 = Debug|Any CPU
{26906157-98E3-4DF8-80F6-866B9686887C}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{26906157-98E3-4DF8-80F6-866B9686887C}.Debug|iPhone.Build.0 = Debug|Any CPU
{26906157-98E3-4DF8-80F6-866B9686887C}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{26906157-98E3-4DF8-80F6-866B9686887C}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{26906157-98E3-4DF8-80F6-866B9686887C}.Debug|x64.ActiveCfg = Debug|Any CPU
{26906157-98E3-4DF8-80F6-866B9686887C}.Debug|x64.Build.0 = Debug|Any CPU
{26906157-98E3-4DF8-80F6-866B9686887C}.Debug|x86.ActiveCfg = Debug|Any CPU
{26906157-98E3-4DF8-80F6-866B9686887C}.Debug|x86.Build.0 = Debug|Any CPU
{26906157-98E3-4DF8-80F6-866B9686887C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{26906157-98E3-4DF8-80F6-866B9686887C}.Release|Any CPU.Build.0 = Release|Any CPU
{26906157-98E3-4DF8-80F6-866B9686887C}.Release|ARM.ActiveCfg = Release|Any CPU
{26906157-98E3-4DF8-80F6-866B9686887C}.Release|ARM.Build.0 = Release|Any CPU
{26906157-98E3-4DF8-80F6-866B9686887C}.Release|iPhone.ActiveCfg = Release|Any CPU
{26906157-98E3-4DF8-80F6-866B9686887C}.Release|iPhone.Build.0 = Release|Any CPU
{26906157-98E3-4DF8-80F6-866B9686887C}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{26906157-98E3-4DF8-80F6-866B9686887C}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{26906157-98E3-4DF8-80F6-866B9686887C}.Release|x64.ActiveCfg = Release|Any CPU
{26906157-98E3-4DF8-80F6-866B9686887C}.Release|x64.Build.0 = Release|Any CPU
{26906157-98E3-4DF8-80F6-866B9686887C}.Release|x86.ActiveCfg = Release|Any CPU
{26906157-98E3-4DF8-80F6-866B9686887C}.Release|x86.Build.0 = Release|Any CPU
{8AE2AAA3-4507-4BEE-9250-4D16F87015B4}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU
{8AE2AAA3-4507-4BEE-9250-4D16F87015B4}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU
{8AE2AAA3-4507-4BEE-9250-4D16F87015B4}.Ad-Hoc|ARM.ActiveCfg = Debug|Any CPU
{8AE2AAA3-4507-4BEE-9250-4D16F87015B4}.Ad-Hoc|ARM.Build.0 = Debug|Any CPU
{8AE2AAA3-4507-4BEE-9250-4D16F87015B4}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU
{8AE2AAA3-4507-4BEE-9250-4D16F87015B4}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU
{8AE2AAA3-4507-4BEE-9250-4D16F87015B4}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{8AE2AAA3-4507-4BEE-9250-4D16F87015B4}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU
{8AE2AAA3-4507-4BEE-9250-4D16F87015B4}.Ad-Hoc|x64.ActiveCfg = Debug|Any CPU
{8AE2AAA3-4507-4BEE-9250-4D16F87015B4}.Ad-Hoc|x64.Build.0 = Debug|Any CPU
{8AE2AAA3-4507-4BEE-9250-4D16F87015B4}.Ad-Hoc|x86.ActiveCfg = Debug|Any CPU
{8AE2AAA3-4507-4BEE-9250-4D16F87015B4}.Ad-Hoc|x86.Build.0 = Debug|Any CPU
{8AE2AAA3-4507-4BEE-9250-4D16F87015B4}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU
{8AE2AAA3-4507-4BEE-9250-4D16F87015B4}.AppStore|Any CPU.Build.0 = Debug|Any CPU
{8AE2AAA3-4507-4BEE-9250-4D16F87015B4}.AppStore|ARM.ActiveCfg = Debug|Any CPU
{8AE2AAA3-4507-4BEE-9250-4D16F87015B4}.AppStore|ARM.Build.0 = Debug|Any CPU
{8AE2AAA3-4507-4BEE-9250-4D16F87015B4}.AppStore|iPhone.ActiveCfg = Debug|Any CPU
{8AE2AAA3-4507-4BEE-9250-4D16F87015B4}.AppStore|iPhone.Build.0 = Debug|Any CPU
{8AE2AAA3-4507-4BEE-9250-4D16F87015B4}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{8AE2AAA3-4507-4BEE-9250-4D16F87015B4}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU
{8AE2AAA3-4507-4BEE-9250-4D16F87015B4}.AppStore|x64.ActiveCfg = Debug|Any CPU
{8AE2AAA3-4507-4BEE-9250-4D16F87015B4}.AppStore|x64.Build.0 = Debug|Any CPU
{8AE2AAA3-4507-4BEE-9250-4D16F87015B4}.AppStore|x86.ActiveCfg = Debug|Any CPU
{8AE2AAA3-4507-4BEE-9250-4D16F87015B4}.AppStore|x86.Build.0 = Debug|Any CPU
{8AE2AAA3-4507-4BEE-9250-4D16F87015B4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8AE2AAA3-4507-4BEE-9250-4D16F87015B4}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8AE2AAA3-4507-4BEE-9250-4D16F87015B4}.Debug|ARM.ActiveCfg = Debug|Any CPU
{8AE2AAA3-4507-4BEE-9250-4D16F87015B4}.Debug|ARM.Build.0 = Debug|Any CPU
{8AE2AAA3-4507-4BEE-9250-4D16F87015B4}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{8AE2AAA3-4507-4BEE-9250-4D16F87015B4}.Debug|iPhone.Build.0 = Debug|Any CPU
{8AE2AAA3-4507-4BEE-9250-4D16F87015B4}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{8AE2AAA3-4507-4BEE-9250-4D16F87015B4}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{8AE2AAA3-4507-4BEE-9250-4D16F87015B4}.Debug|x64.ActiveCfg = Debug|Any CPU
{8AE2AAA3-4507-4BEE-9250-4D16F87015B4}.Debug|x64.Build.0 = Debug|Any CPU
{8AE2AAA3-4507-4BEE-9250-4D16F87015B4}.Debug|x86.ActiveCfg = Debug|Any CPU
{8AE2AAA3-4507-4BEE-9250-4D16F87015B4}.Debug|x86.Build.0 = Debug|Any CPU
{8AE2AAA3-4507-4BEE-9250-4D16F87015B4}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8AE2AAA3-4507-4BEE-9250-4D16F87015B4}.Release|Any CPU.Build.0 = Release|Any CPU
{8AE2AAA3-4507-4BEE-9250-4D16F87015B4}.Release|ARM.ActiveCfg = Release|Any CPU
{8AE2AAA3-4507-4BEE-9250-4D16F87015B4}.Release|ARM.Build.0 = Release|Any CPU
{8AE2AAA3-4507-4BEE-9250-4D16F87015B4}.Release|iPhone.ActiveCfg = Release|Any CPU
{8AE2AAA3-4507-4BEE-9250-4D16F87015B4}.Release|iPhone.Build.0 = Release|Any CPU
{8AE2AAA3-4507-4BEE-9250-4D16F87015B4}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{8AE2AAA3-4507-4BEE-9250-4D16F87015B4}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{8AE2AAA3-4507-4BEE-9250-4D16F87015B4}.Release|x64.ActiveCfg = Release|Any CPU
{8AE2AAA3-4507-4BEE-9250-4D16F87015B4}.Release|x64.Build.0 = Release|Any CPU
{8AE2AAA3-4507-4BEE-9250-4D16F87015B4}.Release|x86.ActiveCfg = Release|Any CPU
{8AE2AAA3-4507-4BEE-9250-4D16F87015B4}.Release|x86.Build.0 = Release|Any CPU
{1CFFC16D-0D4A-47B3-9316-2A04ABD4A7AD}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU
{1CFFC16D-0D4A-47B3-9316-2A04ABD4A7AD}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU
{1CFFC16D-0D4A-47B3-9316-2A04ABD4A7AD}.Ad-Hoc|ARM.ActiveCfg = Debug|Any CPU
{1CFFC16D-0D4A-47B3-9316-2A04ABD4A7AD}.Ad-Hoc|ARM.Build.0 = Debug|Any CPU
{1CFFC16D-0D4A-47B3-9316-2A04ABD4A7AD}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU
{1CFFC16D-0D4A-47B3-9316-2A04ABD4A7AD}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU
{1CFFC16D-0D4A-47B3-9316-2A04ABD4A7AD}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{1CFFC16D-0D4A-47B3-9316-2A04ABD4A7AD}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU
{1CFFC16D-0D4A-47B3-9316-2A04ABD4A7AD}.Ad-Hoc|x64.ActiveCfg = Debug|Any CPU
{1CFFC16D-0D4A-47B3-9316-2A04ABD4A7AD}.Ad-Hoc|x64.Build.0 = Debug|Any CPU
{1CFFC16D-0D4A-47B3-9316-2A04ABD4A7AD}.Ad-Hoc|x86.ActiveCfg = Debug|Any CPU
{1CFFC16D-0D4A-47B3-9316-2A04ABD4A7AD}.Ad-Hoc|x86.Build.0 = Debug|Any CPU
{1CFFC16D-0D4A-47B3-9316-2A04ABD4A7AD}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU
{1CFFC16D-0D4A-47B3-9316-2A04ABD4A7AD}.AppStore|Any CPU.Build.0 = Debug|Any CPU
{1CFFC16D-0D4A-47B3-9316-2A04ABD4A7AD}.AppStore|ARM.ActiveCfg = Debug|Any CPU
{1CFFC16D-0D4A-47B3-9316-2A04ABD4A7AD}.AppStore|ARM.Build.0 = Debug|Any CPU
{1CFFC16D-0D4A-47B3-9316-2A04ABD4A7AD}.AppStore|iPhone.ActiveCfg = Debug|Any CPU
{1CFFC16D-0D4A-47B3-9316-2A04ABD4A7AD}.AppStore|iPhone.Build.0 = Debug|Any CPU
{1CFFC16D-0D4A-47B3-9316-2A04ABD4A7AD}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{1CFFC16D-0D4A-47B3-9316-2A04ABD4A7AD}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU
{1CFFC16D-0D4A-47B3-9316-2A04ABD4A7AD}.AppStore|x64.ActiveCfg = Debug|Any CPU
{1CFFC16D-0D4A-47B3-9316-2A04ABD4A7AD}.AppStore|x64.Build.0 = Debug|Any CPU
{1CFFC16D-0D4A-47B3-9316-2A04ABD4A7AD}.AppStore|x86.ActiveCfg = Debug|Any CPU
{1CFFC16D-0D4A-47B3-9316-2A04ABD4A7AD}.AppStore|x86.Build.0 = Debug|Any CPU
{1CFFC16D-0D4A-47B3-9316-2A04ABD4A7AD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1CFFC16D-0D4A-47B3-9316-2A04ABD4A7AD}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1CFFC16D-0D4A-47B3-9316-2A04ABD4A7AD}.Debug|ARM.ActiveCfg = Debug|Any CPU
{1CFFC16D-0D4A-47B3-9316-2A04ABD4A7AD}.Debug|ARM.Build.0 = Debug|Any CPU
{1CFFC16D-0D4A-47B3-9316-2A04ABD4A7AD}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{1CFFC16D-0D4A-47B3-9316-2A04ABD4A7AD}.Debug|iPhone.Build.0 = Debug|Any CPU
{1CFFC16D-0D4A-47B3-9316-2A04ABD4A7AD}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{1CFFC16D-0D4A-47B3-9316-2A04ABD4A7AD}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{1CFFC16D-0D4A-47B3-9316-2A04ABD4A7AD}.Debug|x64.ActiveCfg = Debug|Any CPU
{1CFFC16D-0D4A-47B3-9316-2A04ABD4A7AD}.Debug|x64.Build.0 = Debug|Any CPU
{1CFFC16D-0D4A-47B3-9316-2A04ABD4A7AD}.Debug|x86.ActiveCfg = Debug|Any CPU
{1CFFC16D-0D4A-47B3-9316-2A04ABD4A7AD}.Debug|x86.Build.0 = Debug|Any CPU
{1CFFC16D-0D4A-47B3-9316-2A04ABD4A7AD}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1CFFC16D-0D4A-47B3-9316-2A04ABD4A7AD}.Release|Any CPU.Build.0 = Release|Any CPU
{1CFFC16D-0D4A-47B3-9316-2A04ABD4A7AD}.Release|ARM.ActiveCfg = Release|Any CPU
{1CFFC16D-0D4A-47B3-9316-2A04ABD4A7AD}.Release|ARM.Build.0 = Release|Any CPU
{1CFFC16D-0D4A-47B3-9316-2A04ABD4A7AD}.Release|iPhone.ActiveCfg = Release|Any CPU
{1CFFC16D-0D4A-47B3-9316-2A04ABD4A7AD}.Release|iPhone.Build.0 = Release|Any CPU
{1CFFC16D-0D4A-47B3-9316-2A04ABD4A7AD}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{1CFFC16D-0D4A-47B3-9316-2A04ABD4A7AD}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{1CFFC16D-0D4A-47B3-9316-2A04ABD4A7AD}.Release|x64.ActiveCfg = Release|Any CPU
{1CFFC16D-0D4A-47B3-9316-2A04ABD4A7AD}.Release|x64.Build.0 = Release|Any CPU
{1CFFC16D-0D4A-47B3-9316-2A04ABD4A7AD}.Release|x86.ActiveCfg = Release|Any CPU
{1CFFC16D-0D4A-47B3-9316-2A04ABD4A7AD}.Release|x86.Build.0 = Release|Any CPU
{6C6A69FE-A484-4E75-AFEC-827EA354AF46}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU
{6C6A69FE-A484-4E75-AFEC-827EA354AF46}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU
{6C6A69FE-A484-4E75-AFEC-827EA354AF46}.Ad-Hoc|ARM.ActiveCfg = Debug|Any CPU
{6C6A69FE-A484-4E75-AFEC-827EA354AF46}.Ad-Hoc|ARM.Build.0 = Debug|Any CPU
{6C6A69FE-A484-4E75-AFEC-827EA354AF46}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU
{6C6A69FE-A484-4E75-AFEC-827EA354AF46}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU
{6C6A69FE-A484-4E75-AFEC-827EA354AF46}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{6C6A69FE-A484-4E75-AFEC-827EA354AF46}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU
{6C6A69FE-A484-4E75-AFEC-827EA354AF46}.Ad-Hoc|x64.ActiveCfg = Debug|Any CPU
{6C6A69FE-A484-4E75-AFEC-827EA354AF46}.Ad-Hoc|x64.Build.0 = Debug|Any CPU
{6C6A69FE-A484-4E75-AFEC-827EA354AF46}.Ad-Hoc|x86.ActiveCfg = Debug|Any CPU
{6C6A69FE-A484-4E75-AFEC-827EA354AF46}.Ad-Hoc|x86.Build.0 = Debug|Any CPU
{6C6A69FE-A484-4E75-AFEC-827EA354AF46}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU
{6C6A69FE-A484-4E75-AFEC-827EA354AF46}.AppStore|Any CPU.Build.0 = Debug|Any CPU
{6C6A69FE-A484-4E75-AFEC-827EA354AF46}.AppStore|ARM.ActiveCfg = Debug|Any CPU
{6C6A69FE-A484-4E75-AFEC-827EA354AF46}.AppStore|ARM.Build.0 = Debug|Any CPU
{6C6A69FE-A484-4E75-AFEC-827EA354AF46}.AppStore|iPhone.ActiveCfg = Debug|Any CPU
{6C6A69FE-A484-4E75-AFEC-827EA354AF46}.AppStore|iPhone.Build.0 = Debug|Any CPU
{6C6A69FE-A484-4E75-AFEC-827EA354AF46}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{6C6A69FE-A484-4E75-AFEC-827EA354AF46}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU
{6C6A69FE-A484-4E75-AFEC-827EA354AF46}.AppStore|x64.ActiveCfg = Debug|Any CPU
{6C6A69FE-A484-4E75-AFEC-827EA354AF46}.AppStore|x64.Build.0 = Debug|Any CPU
{6C6A69FE-A484-4E75-AFEC-827EA354AF46}.AppStore|x86.ActiveCfg = Debug|Any CPU
{6C6A69FE-A484-4E75-AFEC-827EA354AF46}.AppStore|x86.Build.0 = Debug|Any CPU
{6C6A69FE-A484-4E75-AFEC-827EA354AF46}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6C6A69FE-A484-4E75-AFEC-827EA354AF46}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6C6A69FE-A484-4E75-AFEC-827EA354AF46}.Debug|ARM.ActiveCfg = Debug|Any CPU
{6C6A69FE-A484-4E75-AFEC-827EA354AF46}.Debug|ARM.Build.0 = Debug|Any CPU
{6C6A69FE-A484-4E75-AFEC-827EA354AF46}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{6C6A69FE-A484-4E75-AFEC-827EA354AF46}.Debug|iPhone.Build.0 = Debug|Any CPU
{6C6A69FE-A484-4E75-AFEC-827EA354AF46}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{6C6A69FE-A484-4E75-AFEC-827EA354AF46}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{6C6A69FE-A484-4E75-AFEC-827EA354AF46}.Debug|x64.ActiveCfg = Debug|Any CPU
{6C6A69FE-A484-4E75-AFEC-827EA354AF46}.Debug|x64.Build.0 = Debug|Any CPU
{6C6A69FE-A484-4E75-AFEC-827EA354AF46}.Debug|x86.ActiveCfg = Debug|Any CPU
{6C6A69FE-A484-4E75-AFEC-827EA354AF46}.Debug|x86.Build.0 = Debug|Any CPU
{6C6A69FE-A484-4E75-AFEC-827EA354AF46}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6C6A69FE-A484-4E75-AFEC-827EA354AF46}.Release|Any CPU.Build.0 = Release|Any CPU
{6C6A69FE-A484-4E75-AFEC-827EA354AF46}.Release|ARM.ActiveCfg = Release|Any CPU
{6C6A69FE-A484-4E75-AFEC-827EA354AF46}.Release|ARM.Build.0 = Release|Any CPU
{6C6A69FE-A484-4E75-AFEC-827EA354AF46}.Release|iPhone.ActiveCfg = Release|Any CPU
{6C6A69FE-A484-4E75-AFEC-827EA354AF46}.Release|iPhone.Build.0 = Release|Any CPU
{6C6A69FE-A484-4E75-AFEC-827EA354AF46}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{6C6A69FE-A484-4E75-AFEC-827EA354AF46}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{6C6A69FE-A484-4E75-AFEC-827EA354AF46}.Release|x64.ActiveCfg = Release|Any CPU
{6C6A69FE-A484-4E75-AFEC-827EA354AF46}.Release|x64.Build.0 = Release|Any CPU
{6C6A69FE-A484-4E75-AFEC-827EA354AF46}.Release|x86.ActiveCfg = Release|Any CPU
{6C6A69FE-A484-4E75-AFEC-827EA354AF46}.Release|x86.Build.0 = Release|Any CPU
{2A795FEA-2EB7-45F5-9B30-35E0810CB238}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU
{2A795FEA-2EB7-45F5-9B30-35E0810CB238}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU
{2A795FEA-2EB7-45F5-9B30-35E0810CB238}.Ad-Hoc|ARM.ActiveCfg = Debug|Any CPU
{2A795FEA-2EB7-45F5-9B30-35E0810CB238}.Ad-Hoc|ARM.Build.0 = Debug|Any CPU
{2A795FEA-2EB7-45F5-9B30-35E0810CB238}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU
{2A795FEA-2EB7-45F5-9B30-35E0810CB238}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU
{2A795FEA-2EB7-45F5-9B30-35E0810CB238}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{2A795FEA-2EB7-45F5-9B30-35E0810CB238}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU
{2A795FEA-2EB7-45F5-9B30-35E0810CB238}.Ad-Hoc|x64.ActiveCfg = Debug|Any CPU
{2A795FEA-2EB7-45F5-9B30-35E0810CB238}.Ad-Hoc|x64.Build.0 = Debug|Any CPU
{2A795FEA-2EB7-45F5-9B30-35E0810CB238}.Ad-Hoc|x86.ActiveCfg = Debug|Any CPU
{2A795FEA-2EB7-45F5-9B30-35E0810CB238}.Ad-Hoc|x86.Build.0 = Debug|Any CPU
{2A795FEA-2EB7-45F5-9B30-35E0810CB238}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU
{2A795FEA-2EB7-45F5-9B30-35E0810CB238}.AppStore|Any CPU.Build.0 = Debug|Any CPU
{2A795FEA-2EB7-45F5-9B30-35E0810CB238}.AppStore|ARM.ActiveCfg = Debug|Any CPU
{2A795FEA-2EB7-45F5-9B30-35E0810CB238}.AppStore|ARM.Build.0 = Debug|Any CPU
{2A795FEA-2EB7-45F5-9B30-35E0810CB238}.AppStore|iPhone.ActiveCfg = Debug|Any CPU
{2A795FEA-2EB7-45F5-9B30-35E0810CB238}.AppStore|iPhone.Build.0 = Debug|Any CPU
{2A795FEA-2EB7-45F5-9B30-35E0810CB238}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{2A795FEA-2EB7-45F5-9B30-35E0810CB238}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU
{2A795FEA-2EB7-45F5-9B30-35E0810CB238}.AppStore|x64.ActiveCfg = Debug|Any CPU
{2A795FEA-2EB7-45F5-9B30-35E0810CB238}.AppStore|x64.Build.0 = Debug|Any CPU
{2A795FEA-2EB7-45F5-9B30-35E0810CB238}.AppStore|x86.ActiveCfg = Debug|Any CPU
{2A795FEA-2EB7-45F5-9B30-35E0810CB238}.AppStore|x86.Build.0 = Debug|Any CPU
{2A795FEA-2EB7-45F5-9B30-35E0810CB238}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2A795FEA-2EB7-45F5-9B30-35E0810CB238}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2A795FEA-2EB7-45F5-9B30-35E0810CB238}.Debug|ARM.ActiveCfg = Debug|Any CPU
{2A795FEA-2EB7-45F5-9B30-35E0810CB238}.Debug|ARM.Build.0 = Debug|Any CPU
{2A795FEA-2EB7-45F5-9B30-35E0810CB238}.Debug|iPhone.ActiveCfg = Debug|Any CPU
{2A795FEA-2EB7-45F5-9B30-35E0810CB238}.Debug|iPhone.Build.0 = Debug|Any CPU
{2A795FEA-2EB7-45F5-9B30-35E0810CB238}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{2A795FEA-2EB7-45F5-9B30-35E0810CB238}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{2A795FEA-2EB7-45F5-9B30-35E0810CB238}.Debug|x64.ActiveCfg = Debug|Any CPU
{2A795FEA-2EB7-45F5-9B30-35E0810CB238}.Debug|x64.Build.0 = Debug|Any CPU
{2A795FEA-2EB7-45F5-9B30-35E0810CB238}.Debug|x86.ActiveCfg = Debug|Any CPU
{2A795FEA-2EB7-45F5-9B30-35E0810CB238}.Debug|x86.Build.0 = Debug|Any CPU
{2A795FEA-2EB7-45F5-9B30-35E0810CB238}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2A795FEA-2EB7-45F5-9B30-35E0810CB238}.Release|Any CPU.Build.0 = Release|Any CPU
{2A795FEA-2EB7-45F5-9B30-35E0810CB238}.Release|ARM.ActiveCfg = Release|Any CPU
{2A795FEA-2EB7-45F5-9B30-35E0810CB238}.Release|ARM.Build.0 = Release|Any CPU
{2A795FEA-2EB7-45F5-9B30-35E0810CB238}.Release|iPhone.ActiveCfg = Release|Any CPU
{2A795FEA-2EB7-45F5-9B30-35E0810CB238}.Release|iPhone.Build.0 = Release|Any CPU
{2A795FEA-2EB7-45F5-9B30-35E0810CB238}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{2A795FEA-2EB7-45F5-9B30-35E0810CB238}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{2A795FEA-2EB7-45F5-9B30-35E0810CB238}.Release|x64.ActiveCfg = Release|Any CPU
{2A795FEA-2EB7-45F5-9B30-35E0810CB238}.Release|x64.Build.0 = Release|Any CPU
{2A795FEA-2EB7-45F5-9B30-35E0810CB238}.Release|x86.ActiveCfg = Release|Any CPU
{2A795FEA-2EB7-45F5-9B30-35E0810CB238}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE
@ -1514,5 +1925,17 @@ Global
{D92EB452-7A72-4B26-A8ED-0204CD376BC4} = {D13768ED-5AF1-4E09-96DD-FF6E7A2E5E06} {D92EB452-7A72-4B26-A8ED-0204CD376BC4} = {D13768ED-5AF1-4E09-96DD-FF6E7A2E5E06}
{23FB706A-2701-41E9-8BF9-28936001CA41} = {E279BF0F-7F66-4F3A-A3AB-2CDA66C1CD04} {23FB706A-2701-41E9-8BF9-28936001CA41} = {E279BF0F-7F66-4F3A-A3AB-2CDA66C1CD04}
{6CCC4F1B-602D-4FAD-91A7-002CC86C7612} = {96CE8CE7-BC97-4A53-899F-5EB63D7BBF7B} {6CCC4F1B-602D-4FAD-91A7-002CC86C7612} = {96CE8CE7-BC97-4A53-899F-5EB63D7BBF7B}
{CC0FD121-5E19-44B6-B23F-0FE3D1B821D3} = {1EF3AC0F-F27C-46DD-AC53-D762D2C11C45}
{237CA273-8555-4944-B87D-5B65AB3A788C} = {CC0FD121-5E19-44B6-B23F-0FE3D1B821D3}
{0CF40BE0-A463-4E4F-A29C-C7427D04DC4F} = {91CF7717-08AB-4E65-B10E-0B426F01E2E8}
{B30E0E82-9EA4-49D6-BA0D-BA8E5FA48800} = {0CF40BE0-A463-4E4F-A29C-C7427D04DC4F}
{72704C77-5C90-4705-B2A4-7A6E3B02FF08} = {91CF7717-08AB-4E65-B10E-0B426F01E2E8}
{5E319B6A-9F04-4113-ABF9-AB8CD1F7A0B5} = {72704C77-5C90-4705-B2A4-7A6E3B02FF08}
{26906157-98E3-4DF8-80F6-866B9686887C} = {B473B70F-0796-4862-B1AD-BB742D93B868}
{8AE2AAA3-4507-4BEE-9250-4D16F87015B4} = {B473B70F-0796-4862-B1AD-BB742D93B868}
{1CFFC16D-0D4A-47B3-9316-2A04ABD4A7AD} = {96CE8CE7-BC97-4A53-899F-5EB63D7BBF7B}
{6C6A69FE-A484-4E75-AFEC-827EA354AF46} = {0BD0DB92-2D98-44D9-9AC0-C59186D59B0B}
{D5D3841D-F282-4E60-B9CB-267A1BF2D893} = {91CF7717-08AB-4E65-B10E-0B426F01E2E8}
{2A795FEA-2EB7-45F5-9B30-35E0810CB238} = {D5D3841D-F282-4E60-B9CB-267A1BF2D893}
EndGlobalSection EndGlobalSection
EndGlobal EndGlobal

BIN
img/eShopOnContainers_Architecture_Diagram - Old2.png View File

Before After
Width: 1830  |  Height: 1078  |  Size: 405 KiB

BIN
img/eShopOnContainers_Architecture_Diagram.png View File

Before After
Width: 1830  |  Height: 1078  |  Size: 405 KiB Width: 1830  |  Height: 1125  |  Size: 443 KiB

BIN
img/k8s/deploy_script_task.png View File

Before After
Width: 1408  |  Height: 527  |  Size: 36 KiB

README.CICD.k8s.md → k8s/README.CICD.k8s.md View File

@ -5,44 +5,58 @@ For k8s CI/CD pipeline delivery a series of tasks must be created in VSTS to dep
* A Kubernetes cluster. Follow Azure Container Service's [walkthrough](https://docs.microsoft.com/en-us/azure/container-service/container-service-kubernetes-walkthrough) to create one. * A Kubernetes cluster. Follow Azure Container Service's [walkthrough](https://docs.microsoft.com/en-us/azure/container-service/container-service-kubernetes-walkthrough) to create one.
* A private Docker registry. Follow Azure Container Registry's [guide](https://docs.microsoft.com/en-us/azure/container-registry/container-registry-get-started-portal) to create one. * A private Docker registry. Follow Azure Container Registry's [guide](https://docs.microsoft.com/en-us/azure/container-registry/container-registry-get-started-portal) to create one.
* Optionally, previous steps can be skipped if you run gen-k8s-env.ps1 script to automatically create the azure environment needed for kubernetes deployment. Azure cli 2.0 must be previously installed [installation guide](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli). For example: * Optionally, previous steps can be skipped if you run gen-k8s-env.ps1 script to automatically create the azure environment needed for kubernetes deployment. Azure cli 2.0 must be previously installed [installation guide](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli). For example:
>``` >```
>./gen-k8s-env -resourceGroupName k8sGroup -location westeurope -registryName k8sregistry -orchestratorName k8s-cluster -dnsName k8s-dns >./gen-k8s-env -resourceGroupName k8sGroup -location westeurope -registryName k8sregistry -orchestratorName k8s-cluster -dnsName k8s-dns
>``` >```
* An `Azure Blob storage`. It is needed for storing the kubernetes config file used by the hosted agent to access to Kubernetes cluster. Example: * An `Azure Blob storage`. It is needed for storing the kubernetes config file used by the hosted agent to access to Kubernetes cluster. Example:
<img src="img/k8s/blob_creation.png">
<img src="./img/k8s/blob_creation.png">
* Upload the `kubernetes config file` to the blob storage previously created. Execute the following command which will download the config file into the directory `c:\Users\<User>\.kube\` and then, upload it to your blob storage: * Upload the `kubernetes config file` to the blob storage previously created. Execute the following command which will download the config file into the directory `c:\Users\<User>\.kube\` and then, upload it to your blob storage:
>``` >```
>https://eshopk8s.blob.core.windows.net/k8s-config/config >https://eshopk8s.blob.core.windows.net/k8s-config/config
>``` >```
## Create the VSTS tasks ## Create the VSTS tasks
1. Create a `Download File` task to download the kubernetes binary `kubectl` to the hosted agent. For example: 1. Create a `Download File` task to download the kubernetes binary `kubectl` to the hosted agent. For example:
>``` >```
>https://storage.googleapis.com/kubernetes-release/release/v0.0.1.7.0-alpha.0/bin/windows/386/kubectl.exe >https://storage.googleapis.com/kubernetes-release/release/v0.0.1.7.0-alpha.0/bin/windows/386/kubectl.exe
>``` >```
<img src="img/k8s/get_kubectlbin_task.png">
<img src="./img/get_kubectlbin_task.png">
2. Create a Download File task to download the kubernetes config file to the hosted agent. For example: 2. Create a Download File task to download the kubernetes config file to the hosted agent. For example:
>``` >```
>https://eshopk8s.blob.core.windows.net/k8s-config/config >https://eshopk8s.blob.core.windows.net/k8s-config/config
>``` >```
<img src="img/k8s/get_kubectlconfig_task.png">
<img src="./img/k8s/get_kubectlconfig_task.png">
3. Create a powershell task to execute the k8s deployment script. For example: 3. Create a powershell task to execute the k8s deployment script. For example:
* Deployment script path * Deployment script path
>``` >```
>$(System.DefaultWorkingDirectory)/All Microservices/docker-compose/deploy.ps1 >$(System.DefaultWorkingDirectory)/All Microservices/docker-compose/deploy.ps1
>``` >```
* Deployment script path arguments. Where:
- userDockerHub: indicates if Docker Hub is used instead of ACR
- deployCI: indicates that it is a CI/CD deployment
- execPath: path where the k8s binary is stored
- kubeconfigPath: path where the k8s config file is stored
* Deployment script path arguments. Use value:
>``` >```
>-deployCI $true -useDockerHub $true -execPath '$(System.DefaultWorkingDirectory)/' -kubeconfigPath '$(System.DefaultWorkingDirectory)/'
>-deployCI $true -execPath '$(System.DefaultWorkingDirectory)/' -kubeconfigPath '$(System.DefaultWorkingDirectory)/' -deployInfrastructure $true -imageTag dev -configFile '$(System.DefaultWorkingDirectory)/$(Build.DefinitionName)/docker-compose/conf_local.yml'
>``` >```
<img src="img/k8s/deploy_script_task.png">
- deployCI: Must be set to `$true`. This avoids create images (always are pulled from registry) and compile bits.
- deployInfrastructure: Can be set to `$false` if don't want to deploy infrastructure containers (like Redis, rabbit, SQL,...).
- imageTag: Image tag to pull from k8s.
- configFile: Configuration file (refer to [README.k8s.md](./README.k8s.md) for more info). This file is part of the VSTS build output.
- execPath: path where the k8s binary is stored
- kubeconfigPath: path where the k8s config file is stored
You can use additional parameters (i.e. pass registry and user/password to use custom registry instead of DockerHub. Plase, refer to [README.k8s.md](./README.k8s.md) for more info.
<img src="./img/k8s/deploy_script_task.png">

README.k8s.md → k8s/README.k8s.md View File

@ -5,9 +5,11 @@ The k8s directory contains Kubernetes configuration for the eShopOnContainers ap
* A Kubernetes cluster. Follow Azure Container Service's [walkthrough](https://docs.microsoft.com/en-us/azure/container-service/container-service-kubernetes-walkthrough) to create one. * A Kubernetes cluster. Follow Azure Container Service's [walkthrough](https://docs.microsoft.com/en-us/azure/container-service/container-service-kubernetes-walkthrough) to create one.
* A private Docker registry. Follow Azure Container Registry's [guide](https://docs.microsoft.com/en-us/azure/container-registry/container-registry-get-started-portal) to create one. * A private Docker registry. Follow Azure Container Registry's [guide](https://docs.microsoft.com/en-us/azure/container-registry/container-registry-get-started-portal) to create one.
* Optionally, previous steps can be skipped if you run gen-k8s-env.ps1 script to automatically create the azure environment needed for kubernetes deployment. Azure cli 2.0 must be previously installed [installation guide](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli). For example: * Optionally, previous steps can be skipped if you run gen-k8s-env.ps1 script to automatically create the azure environment needed for kubernetes deployment. Azure cli 2.0 must be previously installed [installation guide](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli). For example:
>``` >```
>./gen-k8s-env -resourceGroupName k8sGroup -location westeurope -registryName k8sregistry -orchestratorName k8s-cluster -dnsName k8s-dns >./gen-k8s-env -resourceGroupName k8sGroup -location westeurope -registryName k8sregistry -orchestratorName k8s-cluster -dnsName k8s-dns
>``` >```
* A Docker development environment with `docker` and `docker-compose`. * A Docker development environment with `docker` and `docker-compose`.
* Visit [docker.com](https://docker.com) to download the tools and set up the environment. Docker's [installation guide](https://docs.docker.com/engine/getstarted/step_one/#step-3-verify-your-installation) covers verifying your Docker installation. * Visit [docker.com](https://docker.com) to download the tools and set up the environment. Docker's [installation guide](https://docs.docker.com/engine/getstarted/step_one/#step-3-verify-your-installation) covers verifying your Docker installation.
* The Kubernetes command line client, `kubectl`. * The Kubernetes command line client, `kubectl`.
@ -17,11 +19,13 @@ The k8s directory contains Kubernetes configuration for the eShopOnContainers ap
1. Open a PowerShell command line at the `k8s` directory of your local eShopOnContainers repository. 1. Open a PowerShell command line at the `k8s` directory of your local eShopOnContainers repository.
1. Ensure `docker`, `docker-compose`, and `kubectl` are on the path, and configured for your Docker machine and Kubernetes cluster. 1. Ensure `docker`, `docker-compose`, and `kubectl` are on the path, and configured for your Docker machine and Kubernetes cluster.
1. Run `deploy.ps1` with your registry information. The Docker username and password are provided by Azure Container Registry, and can be retrieved from the Azure portal. Optionally, ACR credentials can be obtained by running the following command: 1. Run `deploy.ps1` with your registry information. The Docker username and password are provided by Azure Container Registry, and can be retrieved from the Azure portal. Optionally, ACR credentials can be obtained by running the following command:
>``` >```
>az acr credential show -n eshopregistry >az acr credential show -n eshopregistry
>``` >```
Once the user and password are retrieved, run the following script for deployment. For example: Once the user and password are retrieved, run the following script for deployment. For example:
>``` >```
>./deploy.ps1 -registry myregistry.azurecr.io -dockerUser User -dockerPassword SecretPassword -configFile file_with_config.json >./deploy.ps1 -registry myregistry.azurecr.io -dockerUser User -dockerPassword SecretPassword -configFile file_with_config.json
>``` >```
@ -54,6 +58,12 @@ The script accepts following parameters:
+ `deployInfrastructure`: If `true` infrastructure containers (rabbitmq, mongo, redis, sql) will be deployed in k8s. If `false` those containers (and its related deployments and services in k8s) won't be deployed. + `deployInfrastructure`: If `true` infrastructure containers (rabbitmq, mongo, redis, sql) will be deployed in k8s. If `false` those containers (and its related deployments and services in k8s) won't be deployed.
+ `dockerOrg`: Name of the organization in the registry where the images are (or will be pushed). Default value is `eshop` (which has images provided by Microsoft) + `dockerOrg`: Name of the organization in the registry where the images are (or will be pushed). Default value is `eshop` (which has images provided by Microsoft)
**Important:** If you **don't pass the `-buildBits $true` the script won't build and publish the projects** to their `obj/Docker/publish` folder. If any project is not published, you'll be receiving errors like:
```
ERROR: Service 'xxxxxxx' failed to build: COPY failed: stat /var/lib/docker/tmp/docker-builder123456789/obj/Docker/publish: no such file or directory
```
### Typical usages of the script: ### Typical usages of the script:
Build all projects, and deploy all them in k8s including infrastructure containers in a organization called `foo` in Docker Hub. Images will be tagged with my current git branch and containers will use the configuration set in `conf_local.yml` file: Build all projects, and deploy all them in k8s including infrastructure containers in a organization called `foo` in Docker Hub. Images will be tagged with my current git branch and containers will use the configuration set in `conf_local.yml` file:
@ -72,4 +82,4 @@ Deploy k8s using public images that Microsoft provides:
``` ```
./deploy.ps1 -buildImages $false -configFile conf_local.yml -imageTag master ./deploy.ps1 -buildImages $false -configFile conf_local.yml -imageTag master
```
```

+ 17
- 0
k8s/conf-files.md View File

@ -0,0 +1,17 @@
# YAML files used to deploy to k8s
This is just a brief enumeration of the configuration files used to create the k8s objects. Use as reference to find where specific object is.
- `deployments.yaml` Contains the definition of all deployments of the eShopOnContainers. Do not contain any infrastructure deployment (so no SQL, Redis, ...).
- `services.yaml` Contains the definition of all services of the eShopOnContainers. Do not contain any infrastructure service (so no SQL, Redis, ...).
- `basket-data.yaml` Contains the definition of the Redis (used by basket.api) deployment and service
- `nosql-data.yaml` Contains the definition of the Mongodb (used by locations and marketing) deployment and service
- `sql-data.yaml` Contains the definition of the SQL server deployment and service
- `rabbitmq.yaml` Contains the definition of the RabbitMQ deployment and service
- `keystore-data.yaml` Contains the deployment and service definition of the Redis used to mantain coherence between all the ASP.NET Identity keystores.
- `conf_local.yaml` Contains the configuration map that configures all the Pods to use "local" containers (that is all containers in k8s)
- `conf_cloud.yaml` Contains the configuration map that configures all the Pods to use "cloud" resources (that is use Azure resources instead infrastructure containers). This file is provided with no valid values, just for example.
- `frontend.yaml` Contains the deployment and service definition of the NGINX frontend used as reverse-proxy
- For more information what kubernetes deployments are, read [Kubernetes help](https://kubernetes.io/docs/concepts/workloads/controllers/deployment/)
- For more information what kubernetes services are, read [Kubernetes help](https://kubernetes.io/docs/concepts/services-networking/service/)

+ 1
- 0
k8s/conf_cloud.yml View File

@ -30,6 +30,7 @@ data:
# GracePeriodManager entries # GracePeriodManager entries
GracePeriodTime: "5" # Grace period duration (time when you can cancel order) in minutes GracePeriodTime: "5" # Grace period duration (time when you can cancel order) in minutes
GracePeriodCheckUpdateTime: "60000" # Interval time to check new Order status (in milliseconds) GracePeriodCheckUpdateTime: "60000" # Interval time to check new Order status (in milliseconds)
GracePeriodManagerBus: CONNECTION_STRING (NAME OF RABBITMQ CONTAINER OR Endpoint=sb://XXXX in case of using Azure)
# Global entries # Global entries
UseAzureServiceBus: "TRUE" IF USE AZURE SB ("FALSE" FOR USING RABBITMQ) UseAzureServiceBus: "TRUE" IF USE AZURE SB ("FALSE" FOR USING RABBITMQ)
keystore: REDIS CONNECTION STRING FOR KEYSTORE keystore: REDIS CONNECTION STRING FOR KEYSTORE

+ 1
- 0
k8s/conf_local.yml View File

@ -23,5 +23,6 @@ data:
PaymentBus: rabbitmq PaymentBus: rabbitmq
GracePeriodTime: "1" GracePeriodTime: "1"
GracePeriodCheckUpdateTime: "60000" GracePeriodCheckUpdateTime: "60000"
GracePeriodManagerBus: rabbitmq
UseAzureServiceBus: "False" UseAzureServiceBus: "False"
keystore: keystore-data keystore: keystore-data

+ 15
- 4
k8s/deploy.ps1 View File

@ -63,7 +63,7 @@ if ($buildImages) {
docker-compose -p .. -f ../docker-compose.yml build docker-compose -p .. -f ../docker-compose.yml build
Write-Host "Pushing images to $registry/$dockerOrg..." -ForegroundColor Yellow 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", "graceperiodmanager")
foreach ($service in $services) { foreach ($service in $services) {
$imageFqdn = if ($useDockerHub) {"$dockerOrg/${service}"} else {"$registry/$dockerOrg/${service}"} $imageFqdn = if ($useDockerHub) {"$dockerOrg/${service}"} else {"$registry/$dockerOrg/${service}"}
@ -136,7 +136,8 @@ ExecKube -cmd 'create configmap urls `
--from-literal=BasketHealthCheckUrl=http://basket/hc ` --from-literal=BasketHealthCheckUrl=http://basket/hc `
--from-literal=CatalogUrl=http://$($externalDns)/catalog-api ` --from-literal=CatalogUrl=http://$($externalDns)/catalog-api `
--from-literal=CatalogHealthCheckUrl=http://catalog/hc ` --from-literal=CatalogHealthCheckUrl=http://catalog/hc `
--from-literal=PicBaseUrl=http://$($externalDns)/catalog-api/api/v1/pic/ `
--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=IdentityUrl=http://$($externalDns)/identity `
--from-literal=IdentityHealthCheckUrl=http://identity/hc ` --from-literal=IdentityHealthCheckUrl=http://identity/hc `
--from-literal=OrderingUrl=http://ordering ` --from-literal=OrderingUrl=http://ordering `
@ -146,13 +147,21 @@ ExecKube -cmd 'create configmap urls `
--from-literal=MvcClientOrderingUrl=http://ordering ` --from-literal=MvcClientOrderingUrl=http://ordering `
--from-literal=MvcClientCatalogUrl=http://catalog ` --from-literal=MvcClientCatalogUrl=http://catalog `
--from-literal=MvcClientBasketUrl=http://basket ` --from-literal=MvcClientBasketUrl=http://basket `
--from-literal=MvcClientMarketingUrl=http://marketing `
--from-literal=MarketingHealthCheckUrl=http://marketing/hc `
--from-literal=WebSpaHealthCheckUrl=http://webspa/hc ` --from-literal=WebSpaHealthCheckUrl=http://webspa/hc `
--from-literal=SpaClientMarketingExternalUrl=http://$($externalDns)/marketing-api `
--from-literal=SpaClientOrderingExternalUrl=http://$($externalDns)/ordering-api ` --from-literal=SpaClientOrderingExternalUrl=http://$($externalDns)/ordering-api `
--from-literal=SpaClientCatalogExternalUrl=http://$($externalDns)/catalog-api ` --from-literal=SpaClientCatalogExternalUrl=http://$($externalDns)/catalog-api `
--from-literal=SpaClientBasketExternalUrl=http://$($externalDns)/basket-api ` --from-literal=SpaClientBasketExternalUrl=http://$($externalDns)/basket-api `
--from-literal=SpaClientIdentityExternalUrl=http://$($externalDns)/identity ` --from-literal=SpaClientIdentityExternalUrl=http://$($externalDns)/identity `
--from-literal=SpaClientExternalUrl=http://$($externalDns)'
--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'
ExecKube -cmd 'label configmap urls app=eshop' ExecKube -cmd 'label configmap urls app=eshop'
Write-Host "Deploying configuration from $configFile" -ForegroundColor Yellow Write-Host "Deploying configuration from $configFile" -ForegroundColor Yellow
@ -180,6 +189,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/webmvc webmvc=${registryPath}${dockerOrg}/webmvc:$imageTag'
ExecKube -cmd 'set image deployments/webstatus webstatus=${registryPath}${dockerOrg}/webstatus:$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/webspa webspa=${registryPath}${dockerOrg}/webspa:$imageTag'
ExecKube -cmd 'set image deployments/graceperiodmanager graceperiodmanager=${registryPath}${dockerOrg}/graceperiodmanager:$imageTag'
Write-Host "Execute rollout..." -ForegroundColor Yellow Write-Host "Execute rollout..." -ForegroundColor Yellow
ExecKube -cmd 'rollout resume deployments/basket' ExecKube -cmd 'rollout resume deployments/basket'
@ -192,6 +202,7 @@ ExecKube -cmd 'rollout resume deployments/payment'
ExecKube -cmd 'rollout resume deployments/webmvc' ExecKube -cmd 'rollout resume deployments/webmvc'
ExecKube -cmd 'rollout resume deployments/webstatus' ExecKube -cmd 'rollout resume deployments/webstatus'
ExecKube -cmd 'rollout resume deployments/webspa' ExecKube -cmd 'rollout resume deployments/webspa'
ExecKube -cmd 'rollout resume deployments/graceperiodmanager'
Write-Host "WebSPA is exposed at http://$externalDns, WebMVC at http://$externalDns/webmvc, WebStatus at http://$externalDns/webstatus" -ForegroundColor Yellow Write-Host "WebSPA is exposed at http://$externalDns, WebMVC at http://$externalDns/webmvc, WebStatus at http://$externalDns/webstatus" -ForegroundColor Yellow

+ 63
- 3
k8s/deployments.yaml View File

@ -74,7 +74,7 @@ spec:
- name: AzureStorageEnabled - name: AzureStorageEnabled
valueFrom: valueFrom:
configMapKeyRef: configMapKeyRef:
name: urls
name: externalcfg
key: CatalogAzureStorageEnabled key: CatalogAzureStorageEnabled
- name: EventBusConnection - name: EventBusConnection
valueFrom: valueFrom:
@ -127,6 +127,26 @@ spec:
configMapKeyRef: configMapKeyRef:
name: urls name: urls
key: SpaClientExternalUrl key: SpaClientExternalUrl
- name: LocationApiClient
valueFrom:
configMapKeyRef:
name: urls
key: LocationApiClient
- name: MarketingApiClient
valueFrom:
configMapKeyRef:
name: urls
key: MarketingApiClient
- name: BasketApiClient
valueFrom:
configMapKeyRef:
name: urls
key: BasketApiClient
- name: OrderingApiClient
valueFrom:
configMapKeyRef:
name: urls
key: OrderingApiClient
ports: ports:
- containerPort: 80 - containerPort: 80
imagePullSecrets: imagePullSecrets:
@ -185,8 +205,8 @@ spec:
template: template:
metadata: metadata:
labels: labels:
app: graceperiodmanager
component: ordering
app: eshop
component: graceperiodmanager
spec: spec:
containers: containers:
- name: graceperiodmanager - name: graceperiodmanager
@ -267,6 +287,11 @@ spec:
configMapKeyRef: configMapKeyRef:
name: urls name: urls
key: IdentityUrl key: IdentityUrl
- name: IdentityUrlExternal
valueFrom:
configMapKeyRef:
name: urls
key: IdentityUrl
ports: ports:
- containerPort: 80 - containerPort: 80
imagePullSecrets: imagePullSecrets:
@ -321,6 +346,16 @@ spec:
configMapKeyRef: configMapKeyRef:
name: urls name: urls
key: IdentityUrl key: IdentityUrl
- name: IdentityUrlExternal
valueFrom:
configMapKeyRef:
name: urls
key: IdentityUrl
- name: PicBaseUrl
valueFrom:
configMapKeyRef:
name: urls
key: Marketing_PicBaseUrl
ports: ports:
- containerPort: 80 - containerPort: 80
imagePullSecrets: imagePullSecrets:
@ -411,6 +446,11 @@ spec:
configMapKeyRef: configMapKeyRef:
name: urls name: urls
key: MvcClientOrderingUrl key: MvcClientOrderingUrl
- name: MarketingUrl
valueFrom:
configMapKeyRef:
name: urls
key: MvcClientMarketingUrl
ports: ports:
- containerPort: 80 - containerPort: 80
imagePullSecrets: imagePullSecrets:
@ -455,6 +495,16 @@ spec:
configMapKeyRef: configMapKeyRef:
name: urls name: urls
key: OrderingHealthCheckUrl key: OrderingHealthCheckUrl
- name: LocationsUrl
valueFrom:
configMapKeyRef:
name: urls
key: LocationsHealthCheckUrl
- name: MarketingUrl
valueFrom:
configMapKeyRef:
name: urls
key: MarketingHealthCheckUrl
- name: mvc - name: mvc
valueFrom: valueFrom:
configMapKeyRef: configMapKeyRef:
@ -521,6 +571,11 @@ spec:
configMapKeyRef: configMapKeyRef:
name: urls name: urls
key: SpaClientOrderingExternalUrl key: SpaClientOrderingExternalUrl
- name: MarketingUrl
valueFrom:
configMapKeyRef:
name: urls
key: SpaClientMarketingExternalUrl
- name: BasketUrlHC - name: BasketUrlHC
valueFrom: valueFrom:
configMapKeyRef: configMapKeyRef:
@ -541,6 +596,11 @@ spec:
configMapKeyRef: configMapKeyRef:
name: urls name: urls
key: OrderingHealthCheckUrl key: OrderingHealthCheckUrl
- name: MarketingUrlHC
valueFrom:
configMapKeyRef:
name: urls
key: MarketingHealthCheckUrl
ports: ports:
- containerPort: 80 - containerPort: 80
imagePullSecrets: imagePullSecrets:


BIN
img/k8s/blob_creation.png → k8s/img/blob_creation.png View File


BIN
k8s/img/deploy_script_task.png View File


BIN
img/k8s/get_kubectlbin_task.png → k8s/img/get_kubectlbin_task.png View File


BIN
img/k8s/get_kubectlconfig_task.png → k8s/img/get_kubectlconfig_task.png View File


+ 12
- 0
k8s/readme.md View File

@ -0,0 +1,12 @@
# Kubernetes (k8s) deploy information
This folder contains files needed to **create** a ACS with Kubernetes in Azure and to **deploy** eShopServices in a existing Kubernetes:
- `gen-k8s-env.ps1` Script to create a ACS with Kubernetes in Azure
- `deploy.ps1` Script to deploy eShopOnContainers in a existing k8s
Refer to file [README.k8s.md](./README.k8s.md) for detailed information
Refer to file [README.CICD.k8s.md](./README.CICD.k8s.md) for information about how to set a VSTS build for deploying on k8s
Refer to file [conf-files.md](./conf-files.md) for a brief descriptio of every YAML file in this folder

README.ENV.md → readme/README.ENV.md View File


+ 79
- 0
readme/readme-docker-compose.md View File

@ -0,0 +1,79 @@
# Docker-compose yaml files
In the root folder of the repo are all docker-compose files (`docker-compose*.yml`). Here is a list of all of them and what is their purpose:
## Container build
* `docker-compose.ci.build.yml`: This file is for starting the build container to build the project using a container that has all needed prerequisites. Refer to [corresponding wiki section](https://github.com/dotnet-architecture/eShopOnContainers/wiki/03.-Setting-the-eShopOnContainers-solution-up-in-a-Windows-CLI-environment-(dotnet-CLI,-Docker-CLI-and-VS-Code)#build-the-bits-through-the-build-container-image) for more information.
## Files needed to run eShopOnContainers locally
* `docker-compose.yml`: This file contains **the definition of all images needed for running eShopOnContainers**.
* `docker-compose.override.yml`: This file contains the base configuration for all images of the previous file
Usually these two files are using together. The standard way to start eShopOnContainers from CLI is:
```
docker-compose -f docker-compose.yml -f docker-compose.override.yml
```
This will start eShopOnContainers with all containers running locally, and it is the default development environment.
## Files needed to run eShopOnContainers on a remote docker host
* `docker-compose.prod.yml`: This file is a replacement of the `docker-compose.override.yml` but contains some configurations more suitable for a "production" environment or when you need to run the services using an external docker host.
```
docker-compose -f docker-compose.yml -f docker-compose.prod.yml
```
When using this file the following environments variables must be set:
* `ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP` with the IP or DNS name of the docker host that runs the services (can use `localhost` if needed).
* `ESHOP_AZURE_STORAGE_CATALOG` with the URL of the Azure Storage that will host the catalog images
* `ESHOP_AZURE_STORAGE_MARKETING` with the URL of the Azure Storage that will host the marketing campaign images
You might wonder why an external image resource (storage) is needed when using `docker-compose.prod.yml` instead of `docker-compose.override.yml`. Answer to this is related to a limitation of Docker Compose file format. This is how we set the environment configuration of Catalog microservice in `docker-compose.override.yml`:
```
PicBaseUrl=${ESHOP_AZURE_STORAGE_CATALOG:-http://localhost:5101/api/v1/catalog/items/[0]/pic/}
```
The `PicBaseUrl` variable is set to the value of `ESHOP_AZURE_STORAGE_CATALOG` if this variable is set to any value other than blank string. If not, the value is set to `http://localhost:5101/api/v1/catalog/items/[0]/pic/`. That works perfectly in a local environment where you run all your services in `localhost` and setting `ESHOP_AZURE_STORAGE_CATALOG` you can use or not Azure Storage for the images (if you don't use Azure Storage images are served locally by catalog servide). But when you run the services in a external docker host, specified in `ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP`, the configuration should be as follows:
```
PicBaseUrl=${ESHOP_AZURE_STORAGE_CATALOG:-http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5101/api/v1/catalog/items/[0]/pic/}
```
So, use `ESHOP_AZURE_STORAGE_CATALOG` if set, and if not use `http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5101/api/v1/catalog/items/[0]/pic/}`. Unfortunately seems that docker-compose do not substitute variables inside variables, so the value that `PicBaseUrl` gets if `ESHOP_AZURE_STORAGE_CATALOG` is not set is literally `http://${ESHOP_PROD_EXTERNAL_DNS_NAME_OR_IP}:5101/api/v1/catalog/items/[0]/pic/}` without any substitution.
**For more information** about docker-compose variable substitution read the [compose docs](https://docs.docker.com/compose/compose-file/#variable-substitution).
## Other files
* `docker-compose.nobuild.yml`: This file contains the definition of all images needed to run the eShopOnContainers. Contains **the same images that `docker-compose.yml`** but without any `build` instruction. If you use this file instead of `docker-compose.yml` when launching the project and you don't have the images built locally, **the images will be pulled from dockerhub**. This file is not intended for development usage, but for some CI/CD scenarios.
* `docker-compose.vs.debug.yml`: This file is used by Docker Tools of VS2017, and should not be used directly.
* `docker-compose.vs.release.yml`: This file is used by Docker Tools of VS2017, and should not be used directly.
**Note**: The reason why we need the `docker-compose.nobuild.yml` is that [docker-compose issue #3391](https://github.com/docker/compose/issues/3391). Once solved, parameter `--no-build` of docker-compose could be used safely in a CI/CD environments and the need for this file will disappear.
## Windows container files
All `docker-compose-windows*.yml` files have a 1:1 relationship with the same file without the `-windows` in its name. Those files are used to run Windows Containers instead of Linux Containers.
* `docker-compose-windows.yml`: Contains the definitions of all containers that are needed to run eShopOnContainers using windows containers (equivalent to `docker-compose.yml`).
* `docker-compose-windows.override.yml`: Contains the base configuration for all windows containers
**Note** We plan **to remove** the `docker-compose-windows.override.yml` file, because it is **exactly the same** as the `docker-compose.override.yml`. The reason of its existence is historical, but is no longer needed. You can use `docker-compose.override.yml` instead.
* `docker-compose-windows.prod.yml` is the equivalent of `docker-compose.prod.yml` for containers windows. As happens with `docker-compose-windows.override.yml` this file will be deleted in a near future, so you should use `docker-compose.prod.yml` instead.
## "External container" files
These files were intended to provide a fast way to start only "infrastructure" containers (SQL Server, Redis, etc). *This files are deprecated and will be deleted in a near future**:
* `docker-compose-external.override.yml`
* `docker-compose-external.yml`
If you want to start only certain containers use `docker-compose -f ... -f ... up container1 contaner2 containerN` as specified in [compose doc](https://docs.docker.com/compose/reference/up/)

+ 19
- 0
readme/readme.md View File

@ -0,0 +1,19 @@
# Documentation index
This file contains links to the documentation of the project.
* **Wiki**: The wiki contains detailed step-by-step information about how to set up the project. Read it at: [https://github.com/dotnet-architecture/eShopOnContainers/wiki](https://github.com/dotnet-architecture/eShopOnContainers/wiki)
## Documentation included in files
* [Branch Guide](../branch-guide.md): List of branches used and their purpose.
* [vsts-docs folder](../vsts-docs/readme.md): Information about how to setup a CI/CD procedure using VSTS
* [Kubernetes](../k8s/readme.md): Information about how to deploy eShopOnContainers in a kubernetes cluster, and how to setup a CI/CD for k8s using VSTS
* [deploy](../deploy/readme.md): Information about how deploy Azure resources using the Azure CLI 2.0.
* [.env file](./README.ENV.md): What is the `.env` file and how to use it to configure eShopOnContainers to use external resources (like Azure)
* [docker-compose files](./readme-docker-compose.md): What are all these `docker-compose-*.yml` files
## Docs folder
The `/docs` folder contains the pdfs versions of the books

+ 29
- 14
src/BuildingBlocks/EventBus/EventBusServiceBus/EventBusServiceBus.cs View File

@ -1,18 +1,17 @@
namespace Microsoft.eShopOnContainers.BuildingBlocks.EventBusServiceBus namespace Microsoft.eShopOnContainers.BuildingBlocks.EventBusServiceBus
{ {
using System;
using Autofac;
using Microsoft.Azure.ServiceBus;
using Microsoft.eShopOnContainers.BuildingBlocks.EventBus;
using Microsoft.eShopOnContainers.BuildingBlocks.EventBus.Abstractions; using Microsoft.eShopOnContainers.BuildingBlocks.EventBus.Abstractions;
using Microsoft.eShopOnContainers.BuildingBlocks.EventBus.Events; using Microsoft.eShopOnContainers.BuildingBlocks.EventBus.Events;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.Azure.ServiceBus;
using Newtonsoft.Json; using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Reflection;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.eShopOnContainers.BuildingBlocks.EventBus;
using System.Reflection;
using Microsoft.Azure.ServiceBus.Filters;
using Autofac;
using Newtonsoft.Json.Linq;
public class EventBusServiceBus : IEventBus public class EventBusServiceBus : IEventBus
{ {
@ -22,6 +21,7 @@
private readonly SubscriptionClient _subscriptionClient; private readonly SubscriptionClient _subscriptionClient;
private readonly ILifetimeScope _autofac; private readonly ILifetimeScope _autofac;
private readonly string AUTOFAC_SCOPE_NAME = "eshop_event_bus"; private readonly string AUTOFAC_SCOPE_NAME = "eshop_event_bus";
private const string INTEGRATION_EVENT_SUFIX = "IntegrationEvent";
public EventBusServiceBus(IServiceBusPersisterConnection serviceBusPersisterConnection, public EventBusServiceBus(IServiceBusPersisterConnection serviceBusPersisterConnection,
ILogger<EventBusServiceBus> logger, IEventBusSubscriptionsManager subsManager, string subscriptionClientName, ILogger<EventBusServiceBus> logger, IEventBusSubscriptionsManager subsManager, string subscriptionClientName,
@ -41,7 +41,7 @@
public void Publish(IntegrationEvent @event) public void Publish(IntegrationEvent @event)
{ {
var eventName = @event.GetType().Name;
var eventName = @event.GetType().Name.Replace(INTEGRATION_EVENT_SUFIX, "");
var jsonMessage = JsonConvert.SerializeObject(@event); var jsonMessage = JsonConvert.SerializeObject(@event);
var body = Encoding.UTF8.GetBytes(jsonMessage); var body = Encoding.UTF8.GetBytes(jsonMessage);
@ -69,7 +69,8 @@
where T : IntegrationEvent where T : IntegrationEvent
where TH : IIntegrationEventHandler<T> where TH : IIntegrationEventHandler<T>
{ {
var eventName = typeof(T).Name;
var eventName = typeof(T).Name.Replace(INTEGRATION_EVENT_SUFIX, "");
var containsKey = _subsManager.HasSubscriptionsForEvent<T>(); var containsKey = _subsManager.HasSubscriptionsForEvent<T>();
if (!containsKey) if (!containsKey)
{ {
@ -94,7 +95,7 @@
where T : IntegrationEvent where T : IntegrationEvent
where TH : IIntegrationEventHandler<T> where TH : IIntegrationEventHandler<T>
{ {
var eventName = typeof(T).Name;
var eventName = typeof(T).Name.Replace(INTEGRATION_EVENT_SUFIX, "");
try try
{ {
@ -127,11 +128,25 @@
_subscriptionClient.RegisterMessageHandler( _subscriptionClient.RegisterMessageHandler(
async (message, token) => async (message, token) =>
{ {
var eventName = message.Label;
var eventName = $"{message.Label}{INTEGRATION_EVENT_SUFIX}";
var messageData = Encoding.UTF8.GetString(message.Body); var messageData = Encoding.UTF8.GetString(message.Body);
await ProcessEvent(eventName, messageData); await ProcessEvent(eventName, messageData);
// Complete the message so that it is not received again.
await _subscriptionClient.CompleteAsync(message.SystemProperties.LockToken);
}, },
new MessageHandlerOptions() { MaxConcurrentCalls = 10, AutoComplete = true });
new MessageHandlerOptions(ExceptionReceivedHandler) { MaxConcurrentCalls = 10, AutoComplete = false });
}
private Task ExceptionReceivedHandler(ExceptionReceivedEventArgs exceptionReceivedEventArgs)
{
Console.WriteLine($"Message handler encountered an exception {exceptionReceivedEventArgs.Exception}.");
var context = exceptionReceivedEventArgs.ExceptionReceivedContext;
Console.WriteLine("Exception context for troubleshooting:");
Console.WriteLine($"- Endpoint: {context.Endpoint}");
Console.WriteLine($"- Entity Path: {context.EntityPath}");
Console.WriteLine($"- Executing Action: {context.Action}");
return Task.CompletedTask;
} }
private async Task ProcessEvent(string eventName, string message) private async Task ProcessEvent(string eventName, string message)
@ -167,13 +182,13 @@
try try
{ {
_subscriptionClient _subscriptionClient
.RemoveRuleAsync(SubscriptionClient.DefaultRule)
.RemoveRuleAsync(RuleDescription.DefaultRuleName)
.GetAwaiter() .GetAwaiter()
.GetResult(); .GetResult();
} }
catch (MessagingEntityNotFoundException) catch (MessagingEntityNotFoundException)
{ {
_logger.LogInformation($"The messaging entity {SubscriptionClient.DefaultRule} Could not be found.");
_logger.LogInformation($"The messaging entity { RuleDescription.DefaultRuleName } Could not be found.");
} }
} }
} }


+ 1
- 1
src/BuildingBlocks/EventBus/EventBusServiceBus/EventBusServiceBus.csproj View File

@ -6,8 +6,8 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.Azure.ServiceBus" Version="0.0.5-preview" />
<PackageReference Include="Autofac" Version="4.5.0" /> <PackageReference Include="Autofac" Version="4.5.0" />
<PackageReference Include="Microsoft.Azure.ServiceBus" Version="1.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="1.1.1" /> <PackageReference Include="Microsoft.Extensions.Logging" Version="1.1.1" />
</ItemGroup> </ItemGroup>


+ 8
- 0
src/BuildingBlocks/Resilience/Resilience.Http/ResilientHttpClient.cs View File

@ -81,6 +81,14 @@ namespace Microsoft.eShopOnContainers.BuildingBlocks.Resilience.Http
var response = await _client.SendAsync(requestMessage); var response = await _client.SendAsync(requestMessage);
// raise exception if HttpResponseCode 500
// needed for circuit breaker to track fails
if (response.StatusCode == HttpStatusCode.InternalServerError)
{
throw new HttpRequestException();
}
return await response.Content.ReadAsStringAsync(); return await response.Content.ReadAsStringAsync();
}); });
} }


+ 5
- 5
src/BuildingBlocks/Resilience/Resilience.Http/StandardHttpClient.cs View File

@ -40,10 +40,10 @@ namespace Microsoft.eShopOnContainers.BuildingBlocks.Resilience.Http
throw new ArgumentException("Value must be either post or put.", nameof(method)); throw new ArgumentException("Value must be either post or put.", nameof(method));
} }
// a new StringContent must be created for each retry
// a new StringContent must be created for each retry
// as it is disposed after each call // as it is disposed after each call
var requestMessage = new HttpRequestMessage(HttpMethod.Post, uri);
var requestMessage = new HttpRequestMessage(method, uri);
requestMessage.Content = new StringContent(JsonConvert.SerializeObject(item), System.Text.Encoding.UTF8, "application/json"); requestMessage.Content = new StringContent(JsonConvert.SerializeObject(item), System.Text.Encoding.UTF8, "application/json");
@ -59,7 +59,7 @@ namespace Microsoft.eShopOnContainers.BuildingBlocks.Resilience.Http
var response = await _client.SendAsync(requestMessage); var response = await _client.SendAsync(requestMessage);
// raise exception if HttpResponseCode 500
// raise exception if HttpResponseCode 500
// needed for circuit breaker to track fails // needed for circuit breaker to track fails
if (response.StatusCode == HttpStatusCode.InternalServerError) if (response.StatusCode == HttpStatusCode.InternalServerError)
@ -73,12 +73,12 @@ namespace Microsoft.eShopOnContainers.BuildingBlocks.Resilience.Http
public async Task<HttpResponseMessage> PostAsync<T>(string uri, T item, string authorizationToken = null, string requestId = null, string authorizationMethod = "Bearer") public async Task<HttpResponseMessage> PostAsync<T>(string uri, T item, string authorizationToken = null, string requestId = null, string authorizationMethod = "Bearer")
{ {
return await DoPostPutAsync(HttpMethod.Post, uri, item, authorizationToken, requestId, authorizationToken);
return await DoPostPutAsync(HttpMethod.Post, uri, item, authorizationToken, requestId, authorizationMethod);
} }
public async Task<HttpResponseMessage> PutAsync<T>(string uri, T item, string authorizationToken = null, string requestId = null, string authorizationMethod = "Bearer") public async Task<HttpResponseMessage> PutAsync<T>(string uri, T item, string authorizationToken = null, string requestId = null, string authorizationMethod = "Bearer")
{ {
return await DoPostPutAsync(HttpMethod.Put, uri, item, authorizationToken, requestId, authorizationToken);
return await DoPostPutAsync(HttpMethod.Put, uri, item, authorizationToken, requestId, authorizationMethod);
} }
public async Task<HttpResponseMessage> DeleteAsync(string uri, string authorizationToken = null, string requestId = null, string authorizationMethod = "Bearer") public async Task<HttpResponseMessage> DeleteAsync(string uri, string authorizationToken = null, string requestId = null, string authorizationMethod = "Bearer")
{ {


+ 126
- 10
src/Mobile/eShopOnContainers/eShopOnContainers.Core/App.xaml View File

@ -1,12 +1,11 @@
<?xml version="1.0" encoding="utf-8" ?>
<?xml version="1.0" encoding="utf-8" ?>
<Application xmlns="http://xamarin.com/schemas/2014/forms" <Application xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:light="clr-namespace:Xamarin.Forms.Themes;assembly=Xamarin.Forms.Theme.Light"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:converters="clr-namespace:eShopOnContainers.Core.Converters;assembly=eShopOnContainers.Core" xmlns:converters="clr-namespace:eShopOnContainers.Core.Converters;assembly=eShopOnContainers.Core"
xmlns:behaviors="clr-namespace:eShopOnContainers.Core.Behaviors;assembly=eShopOnContainers.Core" xmlns:behaviors="clr-namespace:eShopOnContainers.Core.Behaviors;assembly=eShopOnContainers.Core"
x:Class="eShopOnContainers.App"> x:Class="eShopOnContainers.App">
<Application.Resources> <Application.Resources>
<ResourceDictionary MergedWith="light:LightThemeResources">
<ResourceDictionary>
<!-- COLORS --> <!-- COLORS -->
<Color x:Key="WhiteColor">#ffffff</Color> <Color x:Key="WhiteColor">#ffffff</Color>
@ -18,6 +17,69 @@
<Color x:Key="DarkGreenColor">#00857D</Color> <Color x:Key="DarkGreenColor">#00857D</Color>
<Color x:Key="GrayColor">#e2e2e2</Color> <Color x:Key="GrayColor">#e2e2e2</Color>
<Color x:Key="ErrorColor">#ff5252</Color> <Color x:Key="ErrorColor">#ff5252</Color>
<Color x:Key="TextColor">#757575</Color>
<Color x:Key="InverseTextColor">#FFFFFF</Color>
<Color x:Key="LightTextColor">#979797</Color>
<Color x:Key="iOSDefaultTintColor">#007aff</Color>
<Color x:Key="SeparatorLineColor">#CCCCCC</Color>
<Color x:Key="AndroidDefaultButtonClassBackgroundColor">#C9C9C9</Color>
<Color x:Key="iOSDefaultButtonClassBackgroundColor">Transparent</Color>
<Color x:Key="AndroidDefaultButtonClassBorderColor">Transparent</Color>
<Color x:Key="iOSDefaultButtonClassBorderColor">#007aff</Color>
<Color x:Key="AndroidDefaultButtonClassTextColor">#FFFFFF</Color>
<Color x:Key="iOSDefaultButtonClassTextColor">#007aff</Color>
<Color x:Key="AndroidEntryBackgroundColor">Transparent</Color>
<Color x:Key="iOSEntryBackgroundColor">#FFFFFF</Color>
<Color x:Key="AndroidDefaultAccentColorColor">#1FAECE</Color>
<Color x:Key="AndroidListViewBackgroundColor">Transparent</Color>
<Color x:Key="iOSListViewBackgroundColor">Transparent</Color>
<OnPlatform
x:TypeArguments="Color"
x:Key="ActivityIndicatorColor"
iOS="{ StaticResource iOSDefaultTintColor }" />
<OnPlatform
x:TypeArguments="Color"
x:Key="DefaultButtonClassBackgroundColor"
Android="{ StaticResource AndroidDefaultButtonClassBackgroundColor }"
iOS="{ StaticResource iOSDefaultButtonClassBackgroundColor }" />
<OnPlatform
x:TypeArguments="Color"
x:Key="DefaultButtonClassBorderColor"
Android="{ StaticResource AndroidDefaultButtonClassBorderColor }"
iOS="{ StaticResource iOSDefaultButtonClassBorderColor }" />
<OnPlatform
x:TypeArguments="Color"
x:Key="DefaultButtonClassTextColor"
Android="{ StaticResource AndroidDefaultButtonClassTextColor }"
iOS="{ StaticResource iOSDefaultButtonClassTextColor }" />
<OnPlatform
x:TypeArguments="Color"
x:Key="EntryBackgroundColor"
Android="{ StaticResource AndroidEntryBackgroundColor }"
iOS="{ StaticResource iOSEntryBackgroundColor }" />
<OnPlatform
x:TypeArguments="Color"
x:Key="ThemeListViewBackgroundColor"
Android="{ StaticResource AndroidListViewBackgroundColor }"
iOS="{ StaticResource iOSListViewBackgroundColor }" />
<!-- SIZES -->
<OnPlatform
x:TypeArguments="x:Double"
x:Key="BaseButtonBorderRadius"
iOS="6" />
<OnPlatform
x:TypeArguments="x:Double"
x:Key="BaseButtonBorderWidth"
Android="0"
iOS="0" />
<!-- FONTS --> <!-- FONTS -->
<OnPlatform <OnPlatform
@ -41,7 +103,18 @@
Android="SourceSansPro-Regular.ttf#Source Sans Pro" Android="SourceSansPro-Regular.ttf#Source Sans Pro"
WinPhone="Assets/Fonts/SourceSansPro-Regular.ttf#Source Sans Pro"/> WinPhone="Assets/Fonts/SourceSansPro-Regular.ttf#Source Sans Pro"/>
<!-- FONT SIZES -->
<OnPlatform
x:TypeArguments="x:Double"
x:Key="BaseButtonFontSize"
Android="16"
iOS="18" />
<OnPlatform
x:TypeArguments="x:Double"
x:Key="BaseFontSize"
Android="15"
iOS="16" />
<OnPlatform <OnPlatform
x:Key="LittleSize" x:Key="LittleSize"
x:TypeArguments="x:Double" x:TypeArguments="x:Double"
@ -97,22 +170,24 @@
iOS="32" iOS="32"
Android="48" Android="48"
WinPhone="48"/> WinPhone="48"/>
<OnPlatform
x:TypeArguments="FontAttributes"
x:Key="BaseButtonFontAttributes"
Android="None"
iOS="Bold" />
<!-- CONVERTERS --> <!-- CONVERTERS -->
<converters:CountToBoolConverter x:Key="CountToBoolConverter" /> <converters:CountToBoolConverter x:Key="CountToBoolConverter" />
<converters:DatetimeConverter x:Key="DatetimeConverter" /> <converters:DatetimeConverter x:Key="DatetimeConverter" />
<converters:FirstValidationErrorConverter x:Key="FirstValidationErrorConverter" />
<converters:ImageConverter x:Key="ImageConverter" /> <converters:ImageConverter x:Key="ImageConverter" />
<converters:ItemTappedEventArgsConverter x:Key="ItemTappedEventArgsConverter" /> <converters:ItemTappedEventArgsConverter x:Key="ItemTappedEventArgsConverter" />
<converters:InverseCountToBoolConverter x:Key="InverseCountToBoolConverter" /> <converters:InverseCountToBoolConverter x:Key="InverseCountToBoolConverter" />
<converters:InverseBoolConverter x:Key="InverseBoolConverter" /> <converters:InverseBoolConverter x:Key="InverseBoolConverter" />
<converters:ItemsToHeightConverter x:Key="ItemsToHeightConverter" /> <converters:ItemsToHeightConverter x:Key="ItemsToHeightConverter" />
<converters:ToUpperConverter x:Key="ToUpperConverter" /> <converters:ToUpperConverter x:Key="ToUpperConverter" />
<converters:WebNavigatingEventArgsConverter x:Key="WebNavigatingEventArgsConverter" />
<converters:WebNavigatedEventArgsConverter x:Key="WebNavigatedEventArgsConverter" />
<converters:StringNullOrEmptyBoolConverter x:Key="StringNullOrEmptyBoolConverter" />
<!-- STYLES -->
<!-- EXPLICIT STYLES -->
<Style x:Key="ValidationErrorLabelStyle" <Style x:Key="ValidationErrorLabelStyle"
TargetType="{x:Type Label}"> TargetType="{x:Type Label}">
<Setter Property="TextColor" <Setter Property="TextColor"
@ -184,6 +259,47 @@
</Trigger> </Trigger>
</Style.Triggers> </Style.Triggers>
</Style> </Style>
<!-- IMPLICIT STYLES -->
<Style TargetType="Button" ApplyToDerivedTypes="True" CanCascade="True">
<Setter Property="FontSize" Value="{ StaticResource BaseButtonFontSize }" />
<Setter Property="FontAttributes" Value="{ StaticResource BaseButtonFontAttributes }" />
<Setter Property="BorderRadius" Value="{ StaticResource BaseButtonBorderRadius }" />
<Setter Property="BorderWidth" Value="{ StaticResource BaseButtonBorderWidth }" />
<Setter Property="BackgroundColor" Value="{ StaticResource DefaultButtonClassBackgroundColor }" />
<Setter Property="BorderColor" Value="{ StaticResource DefaultButtonClassBorderColor }" />
<Setter Property="TextColor" Value="{ StaticResource DefaultButtonClassTextColor }" />
</Style>
<Style TargetType="Label" ApplyToDerivedTypes="True" CanCascade="True">
<Setter Property="FontSize" Value="{ StaticResource BaseFontSize }" />
</Style>
<Style TargetType="Entry" ApplyToDerivedTypes="True" CanCascade="True">
<Setter Property="TextColor" Value="{ StaticResource TextColor }" />
<Setter Property="PlaceholderColor" Value="{ StaticResource LightTextColor }" />
<Setter Property="BackgroundColor" Value="{ StaticResource EntryBackgroundColor }" />
</Style>
<Style TargetType="ImageCell" ApplyToDerivedTypes="True" CanCascade="True">
<Setter Property="TextColor" Value="{ StaticResource InverseTextColor }" />
<Setter Property="DetailColor" Value="{ StaticResource AccentColor }" />
</Style>
<Style TargetType="TextCell" ApplyToDerivedTypes="True" CanCascade="True">
<Setter Property="TextColor" Value="{ StaticResource InverseTextColor }" />
<Setter Property="DetailColor" Value="{ StaticResource AccentColor }" />
</Style>
<Style TargetType="ListView" ApplyToDerivedTypes="True" CanCascade="True">
<Setter Property="BackgroundColor" Value="{ StaticResource ThemeListViewBackgroundColor }" />
<Setter Property="SeparatorColor" Value="{ StaticResource SeparatorLineColor }" />
<Setter Property="SeparatorVisibility" Value="Default" />
</Style>
<Style TargetType="ActivityIndicator" ApplyToDerivedTypes="True" CanCascade="True">
<Setter Property="Color" Value="{ StaticResource ActivityIndicatorColor }" />
</Style>
<Style TargetType="NavigationPage"> <Style TargetType="NavigationPage">
<Setter Property="BarBackgroundColor" Value="{StaticResource GreenColor}"/> <Setter Property="BarBackgroundColor" Value="{StaticResource GreenColor}"/>


+ 5
- 4
src/Mobile/eShopOnContainers/eShopOnContainers.Core/App.xaml.cs View File

@ -1,4 +1,5 @@
using System; using System;
using System.Globalization;
using eShopOnContainers.Core.Helpers; using eShopOnContainers.Core.Helpers;
using eShopOnContainers.Services; using eShopOnContainers.Services;
using eShopOnContainers.Core.ViewModels.Base; using eShopOnContainers.Core.ViewModels.Base;
@ -79,8 +80,8 @@ namespace eShopOnContainers
var position = await locator.GetPositionAsync(); var position = await locator.GetPositionAsync();
Settings.Latitude = position.Latitude;
Settings.Longitude = position.Longitude;
Settings.Latitude = position.Latitude.ToString();
Settings.Longitude = position.Longitude.ToString();
} }
else else
{ {
@ -92,8 +93,8 @@ namespace eShopOnContainers
{ {
var location = new Location var location = new Location
{ {
Latitude = Settings.Latitude,
Longitude = Settings.Longitude
Latitude = double.Parse(Settings.Latitude, CultureInfo.InvariantCulture),
Longitude = double.Parse(Settings.Longitude, CultureInfo.InvariantCulture)
}; };
var locationService = ViewModelLocator.Resolve<ILocationService>(); var locationService = ViewModelLocator.Resolve<ILocationService>();


+ 10
- 1
src/Mobile/eShopOnContainers/eShopOnContainers.Core/Controls/AddBasketButton.xaml View File

@ -1,11 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<?xml version="1.0" encoding="UTF-8"?>
<ContentView <ContentView
xmlns="http://xamarin.com/schemas/2014/forms" xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:effects="clr-namespace:eShopOnContainers.Core.Effects"
x:Class="eShopOnContainers.Core.Controls.AddBasketButton"> x:Class="eShopOnContainers.Core.Controls.AddBasketButton">
<ContentView.Resources> <ContentView.Resources>
<ResourceDictionary> <ResourceDictionary>
<Style TargetType="BoxView" Class="Circle">
<Setter Property="BackgroundColor" Value="{ StaticResource AccentColor }" />
<Setter Property="WidthRequest" Value="34" />
<Setter Property="HeightRequest" Value="34" />
<Setter Property="HorizontalOptions" Value="Start" />
<Setter Property="effects:ThemeEffects.Circle" Value="True" />
</Style>
<Style x:Key="AddBackgroundImageStyle" <Style x:Key="AddBackgroundImageStyle"
TargetType="{x:Type Image}"> TargetType="{x:Type Image}">
<Setter Property="HorizontalOptions" <Setter Property="HorizontalOptions"


+ 24
- 0
src/Mobile/eShopOnContainers/eShopOnContainers.Core/Converters/DoubleConverter.cs View File

@ -0,0 +1,24 @@
using System;
using System.Globalization;
using Xamarin.Forms;
namespace eShopOnContainers.Core.Converters
{
public class DoubleConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is double)
return value.ToString();
return value;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
double doub;
if (double.TryParse(value as string, out doub))
return doub;
return value;
}
}
}

+ 54
- 0
src/Mobile/eShopOnContainers/eShopOnContainers.Core/Effects/ThemeEffects.cs View File

@ -0,0 +1,54 @@
using System.Collections.Generic;
using System.Linq;
using Xamarin.Forms;
namespace eShopOnContainers.Core.Effects
{
public static class ThemeEffects
{
public static readonly BindableProperty CircleProperty =
BindableProperty.CreateAttached("Circle", typeof(bool), typeof(ThemeEffects), false, propertyChanged: OnChanged<CircleEffect, bool>);
public static bool GetCircle(BindableObject view)
{
return (bool)view.GetValue(CircleProperty);
}
public static void SetCircle(BindableObject view, bool circle)
{
view.SetValue(CircleProperty, circle);
}
private static void OnChanged<TEffect, TProp>(BindableObject bindable, object oldValue, object newValue)
where TEffect : Effect, new()
{
var view = bindable as View;
if (view == null)
{
return;
}
if (EqualityComparer<TProp>.Equals(newValue, default(TProp)))
{
var toRemove = view.Effects.FirstOrDefault(e => e is TEffect);
if (toRemove != null)
{
view.Effects.Remove(toRemove);
}
}
else
{
view.Effects.Add(new TEffect());
}
}
private class CircleEffect : RoutingEffect
{
public CircleEffect()
: base("eShopOnContainers.CircleEffect")
{
}
}
}
}

+ 23
- 0
src/Mobile/eShopOnContainers/eShopOnContainers.Core/Helpers/RandomNumberGenerator.cs View File

@ -0,0 +1,23 @@
using System.Text;
namespace eShopOnContainers.Core.Helpers
{
internal static class RandomNumberGenerator
{
public static string CreateUniqueId(int length = 64)
{
var bytes = PCLCrypto.WinRTCrypto.CryptographicBuffer.GenerateRandom(length);
return ByteArrayToString(bytes);
}
private static string ByteArrayToString(byte[] array)
{
var hex = new StringBuilder(array.Length * 2);
foreach (byte b in array)
{
hex.AppendFormat("{0:x2}", b);
}
return hex.ToString();
}
}
}

+ 4
- 4
src/Mobile/eShopOnContainers/eShopOnContainers.Core/Helpers/ServicesHelper.cs View File

@ -78,7 +78,7 @@ namespace eShopOnContainers.Core.Helpers
} }
} }
public static void FixCatalogItemPictureUri(IEnumerable<CampaignItem> campaignItems)
public static void FixCampaignItemPictureUri(IEnumerable<CampaignItem> campaignItems)
{ {
if (campaignItems == null) if (campaignItems == null)
{ {
@ -90,9 +90,9 @@ namespace eShopOnContainers.Core.Helpers
if (!ViewModelLocator.UseMockService if (!ViewModelLocator.UseMockService
&& Settings.UrlBase != GlobalSetting.DefaultEndpoint) && Settings.UrlBase != GlobalSetting.DefaultEndpoint)
{ {
foreach (var catalogItem in campaignItems)
foreach (var campaignItem in campaignItems)
{ {
MatchCollection serverResult = IpRegex.Matches(catalogItem.PictureUri);
MatchCollection serverResult = IpRegex.Matches(campaignItem.PictureUri);
MatchCollection localResult = IpRegex.Matches(Settings.UrlBase); MatchCollection localResult = IpRegex.Matches(Settings.UrlBase);
if (serverResult.Count != -1 && localResult.Count != -1) if (serverResult.Count != -1 && localResult.Count != -1)
@ -100,7 +100,7 @@ namespace eShopOnContainers.Core.Helpers
var serviceIp = serverResult[0].Value; var serviceIp = serverResult[0].Value;
var localIp = localResult[0].Value; var localIp = localResult[0].Value;
catalogItem.PictureUri = catalogItem.PictureUri.Replace(serviceIp, localIp);
campaignItem.PictureUri = campaignItem.PictureUri.Replace(serviceIp, localIp);
} }
} }
} }


+ 6
- 6
src/Mobile/eShopOnContainers/eShopOnContainers.Core/Helpers/Settings.cs View File

@ -69,16 +69,16 @@ namespace eShopOnContainers.Core.Helpers
set => AppSettings.AddOrUpdateValue<bool>(IdUseFakeLocation, value); set => AppSettings.AddOrUpdateValue<bool>(IdUseFakeLocation, value);
} }
public static double Latitude
public static string Latitude
{ {
get => AppSettings.GetValueOrDefault<double>(IdLatitude, FakeLatitudeDefault);
set => AppSettings.AddOrUpdateValue<double>(IdLatitude, value);
get => AppSettings.GetValueOrDefault<string>(IdLatitude, FakeLatitudeDefault.ToString());
set => AppSettings.AddOrUpdateValue<string>(IdLatitude, value);
} }
public static double Longitude
public static string Longitude
{ {
get => AppSettings.GetValueOrDefault<double>(IdLongitude, FakeLongitudeDefault);
set => AppSettings.AddOrUpdateValue<double>(IdLongitude, value);
get => AppSettings.GetValueOrDefault<string>(IdLongitude, FakeLongitudeDefault.ToString());
set => AppSettings.AddOrUpdateValue<string>(IdLongitude, value);
} }
public static bool AllowGpsLocation public static bool AllowGpsLocation


+ 22
- 13
src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Basket/BasketService.cs View File

@ -9,6 +9,7 @@ namespace eShopOnContainers.Core.Services.Basket
public class BasketService : IBasketService public class BasketService : IBasketService
{ {
private readonly IRequestProvider _requestProvider; private readonly IRequestProvider _requestProvider;
private const string ApiUrlBase = "api/v1/basket";
public BasketService(IRequestProvider requestProvider) public BasketService(IRequestProvider requestProvider)
{ {
@ -16,12 +17,13 @@ namespace eShopOnContainers.Core.Services.Basket
} }
public async Task<CustomerBasket> GetBasketAsync(string guidUser, string token) public async Task<CustomerBasket> GetBasketAsync(string guidUser, string token)
{
UriBuilder builder = new UriBuilder(GlobalSetting.Instance.BasketEndpoint);
builder.Path = guidUser;
{
var builder = new UriBuilder(GlobalSetting.Instance.BasketEndpoint)
{
Path = $"{ApiUrlBase}/{guidUser}"
};
string uri = builder.ToString();
var uri = builder.ToString();
CustomerBasket basket = CustomerBasket basket =
await _requestProvider.GetAsync<CustomerBasket>(uri, token); await _requestProvider.GetAsync<CustomerBasket>(uri, token);
@ -33,9 +35,12 @@ namespace eShopOnContainers.Core.Services.Basket
public async Task<CustomerBasket> UpdateBasketAsync(CustomerBasket customerBasket, string token) public async Task<CustomerBasket> UpdateBasketAsync(CustomerBasket customerBasket, string token)
{ {
UriBuilder builder = new UriBuilder(GlobalSetting.Instance.BasketEndpoint);
var builder = new UriBuilder(GlobalSetting.Instance.BasketEndpoint)
{
Path = ApiUrlBase
};
string uri = builder.ToString();
var uri = builder.ToString();
var result = await _requestProvider.PostAsync(uri, customerBasket, token); var result = await _requestProvider.PostAsync(uri, customerBasket, token);
@ -44,20 +49,24 @@ namespace eShopOnContainers.Core.Services.Basket
public async Task CheckoutAsync(BasketCheckout basketCheckout, string token) public async Task CheckoutAsync(BasketCheckout basketCheckout, string token)
{ {
UriBuilder builder = new UriBuilder(GlobalSetting.Instance.BasketEndpoint + "/checkout");
var builder = new UriBuilder(GlobalSetting.Instance.BasketEndpoint)
{
Path = $"{ApiUrlBase}/checkout"
};
string uri = builder.ToString();
var uri = builder.ToString();
await _requestProvider.PostAsync(uri, basketCheckout, token); await _requestProvider.PostAsync(uri, basketCheckout, token);
} }
public async Task ClearBasketAsync(string guidUser, string token) public async Task ClearBasketAsync(string guidUser, string token)
{ {
UriBuilder builder = new UriBuilder(GlobalSetting.Instance.BasketEndpoint);
builder.Path = guidUser;
var builder = new UriBuilder(GlobalSetting.Instance.BasketEndpoint)
{
Path = $"{ApiUrlBase}/{guidUser}"
};
string uri = builder.ToString();
var uri = builder.ToString();
await _requestProvider.DeleteAsync(uri, token); await _requestProvider.DeleteAsync(uri, token);
} }


+ 2
- 2
src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Common/Common.cs View File

@ -8,7 +8,7 @@
public static string MockCatalogItemId04 = "4"; public static string MockCatalogItemId04 = "4";
public static string MockCatalogItemId05 = "5"; public static string MockCatalogItemId05 = "5";
public static int MockCampaignd01 = 1;
public static int MockCampaignd02 = 2;
public static int MockCampaignId01 = 1;
public static int MockCampaignId02 = 2;
} }
} }

+ 21
- 3
src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Identity/IdentityService.cs View File

@ -1,16 +1,22 @@
using IdentityModel.Client;
using System;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Net; using System.Net;
using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using eShopOnContainers.Core.Services.RequestProvider; using eShopOnContainers.Core.Services.RequestProvider;
using eShopOnContainers.Core.Models.Token; using eShopOnContainers.Core.Models.Token;
using eShopOnContainers.Core.Helpers;
using IdentityModel;
using IdentityModel.Client;
using PCLCrypto;
using static PCLCrypto.WinRTCrypto;
namespace eShopOnContainers.Core.Services.Identity namespace eShopOnContainers.Core.Services.Identity
{ {
public class IdentityService : IIdentityService public class IdentityService : IIdentityService
{ {
private readonly IRequestProvider _requestProvider; private readonly IRequestProvider _requestProvider;
private string _codeVerifier;
public IdentityService(IRequestProvider requestProvider) public IdentityService(IRequestProvider requestProvider)
{ {
@ -30,6 +36,8 @@ namespace eShopOnContainers.Core.Services.Identity
dic.Add("scope", "openid profile basket orders locations marketing offline_access"); dic.Add("scope", "openid profile basket orders locations marketing offline_access");
dic.Add("redirect_uri", GlobalSetting.Instance.IdentityCallback); dic.Add("redirect_uri", GlobalSetting.Instance.IdentityCallback);
dic.Add("nonce", Guid.NewGuid().ToString("N")); dic.Add("nonce", Guid.NewGuid().ToString("N"));
dic.Add("code_challenge", CreateCodeChallenge());
dic.Add("code_challenge_method", "S256");
// Add CSRF token to protect against cross-site request forgery attacks. // Add CSRF token to protect against cross-site request forgery attacks.
var currentCSRFToken = Guid.NewGuid().ToString("N"); var currentCSRFToken = Guid.NewGuid().ToString("N");
@ -54,9 +62,19 @@ namespace eShopOnContainers.Core.Services.Identity
public async Task<UserToken> GetTokenAsync(string code) public async Task<UserToken> GetTokenAsync(string code)
{ {
string data = string.Format("grant_type=authorization_code&code={0}&redirect_uri={1}", code, WebUtility.UrlEncode(GlobalSetting.Instance.IdentityCallback));
string data = string.Format("grant_type=authorization_code&code={0}&redirect_uri={1}&code_verifier={2}", code, WebUtility.UrlEncode(GlobalSetting.Instance.IdentityCallback), _codeVerifier);
var token = await _requestProvider.PostAsync<UserToken>(GlobalSetting.Instance.TokenEndpoint, data, GlobalSetting.Instance.ClientId, GlobalSetting.Instance.ClientSecret); var token = await _requestProvider.PostAsync<UserToken>(GlobalSetting.Instance.TokenEndpoint, data, GlobalSetting.Instance.ClientId, GlobalSetting.Instance.ClientSecret);
return token; return token;
} }
private string CreateCodeChallenge()
{
_codeVerifier = RandomNumberGenerator.CreateUniqueId();
var sha256 = HashAlgorithmProvider.OpenAlgorithm(HashAlgorithm.Sha256);
var challengeBuffer = sha256.HashData(CryptographicBuffer.CreateFromByteArray(Encoding.UTF8.GetBytes(_codeVerifier)));
byte[] challengeBytes;
CryptographicBuffer.CopyToByteArray(challengeBuffer, out challengeBytes);
return Base64Url.Encode(challengeBytes);
}
} }
} }

+ 2
- 2
src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Marketing/CampaignMockService.cs View File

@ -13,7 +13,7 @@
{ {
new CampaignItem new CampaignItem
{ {
Id = Common.Common.MockCampaignd01,
Id = Common.Common.MockCampaignId01,
PictureUri = Device.RuntimePlatform != Device.Windows PictureUri = Device.RuntimePlatform != Device.Windows
? "fake_campaign_01.png" ? "fake_campaign_01.png"
: "Assets/fake_campaign_01.png", : "Assets/fake_campaign_01.png",
@ -25,7 +25,7 @@
new CampaignItem new CampaignItem
{ {
Id = Common.Common.MockCampaignd02,
Id = Common.Common.MockCampaignId02,
PictureUri = Device.RuntimePlatform != Device.Windows PictureUri = Device.RuntimePlatform != Device.Windows
? "fake_campaign_02.png" ? "fake_campaign_02.png"
: "Assets/fake_campaign_02.png", : "Assets/fake_campaign_02.png",


+ 1
- 1
src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Marketing/CampaignService.cs View File

@ -30,7 +30,7 @@
if (campaign?.Data != null) if (campaign?.Data != null)
{ {
ServicesHelper.FixCatalogItemPictureUri(campaign?.Data);
ServicesHelper.FixCampaignItemPictureUri(campaign?.Data);
return campaign?.Data.ToObservableCollection(); return campaign?.Data.ToObservableCollection();
} }


+ 14
- 12
src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/SettingsViewModel.cs View File

@ -1,4 +1,6 @@
namespace eShopOnContainers.Core.ViewModels
using System.Globalization;
namespace eShopOnContainers.Core.ViewModels
{ {
using System.Windows.Input; using System.Windows.Input;
using Xamarin.Forms; using Xamarin.Forms;
@ -34,8 +36,8 @@
_useAzureServices = !Settings.UseMocks; _useAzureServices = !Settings.UseMocks;
_endpoint = Settings.UrlBase; _endpoint = Settings.UrlBase;
_latitude = Settings.Latitude;
_longitude = Settings.Longitude;
_latitude = double.Parse(Settings.Latitude, CultureInfo.CurrentCulture);
_longitude = double.Parse(Settings.Longitude, CultureInfo.CurrentCulture);
_useFakeLocation = Settings.UseFakeLocation; _useFakeLocation = Settings.UseFakeLocation;
_allowGpsLocation = Settings.AllowGpsLocation; _allowGpsLocation = Settings.AllowGpsLocation;
_gpsWarningMessage = string.Empty; _gpsWarningMessage = string.Empty;
@ -279,13 +281,13 @@
if (!UseFakeLocation) if (!UseFakeLocation)
{ {
TitleUseFakeLocation = "Use Real Location"; TitleUseFakeLocation = "Use Real Location";
DescriptionUseFakeLocation = "When enabling the use of real location, the app will attempt to use real location from the device.";
DescriptionUseFakeLocation = "When enabling location, the app will attempt to use the location from the device.";
} }
else else
{ {
TitleUseFakeLocation = "Use Fake Location"; TitleUseFakeLocation = "Use Fake Location";
DescriptionUseFakeLocation = "Fake Location are added for marketing campaign testing.";
DescriptionUseFakeLocation = "Fake Location data is added for marketing campaign testing.";
} }
} }
@ -293,13 +295,13 @@
{ {
if (!AllowGpsLocation) if (!AllowGpsLocation)
{ {
TitleAllowGpsLocation = "GPS location Denied";
DescriptionAllowGpsLocation = "When denying the use of device gps you won't get the location campaigns through your real location.";
TitleAllowGpsLocation = "GPS Location Disabled";
DescriptionAllowGpsLocation = "When disabling location, you won't receive location campaigns based upon your location.";
} }
else else
{ {
TitleAllowGpsLocation = "GPS location Allowed";
DescriptionAllowGpsLocation = "When allowing the use of device gps you will get the location campaigns through your real location.";
TitleAllowGpsLocation = "GPS Location Enabled";
DescriptionAllowGpsLocation = "When enabling location, you'll receive location campaigns based upon your location.";
} }
} }
@ -325,13 +327,13 @@
private void UpdateLatitude() private void UpdateLatitude()
{ {
// Update fake latitude (save to local storage) // Update fake latitude (save to local storage)
Settings.Latitude = _latitude;
Settings.Latitude = _latitude.ToString();
} }
private void UpdateLongitude() private void UpdateLongitude()
{ {
// Update fake longitude (save to local storage) // Update fake longitude (save to local storage)
Settings.Longitude = _longitude;
Settings.Longitude = _longitude.ToString();
} }
private void UpdateAllowGpsLocation() private void UpdateAllowGpsLocation()
@ -342,7 +344,7 @@
if (!locator.IsGeolocationEnabled) if (!locator.IsGeolocationEnabled)
{ {
_allowGpsLocation = false; _allowGpsLocation = false;
GpsWarningMessage = "Enable your GPS system in your device";
GpsWarningMessage = "Enable the GPS sensor on your device";
} }
else else
{ {


+ 3
- 0
src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/CampaignDetailsView.xaml View File

@ -2,11 +2,14 @@
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms" <ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="eShopOnContainers.Core.Views.CampaignDetailsView" x:Class="eShopOnContainers.Core.Views.CampaignDetailsView"
xmlns:converters="clr-namespace:eShopOnContainers.Core.Converters;assembly=eShopOnContainers.Core"
xmlns:viewModelBase="clr-namespace:eShopOnContainers.Core.ViewModels.Base;assembly=eShopOnContainers.Core" xmlns:viewModelBase="clr-namespace:eShopOnContainers.Core.ViewModels.Base;assembly=eShopOnContainers.Core"
viewModelBase:ViewModelLocator.AutoWireViewModel="true" viewModelBase:ViewModelLocator.AutoWireViewModel="true"
Title="Campaign Details"> Title="Campaign Details">
<ContentPage.Resources> <ContentPage.Resources>
<ResourceDictionary> <ResourceDictionary>
<converters:StringNullOrEmptyBoolConverter x:Key="StringNullOrEmptyBoolConverter" />
<Style x:Key="CampaignTitleStyle" <Style x:Key="CampaignTitleStyle"
TargetType="{x:Type Label}"> TargetType="{x:Type Label}">
<Setter Property="FontFamily" <Setter Property="FontFamily"


+ 1
- 1
src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/CampaignView.xaml View File

@ -8,7 +8,7 @@
xmlns:triggers="clr-namespace:eShopOnContainers.Core.Triggers;assembly=eShopOnContainers.Core" xmlns:triggers="clr-namespace:eShopOnContainers.Core.Triggers;assembly=eShopOnContainers.Core"
xmlns:behaviors="clr-namespace:eShopOnContainers.Core.Behaviors;assembly=eShopOnContainers.Core" xmlns:behaviors="clr-namespace:eShopOnContainers.Core.Behaviors;assembly=eShopOnContainers.Core"
viewModelBase:ViewModelLocator.AutoWireViewModel="true" viewModelBase:ViewModelLocator.AutoWireViewModel="true"
Title="Catalog">
Title="Campaigns">
<ContentPage.Resources> <ContentPage.Resources>
<ResourceDictionary> <ResourceDictionary>


+ 5
- 6
src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/LoginView.xaml View File

@ -4,6 +4,7 @@
x:Class="eShopOnContainers.Core.Views.LoginView" x:Class="eShopOnContainers.Core.Views.LoginView"
xmlns:viewModelBase="clr-namespace:eShopOnContainers.Core.ViewModels.Base;assembly=eShopOnContainers.Core" xmlns:viewModelBase="clr-namespace:eShopOnContainers.Core.ViewModels.Base;assembly=eShopOnContainers.Core"
xmlns:animations="clr-namespace:eShopOnContainers.Core.Animations;assembly=eShopOnContainers.Core" xmlns:animations="clr-namespace:eShopOnContainers.Core.Animations;assembly=eShopOnContainers.Core"
xmlns:converters="clr-namespace:eShopOnContainers.Core.Converters;assembly=eShopOnContainers.Core"
xmlns:triggers="clr-namespace:eShopOnContainers.Core.Triggers;assembly=eShopOnContainers.Core" xmlns:triggers="clr-namespace:eShopOnContainers.Core.Triggers;assembly=eShopOnContainers.Core"
xmlns:behaviors="clr-namespace:eShopOnContainers.Core.Behaviors;assembly=eShopOnContainers.Core" xmlns:behaviors="clr-namespace:eShopOnContainers.Core.Behaviors;assembly=eShopOnContainers.Core"
viewModelBase:ViewModelLocator.AutoWireViewModel="true"> viewModelBase:ViewModelLocator.AutoWireViewModel="true">
@ -15,7 +16,10 @@
</ContentPage.Title> </ContentPage.Title>
<ContentPage.Resources> <ContentPage.Resources>
<ResourceDictionary> <ResourceDictionary>
<converters:FirstValidationErrorConverter x:Key="FirstValidationErrorConverter" />
<converters:WebNavigatingEventArgsConverter x:Key="WebNavigatingEventArgsConverter" />
<converters:WebNavigatedEventArgsConverter x:Key="WebNavigatedEventArgsConverter" />
<Style x:Key="TitleLabelStyle" <Style x:Key="TitleLabelStyle"
TargetType="{x:Type Label}"> TargetType="{x:Type Label}">
<Setter Property="FontFamily" <Setter Property="FontFamily"
@ -147,11 +151,6 @@
<Label <Label
Text="REGISTER" Text="REGISTER"
TextColor="Gray"/> TextColor="Gray"/>
<Grid.GestureRecognizers>
<TapGestureRecognizer
Command="{Binding RegisterCommand}"
NumberOfTapsRequired="1" />
</Grid.GestureRecognizers>
</Grid> </Grid>
<StackLayout <StackLayout
Grid.Column="2" Grid.Column="2"


+ 6
- 4
src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/SettingsView.xaml View File

@ -3,14 +3,16 @@
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="eShopOnContainers.Core.Views.SettingsView" x:Class="eShopOnContainers.Core.Views.SettingsView"
xmlns:viewModelBase="clr-namespace:eShopOnContainers.Core.ViewModels.Base;assembly=eShopOnContainers.Core" xmlns:viewModelBase="clr-namespace:eShopOnContainers.Core.ViewModels.Base;assembly=eShopOnContainers.Core"
xmlns:controls="clr-namespace:eShopOnContainers.Core.Controls;assembly=eShopOnContainers.Core"
xmlns:controls="clr-namespace:eShopOnContainers.Core.Controls;assembly=eShopOnContainers.Core"
xmlns:converters="clr-namespace:eShopOnContainers.Core.Converters;assembly=eShopOnContainers.Core"
xmlns:animations="clr-namespace:eShopOnContainers.Core.Animations;assembly=eShopOnContainers.Core" xmlns:animations="clr-namespace:eShopOnContainers.Core.Animations;assembly=eShopOnContainers.Core"
xmlns:triggers="clr-namespace:eShopOnContainers.Core.Triggers;assembly=eShopOnContainers.Core" xmlns:triggers="clr-namespace:eShopOnContainers.Core.Triggers;assembly=eShopOnContainers.Core"
viewModelBase:ViewModelLocator.AutoWireViewModel="true" viewModelBase:ViewModelLocator.AutoWireViewModel="true"
Title="Settings"> Title="Settings">
<ContentPage.Resources> <ContentPage.Resources>
<ResourceDictionary> <ResourceDictionary>
<converters:DoubleConverter x:Key="DoubleConverter" />
<Style x:Key="SettingsStackLayoutStyle" TargetType="{x:Type StackLayout}"> <Style x:Key="SettingsStackLayoutStyle" TargetType="{x:Type StackLayout}">
<Setter Property="Margin" <Setter Property="Margin"
Value="6" /> Value="6" />
@ -219,7 +221,7 @@
Text="Latitude" Text="Latitude"
Style="{StaticResource HeaderLabelStyle}"/> Style="{StaticResource HeaderLabelStyle}"/>
<Entry <Entry
Text="{Binding Latitude, Mode=TwoWay}"
Text="{Binding Latitude, Mode=TwoWay, Converter={StaticResource DoubleConverter}}"
Keyboard="Text"> Keyboard="Text">
<Entry.Style> <Entry.Style>
<OnPlatform <OnPlatform
@ -233,7 +235,7 @@
Text="Longitude" Text="Longitude"
Style="{StaticResource HeaderLabelStyle}"/> Style="{StaticResource HeaderLabelStyle}"/>
<Entry <Entry
Text="{Binding Longitude, Mode=TwoWay}"
Text="{Binding Longitude, Mode=TwoWay, Converter={StaticResource DoubleConverter}}"
Keyboard="Text"> Keyboard="Text">
<Entry.Style> <Entry.Style>
<OnPlatform <OnPlatform


+ 3
- 5
src/Mobile/eShopOnContainers/eShopOnContainers.Core/eShopOnContainers.Core.csproj View File

@ -49,6 +49,7 @@
</Compile> </Compile>
<Compile Include="Controls\CustomTabbedPage.cs" /> <Compile Include="Controls\CustomTabbedPage.cs" />
<Compile Include="Controls\ToggleButton.cs" /> <Compile Include="Controls\ToggleButton.cs" />
<Compile Include="Converters\DoubleConverter.cs" />
<Compile Include="Converters\StringNullOrEmptyBoolConverter.cs" /> <Compile Include="Converters\StringNullOrEmptyBoolConverter.cs" />
<Compile Include="Converters\CountToBoolConverter.cs" /> <Compile Include="Converters\CountToBoolConverter.cs" />
<Compile Include="Converters\DatetimeConverter.cs" /> <Compile Include="Converters\DatetimeConverter.cs" />
@ -63,6 +64,7 @@
<Compile Include="Extensions\ObservableExtension.cs" /> <Compile Include="Extensions\ObservableExtension.cs" />
<Compile Include="GlobalSettings.cs" /> <Compile Include="GlobalSettings.cs" />
<Compile Include="Helpers\EasingHelper.cs" /> <Compile Include="Helpers\EasingHelper.cs" />
<Compile Include="Helpers\RandomNumberGenerator.cs" />
<Compile Include="Helpers\ServicesHelper.cs" /> <Compile Include="Helpers\ServicesHelper.cs" />
<Compile Include="Helpers\Settings.cs" /> <Compile Include="Helpers\Settings.cs" />
<Compile Include="Models\Basket\BasketCheckout.cs" /> <Compile Include="Models\Basket\BasketCheckout.cs" />
@ -190,6 +192,7 @@
<Compile Include="Effects\EntryLineColorEffect.cs" /> <Compile Include="Effects\EntryLineColorEffect.cs" />
<Compile Include="Behaviors\LineColorBehavior.cs" /> <Compile Include="Behaviors\LineColorBehavior.cs" />
<Compile Include="Models\Token\UserToken.cs" /> <Compile Include="Models\Token\UserToken.cs" />
<Compile Include="Effects\ThemeEffects.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="app.config" /> <None Include="app.config" />
@ -289,11 +292,6 @@
<SubType>Designer</SubType> <SubType>Designer</SubType>
</EmbeddedResource> </EmbeddedResource>
</ItemGroup> </ItemGroup>
<ItemGroup>
<Reference Include="System.ComponentModel.Annotations">
<HintPath>..\..\..\..\..\..\..\..\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETPortable\v4.6\Profile\Profile44\System.ComponentModel.Annotations.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup> <ItemGroup>
<EmbeddedResource Include="Views\CampaignDetailsView.xaml"> <EmbeddedResource Include="Views\CampaignDetailsView.xaml">
<Generator>MSBuild:UpdateDesignTimeXaml</Generator> <Generator>MSBuild:UpdateDesignTimeXaml</Generator>


+ 3
- 4
src/Mobile/eShopOnContainers/eShopOnContainers.Core/project.json View File

@ -8,16 +8,15 @@
"Microsoft.Net.Http": "2.2.29", "Microsoft.Net.Http": "2.2.29",
"modernhttpclient": "2.4.2", "modernhttpclient": "2.4.2",
"Newtonsoft.Json": "9.0.1", "Newtonsoft.Json": "9.0.1",
"PCLCrypto": "2.0.147",
"SlideOverKit": "2.1.4", "SlideOverKit": "2.1.4",
"Splat": "1.6.2", "Splat": "1.6.2",
"System.ComponentModel.Annotations": "4.3.0",
"Xam.Plugin.Geolocator": "3.0.4", "Xam.Plugin.Geolocator": "3.0.4",
"Xam.Plugins.Settings": "2.6.0.12-beta", "Xam.Plugins.Settings": "2.6.0.12-beta",
"Xamarin.FFImageLoading": "2.2.9", "Xamarin.FFImageLoading": "2.2.9",
"Xamarin.FFImageLoading.Forms": "2.2.9", "Xamarin.FFImageLoading.Forms": "2.2.9",
"Xamarin.Forms": "2.3.4.231",
"Xamarin.Forms.Pages": "2.3.4.231",
"Xamarin.Forms.Theme.Base": "1.0.0.43-pre1",
"Xamarin.Forms.Theme.Light": "1.0.0.43-pre1"
"Xamarin.Forms": "2.3.4.231"
}, },
"frameworks": { "frameworks": {
".NETPortable,Version=v4.5,Profile=Profile111": {} ".NETPortable,Version=v4.5,Profile=Profile111": {}


+ 1
- 4
src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Activities/MainActivity.cs View File

@ -14,7 +14,7 @@ using Plugin.Permissions;
namespace eShopOnContainers.Droid.Activities namespace eShopOnContainers.Droid.Activities
{ {
[Activity( [Activity(
Label = "eShopOnContainers",
Label = "eShopOnContainers",
Icon = "@drawable/icon", Icon = "@drawable/icon",
Theme = "@style/MainTheme", Theme = "@style/MainTheme",
MainLauncher = true, MainLauncher = true,
@ -38,9 +38,6 @@ namespace eShopOnContainers.Droid.Activities
CachedImageRenderer.Init(); CachedImageRenderer.Init();
LoadApplication(new App()); LoadApplication(new App());
var x = typeof(Xamarin.Forms.Themes.LightThemeResources);
x = typeof(Xamarin.Forms.Themes.Android.UnderlineEffect);
Window window = this.Window; Window window = this.Window;
window.ClearFlags(WindowManagerFlags.TranslucentStatus); window.ClearFlags(WindowManagerFlags.TranslucentStatus);
window.AddFlags(WindowManagerFlags.DrawsSystemBarBackgrounds); window.AddFlags(WindowManagerFlags.DrawsSystemBarBackgrounds);


+ 66
- 0
src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Effects/BaseContainerEffect.cs View File

@ -0,0 +1,66 @@
using Xamarin.Forms.Platform.Android;
namespace eShopOnContainers.Droid.Effects
{
public abstract class BaseContainerEffect : PlatformEffect
{
private bool _unloaded;
private bool _attached;
protected bool Attached
{
get { return _attached; }
}
protected virtual bool CanBeApplied()
{
return true;
}
protected virtual void OnAttachedInternal()
{
}
protected virtual void OnDetachedInternal()
{
}
protected sealed override void OnAttached()
{
if (CanBeApplied())
{
_attached = true;
Container.ViewDetachedFromWindow -= ContainerViewDetachedFromWindow;
Container.ViewDetachedFromWindow += ContainerViewDetachedFromWindow;
Container.ViewAttachedToWindow -= ContainerViewAttachedToWindow;
Container.ViewAttachedToWindow += ContainerViewAttachedToWindow;
OnAttachedInternal();
}
}
protected sealed override void OnDetached()
{
if (_attached && !_unloaded)
{
_attached = false;
Container.ViewDetachedFromWindow -= ContainerViewDetachedFromWindow;
Container.ViewAttachedToWindow -= ContainerViewAttachedToWindow;
OnDetachedInternal();
}
}
private void ContainerViewDetachedFromWindow(object sender, global::Android.Views.View.ViewDetachedFromWindowEventArgs e)
{
_unloaded = true;
}
private void ContainerViewAttachedToWindow(object sender, global::Android.Views.View.ViewAttachedToWindowEventArgs e)
{
_unloaded = false;
}
}
}

+ 54
- 0
src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Effects/CircleEffect.cs View File

@ -0,0 +1,54 @@
using System;
using Xamarin.Forms;
using eShopOnContainers.Droid.Effects;
using Android.Views;
using Android.Graphics;
[assembly: ExportEffect(typeof(CircleEffect), "CircleEffect")]
namespace eShopOnContainers.Droid.Effects
{
public class CircleEffect : BaseContainerEffect
{
private ViewOutlineProvider _originalProvider;
protected override bool CanBeApplied()
{
return Container != null && (int)global::Android.OS.Build.VERSION.SdkInt >= 21;
}
protected override void OnAttachedInternal()
{
_originalProvider = Container.OutlineProvider;
Container.OutlineProvider = new CircleOutlineProvider();
Container.ClipToOutline = true;
}
protected override void OnDetachedInternal()
{
Container.ClipToOutline = false;
Container.OutlineProvider = _originalProvider;
}
private class CircleOutlineProvider : ViewOutlineProvider
{
public override void GetOutline(Android.Views.View view, Outline outline)
{
double width = view.Width;
double height = view.Height;
if (width <= 0 || height <= 0)
{
return;
}
double min = Math.Min(width, height);
var radius = (float)(min / 2.0);
var layerX = width > min ? (width - min) / 2 : 0;
var layerY = height > min ? (height - min) / 2 : 0;
outline.SetRoundRect(new Rect((int)layerX, (int)layerY, (int)(layerX + min), (int)(layerY + min)), radius);
}
}
}
}

+ 1
- 0
src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Effects/EntryLineColorEffect.cs View File

@ -7,6 +7,7 @@ using eShopOnContainers.Core.Behaviors;
using System.ComponentModel; using System.ComponentModel;
using System.Diagnostics; using System.Diagnostics;
[assembly: ResolutionGroupName("eShopOnContainers")]
[assembly: ExportEffect(typeof(EntryLineColorEffect), "EntryLineColorEffect")] [assembly: ExportEffect(typeof(EntryLineColorEffect), "EntryLineColorEffect")]
namespace eShopOnContainers.Droid.Effects namespace eShopOnContainers.Droid.Effects
{ {


+ 116
- 65
src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Resources/Resource.Designer.cs View File

@ -1,15 +1,15 @@
#pragma warning disable 1591 #pragma warning disable 1591
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Runtime Version:4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
// ------------------------------------------------------------------------------
// <autogenerated>
// This code was generated by a tool.
// Mono Runtime Version: 4.0.30319.42000
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </autogenerated>
// ------------------------------------------------------------------------------
[assembly: global::Android.Runtime.ResourceDesignerAttribute("eShopOnContainers.Droid.Resource", IsApplication=true)]
[assembly: Android.Runtime.ResourceDesignerAttribute("eShopOnContainers.Droid.Resource", IsApplication=true)]
namespace eShopOnContainers.Droid namespace eShopOnContainers.Droid
{ {
@ -64,6 +64,8 @@ namespace eShopOnContainers.Droid
global::AndroidHUD.Resource.Styleable.ProgressWheel_ahTextColor = global::eShopOnContainers.Droid.Resource.Styleable.ProgressWheel_ahTextColor; global::AndroidHUD.Resource.Styleable.ProgressWheel_ahTextColor = global::eShopOnContainers.Droid.Resource.Styleable.ProgressWheel_ahTextColor;
global::AndroidHUD.Resource.Styleable.ProgressWheel_ahTextSize = global::eShopOnContainers.Droid.Resource.Styleable.ProgressWheel_ahTextSize; global::AndroidHUD.Resource.Styleable.ProgressWheel_ahTextSize = global::eShopOnContainers.Droid.Resource.Styleable.ProgressWheel_ahTextSize;
global::ModernHttpClient.Resource.String.library_name = global::eShopOnContainers.Droid.Resource.String.library_name; global::ModernHttpClient.Resource.String.library_name = global::eShopOnContainers.Droid.Resource.String.library_name;
global::PCLCrypto.Resource.String.ApplicationName = global::eShopOnContainers.Droid.Resource.String.ApplicationName;
global::PCLCrypto.Resource.String.Hello = global::eShopOnContainers.Droid.Resource.String.Hello;
global::Splat.Resource.String.library_name = global::eShopOnContainers.Droid.Resource.String.library_name; global::Splat.Resource.String.library_name = global::eShopOnContainers.Droid.Resource.String.library_name;
global::Xamarin.Forms.Platform.Android.Resource.Attribute.actionBarSize = global::eShopOnContainers.Droid.Resource.Attribute.actionBarSize; global::Xamarin.Forms.Platform.Android.Resource.Attribute.actionBarSize = global::eShopOnContainers.Droid.Resource.Attribute.actionBarSize;
} }
@ -3126,11 +3128,11 @@ namespace eShopOnContainers.Droid
public partial class String public partial class String
{ {
// aapt resource value: 0x7f080027
public const int ApplicationName = 2131230759;
// aapt resource value: 0x7f080028
public const int ApplicationName = 2131230760;
// aapt resource value: 0x7f080026
public const int Hello = 2131230758;
// aapt resource value: 0x7f080027
public const int Hello = 2131230759;
// aapt resource value: 0x7f08000f // aapt resource value: 0x7f08000f
public const int abc_action_bar_home_description = 2131230735; public const int abc_action_bar_home_description = 2131230735;
@ -3198,8 +3200,8 @@ namespace eShopOnContainers.Droid
// aapt resource value: 0x7f080025 // aapt resource value: 0x7f080025
public const int character_counter_pattern = 2131230757; public const int character_counter_pattern = 2131230757;
// aapt resource value: 0x7f080028
public const int library_name = 2131230760;
// aapt resource value: 0x7f080026
public const int library_name = 2131230758;
// aapt resource value: 0x7f080000 // aapt resource value: 0x7f080000
public const int mr_button_content_description = 2131230720; public const int mr_button_content_description = 2131230720;
@ -4397,7 +4399,8 @@ namespace eShopOnContainers.Droid
public partial class Styleable public partial class Styleable
{ {
public static int[] ActionBar = new int[] {
public static int[] ActionBar = new int[]
{
2130772007, 2130772007,
2130772009, 2130772009,
2130772010, 2130772010,
@ -4507,13 +4510,15 @@ namespace eShopOnContainers.Droid
// aapt resource value: 5 // aapt resource value: 5
public const int ActionBar_titleTextStyle = 5; public const int ActionBar_titleTextStyle = 5;
public static int[] ActionBarLayout = new int[] {
public static int[] ActionBarLayout = new int[]
{
16842931}; 16842931};
// aapt resource value: 0 // aapt resource value: 0
public const int ActionBarLayout_android_layout_gravity = 0; public const int ActionBarLayout_android_layout_gravity = 0;
public static int[] ActionMenuItemView = new int[] {
public static int[] ActionMenuItemView = new int[]
{
16843071}; 16843071};
// aapt resource value: 0 // aapt resource value: 0
@ -4521,7 +4526,8 @@ namespace eShopOnContainers.Droid
public static int[] ActionMenuView; public static int[] ActionMenuView;
public static int[] ActionMode = new int[] {
public static int[] ActionMode = new int[]
{
2130772007, 2130772007,
2130772013, 2130772013,
2130772014, 2130772014,
@ -4547,7 +4553,8 @@ namespace eShopOnContainers.Droid
// aapt resource value: 1 // aapt resource value: 1
public const int ActionMode_titleTextStyle = 1; public const int ActionMode_titleTextStyle = 1;
public static int[] ActivityChooserView = new int[] {
public static int[] ActivityChooserView = new int[]
{
2130772035, 2130772035,
2130772036}; 2130772036};
@ -4557,7 +4564,8 @@ namespace eShopOnContainers.Droid
// aapt resource value: 0 // aapt resource value: 0
public const int ActivityChooserView_initialActivityCount = 0; public const int ActivityChooserView_initialActivityCount = 0;
public static int[] AlertDialog = new int[] {
public static int[] AlertDialog = new int[]
{
16842994, 16842994,
2130772037, 2130772037,
2130772038, 2130772038,
@ -4583,7 +4591,8 @@ namespace eShopOnContainers.Droid
// aapt resource value: 4 // aapt resource value: 4
public const int AlertDialog_singleChoiceItemLayout = 4; public const int AlertDialog_singleChoiceItemLayout = 4;
public static int[] AppBarLayout = new int[] {
public static int[] AppBarLayout = new int[]
{
16842964, 16842964,
2130772032, 2130772032,
2130772215}; 2130772215};
@ -4597,7 +4606,8 @@ namespace eShopOnContainers.Droid
// aapt resource value: 2 // aapt resource value: 2
public const int AppBarLayout_expanded = 2; public const int AppBarLayout_expanded = 2;
public static int[] AppBarLayout_LayoutParams = new int[] {
public static int[] AppBarLayout_LayoutParams = new int[]
{
2130772216, 2130772216,
2130772217}; 2130772217};
@ -4607,7 +4617,8 @@ namespace eShopOnContainers.Droid
// aapt resource value: 1 // aapt resource value: 1
public const int AppBarLayout_LayoutParams_layout_scrollInterpolator = 1; public const int AppBarLayout_LayoutParams_layout_scrollInterpolator = 1;
public static int[] AppCompatImageView = new int[] {
public static int[] AppCompatImageView = new int[]
{
16843033, 16843033,
2130772042}; 2130772042};
@ -4617,7 +4628,8 @@ namespace eShopOnContainers.Droid
// aapt resource value: 1 // aapt resource value: 1
public const int AppCompatImageView_srcCompat = 1; public const int AppCompatImageView_srcCompat = 1;
public static int[] AppCompatTextView = new int[] {
public static int[] AppCompatTextView = new int[]
{
16842804, 16842804,
2130772043}; 2130772043};
@ -4627,7 +4639,8 @@ namespace eShopOnContainers.Droid
// aapt resource value: 1 // aapt resource value: 1
public const int AppCompatTextView_textAllCaps = 1; public const int AppCompatTextView_textAllCaps = 1;
public static int[] AppCompatTheme = new int[] {
public static int[] AppCompatTheme = new int[]
{
16842839, 16842839,
16842926, 16842926,
2130772044, 2130772044,
@ -5077,7 +5090,8 @@ namespace eShopOnContainers.Droid
// aapt resource value: 3 // aapt resource value: 3
public const int AppCompatTheme_windowNoTitle = 3; public const int AppCompatTheme_windowNoTitle = 3;
public static int[] BottomSheetBehavior_Params = new int[] {
public static int[] BottomSheetBehavior_Params = new int[]
{
2130772218, 2130772218,
2130772219}; 2130772219};
@ -5087,13 +5101,15 @@ namespace eShopOnContainers.Droid
// aapt resource value: 0 // aapt resource value: 0
public const int BottomSheetBehavior_Params_behavior_peekHeight = 0; public const int BottomSheetBehavior_Params_behavior_peekHeight = 0;
public static int[] ButtonBarLayout = new int[] {
public static int[] ButtonBarLayout = new int[]
{
2130772154}; 2130772154};
// aapt resource value: 0 // aapt resource value: 0
public const int ButtonBarLayout_allowStacking = 0; public const int ButtonBarLayout_allowStacking = 0;
public static int[] CardView = new int[] {
public static int[] CardView = new int[]
{
16843071, 16843071,
16843072, 16843072,
2130771995, 2130771995,
@ -5147,7 +5163,8 @@ namespace eShopOnContainers.Droid
// aapt resource value: 11 // aapt resource value: 11
public const int CardView_contentPaddingTop = 11; public const int CardView_contentPaddingTop = 11;
public static int[] CollapsingAppBarLayout_LayoutParams = new int[] {
public static int[] CollapsingAppBarLayout_LayoutParams = new int[]
{
2130772220, 2130772220,
2130772221}; 2130772221};
@ -5157,7 +5174,8 @@ namespace eShopOnContainers.Droid
// aapt resource value: 1 // aapt resource value: 1
public const int CollapsingAppBarLayout_LayoutParams_layout_collapseParallaxMultiplier = 1; public const int CollapsingAppBarLayout_LayoutParams_layout_collapseParallaxMultiplier = 1;
public static int[] CollapsingToolbarLayout = new int[] {
public static int[] CollapsingToolbarLayout = new int[]
{
2130772009, 2130772009,
2130772222, 2130772222,
2130772223, 2130772223,
@ -5215,7 +5233,8 @@ namespace eShopOnContainers.Droid
// aapt resource value: 10 // aapt resource value: 10
public const int CollapsingToolbarLayout_toolbarId = 10; public const int CollapsingToolbarLayout_toolbarId = 10;
public static int[] CompoundButton = new int[] {
public static int[] CompoundButton = new int[]
{
16843015, 16843015,
2130772155, 2130772155,
2130772156}; 2130772156};
@ -5229,7 +5248,8 @@ namespace eShopOnContainers.Droid
// aapt resource value: 2 // aapt resource value: 2
public const int CompoundButton_buttonTintMode = 2; public const int CompoundButton_buttonTintMode = 2;
public static int[] CoordinatorLayout = new int[] {
public static int[] CoordinatorLayout = new int[]
{
2130772235, 2130772235,
2130772236}; 2130772236};
@ -5239,7 +5259,8 @@ namespace eShopOnContainers.Droid
// aapt resource value: 1 // aapt resource value: 1
public const int CoordinatorLayout_statusBarBackground = 1; public const int CoordinatorLayout_statusBarBackground = 1;
public static int[] CoordinatorLayout_LayoutParams = new int[] {
public static int[] CoordinatorLayout_LayoutParams = new int[]
{
16842931, 16842931,
2130772237, 2130772237,
2130772238, 2130772238,
@ -5261,7 +5282,8 @@ namespace eShopOnContainers.Droid
// aapt resource value: 3 // aapt resource value: 3
public const int CoordinatorLayout_LayoutParams_layout_keyline = 3; public const int CoordinatorLayout_LayoutParams_layout_keyline = 3;
public static int[] DesignTheme = new int[] {
public static int[] DesignTheme = new int[]
{
2130772241, 2130772241,
2130772242, 2130772242,
2130772243}; 2130772243};
@ -5275,7 +5297,8 @@ namespace eShopOnContainers.Droid
// aapt resource value: 2 // aapt resource value: 2
public const int DesignTheme_textColorError = 2; public const int DesignTheme_textColorError = 2;
public static int[] DrawerArrowToggle = new int[] {
public static int[] DrawerArrowToggle = new int[]
{
2130772157, 2130772157,
2130772158, 2130772158,
2130772159, 2130772159,
@ -5309,7 +5332,8 @@ namespace eShopOnContainers.Droid
// aapt resource value: 7 // aapt resource value: 7
public const int DrawerArrowToggle_thickness = 7; public const int DrawerArrowToggle_thickness = 7;
public static int[] FloatingActionButton = new int[] {
public static int[] FloatingActionButton = new int[]
{
2130772032, 2130772032,
2130772213, 2130772213,
2130772214, 2130772214,
@ -5343,7 +5367,8 @@ namespace eShopOnContainers.Droid
// aapt resource value: 7 // aapt resource value: 7
public const int FloatingActionButton_useCompatPadding = 7; public const int FloatingActionButton_useCompatPadding = 7;
public static int[] ForegroundLinearLayout = new int[] {
public static int[] ForegroundLinearLayout = new int[]
{
16843017, 16843017,
16843264, 16843264,
2130772249}; 2130772249};
@ -5357,7 +5382,8 @@ namespace eShopOnContainers.Droid
// aapt resource value: 2 // aapt resource value: 2
public const int ForegroundLinearLayout_foregroundInsidePadding = 2; public const int ForegroundLinearLayout_foregroundInsidePadding = 2;
public static int[] LinearLayoutCompat = new int[] {
public static int[] LinearLayoutCompat = new int[]
{
16842927, 16842927,
16842948, 16842948,
16843046, 16843046,
@ -5395,7 +5421,8 @@ namespace eShopOnContainers.Droid
// aapt resource value: 7 // aapt resource value: 7
public const int LinearLayoutCompat_showDividers = 7; public const int LinearLayoutCompat_showDividers = 7;
public static int[] LinearLayoutCompat_Layout = new int[] {
public static int[] LinearLayoutCompat_Layout = new int[]
{
16842931, 16842931,
16842996, 16842996,
16842997, 16842997,
@ -5413,7 +5440,8 @@ namespace eShopOnContainers.Droid
// aapt resource value: 1 // aapt resource value: 1
public const int LinearLayoutCompat_Layout_android_layout_width = 1; public const int LinearLayoutCompat_Layout_android_layout_width = 1;
public static int[] ListPopupWindow = new int[] {
public static int[] ListPopupWindow = new int[]
{
16843436, 16843436,
16843437}; 16843437};
@ -5423,7 +5451,8 @@ namespace eShopOnContainers.Droid
// aapt resource value: 1 // aapt resource value: 1
public const int ListPopupWindow_android_dropDownVerticalOffset = 1; public const int ListPopupWindow_android_dropDownVerticalOffset = 1;
public static int[] MediaRouteButton = new int[] {
public static int[] MediaRouteButton = new int[]
{
16843071, 16843071,
16843072, 16843072,
2130771994}; 2130771994};
@ -5437,7 +5466,8 @@ namespace eShopOnContainers.Droid
// aapt resource value: 2 // aapt resource value: 2
public const int MediaRouteButton_externalRouteEnabledDrawable = 2; public const int MediaRouteButton_externalRouteEnabledDrawable = 2;
public static int[] MenuGroup = new int[] {
public static int[] MenuGroup = new int[]
{
16842766, 16842766,
16842960, 16842960,
16843156, 16843156,
@ -5463,7 +5493,8 @@ namespace eShopOnContainers.Droid
// aapt resource value: 2 // aapt resource value: 2
public const int MenuGroup_android_visible = 2; public const int MenuGroup_android_visible = 2;
public static int[] MenuItem = new int[] {
public static int[] MenuItem = new int[]
{
16842754, 16842754,
16842766, 16842766,
16842960, 16842960,
@ -5533,7 +5564,8 @@ namespace eShopOnContainers.Droid
// aapt resource value: 13 // aapt resource value: 13
public const int MenuItem_showAsAction = 13; public const int MenuItem_showAsAction = 13;
public static int[] MenuView = new int[] {
public static int[] MenuView = new int[]
{
16842926, 16842926,
16843052, 16843052,
16843053, 16843053,
@ -5567,7 +5599,8 @@ namespace eShopOnContainers.Droid
// aapt resource value: 7 // aapt resource value: 7
public const int MenuView_preserveIconSpacing = 7; public const int MenuView_preserveIconSpacing = 7;
public static int[] NavigationView = new int[] {
public static int[] NavigationView = new int[]
{
16842964, 16842964,
16842973, 16842973,
16843039, 16843039,
@ -5609,7 +5642,8 @@ namespace eShopOnContainers.Droid
// aapt resource value: 4 // aapt resource value: 4
public const int NavigationView_menu = 4; public const int NavigationView_menu = 4;
public static int[] PopupWindow = new int[] {
public static int[] PopupWindow = new int[]
{
16843126, 16843126,
2130772173}; 2130772173};
@ -5619,13 +5653,15 @@ namespace eShopOnContainers.Droid
// aapt resource value: 1 // aapt resource value: 1
public const int PopupWindow_overlapAnchor = 1; public const int PopupWindow_overlapAnchor = 1;
public static int[] PopupWindowBackgroundState = new int[] {
public static int[] PopupWindowBackgroundState = new int[]
{
2130772174}; 2130772174};
// aapt resource value: 0 // aapt resource value: 0
public const int PopupWindowBackgroundState_state_above_anchor = 0; public const int PopupWindowBackgroundState_state_above_anchor = 0;
public static int[] ProgressWheel = new int[] {
public static int[] ProgressWheel = new int[]
{
2130772284, 2130772284,
2130772285, 2130772285,
2130772286, 2130772286,
@ -5675,7 +5711,8 @@ namespace eShopOnContainers.Droid
// aapt resource value: 2 // aapt resource value: 2
public const int ProgressWheel_ahTextSize = 2; public const int ProgressWheel_ahTextSize = 2;
public static int[] RecyclerView = new int[] {
public static int[] RecyclerView = new int[]
{
16842948, 16842948,
2130771968, 2130771968,
2130771969, 2130771969,
@ -5697,19 +5734,22 @@ namespace eShopOnContainers.Droid
// aapt resource value: 4 // aapt resource value: 4
public const int RecyclerView_stackFromEnd = 4; public const int RecyclerView_stackFromEnd = 4;
public static int[] ScrimInsetsFrameLayout = new int[] {
public static int[] ScrimInsetsFrameLayout = new int[]
{
2130772256}; 2130772256};
// aapt resource value: 0 // aapt resource value: 0
public const int ScrimInsetsFrameLayout_insetForeground = 0; public const int ScrimInsetsFrameLayout_insetForeground = 0;
public static int[] ScrollingViewBehavior_Params = new int[] {
public static int[] ScrollingViewBehavior_Params = new int[]
{
2130772257}; 2130772257};
// aapt resource value: 0 // aapt resource value: 0
public const int ScrollingViewBehavior_Params_behavior_overlapTop = 0; public const int ScrollingViewBehavior_Params_behavior_overlapTop = 0;
public static int[] SearchView = new int[] {
public static int[] SearchView = new int[]
{
16842970, 16842970,
16843039, 16843039,
16843296, 16843296,
@ -5779,7 +5819,8 @@ namespace eShopOnContainers.Droid
// aapt resource value: 12 // aapt resource value: 12
public const int SearchView_voiceIcon = 12; public const int SearchView_voiceIcon = 12;
public static int[] SnackbarLayout = new int[] {
public static int[] SnackbarLayout = new int[]
{
16843039, 16843039,
2130772032, 2130772032,
2130772258}; 2130772258};
@ -5793,7 +5834,8 @@ namespace eShopOnContainers.Droid
// aapt resource value: 2 // aapt resource value: 2
public const int SnackbarLayout_maxActionInlineWidth = 2; public const int SnackbarLayout_maxActionInlineWidth = 2;
public static int[] Spinner = new int[] {
public static int[] Spinner = new int[]
{
16842930, 16842930,
16843126, 16843126,
16843131, 16843131,
@ -5815,7 +5857,8 @@ namespace eShopOnContainers.Droid
// aapt resource value: 4 // aapt resource value: 4
public const int Spinner_popupTheme = 4; public const int Spinner_popupTheme = 4;
public static int[] SwitchCompat = new int[] {
public static int[] SwitchCompat = new int[]
{
16843044, 16843044,
16843045, 16843045,
16843074, 16843074,
@ -5857,7 +5900,8 @@ namespace eShopOnContainers.Droid
// aapt resource value: 3 // aapt resource value: 3
public const int SwitchCompat_track = 3; public const int SwitchCompat_track = 3;
public static int[] TabItem = new int[] {
public static int[] TabItem = new int[]
{
16842754, 16842754,
16842994, 16842994,
16843087}; 16843087};
@ -5871,7 +5915,8 @@ namespace eShopOnContainers.Droid
// aapt resource value: 2 // aapt resource value: 2
public const int TabItem_android_text = 2; public const int TabItem_android_text = 2;
public static int[] TabLayout = new int[] {
public static int[] TabLayout = new int[]
{
2130772259, 2130772259,
2130772260, 2130772260,
2130772261, 2130772261,
@ -5937,7 +5982,8 @@ namespace eShopOnContainers.Droid
// aapt resource value: 9 // aapt resource value: 9
public const int TabLayout_tabTextColor = 9; public const int TabLayout_tabTextColor = 9;
public static int[] TextAppearance = new int[] {
public static int[] TextAppearance = new int[]
{
16842901, 16842901,
16842902, 16842902,
16842903, 16842903,
@ -5975,7 +6021,8 @@ namespace eShopOnContainers.Droid
// aapt resource value: 8 // aapt resource value: 8
public const int TextAppearance_textAllCaps = 8; public const int TextAppearance_textAllCaps = 8;
public static int[] TextInputLayout = new int[] {
public static int[] TextInputLayout = new int[]
{
16842906, 16842906,
16843088, 16843088,
2130772275, 2130772275,
@ -6021,7 +6068,8 @@ namespace eShopOnContainers.Droid
// aapt resource value: 2 // aapt resource value: 2
public const int TextInputLayout_hintTextAppearance = 2; public const int TextInputLayout_hintTextAppearance = 2;
public static int[] Toolbar = new int[] {
public static int[] Toolbar = new int[]
{
16842927, 16842927,
16843072, 16843072,
2130772009, 2130772009,
@ -6123,7 +6171,8 @@ namespace eShopOnContainers.Droid
// aapt resource value: 23 // aapt resource value: 23
public const int Toolbar_titleTextColor = 23; public const int Toolbar_titleTextColor = 23;
public static int[] View = new int[] {
public static int[] View = new int[]
{
16842752, 16842752,
16842970, 16842970,
2130772210, 2130772210,
@ -6145,7 +6194,8 @@ namespace eShopOnContainers.Droid
// aapt resource value: 4 // aapt resource value: 4
public const int View_theme = 4; public const int View_theme = 4;
public static int[] ViewBackgroundHelper = new int[] {
public static int[] ViewBackgroundHelper = new int[]
{
16842964, 16842964,
2130772213, 2130772213,
2130772214}; 2130772214};
@ -6159,7 +6209,8 @@ namespace eShopOnContainers.Droid
// aapt resource value: 2 // aapt resource value: 2
public const int ViewBackgroundHelper_backgroundTintMode = 2; public const int ViewBackgroundHelper_backgroundTintMode = 2;
public static int[] ViewStubCompat = new int[] {
public static int[] ViewStubCompat = new int[]
{
16842960, 16842960,
16842994, 16842994,
16842995}; 16842995};


+ 20
- 15
src/Mobile/eShopOnContainers/eShopOnContainers.Droid/eShopOnContainers.Droid.csproj View File

@ -100,6 +100,21 @@
<HintPath>..\..\..\..\packages\modernhttpclient.2.4.2\lib\MonoAndroid\OkHttp.dll</HintPath> <HintPath>..\..\..\..\packages\modernhttpclient.2.4.2\lib\MonoAndroid\OkHttp.dll</HintPath>
<Private>True</Private> <Private>True</Private>
</Reference> </Reference>
<Reference Include="PCLCrypto, Version=2.0.0.0, Culture=neutral, PublicKeyToken=d4421c8a4786956c, processorArchitecture=MSIL">
<HintPath>..\..\..\..\packages\PCLCrypto.2.0.147\lib\MonoAndroid23\PCLCrypto.dll</HintPath>
</Reference>
<Reference Include="PInvoke.BCrypt, Version=0.3.0.0, Culture=neutral, PublicKeyToken=9e300f9f87f04a7a, processorArchitecture=MSIL">
<HintPath>..\..\..\..\packages\PInvoke.BCrypt.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.BCrypt.dll</HintPath>
</Reference>
<Reference Include="PInvoke.Kernel32, Version=0.3.0.0, Culture=neutral, PublicKeyToken=9e300f9f87f04a7a, processorArchitecture=MSIL">
<HintPath>..\..\..\..\packages\PInvoke.Kernel32.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.Kernel32.dll</HintPath>
</Reference>
<Reference Include="PInvoke.NCrypt, Version=0.3.0.0, Culture=neutral, PublicKeyToken=9e300f9f87f04a7a, processorArchitecture=MSIL">
<HintPath>..\..\..\..\packages\PInvoke.NCrypt.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.NCrypt.dll</HintPath>
</Reference>
<Reference Include="PInvoke.Windows.Core, Version=0.3.0.0, Culture=neutral, PublicKeyToken=9e300f9f87f04a7a, processorArchitecture=MSIL">
<HintPath>..\..\..\..\packages\PInvoke.Windows.Core.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.Windows.Core.dll</HintPath>
</Reference>
<Reference Include="Plugin.CurrentActivity, Version=1.0.1.0, Culture=neutral, processorArchitecture=MSIL"> <Reference Include="Plugin.CurrentActivity, Version=1.0.1.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\..\..\..\packages\Plugin.CurrentActivity.1.0.1\lib\MonoAndroid10\Plugin.CurrentActivity.dll</HintPath> <HintPath>..\..\..\..\packages\Plugin.CurrentActivity.1.0.1\lib\MonoAndroid10\Plugin.CurrentActivity.dll</HintPath>
</Reference> </Reference>
@ -149,6 +164,9 @@
<Reference Include="System.ObjectModel" /> <Reference Include="System.ObjectModel" />
<Reference Include="System.Xml.Linq" /> <Reference Include="System.Xml.Linq" />
<Reference Include="System.Xml" /> <Reference Include="System.Xml" />
<Reference Include="Validation, Version=2.2.0.0, Culture=neutral, PublicKeyToken=2fc06f0d701809a7, processorArchitecture=MSIL">
<HintPath>..\..\..\..\packages\Validation.2.2.8\lib\dotnet\Validation.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Android.Support.Animated.Vector.Drawable, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL"> <Reference Include="Xamarin.Android.Support.Animated.Vector.Drawable, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\..\..\..\packages\Xamarin.Android.Support.Animated.Vector.Drawable.23.3.0\lib\MonoAndroid403\Xamarin.Android.Support.Animated.Vector.Drawable.dll</HintPath> <HintPath>..\..\..\..\packages\Xamarin.Android.Support.Animated.Vector.Drawable.23.3.0\lib\MonoAndroid403\Xamarin.Android.Support.Animated.Vector.Drawable.dll</HintPath>
<Private>True</Private> <Private>True</Private>
@ -181,18 +199,6 @@
<HintPath>..\..\..\..\packages\Xamarin.Android.Support.Vector.Drawable.23.3.0\lib\MonoAndroid403\Xamarin.Android.Support.Vector.Drawable.dll</HintPath> <HintPath>..\..\..\..\packages\Xamarin.Android.Support.Vector.Drawable.23.3.0\lib\MonoAndroid403\Xamarin.Android.Support.Vector.Drawable.dll</HintPath>
<Private>True</Private> <Private>True</Private>
</Reference> </Reference>
<Reference Include="Xamarin.Forms.Theme.Android">
<HintPath>..\..\..\..\packages\Xamarin.Forms.Theme.Base.1.0.0.43-pre1\lib\MonoAndroid10\Xamarin.Forms.Theme.Android.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Xamarin.Forms.Theme.Base">
<HintPath>..\..\..\..\packages\Xamarin.Forms.Theme.Base.1.0.0.43-pre1\lib\MonoAndroid10\Xamarin.Forms.Theme.Base.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Xamarin.Forms.Theme.Light">
<HintPath>..\..\..\..\packages\Xamarin.Forms.Theme.Light.1.0.0.43-pre1\lib\MonoAndroid10\Xamarin.Forms.Theme.Light.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="FormsViewGroup"> <Reference Include="FormsViewGroup">
<HintPath>..\..\..\..\packages\Xamarin.Forms.2.3.4.231\lib\MonoAndroid10\FormsViewGroup.dll</HintPath> <HintPath>..\..\..\..\packages\Xamarin.Forms.2.3.4.231\lib\MonoAndroid10\FormsViewGroup.dll</HintPath>
</Reference> </Reference>
@ -208,9 +214,6 @@
<Reference Include="Xamarin.Forms.Xaml"> <Reference Include="Xamarin.Forms.Xaml">
<HintPath>..\..\..\..\packages\Xamarin.Forms.2.3.4.231\lib\MonoAndroid10\Xamarin.Forms.Xaml.dll</HintPath> <HintPath>..\..\..\..\packages\Xamarin.Forms.2.3.4.231\lib\MonoAndroid10\Xamarin.Forms.Xaml.dll</HintPath>
</Reference> </Reference>
<Reference Include="Xamarin.Forms.Pages">
<HintPath>..\..\..\..\packages\Xamarin.Forms.Pages.2.3.4.231\lib\MonoAndroid10\Xamarin.Forms.Pages.dll</HintPath>
</Reference>
<Reference Include="System.IO.Compression" /> <Reference Include="System.IO.Compression" />
<Reference Include="Autofac"> <Reference Include="Autofac">
<HintPath>..\..\..\..\packages\Autofac.4.5.0\lib\netstandard1.1\Autofac.dll</HintPath> <HintPath>..\..\..\..\packages\Autofac.4.5.0\lib\netstandard1.1\Autofac.dll</HintPath>
@ -229,6 +232,8 @@
<Compile Include="Renderers\SlideDownMenuPageRenderer.cs" /> <Compile Include="Renderers\SlideDownMenuPageRenderer.cs" />
<Compile Include="Resources\Resource.Designer.cs" /> <Compile Include="Resources\Resource.Designer.cs" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Effects\CircleEffect.cs" />
<Compile Include="Effects\BaseContainerEffect.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<AndroidAsset Include="..\CommonResources\Fonts\Montserrat-Bold.ttf"> <AndroidAsset Include="..\CommonResources\Fonts\Montserrat-Bold.ttf">


+ 6
- 3
src/Mobile/eShopOnContainers/eShopOnContainers.Droid/packages.config View File

@ -14,6 +14,11 @@
<package id="modernhttpclient" version="2.4.2" targetFramework="monoandroid70" /> <package id="modernhttpclient" version="2.4.2" targetFramework="monoandroid70" />
<package id="NETStandard.Library" version="1.6.0" targetFramework="monoandroid60" /> <package id="NETStandard.Library" version="1.6.0" targetFramework="monoandroid60" />
<package id="Newtonsoft.Json" version="9.0.1" targetFramework="monoandroid60" /> <package id="Newtonsoft.Json" version="9.0.1" targetFramework="monoandroid60" />
<package id="PCLCrypto" version="2.0.147" targetFramework="monoandroid60" />
<package id="PInvoke.BCrypt" version="0.3.2" targetFramework="monoandroid60" />
<package id="PInvoke.Kernel32" version="0.3.2" targetFramework="monoandroid60" />
<package id="PInvoke.NCrypt" version="0.3.2" targetFramework="monoandroid60" />
<package id="PInvoke.Windows.Core" version="0.3.2" targetFramework="monoandroid60" />
<package id="Plugin.CurrentActivity" version="1.0.1" targetFramework="monoandroid60" /> <package id="Plugin.CurrentActivity" version="1.0.1" targetFramework="monoandroid60" />
<package id="Plugin.Permissions" version="1.1.7" targetFramework="monoandroid60" /> <package id="Plugin.Permissions" version="1.1.7" targetFramework="monoandroid60" />
<package id="SlideOverKit" version="2.1.4" targetFramework="monoandroid70" /> <package id="SlideOverKit" version="2.1.4" targetFramework="monoandroid70" />
@ -63,6 +68,7 @@
<package id="System.Threading.Timer" version="4.0.1" targetFramework="monoandroid60" /> <package id="System.Threading.Timer" version="4.0.1" targetFramework="monoandroid60" />
<package id="System.Xml.ReaderWriter" version="4.0.11" targetFramework="monoandroid70" /> <package id="System.Xml.ReaderWriter" version="4.0.11" targetFramework="monoandroid70" />
<package id="System.Xml.XDocument" version="4.0.11" targetFramework="monoandroid70" /> <package id="System.Xml.XDocument" version="4.0.11" targetFramework="monoandroid70" />
<package id="Validation" version="2.2.8" targetFramework="monoandroid60" />
<package id="Xam.Plugin.Geolocator" version="3.0.4" targetFramework="monoandroid60" /> <package id="Xam.Plugin.Geolocator" version="3.0.4" targetFramework="monoandroid60" />
<package id="Xam.Plugins.Settings" version="2.6.0.12-beta" targetFramework="monoandroid70" /> <package id="Xam.Plugins.Settings" version="2.6.0.12-beta" targetFramework="monoandroid70" />
<package id="Xamarin.Android.Support.Animated.Vector.Drawable" version="23.3.0" targetFramework="monoandroid70" /> <package id="Xamarin.Android.Support.Animated.Vector.Drawable" version="23.3.0" targetFramework="monoandroid70" />
@ -76,7 +82,4 @@
<package id="Xamarin.FFImageLoading" version="2.2.9" targetFramework="monoandroid60" /> <package id="Xamarin.FFImageLoading" version="2.2.9" targetFramework="monoandroid60" />
<package id="Xamarin.FFImageLoading.Forms" version="2.2.9" targetFramework="monoandroid60" /> <package id="Xamarin.FFImageLoading.Forms" version="2.2.9" targetFramework="monoandroid60" />
<package id="Xamarin.Forms" version="2.3.4.231" targetFramework="monoandroid60" /> <package id="Xamarin.Forms" version="2.3.4.231" targetFramework="monoandroid60" />
<package id="Xamarin.Forms.Pages" version="2.3.4.231" targetFramework="monoandroid60" />
<package id="Xamarin.Forms.Theme.Base" version="1.0.0.43-pre1" targetFramework="monoandroid70" />
<package id="Xamarin.Forms.Theme.Light" version="1.0.0.43-pre1" targetFramework="monoandroid70" />
</packages> </packages>

+ 63
- 0
src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.Droid/MainApplication.cs View File

@ -0,0 +1,63 @@
using System;
using Android.App;
using Android.OS;
using Android.Runtime;
using Plugin.CurrentActivity;
namespace eShopOnContainers.TestRunner.Droid
{
//You can specify additional application information in this attribute
[Application]
public class MainApplication : Application, Application.IActivityLifecycleCallbacks
{
public MainApplication(IntPtr handle, JniHandleOwnership transer)
:base(handle, transer)
{
}
public override void OnCreate()
{
base.OnCreate();
RegisterActivityLifecycleCallbacks(this);
//A great place to initialize Xamarin.Insights and Dependency Services!
}
public override void OnTerminate()
{
base.OnTerminate();
UnregisterActivityLifecycleCallbacks(this);
}
public void OnActivityCreated(Activity activity, Bundle savedInstanceState)
{
CrossCurrentActivity.Current.Activity = activity;
}
public void OnActivityDestroyed(Activity activity)
{
}
public void OnActivityPaused(Activity activity)
{
}
public void OnActivityResumed(Activity activity)
{
CrossCurrentActivity.Current.Activity = activity;
}
public void OnActivitySaveInstanceState(Activity activity, Bundle outState)
{
}
public void OnActivityStarted(Activity activity)
{
CrossCurrentActivity.Current.Activity = activity;
}
public void OnActivityStopped(Activity activity)
{
}
}
}

+ 10
- 8
src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.Droid/Resources/Resource.Designer.cs View File

@ -26,7 +26,6 @@ namespace eShopOnContainers.TestRunner.Droid
public static void UpdateIdValues() public static void UpdateIdValues()
{ {
global::Xamarin.Forms.Platform.Android.Resource.Attribute.actionBarSize = global::eShopOnContainers.TestRunner.Droid.Resource.Attribute.actionBarSize;
global::AndroidHUD.Resource.Attribute.ahBarColor = global::eShopOnContainers.TestRunner.Droid.Resource.Attribute.ahBarColor; global::AndroidHUD.Resource.Attribute.ahBarColor = global::eShopOnContainers.TestRunner.Droid.Resource.Attribute.ahBarColor;
global::AndroidHUD.Resource.Attribute.ahBarLength = global::eShopOnContainers.TestRunner.Droid.Resource.Attribute.ahBarLength; global::AndroidHUD.Resource.Attribute.ahBarLength = global::eShopOnContainers.TestRunner.Droid.Resource.Attribute.ahBarLength;
global::AndroidHUD.Resource.Attribute.ahBarWidth = global::eShopOnContainers.TestRunner.Droid.Resource.Attribute.ahBarWidth; global::AndroidHUD.Resource.Attribute.ahBarWidth = global::eShopOnContainers.TestRunner.Droid.Resource.Attribute.ahBarWidth;
@ -64,8 +63,11 @@ namespace eShopOnContainers.TestRunner.Droid
global::AndroidHUD.Resource.Styleable.ProgressWheel_ahText = global::eShopOnContainers.TestRunner.Droid.Resource.Styleable.ProgressWheel_ahText; global::AndroidHUD.Resource.Styleable.ProgressWheel_ahText = global::eShopOnContainers.TestRunner.Droid.Resource.Styleable.ProgressWheel_ahText;
global::AndroidHUD.Resource.Styleable.ProgressWheel_ahTextColor = global::eShopOnContainers.TestRunner.Droid.Resource.Styleable.ProgressWheel_ahTextColor; global::AndroidHUD.Resource.Styleable.ProgressWheel_ahTextColor = global::eShopOnContainers.TestRunner.Droid.Resource.Styleable.ProgressWheel_ahTextColor;
global::AndroidHUD.Resource.Styleable.ProgressWheel_ahTextSize = global::eShopOnContainers.TestRunner.Droid.Resource.Styleable.ProgressWheel_ahTextSize; global::AndroidHUD.Resource.Styleable.ProgressWheel_ahTextSize = global::eShopOnContainers.TestRunner.Droid.Resource.Styleable.ProgressWheel_ahTextSize;
global::Splat.Resource.String.library_name = global::eShopOnContainers.TestRunner.Droid.Resource.String.library_name;
global::ModernHttpClient.Resource.String.library_name = global::eShopOnContainers.TestRunner.Droid.Resource.String.library_name; global::ModernHttpClient.Resource.String.library_name = global::eShopOnContainers.TestRunner.Droid.Resource.String.library_name;
global::PCLCrypto.Resource.String.ApplicationName = global::eShopOnContainers.TestRunner.Droid.Resource.String.ApplicationName;
global::PCLCrypto.Resource.String.Hello = global::eShopOnContainers.TestRunner.Droid.Resource.String.Hello;
global::Splat.Resource.String.library_name = global::eShopOnContainers.TestRunner.Droid.Resource.String.library_name;
global::Xamarin.Forms.Platform.Android.Resource.Attribute.actionBarSize = global::eShopOnContainers.TestRunner.Droid.Resource.Attribute.actionBarSize;
} }
public partial class Animation public partial class Animation
@ -3036,11 +3038,11 @@ namespace eShopOnContainers.TestRunner.Droid
public partial class String public partial class String
{ {
// aapt resource value: 0x7f080027
public const int ApplicationName = 2131230759;
// aapt resource value: 0x7f080028
public const int ApplicationName = 2131230760;
// aapt resource value: 0x7f080026
public const int Hello = 2131230758;
// aapt resource value: 0x7f080027
public const int Hello = 2131230759;
// aapt resource value: 0x7f08000f // aapt resource value: 0x7f08000f
public const int abc_action_bar_home_description = 2131230735; public const int abc_action_bar_home_description = 2131230735;
@ -3108,8 +3110,8 @@ namespace eShopOnContainers.TestRunner.Droid
// aapt resource value: 0x7f080025 // aapt resource value: 0x7f080025
public const int character_counter_pattern = 2131230757; public const int character_counter_pattern = 2131230757;
// aapt resource value: 0x7f080028
public const int library_name = 2131230760;
// aapt resource value: 0x7f080026
public const int library_name = 2131230758;
// aapt resource value: 0x7f080000 // aapt resource value: 0x7f080000
public const int mr_button_content_description = 2131230720; public const int mr_button_content_description = 2131230720;


+ 37
- 13
src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.Droid/eShopOnContainers.TestRunner.Droid.csproj View File

@ -51,6 +51,36 @@
</Reference> </Reference>
<Reference Include="Mono.Android" /> <Reference Include="Mono.Android" />
<Reference Include="mscorlib" /> <Reference Include="mscorlib" />
<Reference Include="PCLCrypto, Version=2.0.0.0, Culture=neutral, PublicKeyToken=d4421c8a4786956c, processorArchitecture=MSIL">
<HintPath>..\..\..\..\packages\PCLCrypto.2.0.147\lib\MonoAndroid23\PCLCrypto.dll</HintPath>
</Reference>
<Reference Include="PInvoke.BCrypt, Version=0.3.0.0, Culture=neutral, PublicKeyToken=9e300f9f87f04a7a, processorArchitecture=MSIL">
<HintPath>..\..\..\..\packages\PInvoke.BCrypt.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.BCrypt.dll</HintPath>
</Reference>
<Reference Include="PInvoke.Kernel32, Version=0.3.0.0, Culture=neutral, PublicKeyToken=9e300f9f87f04a7a, processorArchitecture=MSIL">
<HintPath>..\..\..\..\packages\PInvoke.Kernel32.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.Kernel32.dll</HintPath>
</Reference>
<Reference Include="PInvoke.NCrypt, Version=0.3.0.0, Culture=neutral, PublicKeyToken=9e300f9f87f04a7a, processorArchitecture=MSIL">
<HintPath>..\..\..\..\packages\PInvoke.NCrypt.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.NCrypt.dll</HintPath>
</Reference>
<Reference Include="PInvoke.Windows.Core, Version=0.3.0.0, Culture=neutral, PublicKeyToken=9e300f9f87f04a7a, processorArchitecture=MSIL">
<HintPath>..\..\..\..\packages\PInvoke.Windows.Core.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.Windows.Core.dll</HintPath>
</Reference>
<Reference Include="Plugin.CurrentActivity, Version=1.0.1.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\..\..\..\packages\Plugin.CurrentActivity.1.0.1\lib\MonoAndroid10\Plugin.CurrentActivity.dll</HintPath>
</Reference>
<Reference Include="Plugin.Geolocator, Version=3.0.4.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\..\..\..\packages\Xam.Plugin.Geolocator.3.0.4\lib\MonoAndroid10\Plugin.Geolocator.dll</HintPath>
</Reference>
<Reference Include="Plugin.Geolocator.Abstractions, Version=3.0.4.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\..\..\..\packages\Xam.Plugin.Geolocator.3.0.4\lib\MonoAndroid10\Plugin.Geolocator.Abstractions.dll</HintPath>
</Reference>
<Reference Include="Plugin.Permissions, Version=1.1.6.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\..\..\..\packages\Plugin.Permissions.1.1.7\lib\MonoAndroid10\Plugin.Permissions.dll</HintPath>
</Reference>
<Reference Include="Plugin.Permissions.Abstractions, Version=1.1.6.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\..\..\..\packages\Plugin.Permissions.1.1.7\lib\MonoAndroid10\Plugin.Permissions.Abstractions.dll</HintPath>
</Reference>
<Reference Include="System" /> <Reference Include="System" />
<Reference Include="System.Core" /> <Reference Include="System.Core" />
<Reference Include="System.Net.Http.Extensions, Version=2.2.29.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"> <Reference Include="System.Net.Http.Extensions, Version=2.2.29.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
@ -61,6 +91,9 @@
</Reference> </Reference>
<Reference Include="System.Xml.Linq" /> <Reference Include="System.Xml.Linq" />
<Reference Include="System.Xml" /> <Reference Include="System.Xml" />
<Reference Include="Validation, Version=2.2.0.0, Culture=neutral, PublicKeyToken=2fc06f0d701809a7, processorArchitecture=MSIL">
<HintPath>..\..\..\..\packages\Validation.2.2.8\lib\dotnet\Validation.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Android.Support.Animated.Vector.Drawable, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL"> <Reference Include="Xamarin.Android.Support.Animated.Vector.Drawable, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\..\..\..\packages\Xamarin.Android.Support.Animated.Vector.Drawable.23.3.0\lib\MonoAndroid403\Xamarin.Android.Support.Animated.Vector.Drawable.dll</HintPath> <HintPath>..\..\..\..\packages\Xamarin.Android.Support.Animated.Vector.Drawable.23.3.0\lib\MonoAndroid403\Xamarin.Android.Support.Animated.Vector.Drawable.dll</HintPath>
<Private>True</Private> <Private>True</Private>
@ -96,9 +129,6 @@
<Reference Include="Xamarin.Forms.Core, Version=2.0.0.0, Culture=neutral, processorArchitecture=MSIL"> <Reference Include="Xamarin.Forms.Core, Version=2.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\..\..\..\packages\Xamarin.Forms.2.3.4.231\lib\MonoAndroid10\Xamarin.Forms.Core.dll</HintPath> <HintPath>..\..\..\..\packages\Xamarin.Forms.2.3.4.231\lib\MonoAndroid10\Xamarin.Forms.Core.dll</HintPath>
</Reference> </Reference>
<Reference Include="Xamarin.Forms.Pages, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\..\..\..\packages\Xamarin.Forms.Pages.2.3.4.231\lib\MonoAndroid10\Xamarin.Forms.Pages.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Forms.Platform, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL"> <Reference Include="Xamarin.Forms.Platform, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\..\..\..\packages\Xamarin.Forms.2.3.4.231\lib\MonoAndroid10\Xamarin.Forms.Platform.dll</HintPath> <HintPath>..\..\..\..\packages\Xamarin.Forms.2.3.4.231\lib\MonoAndroid10\Xamarin.Forms.Platform.dll</HintPath>
</Reference> </Reference>
@ -182,24 +212,18 @@
<Reference Include="OkHttp"> <Reference Include="OkHttp">
<HintPath>..\..\..\..\packages\modernhttpclient.2.4.2\lib\MonoAndroid\OkHttp.dll</HintPath> <HintPath>..\..\..\..\packages\modernhttpclient.2.4.2\lib\MonoAndroid\OkHttp.dll</HintPath>
</Reference> </Reference>
<Reference Include="Xamarin.Forms.Theme.Android">
<HintPath>..\..\..\..\packages\Xamarin.Forms.Theme.Base.1.0.0.43-pre1\lib\MonoAndroid10\Xamarin.Forms.Theme.Android.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Forms.Theme.Base">
<HintPath>..\..\..\..\packages\Xamarin.Forms.Theme.Base.1.0.0.43-pre1\lib\MonoAndroid10\Xamarin.Forms.Theme.Base.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Forms.Theme.Light">
<HintPath>..\..\..\..\packages\Xamarin.Forms.Theme.Light.1.0.0.43-pre1\lib\MonoAndroid10\Xamarin.Forms.Theme.Light.dll</HintPath>
</Reference>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="MainActivity.cs" /> <Compile Include="MainActivity.cs" />
<Compile Include="MainApplication.cs" />
<Compile Include="Resources\Resource.Designer.cs" /> <Compile Include="Resources\Resource.Designer.cs" />
<Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="app.config" /> <None Include="app.config" />
<None Include="packages.config" />
<None Include="packages.config">
<SubType>Designer</SubType>
</None>
<None Include="Resources\AboutResources.txt" /> <None Include="Resources\AboutResources.txt" />
<None Include="Assets\AboutAssets.txt" /> <None Include="Assets\AboutAssets.txt" />
</ItemGroup> </ItemGroup>


+ 9
- 3
src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.Droid/packages.config View File

@ -13,6 +13,13 @@
<package id="modernhttpclient" version="2.4.2" targetFramework="monoandroid60" /> <package id="modernhttpclient" version="2.4.2" targetFramework="monoandroid60" />
<package id="NETStandard.Library" version="1.6.0" targetFramework="monoandroid60" /> <package id="NETStandard.Library" version="1.6.0" targetFramework="monoandroid60" />
<package id="Newtonsoft.Json" version="9.0.1" targetFramework="monoandroid60" /> <package id="Newtonsoft.Json" version="9.0.1" targetFramework="monoandroid60" />
<package id="PCLCrypto" version="2.0.147" targetFramework="monoandroid60" />
<package id="PInvoke.BCrypt" version="0.3.2" targetFramework="monoandroid60" />
<package id="PInvoke.Kernel32" version="0.3.2" targetFramework="monoandroid60" />
<package id="PInvoke.NCrypt" version="0.3.2" targetFramework="monoandroid60" />
<package id="PInvoke.Windows.Core" version="0.3.2" targetFramework="monoandroid60" />
<package id="Plugin.CurrentActivity" version="1.0.1" targetFramework="monoandroid60" />
<package id="Plugin.Permissions" version="1.1.7" targetFramework="monoandroid60" />
<package id="SlideOverKit" version="2.1.4" targetFramework="monoandroid60" /> <package id="SlideOverKit" version="2.1.4" targetFramework="monoandroid60" />
<package id="Splat" version="1.6.2" targetFramework="monoandroid60" /> <package id="Splat" version="1.6.2" targetFramework="monoandroid60" />
<package id="System.AppContext" version="4.1.0" targetFramework="monoandroid60" /> <package id="System.AppContext" version="4.1.0" targetFramework="monoandroid60" />
@ -58,6 +65,8 @@
<package id="System.Threading.Timer" version="4.0.1" targetFramework="monoandroid60" /> <package id="System.Threading.Timer" version="4.0.1" targetFramework="monoandroid60" />
<package id="System.Xml.ReaderWriter" version="4.0.11" targetFramework="monoandroid60" /> <package id="System.Xml.ReaderWriter" version="4.0.11" targetFramework="monoandroid60" />
<package id="System.Xml.XDocument" version="4.0.11" targetFramework="monoandroid60" /> <package id="System.Xml.XDocument" version="4.0.11" targetFramework="monoandroid60" />
<package id="Validation" version="2.2.8" targetFramework="monoandroid60" />
<package id="Xam.Plugin.Geolocator" version="3.0.4" targetFramework="monoandroid60" />
<package id="Xam.Plugins.Settings" version="2.6.0.12-beta" targetFramework="monoandroid60" /> <package id="Xam.Plugins.Settings" version="2.6.0.12-beta" targetFramework="monoandroid60" />
<package id="Xamarin.Android.Support.Animated.Vector.Drawable" version="23.3.0" targetFramework="monoandroid70" /> <package id="Xamarin.Android.Support.Animated.Vector.Drawable" version="23.3.0" targetFramework="monoandroid70" />
<package id="Xamarin.Android.Support.Design" version="23.3.0" targetFramework="monoandroid70" /> <package id="Xamarin.Android.Support.Design" version="23.3.0" targetFramework="monoandroid70" />
@ -70,9 +79,6 @@
<package id="Xamarin.FFImageLoading" version="2.2.9" targetFramework="monoandroid60" /> <package id="Xamarin.FFImageLoading" version="2.2.9" targetFramework="monoandroid60" />
<package id="Xamarin.FFImageLoading.Forms" version="2.2.9" targetFramework="monoandroid60" /> <package id="Xamarin.FFImageLoading.Forms" version="2.2.9" targetFramework="monoandroid60" />
<package id="Xamarin.Forms" version="2.3.4.231" targetFramework="monoandroid60" /> <package id="Xamarin.Forms" version="2.3.4.231" targetFramework="monoandroid60" />
<package id="Xamarin.Forms.Pages" version="2.3.4.231" targetFramework="monoandroid60" />
<package id="Xamarin.Forms.Theme.Base" version="1.0.0.43-pre1" targetFramework="monoandroid60" />
<package id="Xamarin.Forms.Theme.Light" version="1.0.0.43-pre1" targetFramework="monoandroid60" />
<package id="xunit.abstractions" version="2.0.0" targetFramework="monoandroid60" /> <package id="xunit.abstractions" version="2.0.0" targetFramework="monoandroid60" />
<package id="xunit.assert" version="2.2.0" targetFramework="monoandroid60" /> <package id="xunit.assert" version="2.2.0" targetFramework="monoandroid60" />
<package id="xunit.core" version="2.1.0" targetFramework="monoandroid60" /> <package id="xunit.core" version="2.1.0" targetFramework="monoandroid60" />


+ 28
- 16
src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.iOS/eShopOnContainers.TestRunner.iOS.csproj View File

@ -22,16 +22,15 @@
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
<ConsolePause>false</ConsolePause> <ConsolePause>false</ConsolePause>
<MtouchArch>x86_64</MtouchArch> <MtouchArch>x86_64</MtouchArch>
<MtouchLink>SdkOnly</MtouchLink>
<MtouchLink>None</MtouchLink>
<MtouchDebug>True</MtouchDebug> <MtouchDebug>True</MtouchDebug>
<MtouchSdkVersion>10.2</MtouchSdkVersion>
<MtouchSdkVersion>
</MtouchSdkVersion>
<MtouchProfiling>False</MtouchProfiling> <MtouchProfiling>False</MtouchProfiling>
<MtouchFastDev>False</MtouchFastDev> <MtouchFastDev>False</MtouchFastDev>
<MtouchUseLlvm>False</MtouchUseLlvm> <MtouchUseLlvm>False</MtouchUseLlvm>
<MtouchUseThumb>False</MtouchUseThumb> <MtouchUseThumb>False</MtouchUseThumb>
<MtouchEnableBitcode>False</MtouchEnableBitcode> <MtouchEnableBitcode>False</MtouchEnableBitcode>
<MtouchUseSGen>False</MtouchUseSGen>
<MtouchUseRefCounting>False</MtouchUseRefCounting>
<OptimizePNGs>True</OptimizePNGs> <OptimizePNGs>True</OptimizePNGs>
<MtouchTlsProvider>Default</MtouchTlsProvider> <MtouchTlsProvider>Default</MtouchTlsProvider>
<MtouchHttpClientHandler>HttpClientHandler</MtouchHttpClientHandler> <MtouchHttpClientHandler>HttpClientHandler</MtouchHttpClientHandler>
@ -60,8 +59,9 @@
<CodesignEntitlements>Entitlements.plist</CodesignEntitlements> <CodesignEntitlements>Entitlements.plist</CodesignEntitlements>
<CodesignKey>iPhone Developer</CodesignKey> <CodesignKey>iPhone Developer</CodesignKey>
<MtouchDebug>true</MtouchDebug> <MtouchDebug>true</MtouchDebug>
<MtouchSdkVersion>10.2</MtouchSdkVersion>
<MtouchLink>SdkOnly</MtouchLink>
<MtouchSdkVersion>
</MtouchSdkVersion>
<MtouchLink>None</MtouchLink>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|iPhone' "> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|iPhone' ">
<DebugType>none</DebugType> <DebugType>none</DebugType>
@ -109,6 +109,21 @@
<None Include="packages.config" /> <None Include="packages.config" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Reference Include="PCLCrypto, Version=2.0.0.0, Culture=neutral, PublicKeyToken=d4421c8a4786956c, processorArchitecture=MSIL">
<HintPath>..\..\..\..\packages\PCLCrypto.2.0.147\lib\xamarinios10\PCLCrypto.dll</HintPath>
</Reference>
<Reference Include="PInvoke.BCrypt, Version=0.3.0.0, Culture=neutral, PublicKeyToken=9e300f9f87f04a7a, processorArchitecture=MSIL">
<HintPath>..\..\..\..\packages\PInvoke.BCrypt.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.BCrypt.dll</HintPath>
</Reference>
<Reference Include="PInvoke.Kernel32, Version=0.3.0.0, Culture=neutral, PublicKeyToken=9e300f9f87f04a7a, processorArchitecture=MSIL">
<HintPath>..\..\..\..\packages\PInvoke.Kernel32.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.Kernel32.dll</HintPath>
</Reference>
<Reference Include="PInvoke.NCrypt, Version=0.3.0.0, Culture=neutral, PublicKeyToken=9e300f9f87f04a7a, processorArchitecture=MSIL">
<HintPath>..\..\..\..\packages\PInvoke.NCrypt.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.NCrypt.dll</HintPath>
</Reference>
<Reference Include="PInvoke.Windows.Core, Version=0.3.0.0, Culture=neutral, PublicKeyToken=9e300f9f87f04a7a, processorArchitecture=MSIL">
<HintPath>..\..\..\..\packages\PInvoke.Windows.Core.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.Windows.Core.dll</HintPath>
</Reference>
<Reference Include="System" /> <Reference Include="System" />
<Reference Include="System.Net.Http.Extensions, Version=2.2.29.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"> <Reference Include="System.Net.Http.Extensions, Version=2.2.29.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\..\..\..\packages\Microsoft.Net.Http.2.2.29\lib\Xamarin.iOS10\System.Net.Http.Extensions.dll</HintPath> <HintPath>..\..\..\..\packages\Microsoft.Net.Http.2.2.29\lib\Xamarin.iOS10\System.Net.Http.Extensions.dll</HintPath>
@ -118,12 +133,12 @@
</Reference> </Reference>
<Reference Include="System.Xml" /> <Reference Include="System.Xml" />
<Reference Include="System.Core" /> <Reference Include="System.Core" />
<Reference Include="Validation, Version=2.2.0.0, Culture=neutral, PublicKeyToken=2fc06f0d701809a7, processorArchitecture=MSIL">
<HintPath>..\..\..\..\packages\Validation.2.2.8\lib\dotnet\Validation.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Forms.Core, Version=2.0.0.0, Culture=neutral, processorArchitecture=MSIL"> <Reference Include="Xamarin.Forms.Core, Version=2.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\..\..\..\packages\Xamarin.Forms.2.3.4.231\lib\Xamarin.iOS10\Xamarin.Forms.Core.dll</HintPath> <HintPath>..\..\..\..\packages\Xamarin.Forms.2.3.4.231\lib\Xamarin.iOS10\Xamarin.Forms.Core.dll</HintPath>
</Reference> </Reference>
<Reference Include="Xamarin.Forms.Pages, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\..\..\..\packages\Xamarin.Forms.Pages.2.3.4.231\lib\Xamarin.iOS10\Xamarin.Forms.Pages.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Forms.Platform, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL"> <Reference Include="Xamarin.Forms.Platform, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\..\..\..\packages\Xamarin.Forms.2.3.4.231\lib\Xamarin.iOS10\Xamarin.Forms.Platform.dll</HintPath> <HintPath>..\..\..\..\packages\Xamarin.Forms.2.3.4.231\lib\Xamarin.iOS10\Xamarin.Forms.Platform.dll</HintPath>
</Reference> </Reference>
@ -205,14 +220,11 @@
<Reference Include="ModernHttpClient"> <Reference Include="ModernHttpClient">
<HintPath>..\..\..\..\packages\modernhttpclient.2.4.2\lib\Xamarin.iOS10\ModernHttpClient.dll</HintPath> <HintPath>..\..\..\..\packages\modernhttpclient.2.4.2\lib\Xamarin.iOS10\ModernHttpClient.dll</HintPath>
</Reference> </Reference>
<Reference Include="Xamarin.Forms.Theme.Base">
<HintPath>..\..\..\..\packages\Xamarin.Forms.Theme.Base.1.0.0.43-pre1\lib\Xamarin.iOS10\Xamarin.Forms.Theme.Base.dll</HintPath>
</Reference>
<Reference Include="Xamarin.Forms.Theme.iOS">
<HintPath>..\..\..\..\packages\Xamarin.Forms.Theme.Base.1.0.0.43-pre1\lib\Xamarin.iOS10\Xamarin.Forms.Theme.iOS.dll</HintPath>
<Reference Include="Plugin.Geolocator.Abstractions">
<HintPath>..\..\..\..\packages\Xam.Plugin.Geolocator.3.0.4\lib\Xamarin.iOS10\Plugin.Geolocator.Abstractions.dll</HintPath>
</Reference> </Reference>
<Reference Include="Xamarin.Forms.Theme.Light">
<HintPath>..\..\..\..\packages\Xamarin.Forms.Theme.Light.1.0.0.43-pre1\lib\Xamarin.iOS10\Xamarin.Forms.Theme.Light.dll</HintPath>
<Reference Include="Plugin.Geolocator">
<HintPath>..\..\..\..\packages\Xam.Plugin.Geolocator.3.0.4\lib\Xamarin.iOS10\Plugin.Geolocator.dll</HintPath>
</Reference> </Reference>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>


+ 7
- 3
src/Mobile/eShopOnContainers/eShopOnContainers.TestRunner.iOS/packages.config View File

@ -12,6 +12,11 @@
<package id="modernhttpclient" version="2.4.2" targetFramework="xamarinios10" /> <package id="modernhttpclient" version="2.4.2" targetFramework="xamarinios10" />
<package id="NETStandard.Library" version="1.6.0" targetFramework="xamarinios10" /> <package id="NETStandard.Library" version="1.6.0" targetFramework="xamarinios10" />
<package id="Newtonsoft.Json" version="9.0.1" targetFramework="xamarinios10" /> <package id="Newtonsoft.Json" version="9.0.1" targetFramework="xamarinios10" />
<package id="PCLCrypto" version="2.0.147" targetFramework="xamarinios10" />
<package id="PInvoke.BCrypt" version="0.3.2" targetFramework="xamarinios10" />
<package id="PInvoke.Kernel32" version="0.3.2" targetFramework="xamarinios10" />
<package id="PInvoke.NCrypt" version="0.3.2" targetFramework="xamarinios10" />
<package id="PInvoke.Windows.Core" version="0.3.2" targetFramework="xamarinios10" />
<package id="SlideOverKit" version="2.1.4" targetFramework="xamarinios10" /> <package id="SlideOverKit" version="2.1.4" targetFramework="xamarinios10" />
<package id="Splat" version="1.6.2" targetFramework="xamarinios10" /> <package id="Splat" version="1.6.2" targetFramework="xamarinios10" />
<package id="System.AppContext" version="4.1.0" targetFramework="xamarinios10" /> <package id="System.AppContext" version="4.1.0" targetFramework="xamarinios10" />
@ -57,14 +62,13 @@
<package id="System.Threading.Timer" version="4.0.1" targetFramework="xamarinios10" /> <package id="System.Threading.Timer" version="4.0.1" targetFramework="xamarinios10" />
<package id="System.Xml.ReaderWriter" version="4.0.11" targetFramework="xamarinios10" /> <package id="System.Xml.ReaderWriter" version="4.0.11" targetFramework="xamarinios10" />
<package id="System.Xml.XDocument" version="4.0.11" targetFramework="xamarinios10" /> <package id="System.Xml.XDocument" version="4.0.11" targetFramework="xamarinios10" />
<package id="Validation" version="2.2.8" targetFramework="xamarinios10" />
<package id="WebP.Touch" version="1.0.3" targetFramework="xamarinios10" /> <package id="WebP.Touch" version="1.0.3" targetFramework="xamarinios10" />
<package id="Xam.Plugin.Geolocator" version="3.0.4" targetFramework="xamarinios10" />
<package id="Xam.Plugins.Settings" version="2.6.0.12-beta" targetFramework="xamarinios10" /> <package id="Xam.Plugins.Settings" version="2.6.0.12-beta" targetFramework="xamarinios10" />
<package id="Xamarin.FFImageLoading" version="2.2.9" targetFramework="xamarinios10" /> <package id="Xamarin.FFImageLoading" version="2.2.9" targetFramework="xamarinios10" />
<package id="Xamarin.FFImageLoading.Forms" version="2.2.9" targetFramework="xamarinios10" /> <package id="Xamarin.FFImageLoading.Forms" version="2.2.9" targetFramework="xamarinios10" />
<package id="Xamarin.Forms" version="2.3.4.231" targetFramework="xamarinios10" /> <package id="Xamarin.Forms" version="2.3.4.231" targetFramework="xamarinios10" />
<package id="Xamarin.Forms.Pages" version="2.3.4.231" targetFramework="xamarinios10" />
<package id="Xamarin.Forms.Theme.Base" version="1.0.0.43-pre1" targetFramework="xamarinios10" />
<package id="Xamarin.Forms.Theme.Light" version="1.0.0.43-pre1" targetFramework="xamarinios10" />
<package id="xunit.abstractions" version="2.0.0" targetFramework="xamarinios10" /> <package id="xunit.abstractions" version="2.0.0" targetFramework="xamarinios10" />
<package id="xunit.assert" version="2.2.0" targetFramework="xamarinios10" /> <package id="xunit.assert" version="2.2.0" targetFramework="xamarinios10" />
<package id="xunit.core" version="2.1.0" targetFramework="xamarinios10" /> <package id="xunit.core" version="2.1.0" targetFramework="xamarinios10" />


+ 2
- 3
src/Mobile/eShopOnContainers/eShopOnContainers.Windows/project.json View File

@ -4,14 +4,13 @@
"IdentityModel": "1.3.1", "IdentityModel": "1.3.1",
"Microsoft.NETCore.UniversalWindowsPlatform": "5.3.3", "Microsoft.NETCore.UniversalWindowsPlatform": "5.3.3",
"Newtonsoft.Json": "9.0.1", "Newtonsoft.Json": "9.0.1",
"PCLCrypto": "2.0.147",
"SlideOverKit": "2.1.4", "SlideOverKit": "2.1.4",
"Xam.Plugin.Geolocator": "3.0.4", "Xam.Plugin.Geolocator": "3.0.4",
"Xam.Plugins.Settings": "2.6.0.12-beta", "Xam.Plugins.Settings": "2.6.0.12-beta",
"Xamarin.FFImageLoading": "2.2.9", "Xamarin.FFImageLoading": "2.2.9",
"Xamarin.FFImageLoading.Forms": "2.2.9", "Xamarin.FFImageLoading.Forms": "2.2.9",
"Xamarin.Forms": "2.3.4.231",
"Xamarin.Forms.Theme.Base": "1.0.0.43-pre1",
"Xamarin.Forms.Theme.Light": "1.0.0.43-pre1"
"Xamarin.Forms": "2.3.4.231"
}, },
"frameworks": { "frameworks": {
"uap10.0": {} "uap10.0": {}


+ 1
- 13
src/Mobile/eShopOnContainers/eShopOnContainers.iOS/AppDelegate.cs View File

@ -4,29 +4,17 @@ using UIKit;
namespace eShopOnContainers.iOS namespace eShopOnContainers.iOS
{ {
// The UIApplicationDelegate for the application. This class is responsible for launching the
// User Interface of the application, as well as listening (and optionally responding) to
// application events from iOS.
[Register("AppDelegate")] [Register("AppDelegate")]
public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate
{ {
//
// This method is invoked when the application has loaded and is ready to run. In this
// method you should instantiate the window, load the UI into it and then make the window
// visible.
//
// You have 17 seconds to return from this method, or iOS will terminate your application.
//
public override bool FinishedLaunching(UIApplication app, NSDictionary options) public override bool FinishedLaunching(UIApplication app, NSDictionary options)
{ {
global::Xamarin.Forms.Forms.Init(); global::Xamarin.Forms.Forms.Init();
LoadApplication(new App()); LoadApplication(new App());
SlideOverKit.iOS.SlideOverKit.Init(); SlideOverKit.iOS.SlideOverKit.Init();
CachedImageRenderer.Init(); CachedImageRenderer.Init();
var x = typeof(Xamarin.Forms.Themes.LightThemeResources);
x = typeof(Xamarin.Forms.Themes.iOS.UnderlineEffect);
return base.FinishedLaunching(app, options); return base.FinishedLaunching(app, options);
} }
} }


+ 53
- 0
src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Effects/CircleEffect.cs View File

@ -0,0 +1,53 @@
using System;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;
using eShopOnContainers.iOS.Effects;
using CoreGraphics;
using CoreAnimation;
[assembly: ExportEffect(typeof(CircleEffect), "CircleEffect")]
namespace eShopOnContainers.iOS.Effects
{
public class CircleEffect : PlatformEffect
{
protected override void OnAttached()
{
UpdateCircle();
}
protected override void OnDetached()
{
Container.Layer.Mask = null;
}
protected override void OnElementPropertyChanged(System.ComponentModel.PropertyChangedEventArgs args)
{
base.OnElementPropertyChanged(args);
if (args.PropertyName == VisualElement.WidthProperty.PropertyName ||
args.PropertyName == VisualElement.HeightProperty.PropertyName)
{
UpdateCircle();
}
}
private void UpdateCircle()
{
double width = ((VisualElement)Element).Width;
double height = ((VisualElement)Element).Height;
if (width <= 0 || height <= 0)
{
return;
}
double min = Math.Min(width, height);
var layerX = width > min ? (width - min) / 2 : 0;
var layerY = height > min ? (height - min) / 2 : 0;
var mask = new CAShapeLayer();
mask.Path = CGPath.EllipseFromRect(new CGRect(layerX, layerY, min, min));
Container.Layer.Mask = mask;
}
}
}

+ 0
- 24
src/Mobile/eShopOnContainers/eShopOnContainers.iOS/PluginsHelp/GeolocatorReadme.txt View File

@ -1,24 +0,0 @@
Connectivity Readme
Find the most up to date information at: https://github.com/jamesmontemagno/Xamarin.Plugins
**IMPORTANT**
Android:
You must request ACCESS_COARSE_LOCATION & ACCESS_FINE_LOCATION permission
iOS:
In iOS 8 you now have to call either RequestWhenInUseAuthorization or RequestAlwaysAuthorization on the location manager. Additionally you need to add either the concisely named NSLocationWhenInUseUsageDescription or NSLocationAlwaysUsageDescription to your Info.plist.
See: http://motzcod.es/post/97662738237/scanning-for-ibeacons-in-ios-8
Windows Phone:
You must set the ID_CAP_LOCATION permission.
Getting Started:
var locator = CrossGeolocator.Current;
locator.DesiredAccuracy = 50;
var position = await locator.GetPositionAsync (timeoutMilliseconds: 10000);
Console.WriteLine ("Position Status: {0}", position.Timestamp);
Console.WriteLine ("Position Latitude: {0}", position.Latitude);
Console.WriteLine ("Position Longitude: {0}", position.Longitude);

+ 28
- 27
src/Mobile/eShopOnContainers/eShopOnContainers.iOS/eShopOnContainers.iOS.csproj View File

@ -25,16 +25,15 @@
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
<ConsolePause>false</ConsolePause> <ConsolePause>false</ConsolePause>
<MtouchArch>i386, x86_64</MtouchArch> <MtouchArch>i386, x86_64</MtouchArch>
<MtouchLink>SdkOnly</MtouchLink>
<MtouchLink>None</MtouchLink>
<MtouchDebug>True</MtouchDebug> <MtouchDebug>True</MtouchDebug>
<MtouchSdkVersion>10.2</MtouchSdkVersion>
<MtouchSdkVersion>
</MtouchSdkVersion>
<MtouchProfiling>False</MtouchProfiling> <MtouchProfiling>False</MtouchProfiling>
<MtouchFastDev>False</MtouchFastDev> <MtouchFastDev>False</MtouchFastDev>
<MtouchUseLlvm>False</MtouchUseLlvm> <MtouchUseLlvm>False</MtouchUseLlvm>
<MtouchUseThumb>False</MtouchUseThumb> <MtouchUseThumb>False</MtouchUseThumb>
<MtouchEnableBitcode>False</MtouchEnableBitcode> <MtouchEnableBitcode>False</MtouchEnableBitcode>
<MtouchUseSGen>False</MtouchUseSGen>
<MtouchUseRefCounting>False</MtouchUseRefCounting>
<OptimizePNGs>True</OptimizePNGs> <OptimizePNGs>True</OptimizePNGs>
<MtouchTlsProvider>Default</MtouchTlsProvider> <MtouchTlsProvider>Default</MtouchTlsProvider>
<MtouchHttpClientHandler>HttpClientHandler</MtouchHttpClientHandler> <MtouchHttpClientHandler>HttpClientHandler</MtouchHttpClientHandler>
@ -63,6 +62,7 @@
<CodesignKey>iPhone Developer</CodesignKey> <CodesignKey>iPhone Developer</CodesignKey>
<MtouchDebug>true</MtouchDebug> <MtouchDebug>true</MtouchDebug>
<CodesignEntitlements>Entitlements.plist</CodesignEntitlements> <CodesignEntitlements>Entitlements.plist</CodesignEntitlements>
<MtouchLink>None</MtouchLink>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|iPhone' "> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|iPhone' ">
<DebugType>none</DebugType> <DebugType>none</DebugType>
@ -123,6 +123,7 @@
<ITunesArtwork Include="iTunesArtwork" /> <ITunesArtwork Include="iTunesArtwork" />
<ITunesArtwork Include="iTunesArtwork@2x" /> <ITunesArtwork Include="iTunesArtwork@2x" />
<None Include="packages.config" /> <None Include="packages.config" />
<Compile Include="Effects\CircleEffect.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<BundleResource Include="Resources\Icon-60%403x.png" /> <BundleResource Include="Resources\Icon-60%403x.png" />
@ -155,12 +156,6 @@
<Reference Include="FFImageLoading.Platform, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL"> <Reference Include="FFImageLoading.Platform, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\..\..\..\packages\Xamarin.FFImageLoading.2.2.9\lib\Xamarin.iOS10\FFImageLoading.Platform.dll</HintPath> <HintPath>..\..\..\..\packages\Xamarin.FFImageLoading.2.2.9\lib\Xamarin.iOS10\FFImageLoading.Platform.dll</HintPath>
</Reference> </Reference>
<Reference Include="Geolocator.Plugin, Version=1.0.3.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\..\..\..\packages\Xam.Plugin.Geolocator.1.0.3\lib\Xamarin.iOS10\Geolocator.Plugin.dll</HintPath>
</Reference>
<Reference Include="Geolocator.Plugin.Abstractions, Version=1.0.3.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\..\..\..\packages\Xam.Plugin.Geolocator.1.0.3\lib\Xamarin.iOS10\Geolocator.Plugin.Abstractions.dll</HintPath>
</Reference>
<Reference Include="IdentityModel.Portable, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL"> <Reference Include="IdentityModel.Portable, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\..\..\..\packages\IdentityModel.1.3.1\lib\portable-net45+wp80+win8+wpa81\IdentityModel.Portable.dll</HintPath> <HintPath>..\..\..\..\packages\IdentityModel.1.3.1\lib\portable-net45+wp80+win8+wpa81\IdentityModel.Portable.dll</HintPath>
<Private>True</Private> <Private>True</Private>
@ -173,6 +168,21 @@
<HintPath>..\..\..\..\packages\Newtonsoft.Json.9.0.1\lib\portable-net45+wp80+win8+wpa81\Newtonsoft.Json.dll</HintPath> <HintPath>..\..\..\..\packages\Newtonsoft.Json.9.0.1\lib\portable-net45+wp80+win8+wpa81\Newtonsoft.Json.dll</HintPath>
<Private>True</Private> <Private>True</Private>
</Reference> </Reference>
<Reference Include="PCLCrypto, Version=2.0.0.0, Culture=neutral, PublicKeyToken=d4421c8a4786956c, processorArchitecture=MSIL">
<HintPath>..\..\..\..\packages\PCLCrypto.2.0.147\lib\xamarinios10\PCLCrypto.dll</HintPath>
</Reference>
<Reference Include="PInvoke.BCrypt, Version=0.3.0.0, Culture=neutral, PublicKeyToken=9e300f9f87f04a7a, processorArchitecture=MSIL">
<HintPath>..\..\..\..\packages\PInvoke.BCrypt.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.BCrypt.dll</HintPath>
</Reference>
<Reference Include="PInvoke.Kernel32, Version=0.3.0.0, Culture=neutral, PublicKeyToken=9e300f9f87f04a7a, processorArchitecture=MSIL">
<HintPath>..\..\..\..\packages\PInvoke.Kernel32.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.Kernel32.dll</HintPath>
</Reference>
<Reference Include="PInvoke.NCrypt, Version=0.3.0.0, Culture=neutral, PublicKeyToken=9e300f9f87f04a7a, processorArchitecture=MSIL">
<HintPath>..\..\..\..\packages\PInvoke.NCrypt.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.NCrypt.dll</HintPath>
</Reference>
<Reference Include="PInvoke.Windows.Core, Version=0.3.0.0, Culture=neutral, PublicKeyToken=9e300f9f87f04a7a, processorArchitecture=MSIL">
<HintPath>..\..\..\..\packages\PInvoke.Windows.Core.0.3.2\lib\portable-net45+win+wpa81+MonoAndroid10+xamarinios10+MonoTouch10\PInvoke.Windows.Core.dll</HintPath>
</Reference>
<Reference Include="Plugin.Settings, Version=2.6.0.12, Culture=neutral, processorArchitecture=MSIL"> <Reference Include="Plugin.Settings, Version=2.6.0.12, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\..\..\..\packages\Xam.Plugins.Settings.2.6.0.12-beta\lib\Xamarin.iOS10\Plugin.Settings.dll</HintPath> <HintPath>..\..\..\..\packages\Xam.Plugins.Settings.2.6.0.12-beta\lib\Xamarin.iOS10\Plugin.Settings.dll</HintPath>
<Private>True</Private> <Private>True</Private>
@ -204,21 +214,12 @@
</Reference> </Reference>
<Reference Include="System.Xml" /> <Reference Include="System.Xml" />
<Reference Include="System.Core" /> <Reference Include="System.Core" />
<Reference Include="Validation, Version=2.2.0.0, Culture=neutral, PublicKeyToken=2fc06f0d701809a7, processorArchitecture=MSIL">
<HintPath>..\..\..\..\packages\Validation.2.2.8\lib\dotnet\Validation.dll</HintPath>
</Reference>
<Reference Include="WebP.Touch, Version=1.0.6230.37678, Culture=neutral, processorArchitecture=MSIL"> <Reference Include="WebP.Touch, Version=1.0.6230.37678, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\..\..\..\packages\WebP.Touch.1.0.3\lib\Xamarin.iOS10\WebP.Touch.dll</HintPath> <HintPath>..\..\..\..\packages\WebP.Touch.1.0.3\lib\Xamarin.iOS10\WebP.Touch.dll</HintPath>
</Reference> </Reference>
<Reference Include="Xamarin.Forms.Theme.Base, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\..\..\..\packages\Xamarin.Forms.Theme.Base.1.0.0.43-pre1\lib\Xamarin.iOS10\Xamarin.Forms.Theme.Base.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Xamarin.Forms.Theme.iOS, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\..\..\..\packages\Xamarin.Forms.Theme.Base.1.0.0.43-pre1\lib\Xamarin.iOS10\Xamarin.Forms.Theme.iOS.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Xamarin.Forms.Theme.Light, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\..\..\..\packages\Xamarin.Forms.Theme.Light.1.0.0.43-pre1\lib\Xamarin.iOS10\Xamarin.Forms.Theme.Light.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="Xamarin.iOS" /> <Reference Include="Xamarin.iOS" />
<Reference Include="System.IO.Compression" /> <Reference Include="System.IO.Compression" />
<Reference Include="System.Net.Http" /> <Reference Include="System.Net.Http" />
@ -237,8 +238,11 @@
<Reference Include="Xamarin.Forms.Xaml"> <Reference Include="Xamarin.Forms.Xaml">
<HintPath>..\..\..\..\packages\Xamarin.Forms.2.3.4.231\lib\Xamarin.iOS10\Xamarin.Forms.Xaml.dll</HintPath> <HintPath>..\..\..\..\packages\Xamarin.Forms.2.3.4.231\lib\Xamarin.iOS10\Xamarin.Forms.Xaml.dll</HintPath>
</Reference> </Reference>
<Reference Include="Xamarin.Forms.Pages">
<HintPath>..\..\..\..\packages\Xamarin.Forms.Pages.2.3.4.231\lib\Xamarin.iOS10\Xamarin.Forms.Pages.dll</HintPath>
<Reference Include="Plugin.Geolocator.Abstractions">
<HintPath>..\..\..\..\packages\Xam.Plugin.Geolocator.3.0.4\lib\Xamarin.iOS10\Plugin.Geolocator.Abstractions.dll</HintPath>
</Reference>
<Reference Include="Plugin.Geolocator">
<HintPath>..\..\..\..\packages\Xam.Plugin.Geolocator.3.0.4\lib\Xamarin.iOS10\Plugin.Geolocator.dll</HintPath>
</Reference> </Reference>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
@ -432,9 +436,6 @@
<ItemGroup> <ItemGroup>
<AndroidResource Include="Resources\default_campaign.png" /> <AndroidResource Include="Resources\default_campaign.png" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<Content Include="PluginsHelp\GeolocatorReadme.txt" />
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath)\Xamarin\iOS\Xamarin.iOS.CSharp.targets" /> <Import Project="$(MSBuildExtensionsPath)\Xamarin\iOS\Xamarin.iOS.CSharp.targets" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild"> <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup> <PropertyGroup>


+ 7
- 4
src/Mobile/eShopOnContainers/eShopOnContainers.iOS/packages.config View File

@ -12,6 +12,11 @@
<package id="modernhttpclient" version="2.4.2" targetFramework="xamarinios10" /> <package id="modernhttpclient" version="2.4.2" targetFramework="xamarinios10" />
<package id="NETStandard.Library" version="1.6.0" targetFramework="xamarinios10" /> <package id="NETStandard.Library" version="1.6.0" targetFramework="xamarinios10" />
<package id="Newtonsoft.Json" version="9.0.1" targetFramework="xamarinios10" /> <package id="Newtonsoft.Json" version="9.0.1" targetFramework="xamarinios10" />
<package id="PCLCrypto" version="2.0.147" targetFramework="xamarinios10" />
<package id="PInvoke.BCrypt" version="0.3.2" targetFramework="xamarinios10" />
<package id="PInvoke.Kernel32" version="0.3.2" targetFramework="xamarinios10" />
<package id="PInvoke.NCrypt" version="0.3.2" targetFramework="xamarinios10" />
<package id="PInvoke.Windows.Core" version="0.3.2" targetFramework="xamarinios10" />
<package id="SlideOverKit" version="2.1.4" targetFramework="xamarinios10" /> <package id="SlideOverKit" version="2.1.4" targetFramework="xamarinios10" />
<package id="Splat" version="1.6.2" targetFramework="xamarinios10" /> <package id="Splat" version="1.6.2" targetFramework="xamarinios10" />
<package id="System.AppContext" version="4.1.0" targetFramework="xamarinios10" /> <package id="System.AppContext" version="4.1.0" targetFramework="xamarinios10" />
@ -57,13 +62,11 @@
<package id="System.Threading.Timer" version="4.0.1" targetFramework="xamarinios10" /> <package id="System.Threading.Timer" version="4.0.1" targetFramework="xamarinios10" />
<package id="System.Xml.ReaderWriter" version="4.0.11" targetFramework="xamarinios10" /> <package id="System.Xml.ReaderWriter" version="4.0.11" targetFramework="xamarinios10" />
<package id="System.Xml.XDocument" version="4.0.11" targetFramework="xamarinios10" /> <package id="System.Xml.XDocument" version="4.0.11" targetFramework="xamarinios10" />
<package id="Validation" version="2.2.8" targetFramework="xamarinios10" />
<package id="WebP.Touch" version="1.0.3" targetFramework="xamarinios10" /> <package id="WebP.Touch" version="1.0.3" targetFramework="xamarinios10" />
<package id="Xam.Plugin.Geolocator" version="1.0.3" targetFramework="xamarinios10" />
<package id="Xam.Plugin.Geolocator" version="3.0.4" targetFramework="xamarinios10" />
<package id="Xam.Plugins.Settings" version="2.6.0.12-beta" targetFramework="xamarinios10" /> <package id="Xam.Plugins.Settings" version="2.6.0.12-beta" targetFramework="xamarinios10" />
<package id="Xamarin.FFImageLoading" version="2.2.9" targetFramework="xamarinios10" /> <package id="Xamarin.FFImageLoading" version="2.2.9" targetFramework="xamarinios10" />
<package id="Xamarin.FFImageLoading.Forms" version="2.2.9" targetFramework="xamarinios10" /> <package id="Xamarin.FFImageLoading.Forms" version="2.2.9" targetFramework="xamarinios10" />
<package id="Xamarin.Forms" version="2.3.4.231" targetFramework="xamarinios10" /> <package id="Xamarin.Forms" version="2.3.4.231" targetFramework="xamarinios10" />
<package id="Xamarin.Forms.Pages" version="2.3.4.231" targetFramework="xamarinios10" />
<package id="Xamarin.Forms.Theme.Base" version="1.0.0.43-pre1" targetFramework="xamarinios10" />
<package id="Xamarin.Forms.Theme.Light" version="1.0.0.43-pre1" targetFramework="xamarinios10" />
</packages> </packages>

+ 1
- 1
src/Services/Basket/Basket.API/Basket.API.csproj View File

@ -17,8 +17,8 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="Autofac.Extensions.DependencyInjection" Version="4.1.0" /> <PackageReference Include="Autofac.Extensions.DependencyInjection" Version="4.1.0" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="1.0.0" />
<PackageReference Include="StackExchange.Redis" Version="1.2.3" /> <PackageReference Include="StackExchange.Redis" Version="1.2.3" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="1.0.0" />
<PackageReference Include="System.Threading" Version="4.3.0" /> <PackageReference Include="System.Threading" Version="4.3.0" />
<PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.0.0-preview2-final" /> <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.0.0-preview2-final" />
<PackageReference Include="Microsoft.AspNetCore.Server.IISIntegration" Version="2.0.0-preview2-final" /> <PackageReference Include="Microsoft.AspNetCore.Server.IISIntegration" Version="2.0.0-preview2-final" />


+ 1
- 1
src/Services/Basket/Basket.API/Controllers/BasketController.cs View File

@ -13,7 +13,7 @@ using Basket.API.Model;
namespace Microsoft.eShopOnContainers.Services.Basket.API.Controllers namespace Microsoft.eShopOnContainers.Services.Basket.API.Controllers
{ {
[Route("/")]
[Route("api/v1/[controller]")]
[Authorize] [Authorize]
public class BasketController : Controller public class BasketController : Controller
{ {


src/Services/Ordering/Ordering.API/Infrastructure/Middlewares/FailingMiddlewareAppBuilderExtensions.cs → src/Services/Basket/Basket.API/Infrastructure/Exceptions/FailingMiddlewareAppBuilderExtensions.cs View File

@ -4,7 +4,7 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace Ordering.API.Infrastructure.Middlewares
namespace Basket.API.Infrastructure.Middlewares
{ {
public static class FailingMiddlewareAppBuilderExtensions public static class FailingMiddlewareAppBuilderExtensions
{ {

+ 32
- 0
src/Services/Basket/Basket.API/Infrastructure/Filters/AuthorizeCheckOperationFilter.cs View File

@ -0,0 +1,32 @@
using Microsoft.AspNetCore.Authorization;
using Swashbuckle.AspNetCore.Swagger;
using Swashbuckle.AspNetCore.SwaggerGen;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
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<AuthorizeAttribute>().Any() ||
context.ApiDescription.ActionAttributes().OfType<AuthorizeAttribute>().Any();
if (hasAuthorize)
{
operation.Responses.Add("401", new Response { Description = "Unauthorized" });
operation.Responses.Add("403", new Response { Description = "Forbidden" });
operation.Security = new List<IDictionary<string, IEnumerable<string>>>();
operation.Security.Add(new Dictionary<string, IEnumerable<string>>
{
{ "oauth2", new [] { "basketapi" } }
});
}
}
}
}

+ 1
- 8
src/Services/Basket/Basket.API/Infrastructure/Filters/HttpGlobalExceptionFilter.cs View File

@ -8,7 +8,7 @@ using System.Net;
namespace Basket.API.Infrastructure.Filters namespace Basket.API.Infrastructure.Filters
{ {
public class HttpGlobalExceptionFilter : IExceptionFilter
public partial class HttpGlobalExceptionFilter : IExceptionFilter
{ {
private readonly IHostingEnvironment env; private readonly IHostingEnvironment env;
private readonly ILogger<HttpGlobalExceptionFilter> logger; private readonly ILogger<HttpGlobalExceptionFilter> logger;
@ -52,12 +52,5 @@ namespace Basket.API.Infrastructure.Filters
} }
context.ExceptionHandled = true; context.ExceptionHandled = true;
} }
private class JsonErrorResponse
{
public string[] Messages { get; set; }
public object DeveloperMessage { get; set; }
}
} }
} }

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save