Exemplo n.º 1
0
        private void Handle(BasketCheckedOut evt)
        {
            var basket = _indexer.Get <Basket>(evt.Id);

            basket.BasketState = BasketState.CheckedOut;
            _indexer.Index(basket);
        }
Exemplo n.º 2
0
        public void When_BasketCheckedOut_CreateOrder()
        {
            AggregateRepository.CreateGuid = () => orderId;

            SetupPreviousEvents();
            var nonProcessedEvent = new BasketCheckedOut(basketId, OrderLines, shippingAddress);

            orderId = AddPreviousEvent <BasketAggregate>(nonProcessedEvent);
            SetInitalMetadata();

            Given(_initialEvents.ToArray());
            WhenProcessed(nonProcessedEvent);

            var expectedCommands = new List <ICommand> {
                new CreateOrder(orderId, basketId, shippingAddress)
            };
            var expectedEvents = new List <IEvent> {
                new EventProcessed(orderId, nonProcessedEvent)
            };

            SetMetadata(nonProcessedEvent, expectedCommands, expectedEvents);

            Then(expectedCommands.ToArray());
            Then(expectedEvents.ToArray());
        }
Exemplo n.º 3
0
        private void Apply(BasketCheckedOut evt)
        {
            ProcessId        = evt.Metadata.ProcessId;
            _orderId         = ProcessId;
            _basketId        = evt.AggregateId;
            _shippingAddress = evt.ShippingAddress;
            _orderLines      = evt.OrderLines.ToDictionary(ol => ol.ProductId, ol => ol);

            DispatchCommand <OrderAggregate>(new CreateOrder(_orderId, _basketId, _shippingAddress));
        }
        public void When_AddItemNotPending_ThrowsInvalidStateException(string checkedOutOrCancelled)
        {
            IEvent evt = new BasketCheckedOut(id, new List <OrderLine>(), new Address());

            if (checkedOutOrCancelled == "cancelled")
            {
                evt = new BasketCancelled(id);
            }

            InitialEvents.Add(evt);

            Given(InitialEvents.ToArray());

            WhenThrows <AddItemToBasket, InvalidStateException>(new AddItemToBasket(id, productId, "Test Product", 2, 10));
        }
Exemplo n.º 5
0
        public void When_RemoveItemNotPending_ThrowsInvalidStateException(string checkedOutOrCancelled)
        {
            IEvent evt = new BasketCheckedOut(id, OrderLines, new Address());

            if (checkedOutOrCancelled == "cancelled")
            {
                evt = new BasketCancelled(id);
            }

            InitialEvents.Add(evt);

            Given(InitialEvents.ToArray());

            WhenThrows <RemoveItemFromBasket, InvalidStateException>(new RemoveItemFromBasket(id, productId, 10));
        }
        public void When_CheckOut_CheckedOut()
        {
            Given(InitialEvents.ToArray());

            var command = new CheckOutBasket(id, shippingAddress);

            command.Metadata.CausationId   = command.Metadata.CommandId;
            command.Metadata.CorrelationId = causationAndCorrelationId;
            command.Metadata.ProcessId     = causationAndCorrelationId;

            When(command);

            var expectedEvent = new BasketCheckedOut(id, OrderLines, shippingAddress);

            expectedEvent.Metadata.CausationId   = command.Metadata.CommandId;
            expectedEvent.Metadata.CorrelationId = causationAndCorrelationId;
            expectedEvent.Metadata.ProcessId     = command.Metadata.ProcessId;

            Then(expectedEvent);
        }
        public async Task HandleAsync(CheckoutBasket command, ICorrelationContext context)
        {
            CustomerBasket basket = await _basketRepo.GetAsync(command.BasketId);

            if (basket is null)
            {
                throw new MedParkException("basket_does_not_exist", $"A basket for customer {command.BasketId} does not exist.");
            }

            IEnumerable <BasketItem> items = await _basketItemRepo.FindAsync(x => x.BasketId == command.BasketId);

            if (items.Count() == 0)
            {
                throw new MedParkException("basket_items_not_valid", $"The basket {command.BasketId} items are not valid to checkout.");
            }


            BasketCheckedOut   basketCheckedOutEvent = new BasketCheckedOut(basket.CustomerId, command.ShippingType, command.ShippingAddress);
            List <LineItemDto> lineItems             = new List <LineItemDto>();

            items.ToList().ForEach(i =>
            {
                LineItemDto lineItem = new LineItemDto {
                    Id = Guid.NewGuid(), ProductCode = i.Code, Price = i.Price, ProductName = i.Name, Quantity = i.Quantity
                };
                lineItems.Add(lineItem);
            });

            basketCheckedOutEvent.Items = lineItems;

            //Publish event to start order
            await _busPublisher.PublishAsync(basketCheckedOutEvent, null);

            //Empty basket
            items.ToList().ForEach(async(i) =>
            {
                await _basketItemRepo.DeleteAsync(i.Id);
            });
        }
        public ActionResult Post([FromBody] Models.Basket basket)
        {
            basket = _serializer.Deserialize <Models.Basket>(_database.StringGet(basket.Id));

            var basketCheckedOut = new BasketCheckedOut()
            {
                Basket = new Events.Basket()
                {
                    Created = basket.Created,
                    Id      = basket.Id,
                    UserId  = basket.UserId,
                    Items   = basket.Items.Select(x => new Events.BasketItem()
                    {
                        Quantity = x.Quantity,
                        Id       = x.Id
                    }).ToList()
                }
            };

            _bus.Publish(basketCheckedOut);
            _database.KeyDelete(basket.Id);
            return(Json(basket));
        }
        public void OnBasketCheckedOut_CreateOrder()
        {
            Given(new List <EventInStream>(), new BasketCheckedOutToOrderCreatedWorker());
            var basketId         = Guid.NewGuid();
            var customerId       = Guid.NewGuid();
            var basketCheckedOut = new BasketCheckedOut(basketId,
                                                        customerId, new List <BasketItem>()
            {
                new BasketItem(3, 6, "some product", 1423)
            });

            var streamName = $"basket-{basketId.ToString()}";

            When(new StreamEvent(streamName, 0, 0, DateTime.Now, basketCheckedOut));
            Then("order-1", streamEvent =>
            {
                var e = streamEvent.Event as OrderCreated;
                Assert.IsType <OrderCreated>(e);
                Assert.Equal(1, e.Order.OrderId);
                Assert.Equal(customerId, e.Order.CustomerId);
                Assert.Equal(basketId, e.Order.BasketId);
            });
        }
Exemplo n.º 10
0
 private void Handle(BasketCheckedOut evt)
 {
     var basket = _indexer.Get<Basket>(evt.Id);
     basket.BasketState = BasketState.CheckedOut;
     _indexer.Index(basket);
 }
Exemplo n.º 11
0
 private void OnBasketCheckedOut(BasketCheckedOut evt)
 {
     _orderProcessEventHandler.HandleEvent <BasketCheckedOut, OrderProcessManager>(evt);
     SetLastEventNumber(evt);
 }
Exemplo n.º 12
0
 private void Apply(BasketCheckedOut evt)
 {
     State = BasketState.CheckedOut;
 }