public async Task <CartResponse> addToCartAsync(AddToCartModel addToCartModel) { if (addToCartModel == null) { return(new CartResponse { Status = "Error", Message = "Bad request" }); } var cart = await appDb.Carts.SingleOrDefaultAsync(x => x.Id == addToCartModel.CartId); if (cart == null) { cart = new ShoppingCart(); await appDb.AddAsync(cart); await appDb.SaveChangesAsync(); } var cartProduct = await appDb.CartProducts.FindAsync(cart.Id, addToCartModel.ProductId, addToCartModel.ProductVariationId); var productOption = await appDb.Options.Where(o => o.Name == addToCartModel.OptionName).FirstOrDefaultAsync(); // If null return error indicator if (productOption == null) { return(new CartResponse { Status = "Error", Message = "Option not found" }); } var productStock = appDb.ProductOptions .Where(p => p.ProductId == addToCartModel.ProductId && p.ProductVariationId == addToCartModel.ProductVariationId && p.OptionId == productOption.Id) .Select(p => p.ProductStock) .FirstOrDefault(); if (productStock < addToCartModel.Quantity) { return(new CartResponse { Status = "Error", Message = "Not enough products in stock" }); } if (addToCartModel.Quantity == null) { addToCartModel.Quantity = 1; } if (cartProduct == null) { cartProduct = new CartProduct() { CartId = cart.Id, ProductId = addToCartModel.ProductId, ProductVariationId = addToCartModel.ProductVariationId, Quantity = (int)addToCartModel.Quantity, OptionId = productOption.Id, Option = productOption }; await appDb.CartProducts.AddAsync(cartProduct); } else { if (productStock <= cartProduct.Quantity) { return(new CartResponse { Status = "Error", Message = "Not enough products in stock" }); } cartProduct.Quantity += (int)addToCartModel.Quantity; } await appDb.SaveChangesAsync(); cart.TotalPrice = await getCartPriceAsync(cart.Id); await appDb.SaveChangesAsync(); var cartCount = await getCartProductsCountAsync(cart.Id); var cartProducts = await getCartProductsAsync(cart.Id); return(new CartResponse { CartId = cart.Id, CartPrice = cart.TotalPrice, CartCount = cartCount, CartProducts = cartProducts, Status = "Success", Message = "Succesfully added product to cart" }); }