// AddItemToCart(string, MenuItemView) => async void // Associates a given item with an order id and sets it in the database // PRODUCTION: This should be called from an AJAX POST/GET script. public async Task AddItemToCart(string orderId, MenuItemView item)//string optionId, Sauce sauce, string itemId, int quantity) { if (orderId != null && orderId != "" && item != null) { // see if there is already a menuitem with that comb OrderItems existingItem = await this.database.OrderItems.Where(x => x.OrderId == orderId && x.MenuItemId == item.Id && x.OptionId == item.OptionSelected).FirstOrDefaultAsync(); // Entry point: Item does exist already in the cart if (existingItem != null) { // just in case - this shouldn't be possible since there is javascript verification and currently this is AJAX only. // However, this is here in case we have users who don't use JS or somehow validation doesn't catch it properly if (item.Quantity < 0) { existingItem.Quantity = 0; existingItem.Removed = true; } else { // we just update the changes existingItem.Quantity = item.Quantity; existingItem.Removed = false; existingItem.OptionId = item.OptionSelected; existingItem.IsHalfOrder = item.IsHalfOrder; existingItem.Sauce = item.Sauce; existingItem.SpiceLevel = item.SpiceLevel; existingItem.Created = DateTime.Now; } if (this.database.Entry(existingItem).State == EntityState.Detached) { this.database.OrderItems.Attach(existingItem); } this.database.Entry(existingItem).State = EntityState.Modified; } // end item exists and entry item doesn't exist else { // we create the new item existingItem = new OrderItems() { MenuItemId = item.Id, OrderId = orderId, Quantity = item.Quantity, IsHalfOrder = item.IsHalfOrder, OptionId = item.OptionSelected, SpiceLevel = item.SpiceLevel, Created = DateTime.Now }; this.database.OrderItems.Add(existingItem); } } await this.database.SaveChangesAsync(); }
// UpdateItem(string, MenuItemView) => void // Takes an item and updates the parameters of it // PRODUCTION: This is called via AJAX public async Task UpdateItem(string orderItemId, string orderId, MenuItemView item) { // only execute if not null if (item != null) { var dbItem = await this.database.OrderItems.Where(x => x.Id == orderItemId).FirstOrDefaultAsync(); // if it doesn't exist already, we just add it if (dbItem == null) { await AddItemToCart(orderId, item); } else if (dbItem.MenuItemId != item.Id) { await RemoveItemFromCart(orderId, dbItem.Id, dbItem.OptionId); await AddItemToCart(orderId, item); } else { dbItem.Created = DateTime.Now; dbItem.IsHalfOrder = item.IsHalfOrder; dbItem.OptionId = item.OptionSelected; dbItem.Quantity = item.Quantity; dbItem.Sauce = item.Sauce; dbItem.SpiceLevel = item.SpiceLevel; if (this.database.Entry(dbItem).State == EntityState.Detached) { this.database.OrderItems.Attach(dbItem); } this.database.Entry(dbItem).State = EntityState.Modified; } } }
public async Task<string> AddToCart(string itemId, bool halfOrder, string optionId, int quantity, SpicyScale ? spiceLevel, Sauce ? sauce) { try { MenuItemView newItem = new MenuItemView() { IsHalfOrder = halfOrder, OptionSelected = optionId, Quantity = quantity, SpiceLevel = spiceLevel, Sauce = sauce }; var dbItem = await SpicyGardenDbContext.Menu.Where(m => m.Id == itemId).FirstAsync(); newItem.Id = dbItem.Id; HttpCookie c = Request.Cookies["blowme"]; if (!AssertNonTampered(c["cid"], c["oid"], c)) { RedirectToAction("Index"); } var oid = c["oid"]; await orderHandler.AddItemToCart(oid, newItem); return GenerateItemHtml(await this.SpicyGardenDbContext.OrderItems.Where(x => x.OrderId == oid && x.MenuItemId == itemId && x.Removed == false).FirstOrDefaultAsync()); } catch (Exception e) { return "error"; } }