public IOrder SuggestOrder(IUser user) { if (user is null) { throw new ArgumentNullException(paramName: nameof(user)); } if (OrderHistory.TryGetValue(user, out Stack <IOrder> userHistory) && userHistory.Count > 0) { // suggest user's last order return(new Order(userHistory.Peek())); } return(new Order(pizzasByPrice: DefaultSuggestedOrderPizzas, location: this, user: user)); }
// returns any rejected orders public ICollection <IOrder> Order(IUser user, ICollection <IOrder> orders) { if (user is null) { throw new ArgumentNullException(paramName: nameof(user)); } if (orders is null) { throw new ArgumentNullException(paramName: nameof(orders)); } var attemptedOrderTime = TimeProvider.Current.UtcNow; if (orders.Count > user.MaxOrdersPerCall) { throw new ArgumentException(message: $"user should not exceed {user.MaxOrdersPerCall} orders per call.", paramName: nameof(orders)); } if (LastOrderTime.TryGetValue(user, out DateTime userLastOrderTime) && attemptedOrderTime - userLastOrderTime < MinOrderInterval) { // user cannot order from here within 2 hours of last order return(new List <IOrder>(orders)); } ICollection <IOrder> rejectedOrders = new List <IOrder>(); IPizzaStoreDBContext context = PSDBContextProvider.Current.NewPSDBContext; foreach (IOrder order in orders) { // reject if this order is for another location if (order.Location != this) { rejectedOrders.Add(order); continue; } // reject if this exact order has already been ordered if (order.Time != null) { rejectedOrders.Add(order); continue; } int piesRequired = order.PizzasByPrice.Sum(x => x.Value); // reject if there is not enough inventory for this order if (piesRequired > PieCount) { rejectedOrders.Add(order); continue; } if (!OrderHistory.TryGetValue(user, out Stack <IOrder> userOrderHistory)) { userOrderHistory = new Stack <IOrder>(); OrderHistory[user] = userOrderHistory; } userOrderHistory.Push(order); LastOrderTime[user] = attemptedOrderTime; order.Time = attemptedOrderTime; PieCount -= piesRequired; Dao.Inventory = PieCount; context.Update(Dao); context.Update(order.Dao); } context.SaveChanges(); context.Dispose(); return(rejectedOrders); }