public PostsControllerTests()
        {
            _repoMock = new Mock <IRecipeRepository>();

            var mockMapper = new MapperConfiguration(cfg => { cfg.AddProfile(new AutoMapperProfiles()); });

            var mapper = mockMapper.CreateMapper();

            _postsController         = new PostsController(_repoMock.Object, mapper);
            _calculateAverageRatings = new CalculateAverageRatings(_repoMock.Object);

            // Mock claim types
            _userClaims = new ClaimsPrincipal(new ClaimsIdentity(new Claim[]
            {
                new Claim(ClaimTypes.Name, "josh"),
                new Claim(ClaimTypes.NameIdentifier, "2"),
            }, "mock"));
            _postsController.ControllerContext = new ControllerContext()
            {
                HttpContext = new DefaultHttpContext()
                {
                    User = _userClaims
                }
            };
        }
        public async Task <IActionResult> GetPost(int id)
        {
            var calculateAverageRatings = new CalculateAverageRatings(_recipeRepo);
            var post = await _recipeRepo.GetPost(id);

            var average = calculateAverageRatings.GetAverageRating(id).Result;

            // Assign users avatar to the post
            var authorAvatar = await _recipeRepo.GetMainPhotoForUser(post.UserId);

            if (authorAvatar != null)
            {
                post.UserPhotoUrl = authorAvatar.Url;
            }

            // Assign commenters photos
            foreach (var comment in post.Comments)
            {
                var commenterId         = comment.CommenterId;
                var commentersMainPhoto = await _recipeRepo.GetMainPhotoForUser(commenterId);

                if (commentersMainPhoto != null)
                {
                    comment.UserPhotoUrl = commentersMainPhoto.Url;
                }
            }

            if (post.Ratings.Count() == 0)
            {
                post.AverageRating = 0;
            }
            else
            {
                post.AverageRating = average;
            }

            var postFromRepo = _mapper.Map <PostsForDetailedDto>(post);

            if (await _recipeRepo.SaveAll())
            {
                return(Ok(postFromRepo));
            }

            return(Ok(postFromRepo));
        }
        public async Task <IActionResult> GetPosts([FromQuery] PageParams pageParams, PostForSearchDto postForSearchDto)
        {
            var calculateAverageRatings = new CalculateAverageRatings(_recipeRepo);
            var posts = await _recipeRepo.GetPosts(pageParams, postForSearchDto);


            foreach (var post in posts)
            {
                // Assign users avatar to the post
                var authorAvatar = await _recipeRepo.GetMainPhotoForUser(post.UserId);

                if (authorAvatar != null)
                {
                    post.UserPhotoUrl = authorAvatar.Url;
                }

                // Calculate average rating of post
                var average = calculateAverageRatings.GetAverageRating(post.PostId).Result;
                if (post.Ratings.Count() == 0)
                {
                    post.AverageRating = 0;
                }
                else
                {
                    post.AverageRating = average;
                }
            }

            var postsFromRepo = _mapper.Map <IEnumerable <PostsForListDto> >(posts);

            Response.AddPagination(posts.CurrentPage, posts.PageSize, posts.TotalCount, posts.TotalPages);

            // If update to average rating, save to the database and return the newly updated posts
            if (await _recipeRepo.SaveAll())
            {
                return(Ok(postsFromRepo));
            }

            return(Ok(postsFromRepo));
        }