public async Task <int> ChangeShoppingCartProductCountAsync(Product product, ShoppingCart shoppingCart, string operation, ISession session)
        {
            if (shoppingCart != null)
            {
                int returnCode = 1;

                await Task.Run(() =>
                {
                    try
                    {
                        ShoppingCartProduct shoppingCartProduct = _context.ShoppingCartProduct
                                                                  .Where(scp => scp.Product.Name == product.Name && scp.ShoppingCart == shoppingCart)
                                                                  .FirstOrDefault();

                        //Change
                        if (operation == "reduce" && shoppingCartProduct.Quantity > 1)
                        {
                            shoppingCartProduct.Quantity--;
                        }
                        else if (operation == "increase")
                        {
                            shoppingCartProduct.Quantity++;
                        }

                        _context.Update(shoppingCartProduct);
                        _context.Update(shoppingCart);

                        var t2 = Task.Run(
                            async() =>
                        {
                            await _context.SaveChangesAsync();
                        });
                        t2.Wait();
                        returnCode = 0;
                    }
                    catch (Exception)
                    {
                        returnCode = 1;
                    }
                });

                return(returnCode);
            }
            else
            {
                if (operation == "reduce")
                {
                    await session.AddSessionProductAsync(product.Id, -1);
                }
                else if (operation == "increase")
                {
                    await session.AddSessionProductAsync(product.Id, 1);
                }
                return(0);
            }
        }
        public async Task <int> AddProductToShoppingCartAsync(Product product, ShoppingCart cart, int quantity, ISession session)
        {
            if (cart != null)
            {
                int returnCode = 1;
                // 0 - success
                // 1 - error
                // 2 - limit reached
                await Task.Run(() =>
                {
                    try
                    {
                        // Check if such product has already been added
                        ShoppingCartProduct shoppingCartProduct = _context.ShoppingCartProduct
                                                                  .Where(scp => scp.Product == product && scp.ShoppingCart == cart)
                                                                  .FirstOrDefault();

                        // No such product found
                        if (shoppingCartProduct == null)
                        {
                            int productsInCart = 0;
                            var t = Task.Run(async() => { productsInCart = await CountProductsInShoppingCart(cart); });
                            t.Wait();

                            if (productsInCart >= maxProductsInShoppingCart)
                            {
                                returnCode = 2;
                            }
                            else
                            {
                                shoppingCartProduct = new ShoppingCartProduct
                                {
                                    Product      = product,
                                    ShoppingCart = cart,
                                    Quantity     = quantity
                                };

                                _context.Add(shoppingCartProduct);

                                var t2 = Task.Run(
                                    async() =>
                                {
                                    await _context.SaveChangesAsync();
                                });
                                t2.Wait();
                                returnCode = 0; // success
                            }
                        }
                        // Product found: update it
                        else
                        {
                            shoppingCartProduct.ShoppingCart = cart;
                            shoppingCartProduct.Quantity    += quantity;


                            _context.Update(shoppingCartProduct);

                            var t2 = Task.Run(
                                async() =>
                            {
                                await _context.SaveChangesAsync();
                            });
                            t2.Wait();
                            returnCode = 0; // success
                        }
                    }
                    catch (Exception)
                    {
                        returnCode = 1; // exception
                                        //throw new Exception(e.ToString());
                    }
                });

                return(returnCode);
            }
            else
            {
                if (await session.CountProducts() >= maxProductsInShoppingCart)
                {
                    return(2);
                }
                else
                {
                    await session.AddSessionProductAsync(product.Id, quantity);

                    return(0);
                }
            }
        }