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 _basketRepository; private readonly IAsyncRepository _basketItemRepository; private readonly IUriComposer _uriComposer; private readonly IAppLogger _logger; private readonly IRepository _itemRepository; public BasketService(IAsyncRepository basketRepository, IRepository itemRepository, IUriComposer uriComposer, IAppLogger logger, IAsyncRepository basketItemRepository) { _basketRepository = basketRepository; _uriComposer = uriComposer; _logger = logger; _itemRepository = itemRepository; _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 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 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); } } }