public async Task <ActionResult <Guid> > OnCustomizationFailed(OrderCustomization customization, [FromServices] DaprClient daprClient) { // retrieve state of whole reservation request var stateReservation = await daprClient.GetStateEntryAsync <ReservationState>(StoreName_reservation, customization.OrderId.ToString()); if (stateReservation.Value == null) { return(this.NotFound()); } // ReservedItems: group by SKU & sum by Quantity var groupedReserved = from item in stateReservation.Value.ReservedItems group item by item.SKU into items select new { SKU = items.Key, Quantity = items.Sum(x => x.Quantity) }; // CustomizedItems: group by SKU & sum by Quantity var groupedCustomized = from item in customization.CustomizedItems group item by item.SKU into items select new { SKU = items.Key, Quantity = items.Sum(x => x.Quantity) }; foreach (var itemReserved in groupedReserved) { var customizedItem = groupedCustomized.Where(e => e.SKU == itemReserved.SKU).FirstOrDefault(); var compensateQuantity = (itemReserved.Quantity - (customizedItem == null ? 0 : customizedItem.Quantity)); if (compensateQuantity > 0) { var SKU = itemReserved.SKU; // compensate balance var quantity = -compensateQuantity; var actorID = new ActorId(SKU); var proxy = ActorProxy.Create <IReservationItemActor>(actorID, "ReservationItemActor"); var balanceQuantity = await proxy.AddReservation(quantity); // save updated reservation state stateReservation.Value.ReservedItems.Add(new ItemReservation() { SKU = SKU, Quantity = quantity, ReservedOn = DateTime.UtcNow }); await stateReservation.SaveAsync(); Console.WriteLine($"Reservation in {stateReservation.Value.OrderId} of {SKU} for {quantity}, balance {balanceQuantity}"); } } Console.WriteLine($"Acknowledged customization failed for order {customization.OrderId}"); return(this.Ok()); }
public async Task <ActionResult <OrderCustomization> > CustomizeOrder(Order order, [FromServices] DaprClient daprClient) { // no state management in this microservice sample var result = new OrderCustomization() { OrderId = order.Id, CustomizedItems = new List <ItemCustomization>() }; // no customization requested if (order.SpecialRequests == null || order.SpecialRequests.Count == 0) { await daprClient.PublishEventAsync <OrderCustomization>(PubSub, common.Topics.CustomizationCompletedTopicName, result); Console.WriteLine($"Customization in {order.Id} not requested"); return(this.Ok()); } // in case customization is requested foreach (var item in order.SpecialRequests) { var SKU = item.Scope.ProductCode; var quantity = item.Scope.Quantity; // simulate chaos is crazycookie is customized bool customizationSucceeded = !(SKU.Equals("crazycookie")); // item passed customized but Succeeded var customizedItem = new ItemCustomization() { SKU = SKU, Quantity = quantity, CustomizationId = item.CustomizationId, Succeeded = customizationSucceeded }; result.CustomizedItems.Add(customizedItem); if (!customizedItem.Succeeded) { await daprClient.PublishEventAsync <OrderCustomization>(PubSub, common.Topics.CustomizationFailedTopicName, result); Console.WriteLine($"Customization in {order.Id} of {SKU} for {quantity} failed"); return(this.NotFound()); } else { Console.WriteLine($"Customization in {order.Id} of {SKU} for {quantity}, special request {item.CustomizationId}, done"); } } await daprClient.PublishEventAsync <OrderCustomization>(PubSub, common.Topics.CustomizationCompletedTopicName, result); Console.WriteLine($"Customization in {order.Id} completed"); return(this.Ok()); }
public async Task <ActionResult <Guid> > OnCustomizationFailed(OrderCustomization customization, [FromServices] DaprClient daprClient) { var state = await daprClient.GetStateEntryAsync <OrderState>(StoreName, customization.OrderId.ToString()); if (state.Value == null) { return(this.NotFound()); } state.Value.Status = "customization failed"; state.Value.UpdatedOn = DateTime.UtcNow; await state.SaveAsync(); Console.WriteLine($"Acknowledged customization failed for order {customization.OrderId}"); return(this.Ok()); }