using Microsoft.eShopWeb.ApplicationCore.Interfaces; using System.Threading.Tasks; using Microsoft.eShopWeb.ApplicationCore.Entities; using System.Linq; using System.Collections.Generic; using Microsoft.eShopWeb.ApplicationCore.Specifications; using Microsoft.eShopWeb.RazorPages.Interfaces; using Microsoft.eShopWeb.RazorPages.ViewModels; using Microsoft.eShopWeb.ApplicationCore.Entities.BasketAggregate; namespace Microsoft.eShopWeb.RazorPages.Services { public class BasketViewModelService : IBasketViewModelService { private readonly IAsyncRepository _basketRepository; private readonly IUriComposer _uriComposer; private readonly IRepository _itemRepository; public BasketViewModelService(IAsyncRepository basketRepository, IRepository itemRepository, IUriComposer uriComposer) { _basketRepository = basketRepository; _uriComposer = uriComposer; _itemRepository = itemRepository; } public async Task GetOrCreateBasketForUser(string userName) { var basketSpec = new BasketWithItemsSpecification(userName); var basket = (await _basketRepository.ListAsync(basketSpec)).FirstOrDefault(); if (basket == null) { return await CreateBasketForUser(userName); } return CreateViewModelFromBasket(basket); } private BasketViewModel CreateViewModelFromBasket(Basket basket) { var viewModel = new BasketViewModel(); viewModel.Id = basket.Id; viewModel.BuyerId = basket.BuyerId; viewModel.Items = basket.Items.Select(i => { var itemModel = new BasketItemViewModel() { Id = i.Id, UnitPrice = i.UnitPrice, Quantity = i.Quantity, CatalogItemId = i.CatalogItemId }; var item = _itemRepository.GetById(i.CatalogItemId); itemModel.PictureUrl = _uriComposer.ComposePicUri(item.PictureUri); itemModel.ProductName = item.Name; return itemModel; }) .ToList(); return viewModel; } private async Task CreateBasketForUser(string userId) { var basket = new Basket() { BuyerId = userId }; await _basketRepository.AddAsync(basket); return new BasketViewModel() { BuyerId = basket.BuyerId, Id = basket.Id, Items = new List() }; } } }