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