* 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>
94 lines
3.1 KiB
C#
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;
|
|
}
|
|
}
|