using ApplicationCore.Interfaces; using ApplicationCore.Entities.OrderAggregate; using System.Threading.Tasks; using Microsoft.eShopWeb.ApplicationCore.Entities; using System.Collections.Generic; using Ardalis.GuardClauses; namespace ApplicationCore.Services { public class OrderService : IOrderService { private readonly IAsyncRepository _orderRepository; private readonly IAsyncRepository _basketRepository; private readonly IAsyncRepository _itemRepository; public OrderService(IAsyncRepository basketRepository, IAsyncRepository itemRepository, IAsyncRepository orderRepository) { _orderRepository = orderRepository; _basketRepository = basketRepository; _itemRepository = itemRepository; } public async Task CreateOrderAsync(int basketId, Address shippingAddress) { var basket = await _basketRepository.GetByIdAsync(basketId); Guard.Against.NullBasket(basketId, basket); var items = new List(); foreach (var item in basket.Items) { var catalogItem = await _itemRepository.GetByIdAsync(item.CatalogItemId); var itemOrdered = new CatalogItemOrdered(catalogItem.Id, catalogItem.Name, catalogItem.PictureUri); var orderItem = new OrderItem(itemOrdered, item.UnitPrice, item.Quantity); items.Add(orderItem); } var order = new Order(basket.BuyerId, shippingAddress, items); await _orderRepository.AddAsync(order); } } }