public void GetAverageRatingOfPosts_NoRatingsYet_Returns_Default()
        {
            // Arrange
            var postId          = 2;
            var ratingsFromRepo = GetFakeRatingsList2().Where(x => x.PostId == postId);

            // Act
            _repoMock.Setup(x => x.GetRatings(postId)).ReturnsAsync(ratingsFromRepo);

            var result = _calculateAverageRatings.GetAverageRating(postId).Result;

            // Assert
            var okResult = Assert.IsType <double>(result);

            Assert.Equal(ratingsFromRepo.Count().ToString(), okResult.ToString());
        }
        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));
        }