Browse Source

Changes in Basket Integration

pull/49/merge
Javier Suárez Ruiz 8 years ago
parent
commit
2ab72466fc
10 changed files with 77 additions and 51 deletions
  1. +16
    -0
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/Controls/BindablePicker.cs
  2. +1
    -1
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/Models/Basket/BasketItem.cs
  3. +12
    -2
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Basket/BasketMockService.cs
  4. +4
    -4
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Basket/BasketService.cs
  5. +2
    -2
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Basket/IBasketService.cs
  6. +6
    -8
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/RequestProvider/IRequestProvider.cs
  7. +18
    -29
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/RequestProvider/RequestProvider.cs
  8. +6
    -3
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/BasketViewModel.cs
  9. +4
    -1
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CheckoutViewModel.cs
  10. +8
    -1
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/LoginViewModel.cs

+ 16
- 0
src/Mobile/eShopOnContainers/eShopOnContainers.Core/Controls/BindablePicker.cs View File

@ -1,5 +1,6 @@
using System; using System;
using System.Collections; using System.Collections;
using System.Windows.Input;
using Xamarin.Forms; using Xamarin.Forms;
namespace eShopOnContainers.Core.Controls namespace eShopOnContainers.Core.Controls
@ -12,6 +13,9 @@ namespace eShopOnContainers.Core.Controls
public static readonly BindableProperty SelectedItemProperty = BindableProperty.Create("SelectedItem", public static readonly BindableProperty SelectedItemProperty = BindableProperty.Create("SelectedItem",
typeof(object), typeof(BindablePicker), null, BindingMode.TwoWay, propertyChanged: OnSelectedItemChanged); typeof(object), typeof(BindablePicker), null, BindingMode.TwoWay, propertyChanged: OnSelectedItemChanged);
public static readonly BindableProperty ItemSelectedCommandProperty = BindableProperty.Create("ItemSelectedCommand",
typeof(ICommand), typeof(BindablePicker), null);
public BindablePicker() public BindablePicker()
{ {
SelectedIndexChanged += (o, e) => SelectedIndexChanged += (o, e) =>
@ -23,6 +27,7 @@ namespace eShopOnContainers.Core.Controls
} }
var index = 0; var index = 0;
foreach (var item in ItemsSource) foreach (var item in ItemsSource)
{ {
if (index == SelectedIndex) if (index == SelectedIndex)
@ -54,6 +59,12 @@ namespace eShopOnContainers.Core.Controls
} }
} }
public ICommand ItemSelectedCommand
{
get { return (ICommand)GetValue(ItemSelectedCommandProperty); }
set { SetValue(ItemSelectedCommandProperty, value); }
}
public event EventHandler<SelectedItemChangedEventArgs> ItemSelected; public event EventHandler<SelectedItemChangedEventArgs> ItemSelected;
private void InternalUpdateSelectedIndex() private void InternalUpdateSelectedIndex()
@ -107,6 +118,11 @@ namespace eShopOnContainers.Core.Controls
boundPicker.ItemSelected(boundPicker, new SelectedItemChangedEventArgs(newValue)); boundPicker.ItemSelected(boundPicker, new SelectedItemChangedEventArgs(newValue));
} }
if(boundPicker.ItemSelectedCommand != null)
{
boundPicker.ItemSelectedCommand.Execute(newValue);
}
boundPicker.InternalUpdateSelectedIndex(); boundPicker.InternalUpdateSelectedIndex();
} }
} }


+ 1
- 1
src/Mobile/eShopOnContainers/eShopOnContainers.Core/Models/Basket/BasketItem.cs View File

@ -105,4 +105,4 @@ namespace eShopOnContainers.Core.Models.Basket
return String.Format("Product Id: {0}, Quantity: {1}", ProductId, Quantity); return String.Format("Product Id: {0}, Quantity: {1}", ProductId, Quantity);
} }
} }
}
}

+ 12
- 2
src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Basket/BasketMockService.cs View File

@ -29,19 +29,29 @@ namespace eShopOnContainers.Core.Services.Basket
return MockCustomBasket; return MockCustomBasket;
} }
public async Task<CustomerBasket> UpdateBasketAsync(CustomerBasket customerBasket)
public async Task<CustomerBasket> UpdateBasketAsync(CustomerBasket customerBasket, string token)
{ {
await Task.Delay(500); await Task.Delay(500);
if (string.IsNullOrEmpty(token))
{
return new CustomerBasket();
}
MockCustomBasket = customerBasket; MockCustomBasket = customerBasket;
return MockCustomBasket; return MockCustomBasket;
} }
public async Task ClearBasketAsync(string guidUser)
public async Task ClearBasketAsync(string guidUser, string token)
{ {
await Task.Delay(500); await Task.Delay(500);
if (string.IsNullOrEmpty(token))
{
return;
}
if (!string.IsNullOrEmpty(guidUser)) if (!string.IsNullOrEmpty(guidUser))
{ {
MockCustomBasket.Items.Clear(); MockCustomBasket.Items.Clear();


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

@ -39,18 +39,18 @@ namespace eShopOnContainers.Core.Services.Basket
} }
} }
public async Task<CustomerBasket> UpdateBasketAsync(CustomerBasket customerBasket)
public async Task<CustomerBasket> UpdateBasketAsync(CustomerBasket customerBasket, string token)
{ {
UriBuilder builder = new UriBuilder(GlobalSetting.Instance.BasketEndpoint); UriBuilder builder = new UriBuilder(GlobalSetting.Instance.BasketEndpoint);
string uri = builder.ToString(); string uri = builder.ToString();
var result = await _requestProvider.PostAsync(uri, customerBasket);
var result = await _requestProvider.PostAsync(uri, customerBasket, token);
return result; return result;
} }
public async Task ClearBasketAsync(string guidUser)
public async Task ClearBasketAsync(string guidUser, string token)
{ {
UriBuilder builder = new UriBuilder(GlobalSetting.Instance.BasketEndpoint); UriBuilder builder = new UriBuilder(GlobalSetting.Instance.BasketEndpoint);
@ -58,7 +58,7 @@ namespace eShopOnContainers.Core.Services.Basket
string uri = builder.ToString(); string uri = builder.ToString();
await _requestProvider.DeleteAsync(uri);
await _requestProvider.DeleteAsync(uri, token);
} }
} }
} }

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

@ -6,7 +6,7 @@ namespace eShopOnContainers.Core.Services.Basket
public interface IBasketService public interface IBasketService
{ {
Task<CustomerBasket> GetBasketAsync(string guidUser, string token); Task<CustomerBasket> GetBasketAsync(string guidUser, string token);
Task<CustomerBasket> UpdateBasketAsync(CustomerBasket customerBasket);
Task ClearBasketAsync(string guidUser);
Task<CustomerBasket> UpdateBasketAsync(CustomerBasket customerBasket, string token);
Task ClearBasketAsync(string guidUser, string token);
} }
} }

+ 6
- 8
src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/RequestProvider/IRequestProvider.cs View File

@ -4,18 +4,16 @@ namespace eShopOnContainers.Core.Services.RequestProvider
{ {
public interface IRequestProvider public interface IRequestProvider
{ {
Task<TResult> GetAsync<TResult>(string uri);
Task<TResult> GetAsync<TResult>(string uri, string token = "");
Task<TResult> GetAsync<TResult>(string uri, string token);
Task<TResult> PostAsync<TResult>(string uri, TResult data, string token = "");
Task<TResult> PostAsync<TResult>(string uri, TResult data);
Task<TResult> PostAsync<TRequest, TResult>(string uri, TRequest data, string token = "");
Task<TResult> PostAsync<TRequest, TResult>(string uri, TRequest data);
Task<TResult> PutAsync<TResult>(string uri, TResult data, string token = "");
Task<TResult> PutAsync<TResult>(string uri, TResult data);
Task<TResult> PutAsync<TRequest, TResult>(string uri, TRequest data, string token = "");
Task<TResult> PutAsync<TRequest, TResult>(string uri, TRequest data);
Task DeleteAsync(string uri);
Task DeleteAsync(string uri, string token = "");
} }
} }

+ 18
- 29
src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/RequestProvider/RequestProvider.cs View File

@ -26,9 +26,9 @@ namespace eShopOnContainers.Core.Services.RequestProvider
_serializerSettings.Converters.Add(new StringEnumConverter()); _serializerSettings.Converters.Add(new StringEnumConverter());
} }
public async Task<TResult> GetAsync<TResult>(string uri)
public async Task<TResult> GetAsync<TResult>(string uri, string token = "")
{ {
HttpClient httpClient = CreateHttpClient();
HttpClient httpClient = CreateHttpClient(token);
HttpResponseMessage response = await httpClient.GetAsync(uri); HttpResponseMessage response = await httpClient.GetAsync(uri);
await HandleResponse(response); await HandleResponse(response);
@ -41,30 +41,14 @@ namespace eShopOnContainers.Core.Services.RequestProvider
return result; return result;
} }
public async Task<TResult> GetAsync<TResult>(string uri, string token)
public Task<TResult> PostAsync<TResult>(string uri, TResult data, string token = "")
{ {
HttpClient httpClient = CreateHttpClient();
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
HttpResponseMessage response = await httpClient.GetAsync(uri);
await HandleResponse(response);
string serialized = await response.Content.ReadAsStringAsync();
TResult result = await Task.Run(() =>
JsonConvert.DeserializeObject<TResult>(serialized, _serializerSettings));
return result;
}
public Task<TResult> PostAsync<TResult>(string uri, TResult data)
{
return PostAsync<TResult, TResult>(uri, data);
return PostAsync<TResult, TResult>(uri, data, token);
} }
public async Task<TResult> PostAsync<TRequest, TResult>(string uri, TRequest data)
public async Task<TResult> PostAsync<TRequest, TResult>(string uri, TRequest data, string token = "")
{ {
HttpClient httpClient = CreateHttpClient();
HttpClient httpClient = CreateHttpClient(token);
string serialized = await Task.Run(() => JsonConvert.SerializeObject(data, _serializerSettings)); string serialized = await Task.Run(() => JsonConvert.SerializeObject(data, _serializerSettings));
HttpResponseMessage response = await httpClient.PostAsync(uri, new StringContent(serialized, Encoding.UTF8, "application/json")); HttpResponseMessage response = await httpClient.PostAsync(uri, new StringContent(serialized, Encoding.UTF8, "application/json"));
@ -75,14 +59,14 @@ namespace eShopOnContainers.Core.Services.RequestProvider
return await Task.Run(() => JsonConvert.DeserializeObject<TResult>(responseData, _serializerSettings)); return await Task.Run(() => JsonConvert.DeserializeObject<TResult>(responseData, _serializerSettings));
} }
public Task<TResult> PutAsync<TResult>(string uri, TResult data)
public Task<TResult> PutAsync<TResult>(string uri, TResult data, string token = "")
{ {
return PutAsync<TResult, TResult>(uri, data);
return PutAsync<TResult, TResult>(uri, data, token);
} }
public async Task<TResult> PutAsync<TRequest, TResult>(string uri, TRequest data)
public async Task<TResult> PutAsync<TRequest, TResult>(string uri, TRequest data, string token = "")
{ {
HttpClient httpClient = CreateHttpClient();
HttpClient httpClient = CreateHttpClient(token);
string serialized = await Task.Run(() => JsonConvert.SerializeObject(data, _serializerSettings)); string serialized = await Task.Run(() => JsonConvert.SerializeObject(data, _serializerSettings));
HttpResponseMessage response = await httpClient.PutAsync(uri, new StringContent(serialized, Encoding.UTF8, "application/json")); HttpResponseMessage response = await httpClient.PutAsync(uri, new StringContent(serialized, Encoding.UTF8, "application/json"));
@ -93,19 +77,24 @@ namespace eShopOnContainers.Core.Services.RequestProvider
return await Task.Run(() => JsonConvert.DeserializeObject<TResult>(responseData, _serializerSettings)); return await Task.Run(() => JsonConvert.DeserializeObject<TResult>(responseData, _serializerSettings));
} }
public async Task DeleteAsync(string uri)
public async Task DeleteAsync(string uri, string token = "")
{ {
HttpClient httpClient = CreateHttpClient();
HttpClient httpClient = CreateHttpClient(token);
await httpClient.DeleteAsync(uri); await httpClient.DeleteAsync(uri);
} }
private HttpClient CreateHttpClient()
private HttpClient CreateHttpClient(string token = "")
{ {
var httpClient = new HttpClient(); var httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
if (!string.IsNullOrEmpty(token))
{
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
}
return httpClient; return httpClient;
} }


+ 6
- 3
src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/BasketViewModel.cs View File

@ -1,4 +1,5 @@
using eShopOnContainers.Core.Models.Basket;
using eShopOnContainers.Core.Helpers;
using eShopOnContainers.Core.Models.Basket;
using eShopOnContainers.Core.Models.Catalog; using eShopOnContainers.Core.Models.Catalog;
using eShopOnContainers.Core.Models.User; using eShopOnContainers.Core.Models.User;
using eShopOnContainers.Core.Services.Basket; using eShopOnContainers.Core.Services.Basket;
@ -133,12 +134,14 @@ namespace eShopOnContainers.Core.ViewModels
{ {
Total += (orderItem.Quantity * orderItem.UnitPrice); Total += (orderItem.Quantity * orderItem.UnitPrice);
} }
var authToken = Settings.AuthAccessToken;
_basketService.UpdateBasketAsync(new CustomerBasket _basketService.UpdateBasketAsync(new CustomerBasket
{ {
BuyerId = _user.GuidUser, BuyerId = _user.GuidUser,
Items = BasketItems.ToList() Items = BasketItems.ToList()
});
}, authToken);
} }
private void Checkout() private void Checkout()


+ 4
- 1
src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CheckoutViewModel.cs View File

@ -13,6 +13,7 @@ using eShopOnContainers.Core.Models.Basket;
using System.Collections.Generic; using System.Collections.Generic;
using eShopOnContainers.Core.Services.Basket; using eShopOnContainers.Core.Services.Basket;
using eShopOnContainers.Core.Services.Order; using eShopOnContainers.Core.Services.Order;
using eShopOnContainers.Core.Helpers;
namespace eShopOnContainers.Core.ViewModels namespace eShopOnContainers.Core.ViewModels
{ {
@ -94,8 +95,10 @@ namespace eShopOnContainers.Core.ViewModels
private async void Checkout() private async void Checkout()
{ {
var authToken = Settings.AuthAccessToken;
await _orderService.CreateOrderAsync(Order); await _orderService.CreateOrderAsync(Order);
await _basketService.ClearBasketAsync(User.GuidUser);
await _basketService.ClearBasketAsync(User.GuidUser, authToken);
await NavigationService.NavigateToAsync<MainViewModel>(new TabParameter { TabIndex = 1 }); await NavigationService.NavigateToAsync<MainViewModel>(new TabParameter { TabIndex = 1 });
await NavigationService.RemoveLastFromBackStackAsync(); await NavigationService.RemoveLastFromBackStackAsync();


+ 8
- 1
src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/LoginViewModel.cs View File

@ -186,9 +186,9 @@ namespace eShopOnContainers.Core.ViewModels
if(!string.IsNullOrEmpty(logoutRequest)) if(!string.IsNullOrEmpty(logoutRequest))
{ {
IsValid = false;
LoginUrl = logoutRequest; LoginUrl = logoutRequest;
Settings.AuthAccessToken = string.Empty; Settings.AuthAccessToken = string.Empty;
IsValid = true;
} }
} }
@ -209,6 +209,13 @@ namespace eShopOnContainers.Core.ViewModels
} }
} }
} }
/*
if(url.Contains("endsession"))
{
await SignInAsync();
}
*/
} }
private bool Validate() private bool Validate()


Loading…
Cancel
Save