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);
        }
Example #2
0
        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);
 }