示例#1
0
 public async Task <ActionResult <bool> > Put(ItemAmountChangeRequest request)
 {
     try
     {
         return(Ok(await service.ChangeCount(await users.GetByUsername(User.Identity.Name), request)));
     }
     catch (Exception)
     {
         return(NotFound($"User \'{User.Identity.Name}\' or item with ID {request.Id} could not be found!"));
     }
 }
        /// <inheritdoc />
        public async Task <int> PlaceOrder(string username, OrderDTO orderdto)
        {
            // Throw out invalid data first
            if (orderdto == null || !orderdto.IsValid())
            {
                throw new ArgumentException("Order could not be found");
            }

            var user = await users.SingleAsync(s => s.Name == username);

            // Create new order object
            var order = new Order
            {
                User      = user,
                OrderTime = DateTime.Now
            };

            // Create list of order items from dto
            var orderitems = orderdto.Items.Select(s =>
                                                   new OrderItem
            {
                Order  = order,
                Item   = items.SingleOrDefault(t => t.Id == s.Id),
                Amount = s.Amount
            })
                             .ToList();

            // And get total price
            var totalPrice = orderitems.Select(s => (s.Amount * s.Item.Price)).Sum();

            // Balance check
            if (!user.HasBalance(totalPrice))
            {
                return(0);
            }


            var hasBev  = orderitems.Any(s => s.Item.Type == ItemType.Beverage);
            var hasFood = orderitems.Any(s => s.Item.Type == ItemType.Food);

            // Set status to none if none are present
            order.StatusBeverage = (hasBev ? OrderStatus.Pending : OrderStatus.None);
            order.StatusFood     = (hasFood ? OrderStatus.Pending : OrderStatus.None);


            order.Items = orderitems;
            var log = new Dictionary <Item, int>();

            // Go over all items and change their count
            foreach (var item in orderdto.Items)
            {
                var dbItem = await items.SingleAsync(s => s.Id == item.Id);

                try
                {
                    //temp.Amount -= item.Amount;
                    if (await itemService.ChangeCount(user, new ItemAmountChangeRequest {
                        Id = dbItem.Id, Amount = -item.Amount
                    }))                                                                                                             //Should it fail, the item is rejected. This will be notified to the catering. This will not affect the Users balance.
                    {
                        log.Add(dbItem, -item.Amount);
                    }
                    else
                    {
                        RevertUser(user, dbItem.Count * dbItem.Price);//Refunds the failed item. It will not show up in the history.
                    }
                }
                catch (Exception)
                {
                    throw;
                }

                items.Update(dbItem);//Updated Item
            }

            var result = await orders.AddAsync(order);//Order added

            await context.SaveChangesAsync();

            await userService.ChangeBalance(user.Name, -totalPrice, true);

            return(result.Entity.Id);
        }