public async Task Handle(OrderStartedDomainEvent orderStartedEvent, CancellationToken cancellationToken)
        {
            var cardTypeId = (orderStartedEvent.CardTypeId != 0) ? orderStartedEvent.CardTypeId : 1;
            var buyer      = await _buyerRepository.FindAsync(orderStartedEvent.UserId);

            bool buyerOriginallyExisted = (buyer == null) ? false : true;

            if (!buyerOriginallyExisted)
            {
                buyer = new Buyer(orderStartedEvent.UserId, orderStartedEvent.UserName);
            }

            buyer.VerifyOrAddPaymentMethod(cardTypeId,
                                           $"Payment Method on {DateTime.UtcNow}",
                                           orderStartedEvent.CardNumber,
                                           orderStartedEvent.CardSecurityNumber,
                                           orderStartedEvent.CardHolderName,
                                           orderStartedEvent.CardExpiration,
                                           orderStartedEvent.Order.Id);

            var buyerUpdated = buyerOriginallyExisted ?
                               _buyerRepository.Update(buyer) :
                               _buyerRepository.Add(buyer);

            await _buyerRepository.UnitOfWork
            .SaveEntitiesAsync();

            var orderStatusChangedTosubmittedIntegrationEvent = new OrderStatusChangedToSubmittedIntegrationEvent(orderStartedEvent.Order.Id, orderStartedEvent.Order.OrderStatus.Name, buyer.Name);
            await _orderingIntegrationEventService.PublishThroughEventBusAsync(orderStatusChangedTosubmittedIntegrationEvent);

            _logger.CreateLogger(nameof(ValidateOrAddBuyerAggregateWhenOrderStartedDomainEventHandler)).LogTrace($"Buyer {buyerUpdated.Id} and related payment method were validated or updated for orderId: {orderStartedEvent.Order.Id}.");
        }
Пример #2
0
        /// <summary>
        ///     Integration event handler which starts the create order process
        /// </summary>
        /// <param name="eventMsg">
        ///     Integration event message which is sent by the
        ///     basket.api once it has successfully process the
        ///     order items.
        /// </param>
        /// <returns></returns>
        public async Task Handle(UserCheckoutAcceptedIntegrationEvent eventMsg)
        {
            var result = false;

            // Send Integration event to clean basket once basket is converted to Order and before starting with the order creation process
            var orderStartedIntegrationEvent = new OrderStartedIntegrationEvent(eventMsg.UserId);
            await _orderingIntegrationEventService.PublishThroughEventBusAsync(0, "Order Started", orderStartedIntegrationEvent);

            if (eventMsg.RequestId != Guid.Empty)
            {
                var createOrderCommand = new CreateOrderCommand(eventMsg.Basket.Items, eventMsg.UserId,
                                                                eventMsg.UserName, eventMsg.City, eventMsg.Street,
                                                                eventMsg.State, eventMsg.Country, eventMsg.ZipCode,
                                                                eventMsg.CardNumber, eventMsg.CardHolderName, eventMsg.CardExpiration,
                                                                eventMsg.CardSecurityNumber, eventMsg.CardTypeId);

                var requestCreateOrder =
                    new IdentifiedCommand <CreateOrderCommand, bool>(createOrderCommand, eventMsg.RequestId);
                result = await _mediator.Send(requestCreateOrder);
            }

            _logger.CreateLogger(nameof(UserCheckoutAcceptedIntegrationEventHandler))
            .LogTrace(result
                    ? $"UserCheckoutAccepted integration event has been received and a create new order process is started with requestId: {eventMsg.RequestId}"
                    : $"UserCheckoutAccepted integration event has been received but a new order process has failed with requestId: {eventMsg.RequestId}");
        }
        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 }");
        }
Пример #4
0
        public async Task Handle(OrderStatusChangedToStockConfirmedDomainEvent orderStatusChangedToStockConfirmedDomainEvent, CancellationToken cancellationToken)
        {
            _logger.CreateLogger(nameof(OrderStatusChangedToStockConfirmedDomainEventHandler))
            .LogTrace($"Order with Id: {orderStatusChangedToStockConfirmedDomainEvent.OrderId} has been successfully updated with " +
                      $"a status order id: {OrderStatus.StockConfirmed.Id}");

            var orderStatusChangedToStockConfirmedIntegrationEvent = new OrderStatusChangedToStockConfirmedIntegrationEvent(orderStatusChangedToStockConfirmedDomainEvent.OrderId);
            await _orderingIntegrationEventService.PublishThroughEventBusAsync(orderStatusChangedToStockConfirmedIntegrationEvent);
        }
        public async Task Handle(OrderShippedDomainEvent orderShippedDomainEvent, CancellationToken cancellationToken)
        {
            _logger.CreateLogger(nameof(OrderShippedDomainEvent))
            .LogTrace($"Order with Id: {orderShippedDomainEvent.Order.Id} has been successfully updated with " +
                      $"a status order id: {OrderStatus.Shipped.Id}");

            var order = await _orderRepository.GetAsync(orderShippedDomainEvent.Order.Id);

            var buyer = await _buyerRepository.FindByIdAsync(order.GetBuyerId.Value.ToString());

            var orderStatusChangedToShippedIntegrationEvent = new OrderStatusChangedToShippedIntegrationEvent(order.Id, order.OrderStatus.Name, buyer.Name);
            await _orderingIntegrationEventService.PublishThroughEventBusAsync(orderStatusChangedToShippedIntegrationEvent);
        }
        public async Task Handle(OrderStatusChangedToAwaitingValidationDomainEvent orderStatusChangedToAwaitingValidationDomainEvent, CancellationToken cancellationToken)
        {
            _logger.CreateLogger(nameof(OrderStatusChangedToAwaitingValidationDomainEvent))
            .LogTrace($"Order with Id: {orderStatusChangedToAwaitingValidationDomainEvent.OrderId} has been successfully updated with " +
                      $"a status order id: {OrderStatus.AwaitingValidation.Id}");

            var orderStockList = orderStatusChangedToAwaitingValidationDomainEvent.OrderItems
                                 .Select(orderItem => new OrderStockItem(orderItem.ProductId, orderItem.GetUnits()));

            var orderStatusChangedToAwaitingValidationIntegrationEvent = new OrderStatusChangedToAwaitingValidationIntegrationEvent(
                orderStatusChangedToAwaitingValidationDomainEvent.OrderId, orderStockList);
            await _orderingIntegrationEventService.PublishThroughEventBusAsync(orderStatusChangedToAwaitingValidationIntegrationEvent);
        }
Пример #7
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 }");
        }
Пример #8
0
        public async Task Handle(OrderStatusChangedToPaidDomainEvent orderStatusChangedToPaidDomainEvent, CancellationToken cancellationToken)
        {
            _logger.CreateLogger(nameof(OrderStatusChangedToPaidDomainEventHandler))
            .LogTrace($"Order with Id: {orderStatusChangedToPaidDomainEvent.OrderId} has been successfully updated with " +
                      $"a status order id: {OrderStatus.Paid.Id}");

            var order = await _orderRepository.GetAsync(orderStatusChangedToPaidDomainEvent.OrderId);

            var buyer = await _buyerRepository.FindByIdAsync(order.GetBuyerId.Value.ToString());

            var orderStockList = orderStatusChangedToPaidDomainEvent.OrderItems
                                 .Select(orderItem => new OrderStockItem(orderItem.ProductId, orderItem.GetUnits()));

            var orderStatusChangedToPaidIntegrationEvent = new OrderStatusChangedToPaidIntegrationEvent(
                orderStatusChangedToPaidDomainEvent.OrderId,
                order.OrderStatus.Name,
                buyer.Name,
                orderStockList);

            await _orderingIntegrationEventService.PublishThroughEventBusAsync(orderStatusChangedToPaidIntegrationEvent);
        }