Merge pull request #28 from dotnet-architecture/dev

upd fork
This commit is contained in:
Taras Kovalenko 2018-06-18 15:33:17 +03:00 committed by GitHub
commit 7b1174a66f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
16 changed files with 293 additions and 506 deletions

View File

@ -25,8 +25,8 @@ $env:ESHOP_AZURE_STORAGE_CATALOG_URL ="http://10.0.75.1:5101/api/v1/catalog/item
$env:ESHOP_AZURE_STORAGE_MARKETING_URL ="http://10.0.75.1:5110/api/v1/campaigns/[0]/pic/" $env:ESHOP_AZURE_STORAGE_MARKETING_URL ="http://10.0.75.1:5110/api/v1/campaigns/[0]/pic/"
if (-Not $customEventBusLoginPassword) { if (-Not $customEventBusLoginPassword) {
docker-compose -f "$rootPath\docker-compose-windows.yml" -f "$rootPath\docker-compose.override.yml" -f "$rootPath\docker-compose.override.windows.yml" up docker-compose -f "$rootPath\docker-compose.yml" -f "$rootPath\docker-compose.override.yml" -f "$rootPath\docker-compose.windows.yml" -f "$rootPath\docker-compose.override.windows.yml" up
} }
else { else {
docker-compose -f "$rootPath\docker-compose-windows.yml" -f "$rootPath\docker-compose.override.yml" up docker-compose -f "$rootPath\docker-compose.yml" -f "$rootPath\docker-compose.override.yml" -f "$rootPath\docker-compose.windows.yml" up
} }

View File

@ -1,138 +0,0 @@
version: '3.4'
services:
basket.api:
image: eshop/basket.api-win:${TAG:-latest}
build:
context: .
dockerfile: src/Services/Basket/Basket.API/Dockerfile
depends_on:
- basket.data
- identity.api
- rabbitmq
catalog.api:
image: eshop/catalog.api-win:${TAG:-latest}
build:
context: .
dockerfile: src/Services/Catalog/Catalog.API/Dockerfile
depends_on:
- sql.data
- rabbitmq
identity.api:
image: eshop/identity.api-win:${TAG:-latest}
build:
context: .
dockerfile: src/Services/Identity/Identity.API/Dockerfile
depends_on:
- sql.data
ordering.api:
image: eshop/ordering.api-win:${TAG:-latest}
build:
context: .
dockerfile: src/Services/Ordering/Ordering.API/Dockerfile
depends_on:
- sql.data
- rabbitmq
ordering.backgroundtasks:
image: eshop/ordering.backgroundtasks-win:${TAG:-latest}
build:
context: .
dockerfile: src/Services/Ordering/Ordering.BackgroundTasks/Dockerfile
depends_on:
- sql.data
- rabbitmq
ordering.signalrhub:
image: eshop/ordering.signalrhub:${TAG:-latest}
build:
context: .
dockerfile: src/Services/Ordering/Ordering.SignalrHub/Dockerfile
depends_on:
- sql.data
- identity.api
- rabbitmq
marketing.api:
image: eshop/marketing.api-win:${TAG:-latest}
build:
context: .
dockerfile: src/Services/Marketing/Marketing.API/Dockerfile
depends_on:
- sql.data
- nosql.data
- identity.api
- rabbitmq
webspa:
image: eshop/webspa-win:${TAG:-latest}
build:
context: .
dockerfile: src/Web/WebSPA/Dockerfile
depends_on:
- catalog.api
- ordering.api
- identity.api
- basket.api
- marketing.api
webmvc:
image: eshop/webmvc-win:${TAG:-latest}
build:
context: .
dockerfile: src/Web/WebMVC/Dockerfile
depends_on:
- catalog.api
- ordering.api
- identity.api
- basket.api
- marketing.api
webstatus:
image: eshop/webstatus-win:${TAG:-latest}
build:
context: .
dockerfile: src/Web/WebStatus/Dockerfile
payment.api:
image: eshop/payment.api-win:${TAG:-latest}
build:
context: .
dockerfile: src/Services/Payment/Payment.API/Dockerfile
depends_on:
- rabbitmq
locations.api:
image: eshop/locations.api-win:${TAG:-latest}
build:
context: .
dockerfile: src/Services/Location/Locations.API/Dockerfile
depends_on:
- nosql.data
- rabbitmq
sql.data:
image: microsoft/mssql-server-windows-developer
nosql.data:
image: mongo:windowsservercore
basket.data:
image: redis:nanoserver
ports:
- "6379:6379"
rabbitmq:
image: spring2/rabbitmq
ports:
- "15672:15672"
- "5672:5672"
networks:
default:
external:
name: nat

View File

@ -37,11 +37,6 @@ services:
- EventBusUserName=admin - EventBusUserName=admin
- EventBusPassword=password - EventBusPassword=password
ordering.api:
environment:
- EventBusUserName=admin
- EventBusPassword=password
ordering.backgroundtasks: ordering.backgroundtasks:
environment: environment:
- EventBusUserName=admin - EventBusUserName=admin
@ -58,6 +53,6 @@ services:
- EventBusPassword=password - EventBusPassword=password
ordering.signalrhub: ordering.signalrhub:
environment: environment:
- EventBusUserName=admin - EventBusUserName=admin
- EventBusPassword=password - EventBusPassword=password

View File

@ -252,8 +252,7 @@ services:
ports: ports:
- "5200:80" - "5200:80"
volumes: volumes:
- ./src/ApiGateways/Mobile.Bff.Shopping/apigw:/app/configuration - ./src/ApiGateways/Mobile.Bff.Shopping/apigw:${ESHOP_OCELOT_VOLUME_SPEC:-/app/configuration}
mobilemarketingapigw: mobilemarketingapigw:
environment: environment:
- ASPNETCORE_ENVIRONMENT=Development - ASPNETCORE_ENVIRONMENT=Development
@ -261,7 +260,7 @@ services:
ports: ports:
- "5201:80" - "5201:80"
volumes: volumes:
- ./src/ApiGateways/Mobile.Bff.Marketing/apigw:/app/configuration - ./src/ApiGateways/Mobile.Bff.Marketing/apigw:${ESHOP_OCELOT_VOLUME_SPEC:-/app/configuration}
webshoppingapigw: webshoppingapigw:
environment: environment:
@ -270,7 +269,7 @@ services:
ports: ports:
- "5202:80" - "5202:80"
volumes: volumes:
- ./src/ApiGateways/Web.Bff.Shopping/apigw:/app/configuration - ./src/ApiGateways/Web.Bff.Shopping/apigw:${ESHOP_OCELOT_VOLUME_SPEC:-/app/configuration}
webmarketingapigw: webmarketingapigw:
environment: environment:
@ -279,7 +278,7 @@ services:
ports: ports:
- "5203:80" - "5203:80"
volumes: volumes:
- ./src/ApiGateways/Web.Bff.Marketing/apigw:/app/configuration - ./src/ApiGateways/Web.Bff.Marketing/apigw:${ESHOP_OCELOT_VOLUME_SPEC:-/app/configuration}
mobileshoppingagg: mobileshoppingagg:
environment: environment:

View File

@ -0,0 +1,39 @@
# This file contains specific services build and images for Windows Containers.
#
# MUST be used alongside "docker-compose.yml" in all windows container commands
version: '3.4'
services:
identity.api:
build:
args:
NODE_IMAGE: stefanscherer/node-windows:8.11
webmvc:
build:
args:
NODE_IMAGE: stefanscherer/node-windows:8.11
webspa:
build:
args:
NODE_IMAGE: stefanscherer/node-windows:8.11
sql.data:
image: microsoft/mssql-server-windows-developer
nosql.data:
image: mongo:windowsservercore
basket.data:
image: redis:nanoserver
rabbitmq:
image: spring2/rabbitmq
networks:
default:
external:
name: nat

View File

@ -202,10 +202,10 @@ services:
build: build:
context: . context: .
dockerfile: src/Web/WebSPA/Dockerfile dockerfile: src/Web/WebSPA/Dockerfile
depends_on: # depends_on:
- webshoppingagg # - webshoppingagg
- webshoppingapigw # - webshoppingapigw
- webmarketingapigw # - webmarketingapigw
webmvc: webmvc:

View File

@ -0,0 +1,8 @@
#!/bin/sh
export NODE_DOWNLOAD_SHA 0e20787e2eda4cc31336d8327556ebc7417e8ee0a6ba0de96a09b0ec2b841f60
curl -SL "https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-x64.tar.gz" --output nodejs.tar.gz \
&& echo "$NODE_DOWNLOAD_SHA nodejs.tar.gz" | sha256sum -c - \
&& tar -xzf "nodejs.tar.gz" -C /usr/local --strip-components=1 \
&& rm nodejs.tar.gz \
&& ln -s /usr/local/bin/node /usr/local/bin/nodejs

View File

@ -0,0 +1,4 @@
set NODE_VERSION=8.11.1
curl -SL "https://nodejs.org/dist/v%NODE_VERSION%/node-v%NODE_VERSION%-win-x64.zip" --output nodejs.zip
tar -xf nodejs.zip -C c:\
setx PATH "%PATH%;c:\node-v%NODE_VERSION%-win-x64"

View File

@ -13,14 +13,8 @@ namespace eShopOnContainers.Core.ViewModels
{ {
public class SettingsViewModel : ViewModelBase public class SettingsViewModel : ViewModelBase
{ {
private string _titleUseAzureServices;
private string _descriptionUseAzureServices;
private bool _useAzureServices; private bool _useAzureServices;
private string _titleUseFakeLocation;
private string _descriptionUseFakeLocation;
private bool _allowGpsLocation; private bool _allowGpsLocation;
private string _titleAllowGpsLocation;
private string _descriptionAllowGpsLocation;
private bool _useFakeLocation; private bool _useFakeLocation;
private string _endpoint; private string _endpoint;
private double _latitude; private double _latitude;
@ -48,21 +42,16 @@ namespace eShopOnContainers.Core.ViewModels
public string TitleUseAzureServices public string TitleUseAzureServices
{ {
get => _titleUseAzureServices; get { return !UseAzureServices ? "Use Mock Services" : "Use Microservices/Containers from eShopOnContainers"; }
set
{
_titleUseAzureServices = value;
RaisePropertyChanged(() => TitleUseAzureServices);
}
} }
public string DescriptionUseAzureServices public string DescriptionUseAzureServices
{ {
get => _descriptionUseAzureServices; get
set
{ {
_descriptionUseAzureServices = value; return !UseAzureServices
RaisePropertyChanged(() => DescriptionUseAzureServices); ? "Mock Services are simulated objects that mimic the behavior of real services using a controlled approach."
: "When enabling the use of microservices/containers, the app will attempt to use real services deployed as Docker containers at the specified base endpoint, which will must be reachable through the network.";
} }
} }
@ -72,30 +61,23 @@ namespace eShopOnContainers.Core.ViewModels
set set
{ {
_useAzureServices = value; _useAzureServices = value;
UpdateUseAzureServices(); UpdateUseAzureServices();
RaisePropertyChanged(() => UseAzureServices); RaisePropertyChanged(() => UseAzureServices);
} }
} }
public string TitleUseFakeLocation public string TitleUseFakeLocation
{ {
get => _titleUseFakeLocation; get { return !UseFakeLocation ? "Use Real Location" : "Use Fake Location"; }
set
{
_titleUseFakeLocation = value;
RaisePropertyChanged(() => TitleUseFakeLocation);
}
} }
public string DescriptionUseFakeLocation public string DescriptionUseFakeLocation
{ {
get => _descriptionUseFakeLocation; get
set
{ {
_descriptionUseFakeLocation = value; return !UseFakeLocation
RaisePropertyChanged(() => DescriptionUseFakeLocation); ? "When enabling location, the app will attempt to use the location from the device."
: "Fake Location data is added for marketing campaign testing.";
} }
} }
@ -105,30 +87,23 @@ namespace eShopOnContainers.Core.ViewModels
set set
{ {
_useFakeLocation = value; _useFakeLocation = value;
UpdateFakeLocation(); UpdateFakeLocation();
RaisePropertyChanged(() => UseFakeLocation); RaisePropertyChanged(() => UseFakeLocation);
} }
} }
public string TitleAllowGpsLocation public string TitleAllowGpsLocation
{ {
get => _titleAllowGpsLocation; get { return !AllowGpsLocation ? "GPS Location Disabled" : "GPS Location Enabled"; }
set
{
_titleAllowGpsLocation = value;
RaisePropertyChanged(() => TitleAllowGpsLocation);
}
} }
public string DescriptionAllowGpsLocation public string DescriptionAllowGpsLocation
{ {
get => _descriptionAllowGpsLocation; get
set
{ {
_descriptionAllowGpsLocation = value; return !AllowGpsLocation
RaisePropertyChanged(() => DescriptionAllowGpsLocation); ? "When disabling location, you won't receive location campaigns based upon your location."
: "When enabling location, you'll receive location campaigns based upon your location.";
} }
} }
@ -148,12 +123,10 @@ namespace eShopOnContainers.Core.ViewModels
set set
{ {
_endpoint = value; _endpoint = value;
if (!string.IsNullOrEmpty(_endpoint)) if (!string.IsNullOrEmpty(_endpoint))
{ {
UpdateEndpoint(); UpdateEndpoint();
} }
RaisePropertyChanged(() => Endpoint); RaisePropertyChanged(() => Endpoint);
} }
} }
@ -164,9 +137,7 @@ namespace eShopOnContainers.Core.ViewModels
set set
{ {
_latitude = value; _latitude = value;
UpdateLatitude(); UpdateLatitude();
RaisePropertyChanged(() => Latitude); RaisePropertyChanged(() => Latitude);
} }
} }
@ -177,9 +148,7 @@ namespace eShopOnContainers.Core.ViewModels
set set
{ {
_longitude = value; _longitude = value;
UpdateLongitude(); UpdateLongitude();
RaisePropertyChanged(() => Longitude); RaisePropertyChanged(() => Longitude);
} }
} }
@ -190,9 +159,7 @@ namespace eShopOnContainers.Core.ViewModels
set set
{ {
_allowGpsLocation = value; _allowGpsLocation = value;
UpdateAllowGpsLocation(); UpdateAllowGpsLocation();
RaisePropertyChanged(() => AllowGpsLocation); RaisePropertyChanged(() => AllowGpsLocation);
} }
} }
@ -207,19 +174,11 @@ namespace eShopOnContainers.Core.ViewModels
public ICommand ToggleAllowGpsLocationCommand => new Command(ToggleAllowGpsLocation); public ICommand ToggleAllowGpsLocationCommand => new Command(ToggleAllowGpsLocation);
public override Task InitializeAsync(object navigationData)
{
UpdateInfoUseAzureServices();
UpdateInfoFakeLocation();
UpdateInfoAllowGpsLocation();
return base.InitializeAsync(navigationData);
}
private async Task ToggleMockServicesAsync() private async Task ToggleMockServicesAsync()
{ {
ViewModelLocator.UpdateDependencies(!UseAzureServices); ViewModelLocator.UpdateDependencies(!UseAzureServices);
UpdateInfoUseAzureServices(); RaisePropertyChanged(() => TitleUseAzureServices);
RaisePropertyChanged(() => DescriptionUseAzureServices);
var previousPageViewModel = NavigationService.PreviousPageViewModel; var previousPageViewModel = NavigationService.PreviousPageViewModel;
if (previousPageViewModel != null) if (previousPageViewModel != null)
@ -243,7 +202,8 @@ namespace eShopOnContainers.Core.ViewModels
private void ToggleFakeLocationAsync() private void ToggleFakeLocationAsync()
{ {
ViewModelLocator.UpdateDependencies(!UseAzureServices); ViewModelLocator.UpdateDependencies(!UseAzureServices);
UpdateInfoFakeLocation(); RaisePropertyChanged(() => TitleUseFakeLocation);
RaisePropertyChanged(() => DescriptionUseFakeLocation);
} }
private async Task ToggleSendLocationAsync() private async Task ToggleSendLocationAsync()
@ -263,51 +223,8 @@ namespace eShopOnContainers.Core.ViewModels
private void ToggleAllowGpsLocation() private void ToggleAllowGpsLocation()
{ {
UpdateInfoAllowGpsLocation(); RaisePropertyChanged(() => TitleAllowGpsLocation);
} RaisePropertyChanged(() => DescriptionAllowGpsLocation);
private void UpdateInfoUseAzureServices()
{
if (!UseAzureServices)
{
TitleUseAzureServices = "Use Mock Services";
DescriptionUseAzureServices = "Mock Services are simulated objects that mimic the behavior of real services using a controlled approach.";
}
else
{
TitleUseAzureServices = "Use Microservices/Containers from eShopOnContainers";
DescriptionUseAzureServices = "When enabling the use of microservices/containers, the app will attempt to use real services deployed as Docker containers at the specified base endpoint, which will must be reachable through the network.";
}
}
private void UpdateInfoFakeLocation()
{
if (!UseFakeLocation)
{
TitleUseFakeLocation = "Use Real Location";
DescriptionUseFakeLocation = "When enabling location, the app will attempt to use the location from the device.";
}
else
{
TitleUseFakeLocation = "Use Fake Location";
DescriptionUseFakeLocation = "Fake Location data is added for marketing campaign testing.";
}
}
private void UpdateInfoAllowGpsLocation()
{
if (!AllowGpsLocation)
{
TitleAllowGpsLocation = "GPS Location Disabled";
DescriptionAllowGpsLocation = "When disabling location, you won't receive location campaigns based upon your location.";
}
else
{
TitleAllowGpsLocation = "GPS Location Enabled";
DescriptionAllowGpsLocation = "When enabling location, you'll receive location campaigns based upon your location.";
}
} }
private void UpdateUseAzureServices() private void UpdateUseAzureServices()

View File

@ -2,12 +2,12 @@
<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.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: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>
@ -116,195 +116,178 @@
Animation="{StaticResource MockServicesAnimation}" /> Animation="{StaticResource MockServicesAnimation}" />
</EventTrigger> </EventTrigger>
</ContentPage.Triggers> </ContentPage.Triggers>
<Grid
BackgroundColor="{StaticResource BackgroundColor}">
<!-- SETTINGS -->
<ScrollView>
<StackLayout
x:Name="MockServices">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="1" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<!-- MOCK SERVICES -->
<StackLayout
Grid.Column="0"
Grid.Row="1"
Style="{StaticResource SettingsStackLayoutStyle}">
<Label
Text="{Binding TitleUseAzureServices}"
Style="{StaticResource SettingsTitleStyle}"/>
<Label
Text="{Binding DescriptionUseAzureServices}"
Style="{StaticResource SettingsDescriptionStyle}"/>
</StackLayout>
<!-- ON / OFF -->
<controls:ToggleButton
Grid.Column="1"
Grid.Row="1"
Checked="{Binding UseAzureServices, Mode=TwoWay}"
Command="{Binding ToggleMockServicesCommand}"
Style="{StaticResource SettingsToggleButtonStyle}">
<controls:ToggleButton.CheckedImage>
<OnPlatform x:TypeArguments="ImageSource">
<On Platform="iOS" Value="switchOn.png" />
<On Platform="Android" Value="switch_on.png" />
<On Platform="UWP, WinRT, WinPhone" Value="Assets/switchOn.png" />
</OnPlatform>
</controls:ToggleButton.CheckedImage>
<controls:ToggleButton.UnCheckedImage>
<OnPlatform x:TypeArguments="ImageSource">
<On Platform="iOS" Value="switchOff.png" />
<On Platform="Android" Value="switch_off.png" />
<On Platform="UWP, WinRT, WinPhone" Value="Assets/switchOff.png" />
</OnPlatform>
</controls:ToggleButton.UnCheckedImage>
</controls:ToggleButton>
<!-- ENDPOINT -->
<StackLayout
Grid.Row="2"
Grid.Column="0"
Grid.ColumnSpan="2"
Style="{StaticResource SettingsStackLayoutStyle}"
IsVisible="{Binding UseAzureServices}">
<Label
Text="Endpoint"
Style="{StaticResource HeaderLabelStyle}"/>
<Entry
Text="{Binding Endpoint, Mode=TwoWay}">
<Entry.Style>
<OnPlatform x:TypeArguments="Style">
<On Platform="iOS, Android" Value="{StaticResource SettingsEntryStyle}" />
<On Platform="UWP, WinRT, WinPhone" Value="{StaticResource SettingsUwpEntryStyle}" />
</OnPlatform>
</Entry.Style>
</Entry>
</StackLayout>
<!-- USE LOCATIONS --> <!-- SETTINGS -->
<StackLayout <Grid x:Name="MockServices" BackgroundColor="{StaticResource BackgroundColor}">
Grid.Column="0" <Grid.ColumnDefinitions>
Grid.Row="3" <ColumnDefinition Width="*" />
IsVisible="{Binding UserIsLogged}" <ColumnDefinition Width="Auto" />
Style="{StaticResource SettingsStackLayoutStyle}"> </Grid.ColumnDefinitions>
<Label <Grid.RowDefinitions>
Text="{Binding TitleUseFakeLocation}" <RowDefinition Height="Auto" />
Style="{StaticResource SettingsTitleStyle}"/> <RowDefinition Height="Auto" />
<Label <RowDefinition Height="Auto" />
Text="{Binding DescriptionUseFakeLocation}" <RowDefinition Height="Auto" />
Style="{StaticResource SettingsDescriptionStyle}"/> <RowDefinition Height="Auto" />
</StackLayout> </Grid.RowDefinitions>
<!-- ON / OFF --> <!-- MOCK SERVICES -->
<controls:ToggleButton <StackLayout
Grid.Column="1" Style="{StaticResource SettingsStackLayoutStyle}">
Grid.Row="3" <Label
Checked="{Binding UseFakeLocation, Mode=TwoWay}" Text="{Binding TitleUseAzureServices}"
Command="{Binding ToggleFakeLocationCommand}" Style="{StaticResource SettingsTitleStyle}"/>
Style="{StaticResource SettingsToggleButtonStyle}" <Label
IsVisible="{Binding UserIsLogged}"> Text="{Binding DescriptionUseAzureServices}"
<controls:ToggleButton.CheckedImage> Style="{StaticResource SettingsDescriptionStyle}"/>
<OnPlatform x:TypeArguments="ImageSource"> </StackLayout>
<On Platform="iOS" Value="switchOn.png" /> <!-- ON / OFF -->
<On Platform="Android" Value="switch_on.png" /> <controls:ToggleButton
<On Platform="UWP, WinRT, WinPhone" Value="Assets/switchOn.png" /> Grid.Column="1"
</OnPlatform> Checked="{Binding UseAzureServices, Mode=TwoWay}"
</controls:ToggleButton.CheckedImage> Command="{Binding ToggleMockServicesCommand}"
<controls:ToggleButton.UnCheckedImage> Style="{StaticResource SettingsToggleButtonStyle}">
<OnPlatform x:TypeArguments="ImageSource"> <controls:ToggleButton.CheckedImage>
<On Platform="iOS" Value="switchOff.png" /> <OnPlatform x:TypeArguments="ImageSource">
<On Platform="Android" Value="switch_off.png" /> <On Platform="iOS" Value="switchOn.png" />
<On Platform="UWP, WinRT, WinPhone" Value="Assets/switchOff.png" /> <On Platform="Android" Value="switch_on.png" />
</OnPlatform> <On Platform="UWP, WinRT, WinPhone" Value="Assets/switchOn.png" />
</controls:ToggleButton.UnCheckedImage> </OnPlatform>
</controls:ToggleButton> </controls:ToggleButton.CheckedImage>
<!-- FAKE LOCATIONS --> <controls:ToggleButton.UnCheckedImage>
<StackLayout <OnPlatform x:TypeArguments="ImageSource">
Grid.Row="4" <On Platform="iOS" Value="switchOff.png" />
Grid.Column="0" <On Platform="Android" Value="switch_off.png" />
Grid.ColumnSpan="2" <On Platform="UWP, WinRT, WinPhone" Value="Assets/switchOff.png" />
Style="{StaticResource SettingsStackLayoutStyle}" </OnPlatform>
IsVisible="{Binding UseFakeLocation}"> </controls:ToggleButton.UnCheckedImage>
<Label </controls:ToggleButton>
Text="Latitude" <!-- ENDPOINT -->
Style="{StaticResource HeaderLabelStyle}"/> <StackLayout
<Entry Grid.Row="1"
Text="{Binding Latitude, Mode=TwoWay, Converter={StaticResource DoubleConverter}}" Grid.ColumnSpan="2"
Keyboard="Text"> Style="{StaticResource SettingsStackLayoutStyle}"
<Entry.Style> IsVisible="{Binding UseAzureServices}">
<OnPlatform x:TypeArguments="Style"> <Label
<On Platform="iOS, Android" Value="{StaticResource SettingsEntryStyle}" /> Text="Endpoint"
<On Platform="UWP, WinRT, WinPhone" Value="{StaticResource SettingsUwpEntryStyle}" /> Style="{StaticResource HeaderLabelStyle}"/>
</OnPlatform> <Entry
</Entry.Style> Text="{Binding Endpoint, Mode=TwoWay}">
</Entry> <Entry.Style>
<Label <OnPlatform x:TypeArguments="Style">
Text="Longitude" <On Platform="iOS, Android" Value="{StaticResource SettingsEntryStyle}" />
Style="{StaticResource HeaderLabelStyle}"/> <On Platform="UWP, WinRT, WinPhone" Value="{StaticResource SettingsUwpEntryStyle}" />
<Entry </OnPlatform>
Text="{Binding Longitude, Mode=TwoWay, Converter={StaticResource DoubleConverter}}" </Entry.Style>
Keyboard="Text"> </Entry>
<Entry.Style> </StackLayout>
<OnPlatform x:TypeArguments="Style"> <!-- USE LOCATIONS -->
<On Platform="iOS, Android" Value="{StaticResource SettingsEntryStyle}" /> <StackLayout
<On Platform="UWP, WinRT, WinPhone" Value="{StaticResource SettingsUwpEntryStyle}" /> Grid.Row="2"
</OnPlatform> IsVisible="{Binding UserIsLogged}"
</Entry.Style> Style="{StaticResource SettingsStackLayoutStyle}">
</Entry> <Label
<Button Text="{Binding TitleUseFakeLocation}"
Command="{Binding ToggleSendLocationCommand}" Style="{StaticResource SettingsTitleStyle}"/>
Text="Send Location"/> <Label
</StackLayout> Text="{Binding DescriptionUseFakeLocation}"
<!-- ALLOW GPS LOCATION --> Style="{StaticResource SettingsDescriptionStyle}"/>
<StackLayout </StackLayout>
Grid.Column="0" <!-- ON / OFF -->
Grid.Row="5" <controls:ToggleButton
Style="{StaticResource SettingsStackLayoutStyle}" Grid.Column="1"
IsVisible="{Binding UseFakeLocation, Converter={StaticResource InverseBoolConverter}}"> Grid.Row="2"
<Label Checked="{Binding UseFakeLocation, Mode=TwoWay}"
Text="{Binding TitleAllowGpsLocation}" Command="{Binding ToggleFakeLocationCommand}"
Style="{StaticResource SettingsToggleButtonStyle}"
Style="{StaticResource SettingsTitleStyle}"/> IsVisible="{Binding UserIsLogged}">
<Label <controls:ToggleButton.CheckedImage>
Text="{Binding DescriptionAllowGpsLocation}" <OnPlatform x:TypeArguments="ImageSource">
Style="{StaticResource SettingsDescriptionStyle}"/> <On Platform="iOS" Value="switchOn.png" />
<Label <On Platform="Android" Value="switch_on.png" />
Text="{Binding GpsWarningMessage}" <On Platform="UWP, WinRT, WinPhone" Value="Assets/switchOn.png" />
Style="{StaticResource SettingsWarningMessageStyle}"/> </OnPlatform>
</StackLayout> </controls:ToggleButton.CheckedImage>
<!-- ON / OFF --> <controls:ToggleButton.UnCheckedImage>
<controls:ToggleButton <OnPlatform x:TypeArguments="ImageSource">
Grid.Column="1" <On Platform="iOS" Value="switchOff.png" />
Grid.Row="5" <On Platform="Android" Value="switch_off.png" />
Checked="{Binding AllowGpsLocation, Mode=TwoWay}" <On Platform="UWP, WinRT, WinPhone" Value="Assets/switchOff.png" />
Command="{Binding ToggleAllowGpsLocationCommand}" </OnPlatform>
Style="{StaticResource SettingsToggleButtonStyle}" </controls:ToggleButton.UnCheckedImage>
IsVisible="{Binding UseFakeLocation, Converter={StaticResource InverseBoolConverter}}"> </controls:ToggleButton>
<controls:ToggleButton.CheckedImage> <!-- FAKE LOCATIONS -->
<OnPlatform x:TypeArguments="ImageSource"> <StackLayout
<On Platform="iOS" Value="switchOn.png" /> Grid.Row="3"
<On Platform="Android" Value="switch_on.png" /> Grid.ColumnSpan="2"
<On Platform="UWP, WinRT, WinPhone" Value="Assets/switchOn.png" /> Style="{StaticResource SettingsStackLayoutStyle}"
</OnPlatform> IsVisible="{Binding UseFakeLocation}">
</controls:ToggleButton.CheckedImage> <Label
<controls:ToggleButton.UnCheckedImage> Text="Latitude"
<OnPlatform x:TypeArguments="ImageSource"> Style="{StaticResource HeaderLabelStyle}"/>
<On Platform="iOS" Value="switchOff.png" /> <Entry
<On Platform="Android" Value="switch_off.png" /> Text="{Binding Latitude, Mode=TwoWay, Converter={StaticResource DoubleConverter}}"
<On Platform="UWP, WinRT, WinPhone" Value="Assets/switchOff.png" /> Keyboard="Text">
</OnPlatform> <Entry.Style>
</controls:ToggleButton.UnCheckedImage> <OnPlatform x:TypeArguments="Style">
</controls:ToggleButton> <On Platform="iOS, Android" Value="{StaticResource SettingsEntryStyle}" />
</Grid> <On Platform="UWP, WinRT, WinPhone" Value="{StaticResource SettingsUwpEntryStyle}" />
</StackLayout> </OnPlatform>
</ScrollView> </Entry.Style>
</Entry>
<Label
Text="Longitude"
Style="{StaticResource HeaderLabelStyle}"/>
<Entry
Text="{Binding Longitude, Mode=TwoWay, Converter={StaticResource DoubleConverter}}"
Keyboard="Text">
<Entry.Style>
<OnPlatform x:TypeArguments="Style">
<On Platform="iOS, Android" Value="{StaticResource SettingsEntryStyle}" />
<On Platform="UWP, WinRT, WinPhone" Value="{StaticResource SettingsUwpEntryStyle}" />
</OnPlatform>
</Entry.Style>
</Entry>
<Button
Command="{Binding ToggleSendLocationCommand}"
Text="Send Location"/>
</StackLayout>
<!-- ALLOW GPS LOCATION -->
<StackLayout
Grid.Row="4"
Style="{StaticResource SettingsStackLayoutStyle}"
IsVisible="{Binding UseFakeLocation, Converter={StaticResource InverseBoolConverter}}">
<Label
Text="{Binding TitleAllowGpsLocation}"
Style="{StaticResource SettingsTitleStyle}"/>
<Label
Text="{Binding DescriptionAllowGpsLocation}"
Style="{StaticResource SettingsDescriptionStyle}"/>
<Label
Text="{Binding GpsWarningMessage}"
Style="{StaticResource SettingsWarningMessageStyle}"/>
</StackLayout>
<!-- ON / OFF -->
<controls:ToggleButton
Grid.Column="1"
Grid.Row="4"
Checked="{Binding AllowGpsLocation, Mode=TwoWay}"
Command="{Binding ToggleAllowGpsLocationCommand}"
Style="{StaticResource SettingsToggleButtonStyle}"
IsVisible="{Binding UseFakeLocation, Converter={StaticResource InverseBoolConverter}}">
<controls:ToggleButton.CheckedImage>
<OnPlatform x:TypeArguments="ImageSource">
<On Platform="iOS" Value="switchOn.png" />
<On Platform="Android" Value="switch_on.png" />
<On Platform="UWP, WinRT, WinPhone" Value="Assets/switchOn.png" />
</OnPlatform>
</controls:ToggleButton.CheckedImage>
<controls:ToggleButton.UnCheckedImage>
<OnPlatform x:TypeArguments="ImageSource">
<On Platform="iOS" Value="switchOff.png" />
<On Platform="Android" Value="switch_off.png" />
<On Platform="UWP, WinRT, WinPhone" Value="Assets/switchOff.png" />
</OnPlatform>
</controls:ToggleButton.UnCheckedImage>
</controls:ToggleButton>
</Grid> </Grid>
</ContentPage> </ContentPage>

View File

@ -1,22 +1,20 @@
ARG NODE_IMAGE=node:8.11
FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base
WORKDIR /app WORKDIR /app
EXPOSE 80 EXPOSE 80
FROM microsoft/dotnet:2.1-sdk AS sdk-with-node FROM microsoft/dotnet:2.1-sdk as dotnet-build
ENV NODE_VERSION 8.11.1 WORKDIR /src
ENV NODE_DOWNLOAD_SHA 0e20787e2eda4cc31336d8327556ebc7417e8ee0a6ba0de96a09b0ec2b841f60
RUN curl -SL "https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-x64.tar.gz" --output nodejs.tar.gz \
&& echo "$NODE_DOWNLOAD_SHA nodejs.tar.gz" | sha256sum -c - \
&& tar -xzf "nodejs.tar.gz" -C /usr/local --strip-components=1 \
&& rm nodejs.tar.gz \
&& ln -s /usr/local/bin/node /usr/local/bin/nodejs
FROM sdk-with-node AS updated-npm FROM ${NODE_IMAGE} as node-build
RUN npm i -g npm WORKDIR /web
COPY src/Services/Identity/Identity.API .
FROM updated-npm as build
RUN npm install -g bower@1.8.4 RUN npm install -g bower@1.8.4
RUN bower install --allow-root
FROM dotnet-build as build
WORKDIR /src/src/Services/Identity/Identity.API/wwwroot
COPY --from=node-build /web/wwwroot .
WORKDIR /src WORKDIR /src
COPY . . COPY . .
WORKDIR /src/src/Services/Identity/Identity.API WORKDIR /src/src/Services/Identity/Identity.API

View File

@ -27,7 +27,6 @@
</ItemGroup> </ItemGroup>
<Target Name="PrepublishScript" BeforeTargets="PrepareForPublish"> <Target Name="PrepublishScript" BeforeTargets="PrepareForPublish">
<Exec Command="bower install --allow-root" />
<Exec Command="dotnet bundle" Condition="'$(ASPNETCORE_ENVIRONMENT)'!='Development'" /> <Exec Command="dotnet bundle" Condition="'$(ASPNETCORE_ENVIRONMENT)'!='Development'" />
</Target> </Target>

View File

@ -1,26 +1,24 @@
ARG NODE_IMAGE=node:8.11
FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base
WORKDIR /app WORKDIR /app
EXPOSE 80 EXPOSE 80
FROM microsoft/dotnet:2.1-sdk AS sdk-with-node FROM microsoft/dotnet:2.1-sdk as dotnet-build
ENV NODE_VERSION 8.11.1 WORKDIR /src
ENV NODE_DOWNLOAD_SHA 0e20787e2eda4cc31336d8327556ebc7417e8ee0a6ba0de96a09b0ec2b841f60
RUN curl -SL "https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-x64.tar.gz" --output nodejs.tar.gz \
&& echo "$NODE_DOWNLOAD_SHA nodejs.tar.gz" | sha256sum -c - \
&& tar -xzf "nodejs.tar.gz" -C /usr/local --strip-components=1 \
&& rm nodejs.tar.gz \
&& ln -s /usr/local/bin/node /usr/local/bin/nodejs
FROM sdk-with-node AS updated-npm FROM ${NODE_IMAGE} as node-build
RUN npm i -g npm WORKDIR /web
COPY src/Web/WebMVC .
FROM updated-npm as build
RUN npm install -g bower@1.8.4 RUN npm install -g bower@1.8.4
RUN bower install --allow-root
FROM dotnet-build as build
WORKDIR /src/src/Web/WebMVC/wwwroot
COPY --from=node-build /web/wwwroot .
WORKDIR /src WORKDIR /src
COPY . . COPY . .
WORKDIR /src/src/Web/WebMVC WORKDIR /src/src/Web/WebMVC
RUN dotnet restore -nowarn:msb3202,nu1503 RUN dotnet restore -nowarn:msb3202,nu1503
RUN dotnet build --no-restore -c Release -o /app
FROM build AS publish FROM build AS publish
RUN dotnet publish --no-restore -c Release -o /app RUN dotnet publish --no-restore -c Release -o /app

View File

@ -31,7 +31,6 @@
</ItemGroup> </ItemGroup>
<Target Name="PrepublishScript" BeforeTargets="PrepareForPublish"> <Target Name="PrepublishScript" BeforeTargets="PrepareForPublish">
<Exec Command="bower install --allow-root" />
<Exec Command="dotnet bundle" Condition="'$(ASPNETCORE_ENVIRONMENT)'!='Development'" /> <Exec Command="dotnet bundle" Condition="'$(ASPNETCORE_ENVIRONMENT)'!='Development'" />
</Target> </Target>

View File

@ -1,28 +1,24 @@
ARG NODE_IMAGE=node:8.11
FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base
WORKDIR /app WORKDIR /app
EXPOSE 80 EXPOSE 80
FROM microsoft/dotnet:2.1-sdk AS sdk-with-node FROM microsoft/dotnet:2.1-sdk as dotnet-build
ENV NODE_VERSION 8.11.1 WORKDIR /src
ENV NODE_DOWNLOAD_SHA 0e20787e2eda4cc31336d8327556ebc7417e8ee0a6ba0de96a09b0ec2b841f60
RUN curl -SL "https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-x64.tar.gz" --output nodejs.tar.gz \
&& echo "$NODE_DOWNLOAD_SHA nodejs.tar.gz" | sha256sum -c - \
&& tar -xzf "nodejs.tar.gz" -C /usr/local --strip-components=1 \
&& rm nodejs.tar.gz \
&& ln -s /usr/local/bin/node /usr/local/bin/nodejs
FROM sdk-with-node AS updated-npm FROM ${NODE_IMAGE} as node-build
RUN npm i -g npm WORKDIR /web
COPY src/Web/WebSPA .
RUN npm install
RUN npm run build:prod
FROM updated-npm as build FROM dotnet-build as publish
WORKDIR /src/src/Web/WebSPA/wwwroot
COPY --from=node-build /web/wwwroot .
WORKDIR /src WORKDIR /src
COPY . . COPY . .
WORKDIR /src/src/Web/WebSPA WORKDIR /src/src/Web/WebSPA
RUN dotnet restore -nowarn:msb3202,nu1503 RUN dotnet publish -c Release -o /app
RUN dotnet build --no-restore -c Release -o /app
FROM build AS publish
RUN dotnet publish --no-restore -c Release -o /app
FROM base AS final FROM base AS final
WORKDIR /app WORKDIR /app

View File

@ -94,16 +94,6 @@
<PackageReference Include="Newtonsoft.Json" Version="11.0.2" /> <PackageReference Include="Newtonsoft.Json" Version="11.0.2" />
</ItemGroup> </ItemGroup>
<!-- workaround for https://github.com/aspnet/websdk/issues/114 -->
<Target Name="PrepublishScript" BeforeTargets="PrepareForPublish">
<Exec Command="npm install" />
<Exec Command="npm run build:prod" />
<ItemGroup>
<_GeneratedFiles Include="$(GeneratedItemPatterns)" />
<ContentWithTargetPath Include="@(_GeneratedFiles)" TargetPath="%(Identity)" CopyToPublishDirectory="PreserveNewest" />
</ItemGroup>
</Target>
<!-- workaround for https://github.com/aspnet/websdk/issues/114 --> <!-- workaround for https://github.com/aspnet/websdk/issues/114 -->
<!-- <!--