Esempio n. 1
0
        public JsonResult OrderReservation(OrderReservationRequestFrontEnd request)
        {
            string           sessionInfo      = GetSessionData("OrderReservation");
            OrderReservation orderReservation = new OrderReservation(request, sessionInfo, new ProjectConfigData());

            return(Json(orderReservation.Response));
        }
Esempio n. 2
0
        private void btn_OrderReservation_Click(object sender, EventArgs e)
        {
            List <string> orders = new List <string>();

            orders.Add(Guid.NewGuid().ToString());
            orders.Add(Guid.NewGuid().ToString());
            orders.Add(Guid.NewGuid().ToString());
            orders.Add(Guid.NewGuid().ToString());
            orders.Add(Guid.NewGuid().ToString());
            OrderReservationRequestFrontEnd orderRequest = new OrderReservationRequestFrontEnd()
            {
                photoProcessId = orders, requestId = Guid.NewGuid().ToString(), sessionId = Guid.NewGuid().ToString()
            };

            OrderReservation orderReservation = new OrderReservation(orderRequest, "SESSION INFO", new ProjectConfigData());
        }
        public async Task <ActionResult <Guid> > OnReservationFailed(OrderReservation reservation, [FromServices] DaprClient daprClient)
        {
            var state = await daprClient.GetStateEntryAsync <OrderState>(StoreName, reservation.OrderId.ToString());

            if (state.Value == null)
            {
                return(this.NotFound());
            }

            state.Value.Status    = "reservation failed";
            state.Value.UpdatedOn = DateTime.UtcNow;

            await state.SaveAsync();

            Console.WriteLine($"Acknowledged reservation failed for order {reservation.OrderId}");
            return(this.Ok());
        }
Esempio n. 4
0
        public async Task <ActionResult <OrderReservation> > ReserveOrder(Order order, [FromServices] DaprClient daprClient)
        {
            // retrieve state of whole reservation request
            var stateReservation = await daprClient.GetStateEntryAsync <ReservationState>(StoreName_reservation, order.Id.ToString());

            stateReservation.Value ??= new ReservationState()
            {
                OrderId = order.Id, ReservedItems = new List <ItemReservation>()
            };

            var result = new OrderReservation()
            {
                OrderId = order.Id, ReservedItems = new List <Item>()
            };

            // iterate over state of each reservation item
            foreach (var item in order.Items)
            {
                var SKU      = item.ProductCode;
                var quantity = item.Quantity;

                var actorID         = new ActorId(SKU);
                var proxy           = ActorProxy.Create <IReservationItemActor>(actorID, "ReservationItemActor");
                var balanceQuantity = await proxy.AddReservation(quantity);

                // compose result
                result.ReservedItems.Add(new Item {
                    SKU = SKU, BalanceQuantity = balanceQuantity
                });

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

            await daprClient.PublishEventAsync <Order>(PubSub, common.Topics.ReservationCompletedTopicName, order);

            Console.WriteLine($"Reservation in {stateReservation.Value.OrderId} completed");
            return(this.Ok());
        }
        public async Task <ActionResult <OrderReservation> > ReserveOrder(Order order, [FromServices] DaprClient daprClient)
        {
            // retrieve state of whole reservation request
            var stateReservation = await daprClient.GetStateEntryAsync <ReservationState>(StoreName_reservation, order.Id.ToString());

            stateReservation.Value ??= new ReservationState()
            {
                OrderId = order.Id, ReservedItems = new List <ItemReservation>()
            };

            var result = new OrderReservation()
            {
                OrderId = order.Id, ReservedItems = new List <Item>()
            };

            // iterate over state of each reservation item
            foreach (var item in order.Items)
            {
                var SKU      = item.ProductCode;
                var quantity = item.Quantity;

                var stateItem = await daprClient.GetStateEntryAsync <ItemState>(StoreName_item, SKU);

                stateItem.Value ??= new ItemState()
                {
                    SKU = SKU, Changes = new List <ItemReservation>()
                };

                // update balance
                stateItem.Value.BalanceQuantity -= quantity;

                // record change
                ItemReservation change = new ItemReservation()
                {
                    SKU = SKU, Quantity = quantity, ReservedOn = DateTime.UtcNow
                };
                stateItem.Value.Changes.Add(change);
                // keep only the 10 latest changes
                if (stateItem.Value.Changes.Count > 10)
                {
                    stateItem.Value.Changes.RemoveAt(0);
                }

                // save item state
                await stateItem.SaveAsync();

                // compose result
                result.ReservedItems.Add(new Item {
                    SKU = SKU, BalanceQuantity = stateItem.Value.BalanceQuantity
                });

                // save updated reservation state
                stateReservation.Value.ReservedItems.Add(change);
                await stateReservation.SaveAsync();

                Console.WriteLine($"Reservation in {stateReservation.Value.OrderId} of {SKU} for {quantity}, balance {stateItem.Value.BalanceQuantity}");
            }

            await daprClient.PublishEventAsync <Order>(PubSub, common.Topics.ReservationCompletedTopicName, order);

            Console.WriteLine($"Reservation in {stateReservation.Value.OrderId} completed");
            return(this.Ok());
        }