public async Task <IActionResult> FollowTheRecipe(Guid id)
        {
            Recipe recipe = await recipeRepository.FindAsync(r => r.Id == id);

            User user = await _signInManager.UserManager.GetUserAsync(User);

            IEnumerable <Fridge> productsInFridge = await fridgeRepository.GetUserProducts(user);

            List <Guid>            productsInFridgeToRemove = new List <Guid>();
            Dictionary <Guid, int> productsInFridgeToChange = new Dictionary <Guid, int>();

            foreach (var fridge in productsInFridge)
            {
                if (recipe.Ingredients.Any(ingredient => ingredient.Product.Id == fridge.Product.Id))
                {
                    var subtraction = fridge.Quantity - recipe.Ingredients.Where(i => i.Product.Id == fridge.Product.Id).First().Quantity;

                    if (subtraction == 0)
                    {
                        productsInFridgeToRemove.Add(fridge.Product.Id);
                    }
                    else
                    {
                        productsInFridgeToChange.Add(fridge.Product.Id, subtraction);
                    }
                }
            }

            foreach (var item in productsInFridgeToRemove)
            {
                fridgeRepository.Remove(productsInFridge.Where(p => p.Product.Id == item).First());
            }

            foreach (var item in productsInFridgeToChange)
            {
                Fridge fridge = productsInFridge.Where(p => p.Product.Id == item.Key).First();
                fridge.Quantity = item.Value;
                fridgeRepository.Update(fridge);
            }

            productsInFridge = await fridgeRepository.GetUserProducts(user);

            return(PartialView("_RecipeDetails", new RecipeDetailsViewModel
            {
                Recipe = recipe,
                DidUserRate = recipe.Ratings.Any(rating => rating.User == user),
                IsInUserFavourites = false,
                HasIngredients = recipe.Ingredients.All(i => productsInFridge.Any(p => (p.Product.Id == i.Product.Id && (p.Quantity >= i.Quantity))))
            }));
        }
Example #2
0
        public async Task <IActionResult> AddToFridge(FridgeViewModel fridge)
        {
            User user = await _signInManager.UserManager.GetUserAsync(User);

            var products = await productRepository.Products();

            products = products.OrderBy(p => p.Name);

            if (!ModelState.IsValid)
            {
                if (ModelState["Id"].Errors.Count != 0)
                {
                    ModelState.Remove("Id");
                    ModelState.SetModelValue("Id", new ValueProviderResult("Należy wybrać produkt", CultureInfo.InvariantCulture));
                    ModelState.AddModelError("Id", "Należy wybrać produkt");
                }

                fridge.Products = products;
                fridge.Fridges  = await fridgeRepository.GetUserProducts(user);

                return(View("Fridge", fridge));
            }

            Fridge productInFridge = await fridgeRepository.FindAsync(f => f.Product.Id == fridge.Id && f.User.Id == user.Id);

            if (productInFridge != null)
            {
                productInFridge.Quantity = (int)fridge.Quantity;
                fridgeRepository.Update(productInFridge);
            }
            else
            {
                Product product = await productRepository.FindAsync(p => p.Id == fridge.Id);

                fridgeRepository.Add(new Fridge {
                    Product = product, User = user, Quantity = (int)fridge.Quantity
                });
            }

            return(RedirectToAction("Fridge"));
        }