public static PutOrderPlacedCommand ToPutPlacedOrderCommand(
            this OrderPlacedSubscriptionEvent subscriptionEvent)
        {
            var result = new PutOrderPlacedCommand
                         (
                subscriptionEvent.Id,
                subscriptionEvent.PersonId,
                subscriptionEvent.Quantity
                         );

            return(result);
        }
        public async Task Given_PutOrderPlacedCommand_Which_Should_Publish_A_PutOrderPlacedEvent_Expect_OrderResponse_With_OrderPlacedEvent_Published()
        {
            // Arrange
            const string topic          = "OrderPlacedUpdated";
            const string subscriptionId = "OrderPlacedUpdated_IntegrationTest";
            var          command        = new PutOrderPlacedCommand(1, 5, 2);
            var          order          = new Order
            {
                Id       = 1,
                Name     = "product zero one",
                Quantity = 10
            };

            Factory.Seed <Startup, MicroserviceDbContext>(db =>
            {
                db.Clear();
                db.Orders.Add(order);
            });

            // Act
            var response = await Client.PutAsJsonAsync($"{GetBaseRoute()}/place", command);

            Assert.That(response.StatusCode, Is.EqualTo(HttpStatusCode.OK));
            var result = response.Content.Deserialize <OrderResponse>().Result;

            var subscriptionResponse = await MessageBrokerClient.Subscribe <OrderPlacedEvent>(
                topic,
                subscriptionId,
                AssertCallback,
                c => c.UseBasicQos());

            // Assert PutOrderPlaced Response
            Assert.That(result.Quantity, Is.EqualTo(8));
            Assert.That(result.Id, Is.EqualTo(order.Id));
            StringAssert.AreEqualIgnoringCase(order.Name, result.Name);

            // Assert Messagebus OrderCreatedEvent
            Task AssertCallback(OrderPlacedEvent orderPlacedEvent)
            {
                var tcs = new TaskCompletionSource <OrderPlacedEvent>();

                Assert.That(orderPlacedEvent.QuantityBeforeReduction, Is.EqualTo(order.Quantity));
                Assert.That(orderPlacedEvent.Quantity, Is.EqualTo(result.Quantity));
                Assert.That(result.Id, Is.EqualTo(order.Id));
                StringAssert.AreEqualIgnoringCase(order.Name, result.Name);

                tcs.SetResult(orderPlacedEvent);
                return(tcs.Task);
            }
        }
        public async Task <IActionResult> PlaceOrder([FromBody] PutOrderPlacedCommand orderPlacedCommand)
        {
            var result = await _mediator.Send(orderPlacedCommand);

            return(result != null ? (IActionResult)Ok(result) : NotFound());
        }