public IHttpActionResult PrepareForShipping([FromBody] GuidModel model)
        {
            var cmd   = new PrepareOrderForShipping(model.OrderId);
            var order = _commandDispatcher.ExecuteCommand <OrderAggregate>(cmd);

            return(Ok(OrderModel.FromAggregate(order)));
        }
        private void When_PrepareForShippingDelivered_ThrowsInvalidOrderStateException()
        {
            Given(InitialEvents, new OrderReadyForShipping(id), new OrderShipped(id), new OrderDelivered(id));

            var command = new PrepareOrderForShipping(id);

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

            WhenThrows <PrepareOrderForShipping, InvalidOrderStateException>(command);
        }
        private void When_PrepareForShippingNoOrderLinesAdded_ThrowsInvalidOrderStateException()
        {
            Given(InitialEvents.Take(1).ToArray());

            var command = new PrepareOrderForShipping(id);

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

            WhenThrows <PrepareOrderForShipping, InvalidOrderStateException>(command);
        }
        internal void PrepareForShipping(PrepareOrderForShipping cmd)
        {
            if (State != OrderState.Pending)
            {
                throw new InvalidOrderStateException(cmd.AggregateId, $"State should be {OrderState.Pending} but is {State}");
            }

            if (State == OrderState.ReadyForShipping)
            {
                return;
            }

            if (!OrderLines.Any())
            {
                throw new InvalidOrderStateException(cmd.AggregateId, $"Order has no order lines");
            }

            RaiseEvent(new OrderReadyForShipping(cmd.AggregateId));
        }
        private void When_PrepareForShipping_OrderReadyForShipping()
        {
            Given(InitialEvents.ToArray());

            var command = new PrepareOrderForShipping(id);

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

            When(command);

            var expectedEvent = new OrderReadyForShipping(id);

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

            Then(expectedEvent);
        }