public async Task HandleAsync(CreatePurchaseOrderCommand command) { //Issue: Crossing the boundary context to cut shot the time. //This should call the Basket Api and get the details. Not the repository directly. var basketSpecification = new BasketWithItemsSpecification(command.BasketId); var basket = await _basketAsyncRepository.GetSingleAsync(basketSpecification); var items = new List <PurchaseOrderItem>(); foreach (var basketItem in basket.BasketItems) { var catalogItem = await _catalogItemAsyncRepository.GetByIdAsync(basketItem.CatalogItemId); var itemOrdered = new CatalogItemOrdered(catalogItem.Id, (CatalogItemType)catalogItem.CatalogType, catalogItem.Name, catalogItem.PictureUri); var orderItem = new PurchaseOrderItem(itemOrdered, basketItem.UnitPrice, basketItem.Quantity); items.Add(orderItem); } var purchaseOrderId = Guid.NewGuid(); var purchaseOrderIdNumberMapping = new PurchaseOrderIdNumberMapping { PurchaseOrderId = purchaseOrderId }; _purchaseOrderIdNumberMappingAsyncRepository.Add(purchaseOrderIdNumberMapping); await _unitOfWork.SaveChangesAsync(); var purchaseOrder = new Domain.PurchaseOrder(purchaseOrderId, purchaseOrderIdNumberMapping.Id, basket.BuyerId, command.Address, items); await _shopAggregateRepositoryService.SaveAsync(purchaseOrder); }
public async Task HandleAsync(AddItemToBasketCommand command) { //Assumptions: Stock Of Product is Available var basket = await _shopAggregateRepositoryService.GetAsync(command.BasketId); basket.AddItem(command.CatalogItemId, command.Price, command.Quantity); await _shopAggregateRepositoryService.SaveAsync(basket); }
public async Task HandleAsync(ProcessPurchaseOrderCommand command) { var purchaseOrderMapping = await _purchaseOrderIdNumberMappingAsyncRepository.GetByIdAsync(command.PurchaseOrderNo); var purchaseOrder = await _shopAggregateRepositoryService.GetAsync(purchaseOrderMapping.PurchaseOrderId); if (!purchaseOrder.IsPurchaseOrderProcessed && purchaseOrder.OrderItems.Count > 0) { await purchaseOrder.ProcessPurchaseOrder(); await _shopAggregateRepositoryService.SaveAsync(purchaseOrder); } }
public async Task HandleAsync(CreateBasketForUserCommand command) { var basket = new Domain.Basket(Guid.NewGuid(), command.BuyerId); await _shopAggregateRepositoryService.SaveAsync(basket); }