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