Files
eShopOnWeb/src/Web/Services/BasketViewModelService.cs
Cédric Michel 1e13733d3d Feature/migrate to minimal api (#662)
* migrate from classic controller to minimal api

* fix all PublicApi integration test

* update all nuget package add forget project

* fix pay now

* Adapt readme use in memory database

* undo AuthenticateEndpoint to use EndpointBaseAsync

* Update README.md

Co-authored-by: Steve Smith <steve@kentsmiths.com>

Co-authored-by: Steve Smith <steve@kentsmiths.com>
2022-01-21 10:13:31 -05:00

94 lines
3.1 KiB
C#

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;
namespace Microsoft.eShopWeb.Web.Services;
public class BasketViewModelService : IBasketViewModelService
{
private readonly IRepository<Basket> _basketRepository;
private readonly IUriComposer _uriComposer;
private readonly IBasketQueryService _basketQueryService;
private readonly IRepository<CatalogItem> _itemRepository;
public BasketViewModelService(IRepository<Basket> basketRepository,
IRepository<CatalogItem> itemRepository,
IUriComposer uriComposer,
IBasketQueryService basketQueryService)
{
_basketRepository = basketRepository;
_uriComposer = uriComposer;
_basketQueryService = basketQueryService;
_itemRepository = itemRepository;
}
public async Task<BasketViewModel> GetOrCreateBasketForUser(string userName)
{
var basketSpec = new BasketWithItemsSpecification(userName);
var basket = (await _basketRepository.GetBySpecAsync(basketSpec));
if (basket == null)
{
return await CreateBasketForUser(userName);
}
var viewModel = await Map(basket);
return viewModel;
}
private async Task<BasketViewModel> CreateBasketForUser(string userId)
{
var basket = new Basket(userId);
await _basketRepository.AddAsync(basket);
return new BasketViewModel()
{
BuyerId = basket.BuyerId,
Id = basket.Id,
};
}
private async Task<List<BasketItemViewModel>> GetBasketItems(IReadOnlyCollection<BasketItem> basketItems)
{
var catalogItemsSpecification = new CatalogItemsSpecification(basketItems.Select(b => b.CatalogItemId).ToArray());
var catalogItems = await _itemRepository.ListAsync(catalogItemsSpecification);
var items = basketItems.Select(basketItem =>
{
var catalogItem = catalogItems.First(c => c.Id == basketItem.CatalogItemId);
var basketItemViewModel = new BasketItemViewModel
{
Id = basketItem.Id,
UnitPrice = basketItem.UnitPrice,
Quantity = basketItem.Quantity,
CatalogItemId = basketItem.CatalogItemId,
PictureUrl = _uriComposer.ComposePicUri(catalogItem.PictureUri),
ProductName = catalogItem.Name
};
return basketItemViewModel;
}).ToList();
return items;
}
public async Task<BasketViewModel> Map(Basket basket)
{
return new BasketViewModel()
{
BuyerId = basket.BuyerId,
Id = basket.Id,
Items = await GetBasketItems(basket.Items)
};
}
public async Task<int> CountTotalBasketItems(string username)
{
var counter = await _basketQueryService.CountTotalBasketItems(username);
return counter;
}
}