diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/GlobalSettings.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/GlobalSettings.cs index 41f18c98d..61fc7da42 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/GlobalSettings.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/GlobalSettings.cs @@ -1,4 +1,6 @@ -namespace eShopOnContainers.Core +using System; + +namespace eShopOnContainers.Core { public class GlobalSetting { @@ -59,7 +61,7 @@ public string RegisterWebsite { get; set; } - public string IdentityEndpoint { get; set; } + public string AuthorizeEndpoint { get; set; } public string UserInfoEndpoint { get; set; } @@ -67,7 +69,7 @@ public string LogoutEndpoint { get; set; } - public string IdentityCallback { get; set; } + public string Callback { get; set; } public string LogoutCallback { get; set; } @@ -77,27 +79,35 @@ private void UpdateEndpoint(string endpoint) { - var identityBaseEndpoint = $"{endpoint}/identity"; - RegisterWebsite = $"{identityBaseEndpoint}/Account/Register"; - LogoutCallback = $"{identityBaseEndpoint}/Account/Redirecting"; + RegisterWebsite = $"{endpoint}/Account/Register"; + LogoutCallback = $"{endpoint}/Account/Redirecting"; - var connectBaseEndpoint = $"{identityBaseEndpoint}/connect"; - IdentityEndpoint = $"{connectBaseEndpoint}/authorize"; + var connectBaseEndpoint = $"{endpoint}/connect"; + AuthorizeEndpoint = $"{connectBaseEndpoint}/authorize"; UserInfoEndpoint = $"{connectBaseEndpoint}/userinfo"; TokenEndpoint = $"{connectBaseEndpoint}/token"; LogoutEndpoint = $"{connectBaseEndpoint}/endsession"; - IdentityCallback = $"{endpoint}/xamarincallback"; + var baseUri = ExtractBaseUri(endpoint); + Callback = $"{baseUri}/xamarincallback"; } private void UpdateGatewayShoppingEndpoint(string endpoint) { - GatewayShoppingEndpoint = $"{endpoint}/mobileshoppingapigw"; + GatewayShoppingEndpoint = $"{endpoint}"; } private void UpdateGatewayMarketingEndpoint(string endpoint) { - GatewayMarketingEndpoint = $"{endpoint}/mobilemarketingapigw"; + GatewayMarketingEndpoint = $"{endpoint}"; + } + + private string ExtractBaseUri(string endpoint) + { + var uri = new Uri(endpoint); + var baseUri = uri.GetLeftPart(System.UriPartial.Authority); + + return baseUri; } } } \ No newline at end of file diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Helpers/UriHelper.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Helpers/UriHelper.cs new file mode 100644 index 000000000..0aef68db5 --- /dev/null +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Helpers/UriHelper.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace eShopOnContainers.Core.Helpers +{ + public static class UriHelper + { + public static string CombineUri(params string[] uriParts) + { + string uri = string.Empty; + if (uriParts != null && uriParts.Count() > 0) + { + char[] trims = new char[] { '\\', '/' }; + uri = (uriParts[0] ?? string.Empty).TrimEnd(trims); + for (int i = 1; i < uriParts.Count(); i++) + { + uri = string.Format("{0}/{1}", uri.TrimEnd(trims), (uriParts[i] ?? string.Empty).TrimStart(trims)); + } + } + return uri; + } + } +} diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Basket/BasketService.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Basket/BasketService.cs index a53967e56..48814341b 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Basket/BasketService.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Basket/BasketService.cs @@ -3,6 +3,7 @@ using System.Threading.Tasks; using eShopOnContainers.Core.Services.RequestProvider; using eShopOnContainers.Core.Models.Basket; using eShopOnContainers.Core.Services.FixUri; +using eShopOnContainers.Core.Helpers; namespace eShopOnContainers.Core.Services.Basket { @@ -21,12 +22,7 @@ namespace eShopOnContainers.Core.Services.Basket public async Task GetBasketAsync(string guidUser, string token) { - var builder = new UriBuilder(GlobalSetting.Instance.GatewayShoppingEndpoint) - { - Path = $"{ApiUrlBase}/{guidUser}" - }; - - var uri = builder.ToString(); + var uri = UriHelper.CombineUri(GlobalSetting.Instance.GatewayShoppingEndpoint, $"{ApiUrlBase}/{guidUser}"); CustomerBasket basket; @@ -45,35 +41,23 @@ namespace eShopOnContainers.Core.Services.Basket public async Task UpdateBasketAsync(CustomerBasket customerBasket, string token) { - var builder = new UriBuilder(GlobalSetting.Instance.GatewayShoppingEndpoint) - { - Path = ApiUrlBase - }; + var uri = UriHelper.CombineUri(GlobalSetting.Instance.GatewayShoppingEndpoint, ApiUrlBase); - var uri = builder.ToString(); var result = await _requestProvider.PostAsync(uri, customerBasket, token); return result; } public async Task CheckoutAsync(BasketCheckout basketCheckout, string token) { - var builder = new UriBuilder(GlobalSetting.Instance.GatewayShoppingEndpoint) - { - Path = $"{ApiUrlBase}/checkout" - }; + var uri = UriHelper.CombineUri(GlobalSetting.Instance.GatewayShoppingEndpoint, $"{ApiUrlBase}/checkout"); - var uri = builder.ToString(); await _requestProvider.PostAsync(uri, basketCheckout, token); } public async Task ClearBasketAsync(string guidUser, string token) { - var builder = new UriBuilder(GlobalSetting.Instance.GatewayShoppingEndpoint) - { - Path = $"{ApiUrlBase}/{guidUser}" - }; + var uri = UriHelper.CombineUri(GlobalSetting.Instance.GatewayShoppingEndpoint, $"{ApiUrlBase}/{guidUser}"); - var uri = builder.ToString(); await _requestProvider.DeleteAsync(uri, token); } } diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Catalog/CatalogService.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Catalog/CatalogService.cs index c9d3ef708..a13c22cb8 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Catalog/CatalogService.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Catalog/CatalogService.cs @@ -6,6 +6,7 @@ using eShopOnContainers.Core.Services.RequestProvider; using eShopOnContainers.Core.Extensions; using System.Collections.Generic; using eShopOnContainers.Core.Services.FixUri; +using eShopOnContainers.Core.Helpers; namespace eShopOnContainers.Core.Services.Catalog { @@ -24,9 +25,7 @@ namespace eShopOnContainers.Core.Services.Catalog public async Task> FilterAsync(int catalogBrandId, int catalogTypeId) { - UriBuilder builder = new UriBuilder(GlobalSetting.Instance.GatewayShoppingEndpoint); - builder.Path = $"{ApiUrlBase}/items/type/{catalogTypeId}/brand/{catalogBrandId}"; - string uri = builder.ToString(); + var uri = UriHelper.CombineUri(GlobalSetting.Instance.GatewayShoppingEndpoint, $"{ApiUrlBase}/items/type/{catalogTypeId}/brand/{catalogBrandId}"); CatalogRoot catalog = await _requestProvider.GetAsync(uri); @@ -38,9 +37,7 @@ namespace eShopOnContainers.Core.Services.Catalog public async Task> GetCatalogAsync() { - UriBuilder builder = new UriBuilder(GlobalSetting.Instance.GatewayShoppingEndpoint); - builder.Path = $"{ApiUrlBase}/items"; - string uri = builder.ToString(); + var uri = UriHelper.CombineUri(GlobalSetting.Instance.GatewayShoppingEndpoint, $"{ApiUrlBase}/items"); CatalogRoot catalog = await _requestProvider.GetAsync(uri); @@ -55,9 +52,7 @@ namespace eShopOnContainers.Core.Services.Catalog public async Task> GetCatalogBrandAsync() { - UriBuilder builder = new UriBuilder(GlobalSetting.Instance.GatewayShoppingEndpoint); - builder.Path = $"{ApiUrlBase}/catalogbrands"; - string uri = builder.ToString(); + var uri = UriHelper.CombineUri(GlobalSetting.Instance.GatewayShoppingEndpoint, $"{ApiUrlBase}/catalogbrands"); IEnumerable brands = await _requestProvider.GetAsync>(uri); @@ -69,9 +64,7 @@ namespace eShopOnContainers.Core.Services.Catalog public async Task> GetCatalogTypeAsync() { - UriBuilder builder = new UriBuilder(GlobalSetting.Instance.GatewayShoppingEndpoint); - builder.Path = $"{ApiUrlBase}/catalogtypes"; - string uri = builder.ToString(); + var uri = UriHelper.CombineUri(GlobalSetting.Instance.GatewayShoppingEndpoint, $"{ApiUrlBase}/catalogtypes"); IEnumerable types = await _requestProvider.GetAsync>(uri); diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Identity/IdentityService.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Identity/IdentityService.cs index a9d0d2c82..0223b48c3 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Identity/IdentityService.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Identity/IdentityService.cs @@ -25,7 +25,7 @@ namespace eShopOnContainers.Core.Services.Identity public string CreateAuthorizationRequest() { // Create URI to authorization endpoint - var authorizeRequest = new AuthorizeRequest(GlobalSetting.Instance.IdentityEndpoint); + var authorizeRequest = new AuthorizeRequest(GlobalSetting.Instance.AuthorizeEndpoint); // Dictionary with values for the authorize request var dic = new Dictionary(); @@ -33,7 +33,7 @@ namespace eShopOnContainers.Core.Services.Identity dic.Add("client_secret", GlobalSetting.Instance.ClientSecret); dic.Add("response_type", "code id_token"); dic.Add("scope", "openid profile basket orders locations marketing offline_access"); - dic.Add("redirect_uri", GlobalSetting.Instance.IdentityCallback); + dic.Add("redirect_uri", GlobalSetting.Instance.Callback); dic.Add("nonce", Guid.NewGuid().ToString("N")); dic.Add("code_challenge", CreateCodeChallenge()); dic.Add("code_challenge_method", "S256"); @@ -61,7 +61,7 @@ namespace eShopOnContainers.Core.Services.Identity public async Task GetTokenAsync(string code) { - string data = string.Format("grant_type=authorization_code&code={0}&redirect_uri={1}&code_verifier={2}", code, WebUtility.UrlEncode(GlobalSetting.Instance.IdentityCallback), _codeVerifier); + string data = string.Format("grant_type=authorization_code&code={0}&redirect_uri={1}&code_verifier={2}", code, WebUtility.UrlEncode(GlobalSetting.Instance.Callback), _codeVerifier); var token = await _requestProvider.PostAsync(GlobalSetting.Instance.TokenEndpoint, data, GlobalSetting.Instance.ClientId, GlobalSetting.Instance.ClientSecret); return token; } diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Location/LocationService.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Location/LocationService.cs index 3a35a303c..b93071368 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Location/LocationService.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Location/LocationService.cs @@ -1,5 +1,6 @@ using System; using System.Threading.Tasks; +using eShopOnContainers.Core.Helpers; using eShopOnContainers.Core.Services.RequestProvider; namespace eShopOnContainers.Core.Services.Location @@ -17,9 +18,8 @@ namespace eShopOnContainers.Core.Services.Location public async Task UpdateUserLocation(eShopOnContainers.Core.Models.Location.Location newLocReq, string token) { - UriBuilder builder = new UriBuilder(GlobalSetting.Instance.GatewayMarketingEndpoint); - builder.Path = ApiUrlBase; - string uri = builder.ToString(); + var uri = UriHelper.CombineUri(GlobalSetting.Instance.GatewayMarketingEndpoint, ApiUrlBase); + await _requestProvider.PostAsync(uri, newLocReq, token); } } diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Marketing/CampaignService.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Marketing/CampaignService.cs index 926a03d1e..7ff7ae50d 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Marketing/CampaignService.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Marketing/CampaignService.cs @@ -1,4 +1,5 @@ using eShopOnContainers.Core.Extensions; +using eShopOnContainers.Core.Helpers; using eShopOnContainers.Core.Models.Marketing; using eShopOnContainers.Core.Services.FixUri; using eShopOnContainers.Core.Services.RequestProvider; @@ -23,9 +24,7 @@ namespace eShopOnContainers.Core.Services.Marketing public async Task> GetAllCampaignsAsync(string token) { - UriBuilder builder = new UriBuilder(GlobalSetting.Instance.GatewayMarketingEndpoint); - builder.Path = $"{ApiUrlBase}/user"; - string uri = builder.ToString(); + var uri = UriHelper.CombineUri(GlobalSetting.Instance.GatewayMarketingEndpoint, $"{ApiUrlBase}/user"); CampaignRoot campaign = await _requestProvider.GetAsync(uri, token); @@ -40,9 +39,8 @@ namespace eShopOnContainers.Core.Services.Marketing public async Task GetCampaignByIdAsync(int campaignId, string token) { - UriBuilder builder = new UriBuilder(GlobalSetting.Instance.GatewayMarketingEndpoint); - builder.Path = $"{ApiUrlBase}/{campaignId}"; - string uri = builder.ToString(); + var uri = UriHelper.CombineUri(GlobalSetting.Instance.GatewayMarketingEndpoint, $"{ApiUrlBase}/{campaignId}"); + return await _requestProvider.GetAsync(uri, token); } } diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Order/OrderService.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Order/OrderService.cs index 7595a7212..3447a21d2 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Order/OrderService.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Order/OrderService.cs @@ -1,4 +1,5 @@ -using eShopOnContainers.Core.Models.Basket; +using eShopOnContainers.Core.Helpers; +using eShopOnContainers.Core.Models.Basket; using eShopOnContainers.Core.Models.Orders; using eShopOnContainers.Core.Services.RequestProvider; using System; @@ -25,11 +26,7 @@ namespace eShopOnContainers.Core.Services.Order public async Task> GetOrdersAsync(string token) { - UriBuilder builder = new UriBuilder(GlobalSetting.Instance.GatewayShoppingEndpoint); - - builder.Path = ApiUrlBase; - - string uri = builder.ToString(); + var uri = UriHelper.CombineUri(GlobalSetting.Instance.GatewayShoppingEndpoint, ApiUrlBase); ObservableCollection orders = await _requestProvider.GetAsync>(uri, token); @@ -42,11 +39,7 @@ namespace eShopOnContainers.Core.Services.Order { try { - UriBuilder builder = new UriBuilder(GlobalSetting.Instance.GatewayShoppingEndpoint); - - builder.Path = $"{ApiUrlBase}/{orderId}"; - - string uri = builder.ToString(); + var uri = UriHelper.CombineUri(GlobalSetting.Instance.GatewayShoppingEndpoint, $"{ApiUrlBase}/{orderId}"); Models.Orders.Order order = await _requestProvider.GetAsync(uri, token); @@ -78,13 +71,10 @@ namespace eShopOnContainers.Core.Services.Order public async Task CancelOrderAsync(int orderId, string token) { - UriBuilder builder = new UriBuilder(GlobalSetting.Instance.GatewayShoppingEndpoint); - - builder.Path = $"{ApiUrlBase}/cancel"; + var uri = UriHelper.CombineUri(GlobalSetting.Instance.GatewayShoppingEndpoint, $"{ApiUrlBase}/cancel"); var cancelOrderCommand = new CancelOrderCommand(orderId); - string uri = builder.ToString(); var header = "x-requestid"; try diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/User/UserService.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/User/UserService.cs index e52d24489..6056fcf7f 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/User/UserService.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/User/UserService.cs @@ -1,4 +1,5 @@ -using eShopOnContainers.Core.Models.User; +using eShopOnContainers.Core.Helpers; +using eShopOnContainers.Core.Models.User; using eShopOnContainers.Core.Services.RequestProvider; using System; using System.Threading.Tasks; @@ -16,8 +17,8 @@ namespace eShopOnContainers.Core.Services.User public async Task GetUserInfoAsync(string authToken) { - UriBuilder builder = new UriBuilder(GlobalSetting.Instance.UserInfoEndpoint); - string uri = builder.ToString(); + var uri = UriHelper.CombineUri(GlobalSetting.Instance.UserInfoEndpoint); + var userInfo = await _requestProvider.GetAsync(uri, authToken); return userInfo; } diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/LoginViewModel.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/LoginViewModel.cs index 2ed8cf83c..cc04deba4 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/LoginViewModel.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/LoginViewModel.cs @@ -234,7 +234,7 @@ namespace eShopOnContainers.Core.ViewModels IsLogin = false; LoginUrl = _identityService.CreateAuthorizationRequest(); } - else if (unescapedUrl.Contains(GlobalSetting.Instance.IdentityCallback)) + else if (unescapedUrl.Contains(GlobalSetting.Instance.Callback)) { var authResponse = new AuthorizeResponse(url); if (!string.IsNullOrWhiteSpace(authResponse.Code))