using Microsoft.eShopWeb.ApplicationCore.Entities; using Microsoft.eShopWeb.ApplicationCore.Entities.BasketAggregate; using Microsoft.eShopWeb.ApplicationCore.Interfaces; using Microsoft.eShopWeb.ApplicationCore.Specifications; using Microsoft.eShopWeb.Web.Interfaces; using Microsoft.eShopWeb.Web.Pages.Basket; using System.Collections.Generic; using System.Threading.Tasks; namespace Microsoft.eShopWeb.Web.Services { public class BasketViewModelService : IBasketViewModelService { private readonly IAsyncRepository _basketRepository; private readonly IUriComposer _uriComposer; private readonly IAsyncRepository _itemRepository; public BasketViewModelService(IAsyncRepository basketRepository, IAsyncRepository itemRepository, IUriComposer uriComposer) { _basketRepository = basketRepository; _uriComposer = uriComposer; _itemRepository = itemRepository; } public async Task GetOrCreateBasketForUser(string userName) { var basketSpec = new BasketWithItemsSpecification(userName); var basket = (await _basketRepository.FirstOrDefaultAsync(basketSpec)); if (basket == null) { return await CreateBasketForUser(userName); } return await CreateViewModelFromBasket(basket); } private async Task CreateViewModelFromBasket(Basket basket) { var viewModel = new BasketViewModel(); viewModel.Id = basket.Id; viewModel.BuyerId = basket.BuyerId; viewModel.Items = await GetBasketItems(basket.Items); ; return viewModel; } private async Task CreateBasketForUser(string userId) { var basket = new Basket(userId); await _basketRepository.AddAsync(basket); return new BasketViewModel() { BuyerId = basket.BuyerId, Id = basket.Id, Items = new List() }; } private async Task> GetBasketItems(IReadOnlyCollection basketItems) { var items = new List(); foreach (var item in basketItems) { var itemModel = new BasketItemViewModel { Id = item.Id, UnitPrice = item.UnitPrice, Quantity = item.Quantity, CatalogItemId = item.CatalogItemId }; var catalogItem = await _itemRepository.GetByIdAsync(item.CatalogItemId); itemModel.PictureUrl = _uriComposer.ComposePicUri(catalogItem.PictureUri); itemModel.ProductName = catalogItem.Name; items.Add(itemModel); } return items; } } }