Esempio n. 1
0
        public async Task ExecuteAsync <TPayload>(MessageBrokerEnvelope <TPayload> messageEnvelope)
        {
            var payload        = GetEnvelopePayload <TPayload, NewOrderDto>(messageEnvelope);
            var persistedOrder = await SaveNewOrderAsync(payload);

            var grouppedOrderItems = persistedOrder.Items.GroupBy(x => x.ProviderId).ToDictionary(k => k.Key, v => v.ToList());

            foreach (var providerItems in grouppedOrderItems)
            {
                switch (providerItems.Key.ToLower())
                {
                case "xyz":
                case "kfc":
                    await SendOrderRequestToProviderViaMessageBrokerAsync(providerItems.Key.ToLower(), persistedOrder.Id, providerItems.Value);
                    await UpdateOrderItemsStatus(providerItems.Value);

                    break;

                case "chefsexperience":
                    await SendOrderRequestToProviderViaHttpAsync(_httpProviderEndpoints.ChefsExperienceBaseEndpoint, persistedOrder.Id, providerItems.Value);
                    await UpdateOrderItemsStatus(providerItems.Value);

                    break;

                default:
                    throw new Exception($"Handling order items for provider '{providerItems.Key}' is not supported.");
                }
            }

            await UpdateOrderStatus(persistedOrder);
        }
Esempio n. 2
0
        protected TPayload GetEnvelopePayload <TMessage, TPayload>(MessageBrokerEnvelope <TMessage> messageEnvelope)
        {
            if (messageEnvelope.Data is not TPayload payload)
            {
                throw new ArgumentException($"'{this.GetType().Name}' cannot handle payloads of type {messageEnvelope.Data.GetType().Name}");
            }

            return(payload);
        }
        public async Task <string> CreateAsync(NewOrderDTO newOrder)
        {
            ValidateNewOrder(newOrder);

            var payload = new MessageBrokerEnvelope <NewOrderDTO>(MessageTypes.NewOrder, newOrder);
            await _messageBroker.SendMessageAsync("new-orders", payload);

            return(payload.RequestId);
        }
        private async Task SendOrderRequestToProviderViaMessageBrokerAsync(string providerId, int orderId, List <OrderItem> orderItems)
        {
            var messageContent = new MessageBrokerExternalOrderRequestDTO
            {
                OrderId    = orderId,
                OrderItems = orderItems.Select(x => new MessageBrokerExternalOrderItemRequestDTO {
                    OrderItemId = x.Id, Name = x.Name, Quantity = x.Quantity
                }).ToList()
            };
            var payload = new MessageBrokerEnvelope <MessageBrokerExternalOrderRequestDTO>(MessageTypes.ProviderNewOrder, messageContent);

            await _messageBroker.SendMessageAsync($"provider-{providerId}-request", payload);
        }
        public async Task ExecuteAsync <TPayload>(MessageBrokerEnvelope <TPayload> messageEnvelope)
        {
            var payload = GetEnvelopePayload <TPayload, MessageBrokerExternalOrderResponseDto>(messageEnvelope);

            var order = await _orderUoW.OrdersRepository.GetByIdAsync(payload.OrderId);

            var orderItem = await _orderUoW.OrderItemsRepository.GetItemsAsync(payload.OrderId);

            await UpdateOrderItemsStatus(order.Items);

            var updatedOrder = await _orderUoW.OrdersRepository.GetByIdAsync(payload.OrderId);

            if (updatedOrder.Items.All(x => x.Status == OrderItemStatus.Ready))
            {
                await _orderUoW.OrdersRepository.UpdateStatusAsync(updatedOrder, OrderStatus.ReadyForPickup);
            }
        }
        public async Task ExecuteAsync <TPayload>(MessageBrokerEnvelope <TPayload> messageEnvelope)
        {
            var payload = messageEnvelope.Data as NewOrderDTO;

            if (payload is null)
            {
                throw new ArgumentException($"{this.GetType().Name} cannot handle payload of type {messageEnvelope.Data.GetType().Name}.");
            }

            var persistedOrder = await SaveNewOrderAsync(payload);

            var grouppedOrderItems = persistedOrder.Items.GroupBy(x => x.ProviderId).ToDictionary(x => x.Key, v => v.ToList());

            foreach (var providerItems in grouppedOrderItems)
            {
                switch (providerItems.Key.ToLower())
                {
                case "chefsexperience":
                case "greekcuisine":
                    string endpoint = GetProviderEndpoint(providerItems.Key.ToLower());
                    await SendOrderRequestToProviderViaHttpAsync(endpoint, persistedOrder.Id, providerItems.Value);
                    await UpdateOrderItemsStatus(providerItems.Value);

                    break;

                case "xyz":
                case "kfc":
                case "prestopizza":
                    await SendOrderRequestToProviderViaMessageBrokerAsync(providerItems.Key.ToLower(), persistedOrder.Id, providerItems.Value);
                    await UpdateOrderItemsStatus(providerItems.Value);

                    break;

                default:
                    throw new Exception($"Handling order items for provider '{providerItems.Key}' is not supported.");
                }
            }

            await UpdateOrderStatus(persistedOrder);
        }