- This also involved cleaning up places where IRepository was still being references in Startup - Removed unused repository from Basket service
94 lines
3.6 KiB
C#
94 lines
3.6 KiB
C#
using Microsoft.eShopWeb.ApplicationCore.Interfaces;
|
|
using System.Threading.Tasks;
|
|
using System.Collections.Generic;
|
|
using Microsoft.eShopWeb.ApplicationCore.Specifications;
|
|
using Microsoft.eShopWeb.ApplicationCore.Entities;
|
|
using System.Linq;
|
|
using Ardalis.GuardClauses;
|
|
using Microsoft.eShopWeb.ApplicationCore.Entities.BasketAggregate;
|
|
|
|
namespace Microsoft.eShopWeb.ApplicationCore.Services
|
|
{
|
|
public class BasketService : IBasketService
|
|
{
|
|
private readonly IAsyncRepository<Basket> _basketRepository;
|
|
private readonly IAsyncRepository<BasketItem> _basketItemRepository;
|
|
private readonly IUriComposer _uriComposer;
|
|
private readonly IAppLogger<BasketService> _logger;
|
|
|
|
public BasketService(IAsyncRepository<Basket> basketRepository,
|
|
IUriComposer uriComposer,
|
|
IAppLogger<BasketService> logger,
|
|
IAsyncRepository<BasketItem> basketItemRepository)
|
|
{
|
|
_basketRepository = basketRepository;
|
|
_uriComposer = uriComposer;
|
|
_logger = logger;
|
|
_basketItemRepository = basketItemRepository;
|
|
}
|
|
|
|
public async Task AddItemToBasket(int basketId, int catalogItemId, decimal price, int quantity)
|
|
{
|
|
var basket = await _basketRepository.GetByIdAsync(basketId);
|
|
|
|
basket.AddItem(catalogItemId, price, quantity);
|
|
|
|
await _basketRepository.UpdateAsync(basket);
|
|
}
|
|
|
|
public async Task DeleteBasketAsync(int basketId)
|
|
{
|
|
var basket = await _basketRepository.GetByIdAsync(basketId);
|
|
|
|
foreach (var item in basket.Items.ToList())
|
|
{
|
|
await _basketItemRepository.DeleteAsync(item);
|
|
}
|
|
|
|
await _basketRepository.DeleteAsync(basket);
|
|
}
|
|
|
|
public async Task<int> GetBasketItemCountAsync(string userName)
|
|
{
|
|
Guard.Against.NullOrEmpty(userName, nameof(userName));
|
|
var basketSpec = new BasketWithItemsSpecification(userName);
|
|
var basket = (await _basketRepository.ListAsync(basketSpec)).FirstOrDefault();
|
|
if (basket == null)
|
|
{
|
|
_logger.LogInformation($"No basket found for {userName}");
|
|
return 0;
|
|
}
|
|
int count = basket.Items.Sum(i => i.Quantity);
|
|
_logger.LogInformation($"Basket for {userName} has {count} items.");
|
|
return count;
|
|
}
|
|
|
|
public async Task SetQuantities(int basketId, Dictionary<string, int> quantities)
|
|
{
|
|
Guard.Against.Null(quantities, nameof(quantities));
|
|
var basket = await _basketRepository.GetByIdAsync(basketId);
|
|
Guard.Against.NullBasket(basketId, basket);
|
|
foreach (var item in basket.Items)
|
|
{
|
|
if (quantities.TryGetValue(item.Id.ToString(), out var quantity))
|
|
{
|
|
_logger.LogInformation($"Updating quantity of item ID:{item.Id} to {quantity}.");
|
|
item.Quantity = quantity;
|
|
}
|
|
}
|
|
await _basketRepository.UpdateAsync(basket);
|
|
}
|
|
|
|
public async Task TransferBasketAsync(string anonymousId, string userName)
|
|
{
|
|
Guard.Against.NullOrEmpty(anonymousId, nameof(anonymousId));
|
|
Guard.Against.NullOrEmpty(userName, nameof(userName));
|
|
var basketSpec = new BasketWithItemsSpecification(anonymousId);
|
|
var basket = (await _basketRepository.ListAsync(basketSpec)).FirstOrDefault();
|
|
if (basket == null) return;
|
|
basket.BuyerId = userName;
|
|
await _basketRepository.UpdateAsync(basket);
|
|
}
|
|
}
|
|
}
|