using Microsoft.eShopOnContainers.WebMVC.ViewModels; using Microsoft.Extensions.Options; using Newtonsoft.Json; using System.Collections.Generic; using System.Linq; using System.Net.Http; using System.Threading.Tasks; using WebMVC.Infrastructure; using WebMVC.Services.ModelDTOs; namespace Microsoft.eShopOnContainers.WebMVC.Services { public class BasketService : IBasketService { private readonly IOptions _settings; private readonly HttpClient _apiClient; private readonly string _basketByPassUrl; private readonly string _purchaseUrl; private readonly string _bffUrl; public BasketService(HttpClient httpClient, IOptions settings) { _apiClient = httpClient; _settings = settings; _basketByPassUrl = $"{_settings.Value.PurchaseUrl}/api/v1/b/basket"; _purchaseUrl = $"{_settings.Value.PurchaseUrl}/api/v1"; } public async Task GetBasket(ApplicationUser user) { var uri = API.Basket.GetBasket(_basketByPassUrl, user.Id); var responseString = await _apiClient.GetStringAsync(uri); return string.IsNullOrEmpty(responseString) ? new Basket() { BuyerId = user.Id } : JsonConvert.DeserializeObject(responseString); } public async Task UpdateBasket(Basket basket) { var uri = API.Basket.UpdateBasket(_basketByPassUrl); var basketContent = new StringContent(JsonConvert.SerializeObject(basket), System.Text.Encoding.UTF8, "application/json"); var response = await _apiClient.PostAsync(uri, basketContent); response.EnsureSuccessStatusCode(); return basket; } public async Task Checkout(BasketDTO basket) { var uri = API.Basket.CheckoutBasket(_basketByPassUrl); var basketContent = new StringContent(JsonConvert.SerializeObject(basket), System.Text.Encoding.UTF8, "application/json"); var response = await _apiClient.PostAsync(uri, basketContent); response.EnsureSuccessStatusCode(); } public async Task SetQuantities(ApplicationUser user, Dictionary quantities) { var uri = API.Purchase.UpdateBasketItem(_purchaseUrl); var basketUpdate = new { BasketId = user.Id, Updates = quantities.Select(kvp => new { BasketItemId = kvp.Key, NewQty = kvp.Value }).ToArray() }; var basketContent = new StringContent(JsonConvert.SerializeObject(basketUpdate), System.Text.Encoding.UTF8, "application/json"); var response = await _apiClient.PutAsync(uri, basketContent); response.EnsureSuccessStatusCode(); var jsonResponse = await response.Content.ReadAsStringAsync(); return JsonConvert.DeserializeObject(jsonResponse); } public async Task GetOrderDraft(string basketId) { var uri = API.Purchase.GetOrderDraft(_purchaseUrl, basketId); var responseString = await _apiClient.GetStringAsync(uri); var response = JsonConvert.DeserializeObject(responseString); return response; } public async Task AddItemToBasket(ApplicationUser user, int productId) { var uri = API.Purchase.AddItemToBasket(_purchaseUrl); var newItem = new { CatalogItemId = productId, BasketId = user.Id, Quantity = 1 }; var basketContent = new StringContent(JsonConvert.SerializeObject(newItem), System.Text.Encoding.UTF8, "application/json"); var response = await _apiClient.PostAsync(uri, basketContent); } } }