You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
54 lines
2.3 KiB
54 lines
2.3 KiB
using Ardalis.GuardClauses;
|
|
using Microsoft.eShopWeb.ApplicationCore.Entities;
|
|
using Microsoft.eShopWeb.ApplicationCore.Entities.BasketAggregate;
|
|
using Microsoft.eShopWeb.ApplicationCore.Entities.OrderAggregate;
|
|
using Microsoft.eShopWeb.ApplicationCore.Interfaces;
|
|
using Microsoft.eShopWeb.ApplicationCore.Specifications;
|
|
using System.Linq;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace Microsoft.eShopWeb.ApplicationCore.Services
|
|
{
|
|
public class OrderService : IOrderService
|
|
{
|
|
private readonly IRepository<Order> _orderRepository;
|
|
private readonly IUriComposer _uriComposer;
|
|
private readonly IRepository<Basket> _basketRepository;
|
|
private readonly IRepository<CatalogItem> _itemRepository;
|
|
|
|
public OrderService(IRepository<Basket> basketRepository,
|
|
IRepository<CatalogItem> itemRepository,
|
|
IRepository<Order> orderRepository,
|
|
IUriComposer uriComposer)
|
|
{
|
|
_orderRepository = orderRepository;
|
|
_uriComposer = uriComposer;
|
|
_basketRepository = basketRepository;
|
|
_itemRepository = itemRepository;
|
|
}
|
|
|
|
public async Task CreateOrderAsync(int basketId, Address shippingAddress)
|
|
{
|
|
var basketSpec = new BasketWithItemsSpecification(basketId);
|
|
var basket = await _basketRepository.GetBySpecAsync(basketSpec);
|
|
|
|
Guard.Against.NullBasket(basketId, basket);
|
|
Guard.Against.EmptyBasketOnCheckout(basket.Items);
|
|
|
|
var catalogItemsSpecification = new CatalogItemsSpecification(basket.Items.Select(item => item.CatalogItemId).ToArray());
|
|
var catalogItems = await _itemRepository.ListAsync(catalogItemsSpecification);
|
|
|
|
var items = basket.Items.Select(basketItem =>
|
|
{
|
|
var catalogItem = catalogItems.First(c => c.Id == basketItem.CatalogItemId);
|
|
var itemOrdered = new CatalogItemOrdered(catalogItem.Id, catalogItem.Name, _uriComposer.ComposePicUri(catalogItem.PictureUri));
|
|
var orderItem = new OrderItem(itemOrdered, basketItem.UnitPrice, basketItem.Quantity);
|
|
return orderItem;
|
|
}).ToList();
|
|
|
|
var order = new Order(basket.BuyerId, shippingAddress, items);
|
|
|
|
await _orderRepository.AddAsync(order);
|
|
}
|
|
}
|
|
}
|
|
|