2017-03-17 10:00:18 +01:00
|
|
|
|
using Microsoft.AspNetCore.Authentication;
|
2016-11-02 20:41:12 +01:00
|
|
|
|
using Microsoft.AspNetCore.Http;
|
2017-04-06 16:59:17 +02:00
|
|
|
|
using Microsoft.eShopOnContainers.BuildingBlocks.Resilience.Http;
|
2017-03-17 10:00:18 +01:00
|
|
|
|
using Microsoft.eShopOnContainers.WebMVC.ViewModels;
|
2016-11-16 10:19:00 +01:00
|
|
|
|
using Microsoft.Extensions.Options;
|
|
|
|
|
using Newtonsoft.Json;
|
2017-03-17 10:00:18 +01:00
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Threading.Tasks;
|
2017-05-04 13:01:14 +02:00
|
|
|
|
using WebMVC.Infrastructure;
|
2017-05-11 11:51:13 +02:00
|
|
|
|
using WebMVC.Models;
|
2016-11-02 20:41:12 +01:00
|
|
|
|
|
|
|
|
|
namespace Microsoft.eShopOnContainers.WebMVC.Services
|
|
|
|
|
{
|
|
|
|
|
public class BasketService : IBasketService
|
|
|
|
|
{
|
2017-02-06 13:53:36 +01:00
|
|
|
|
private readonly IOptionsSnapshot<AppSettings> _settings;
|
2018-01-31 15:35:40 +00:00
|
|
|
|
private readonly IHttpClient _apiClient;
|
2016-11-16 10:19:00 +01:00
|
|
|
|
private readonly string _remoteServiceBaseUrl;
|
2018-01-31 15:35:40 +00:00
|
|
|
|
private readonly string _purchaseUrl;
|
|
|
|
|
private readonly IHttpContextAccessor _httpContextAccesor;
|
2016-11-02 20:41:12 +01:00
|
|
|
|
|
2018-01-31 15:35:40 +00:00
|
|
|
|
private readonly string _bffUrl;
|
|
|
|
|
|
|
|
|
|
public BasketService(IOptionsSnapshot<AppSettings> settings,
|
|
|
|
|
IHttpContextAccessor httpContextAccesor, IHttpClient httpClient)
|
2016-11-02 20:41:12 +01:00
|
|
|
|
{
|
2016-11-16 10:19:00 +01:00
|
|
|
|
_settings = settings;
|
2017-07-12 12:43:15 +02:00
|
|
|
|
_remoteServiceBaseUrl = $"{_settings.Value.BasketUrl}/api/v1/basket";
|
2018-01-31 15:35:40 +00:00
|
|
|
|
_purchaseUrl = $"{_settings.Value.PurchaseUrl}/api/v1";
|
2016-11-29 15:10:16 +01:00
|
|
|
|
_httpContextAccesor = httpContextAccesor;
|
2017-03-17 13:12:34 +01:00
|
|
|
|
_apiClient = httpClient;
|
2016-11-02 20:41:12 +01:00
|
|
|
|
}
|
|
|
|
|
|
2016-11-16 10:19:00 +01:00
|
|
|
|
public async Task<Basket> GetBasket(ApplicationUser user)
|
2016-11-02 20:41:12 +01:00
|
|
|
|
{
|
2017-05-04 13:01:14 +02:00
|
|
|
|
var token = await GetUserTokenAsync();
|
|
|
|
|
var getBasketUri = API.Basket.GetBasket(_remoteServiceBaseUrl, user.Id);
|
2016-11-29 15:10:16 +01:00
|
|
|
|
|
2017-05-04 13:01:14 +02:00
|
|
|
|
var dataString = await _apiClient.GetStringAsync(getBasketUri, token);
|
2016-11-29 15:10:16 +01:00
|
|
|
|
|
2017-03-20 14:18:20 -04:00
|
|
|
|
// Use the ?? Null conditional operator to simplify the initialization of response
|
2017-05-04 13:01:14 +02:00
|
|
|
|
var response = JsonConvert.DeserializeObject<Basket>(dataString) ??
|
2017-03-20 14:18:20 -04:00
|
|
|
|
new Basket()
|
2016-11-16 10:19:00 +01:00
|
|
|
|
{
|
|
|
|
|
BuyerId = user.Id
|
|
|
|
|
};
|
2016-11-02 20:41:12 +01:00
|
|
|
|
|
2016-11-16 10:19:00 +01:00
|
|
|
|
return response;
|
2016-11-02 20:41:12 +01:00
|
|
|
|
}
|
|
|
|
|
|
2016-11-16 10:19:00 +01:00
|
|
|
|
public async Task<Basket> UpdateBasket(Basket basket)
|
2016-11-02 20:41:12 +01:00
|
|
|
|
{
|
2017-05-04 13:01:14 +02:00
|
|
|
|
var token = await GetUserTokenAsync();
|
|
|
|
|
var updateBasketUri = API.Basket.UpdateBasket(_remoteServiceBaseUrl);
|
2016-11-29 15:10:16 +01:00
|
|
|
|
|
2017-05-04 13:01:14 +02:00
|
|
|
|
var response = await _apiClient.PostAsync(updateBasketUri, basket, token);
|
2016-11-16 10:19:00 +01:00
|
|
|
|
|
2017-03-27 14:05:28 +02:00
|
|
|
|
response.EnsureSuccessStatusCode();
|
|
|
|
|
|
2016-11-16 10:19:00 +01:00
|
|
|
|
return basket;
|
2016-11-02 20:41:12 +01:00
|
|
|
|
}
|
|
|
|
|
|
2017-05-11 11:51:13 +02:00
|
|
|
|
public async Task Checkout(BasketDTO basket)
|
|
|
|
|
{
|
|
|
|
|
var token = await GetUserTokenAsync();
|
|
|
|
|
var updateBasketUri = API.Basket.CheckoutBasket(_remoteServiceBaseUrl);
|
|
|
|
|
|
2017-05-16 09:23:35 +02:00
|
|
|
|
var response = await _apiClient.PostAsync(updateBasketUri, basket, token);
|
2017-05-11 11:51:13 +02:00
|
|
|
|
|
|
|
|
|
response.EnsureSuccessStatusCode();
|
|
|
|
|
}
|
|
|
|
|
|
2016-11-16 10:19:00 +01:00
|
|
|
|
public async Task<Basket> SetQuantities(ApplicationUser user, Dictionary<string, int> quantities)
|
2016-11-02 20:41:12 +01:00
|
|
|
|
{
|
2016-11-16 10:19:00 +01:00
|
|
|
|
var basket = await GetBasket(user);
|
2016-11-02 20:41:12 +01:00
|
|
|
|
|
|
|
|
|
basket.Items.ForEach(x =>
|
|
|
|
|
{
|
2017-03-20 14:18:20 -04:00
|
|
|
|
// Simplify this logic by using the
|
|
|
|
|
// new out variable initializer.
|
|
|
|
|
if (quantities.TryGetValue(x.Id, out var quantity))
|
|
|
|
|
{
|
|
|
|
|
x.Quantity = quantity;
|
|
|
|
|
}
|
2016-11-02 20:41:12 +01:00
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
return basket;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public Order MapBasketToOrder(Basket basket)
|
|
|
|
|
{
|
2016-12-17 14:41:16 +01:00
|
|
|
|
var order = new Order();
|
|
|
|
|
order.Total = 0;
|
2016-11-02 20:41:12 +01:00
|
|
|
|
|
|
|
|
|
basket.Items.ForEach(x =>
|
|
|
|
|
{
|
|
|
|
|
order.OrderItems.Add(new OrderItem()
|
|
|
|
|
{
|
2016-12-17 14:41:16 +01:00
|
|
|
|
ProductId = int.Parse(x.ProductId),
|
2017-05-04 13:01:14 +02:00
|
|
|
|
|
2016-11-02 20:41:12 +01:00
|
|
|
|
PictureUrl = x.PictureUrl,
|
|
|
|
|
ProductName = x.ProductName,
|
2016-12-17 14:41:16 +01:00
|
|
|
|
Units = x.Quantity,
|
2016-11-02 20:41:12 +01:00
|
|
|
|
UnitPrice = x.UnitPrice
|
|
|
|
|
});
|
2016-12-17 14:41:16 +01:00
|
|
|
|
order.Total += (x.Quantity * x.UnitPrice);
|
2016-11-02 20:41:12 +01:00
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
return order;
|
|
|
|
|
}
|
2016-11-03 17:17:26 +01:00
|
|
|
|
|
2018-01-31 15:35:40 +00:00
|
|
|
|
public async Task AddItemToBasket(ApplicationUser user, int productId)
|
2016-11-03 17:17:26 +01:00
|
|
|
|
{
|
2018-01-31 15:35:40 +00:00
|
|
|
|
var token = await GetUserTokenAsync();
|
|
|
|
|
var updateBasketUri = API.Purchase.AddItemToBasket(_purchaseUrl);
|
|
|
|
|
var userId = user.Id;
|
2017-05-04 13:01:14 +02:00
|
|
|
|
|
2018-01-31 15:35:40 +00:00
|
|
|
|
var response = await _apiClient.PostAsync(updateBasketUri, new
|
2016-11-03 17:17:26 +01:00
|
|
|
|
{
|
2018-01-31 15:35:40 +00:00
|
|
|
|
CatalogItemId = productId,
|
|
|
|
|
BasketId = userId,
|
|
|
|
|
Quantity = 1
|
|
|
|
|
}, token);
|
2017-05-04 13:01:14 +02:00
|
|
|
|
|
2018-01-31 15:35:40 +00:00
|
|
|
|
}
|
2017-05-04 13:01:14 +02:00
|
|
|
|
|
|
|
|
|
async Task<string> GetUserTokenAsync()
|
|
|
|
|
{
|
|
|
|
|
var context = _httpContextAccesor.HttpContext;
|
2017-06-22 16:55:57 +02:00
|
|
|
|
return await context.GetTokenAsync("access_token");
|
2017-05-04 13:01:14 +02:00
|
|
|
|
}
|
2016-11-02 20:41:12 +01:00
|
|
|
|
}
|
|
|
|
|
}
|