public async Task Handle(OrderStatusChangedToAwaitingValidationIntegrationEvent @event)
        {
            using (LogContext.PushProperty("IntegrationEventContext", $"{Program.AppName}"))
            {
                var confirmedOrderStockItems = new List <ConfirmedOrderStockItem>();

                foreach (var orderStockItem in @event.OrderStockItems)
                {
                    var catalogItem             = _catalogContext.CatalogItems.Find(orderStockItem.ProductId);
                    var hasStock                = catalogItem.AvailableStock >= orderStockItem.Units;
                    var confirmedOrderStockItem = new ConfirmedOrderStockItem(catalogItem.Id, hasStock);

                    confirmedOrderStockItems.Add(confirmedOrderStockItem);
                }

                if (confirmedOrderStockItems.Any(c => !c.HasStock))
                {
                    await _eventBus.PublishAsync(nameof(OrderStockRejectedIntegrationEvent),
                                                 new OrderStockRejectedIntegrationEvent(@event.OrderId, confirmedOrderStockItems));
                }
                else
                {
                    await _eventBus.PublishAsync(nameof(OrderStockConfirmedIntegrationEvent),
                                                 new OrderStockConfirmedIntegrationEvent(@event.OrderId));
                }
            }
        }
        public async Task Should_Call_Handler_On_Event_With_Correct_SourceAsync()
        {
            var orderId = Guid.NewGuid().GetHashCode() & ushort.MaxValue;
            var evt     = new OrderStatusChangedToAwaitingValidationIntegrationEvent(orderId, new List <OrderStockItem>
            {
            });
            await _eventBus.PublishAsync(evt);

            //await Task.Delay(100000);
        }
        public async Task Handle(OrderStatusChangedToAwaitingValidationDomainEvent orderStatusChangedToAwaitingValidationDomainEvent, CancellationToken cancellationToken)
        {
            var order = await _orderRepository.GetAsync(orderStatusChangedToAwaitingValidationDomainEvent.OrderId);

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

            var orderStockList = orderStatusChangedToAwaitingValidationDomainEvent.OrderItems
                                 .Select(orderItem => new OrderStockItem(orderItem.ProductId, orderItem.GetUnits()));
            var orderStatusChangedToAwaitingValidationIntegrationEvent = new OrderStatusChangedToAwaitingValidationIntegrationEvent(
                order.Id, order.OrderStatus.Name, buyer.Name, orderStockList);
            await _messageOutbox.Send(orderStatusChangedToAwaitingValidationIntegrationEvent);
        }
        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);
        }
        public async Task Handle(OrderStartedIntegrationEvent message, IMessageHandlerContext context)
        {
            Data.UserId = message.UserId;

            // We'll do the following actions at the same time, but asynchronous
            // - Grace Period
            // - ~~Verify buyer and payment method~~
            // - Verify if there is stock available
            var @event = new OrderStatusChangedToAwaitingValidationIntegrationEvent(message.OrderId, message.OrderedItems);
            await context.Publish(@event);

            await RequestTimeout <GracePeriodExpired>(context, TimeSpan.FromMinutes(settings.GracePeriodTime));
        }
Example #6
0
        public async Task Should_Call_Handler_On_Event_With_Correct_SourceAsync()
        {
            var orderId = Guid.NewGuid().GetHashCode() & ushort.MaxValue;
            var evt     = new OrderStatusChangedToAwaitingValidationIntegrationEvent(orderId, new List <OrderStockItem>
            {
            });
            await _eventBus.PublishAsync(evt);

            //await _eventBus.PublishAsync(new ClientCreateIntergrationEvent
            //{
            //    ClientId = IDUtils.CreateNewId().ToString(),
            //    ClientSecrets = new[] { "191d437f0cc3463b85669f2b570cdc21" },
            //    AllowedGrantTypes = new[] { "client_credentials" },
            //    AllowedScopes = new[] { "api3.device" }
            //});
        }
        public async Task Handle(OrderStatusChangedToAwaitingValidationDomainEvent orderStatusChangedToAwaitingValidationDomainEvent, CancellationToken cancellationToken)
        {
            _logger.CreateLogger <OrderStatusChangedToAwaitingValidationDomainEvent>()
            .LogTrace("Order with Id: {OrderId} has been successfully updated to status {Status} ({Id})",
                      orderStatusChangedToAwaitingValidationDomainEvent.OrderId, nameof(OrderStatus.AwaitingValidation), OrderStatus.AwaitingValidation.Id);

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

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

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

            var orderStatusChangedToAwaitingValidationIntegrationEvent = new OrderStatusChangedToAwaitingValidationIntegrationEvent(
                order.Id, order.OrderStatus.Name, buyer.Name, orderStockList);
            await _orderingIntegrationEventService.AddAndSaveEventAsync(orderStatusChangedToAwaitingValidationIntegrationEvent);
        }
        public async Task HandleAsync(IDomainEvent <Order, OrderId, OrderStatusChangedToAwaitingValidationDomainEvent> domainEvent, CancellationToken cancellationToken)
        {
            var order = await _aggregateStore
                        .LoadAsync <Order, OrderId>(domainEvent.AggregateIdentity, CancellationToken.None)
                        .ConfigureAwait(false);

            var buyer = await _aggregateStore
                        .LoadAsync <Buyer, BuyerId>(order.GetBuyerId, CancellationToken.None)
                        .ConfigureAwait(false);

            var orderStockList = domainEvent.AggregateEvent.OrderItems
                                 .Select(orderItem => new OrderStockItem(orderItem.ProductId, orderItem.Units));

            var orderStatusChangedToAwaitingValidationIntegrationEvent = new OrderStatusChangedToAwaitingValidationIntegrationEvent(
                order.Id.Value, OrderStatus.AwaitingValidation.Name, orderStockList, "bob");
            await _endpoint.Publish(orderStatusChangedToAwaitingValidationIntegrationEvent);
        }
        public async Task Handle(OrderStatusChangedToAwaitingValidationDomainEvent notification, CancellationToken cancellationToken)
        {
            logger.LogInformation("OrderStatusChangedToAwaitingValidationDomainEvent handler called");
            logger.LogInformation("OrderId is {orderId}", notification.OrderId);
            var list = new List <StockItem>();

            foreach (var item in notification.OrderItems)
            {
                list.Add(new StockItem()
                {
                    ProductId = item.ProductId, Units = item.Quantity
                });
            }

            var evt = new OrderStatusChangedToAwaitingValidationIntegrationEvent(list, notification.OrderId);

            logger.LogInformation("OrderStatusChangedToAwaitingValidationIntegrationEvent is created {@evt}", evt);

            //_integrationEventLogService.SaveEventAsync(evt);
            _eventBus.Publish(evt);
            logger.LogInformation("OrderStatusChangedToAwaitingValidationIntegrationEvent is published");
        }
Example #10
0
        public void SendOrderStatusChangedToAwaitingValidationIntegrationEvent(Guid orderId, IEnumerable <OrderItem> orderItems)
        {
            var integrationEvent = new OrderStatusChangedToAwaitingValidationIntegrationEvent
            {
                OrderId      = orderId,
                CatalogItems = orderItems.Select(o =>
                {
                    return(new OrderStockItem
                    {
                        ProductId = o.ProductId,
                        Units = o.Units
                    });
                })
            };

            var serializedCommand = JsonConvert.SerializeObject(integrationEvent);
            var properties        = _channel.CreateBasicProperties();

            properties.ContentType = "application/json";

            _channel.BasicPublish(ExchangeStatusAwaiting, routingKey: "",
                                  basicProperties: properties, body: Encoding.UTF8.GetBytes(serializedCommand));
        }
Example #11
0
        public void Consume(OrderStatusChangedToAwaitingValidationIntegrationEvent command)
        {
            var confirmedOrderStockItems = command.CatalogItems.Select(orderStockItem =>
            {
                var catalogItem             = GetCatalogItemById(orderStockItem.ProductId);
                var hasStock                = catalogItem.AvailableStock >= orderStockItem.Units;
                var confirmedOrderStockItem = new ConfirmedOrderStockItem
                {
                    HasStock      = hasStock,
                    CatalogItemId = catalogItem.CatalogItemId
                };

                return(confirmedOrderStockItem);
            });

            if (confirmedOrderStockItems.Any(c => !c.HasStock))
            {
                _manager.SendOrderStockRejectedIntegrationEvent(command.OrderId, confirmedOrderStockItems);
            }
            else
            {
                _manager.SendOrderStockConfirmedIntegrationEvent(command.OrderId);
            }
        }