Пример #1
0
        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());
        }