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); }
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); }