public async Task Handle(PaymentMethodVerifiedDomainEvent paymentMethodVerifiedDomainEvent)
        {
            var order = await _orderRepository.GetAsync(paymentMethodVerifiedDomainEvent.OrderId);

            order.SetBuyerId(paymentMethodVerifiedDomainEvent.Buyer.Id);
            order.SetPaymentMethodId(paymentMethodVerifiedDomainEvent.PaymentMethod.Id);

            // Publish the new ordering integration event
            var items = new List <OrderItemInfo>();

            order.OrderItems.ToList().ForEach((item) =>
            {
                items.Add(new OrderItemInfo()
                {
                    ProductId = item.ProductId, Assets = item.Units
                });
            });

            var integrationEvent = new OrderStartedIntegrationEvent(
                Guid.NewGuid(), paymentMethodVerifiedDomainEvent.Buyer.IdentityGuid, DateTime.UtcNow, items);

            await _orderingIntegrationEventService.PublishThroughEventBusAsync(integrationEvent);

            await _orderingIntegrationEventService.SaveEventAndOrderingContextChangesAsync();

            _logger.CreateLogger(nameof(UpdateOrderOnPaymentMethodVerifiedEventHandler))
            .LogTrace($"Order with Id: {paymentMethodVerifiedDomainEvent.OrderId} has been successfully updated with a payment method id: { paymentMethodVerifiedDomainEvent.PaymentMethod.Id }");
        }
Ejemplo n.º 2
0
        // Domain Logic comment:
        // When the Buyer and Buyer's payment method have been created or verified that they existed,
        // then we can update the original Order with the BuyerId and PaymentId (foreign keys)
        public async Task Handle(BuyerAndPaymentMethodVerifiedDomainEvent buyerPaymentMethodVerifiedEvent)
        {
            var orderToUpdate = await _orderRepository.GetAsync(buyerPaymentMethodVerifiedEvent.OrderId);

            orderToUpdate.SetBuyerId(buyerPaymentMethodVerifiedEvent.Buyer.Id);
            orderToUpdate.SetPaymentId(buyerPaymentMethodVerifiedEvent.Payment.Id);

            var orderStartedIntegrationEvent = new OrderStartedIntegrationEvent(buyerPaymentMethodVerifiedEvent.Buyer.IdentityGuid);

            // Using a local transaction to achieve atomicity between original Ordering database operation and
            // the IntegrationEventLog. Only saving event if order has been successfully persisted to db
            await _orderingIntegrationEventService
            .SaveEventAndOrderingContextChangesAsync(orderStartedIntegrationEvent);

            // Publish ordering integration event and mark it as published
            await _orderingIntegrationEventService
            .PublishThroughEventBusAsync(orderStartedIntegrationEvent);

            _logger.CreateLogger(nameof(UpdateOrderWhenBuyerAndPaymentMethodVerifiedDomainEventHandler))
            .LogTrace($"Order with Id: {buyerPaymentMethodVerifiedEvent.OrderId} has been successfully updated with a payment method id: { buyerPaymentMethodVerifiedEvent.Payment.Id }");
        }