public IActionResult GetSortedArticles([FromQuery] GetArticlesList query)
        {
            var all = ArticleService.GetAllArticles()
                      .Where(article => article.ModerationStatus == ArticleModerationStatus.Accepted)
                      .ToList();

            var articles = GetFullArticles(query);

            return(Ok(new ArticlesListResponse
            {
                Data = articles,
                PageSize = query.PageSize,
                CurrentPage = query.PageNumber,
                SortBy = query.SortBy,
                OrderBy = query.OrderBy,
                TotalPages = (int)Math.Ceiling(all.Count / (double)query.PageSize),
                TotalItems = all.Count
            }));
        }
        private List <ArticleViewModel> GetFullArticles(GetArticlesList query)
        {
            var isLoggedIn = false;

            User user = null;

            if (User.Identity.Name != null)
            {
                user = UserService.Get(long.Parse(User.Identity.Name));

                if (user != null)
                {
                    isLoggedIn = true;
                }
            }

            var result   = new List <ArticleViewModel>();
            var articles = new List <Article>();

            if (query.OrderBy == OrderBy.ASC)
            {
                switch (query.SortBy)
                {
                case ArticlesSort.Comments:
                {
                    articles.AddRange(ArticleService.GetAll()
                                      .Where(article => article.ModerationStatus == ArticleModerationStatus.Accepted).ToList()
                                      .OrderBy(x => ArticleCommentService.GetArticleCommentsCount(x))
                                      .Skip((query.PageNumber - 1) * query.PageSize)
                                      .Take(query.PageSize)
                                      .ToList());

                    break;
                }

                case ArticlesSort.Likes:
                {
                    articles.AddRange(ArticleService.GetAll()
                                      .Where(article => article.ModerationStatus == ArticleModerationStatus.Accepted).ToList()
                                      .OrderBy(x => ArticleLikeService.GetArticleLikesCount(x))
                                      .Skip((query.PageNumber - 1) * query.PageSize)
                                      .Take(query.PageSize)
                                      .ToList());

                    break;
                }

                case ArticlesSort.Date:
                {
                    articles.AddRange(ArticleService.GetAll()
                                      .Where(article => article.ModerationStatus == ArticleModerationStatus.Accepted).ToList()
                                      .OrderBy(x => x.Date)
                                      .Skip((query.PageNumber - 1) * query.PageSize)
                                      .Take(query.PageSize)
                                      .ToList());

                    break;
                }

                default:
                {
                    articles.AddRange(ArticleService.GetAll()
                                      .Where(article => article.ModerationStatus == ArticleModerationStatus.Accepted).ToList()
                                      .OrderBy(x => x.Date)
                                      .Skip((query.PageNumber - 1) * query.PageSize)
                                      .Take(query.PageSize)
                                      .ToList());

                    break;
                }
                }
            }
            else
            {
                switch (query.SortBy)
                {
                case ArticlesSort.Comments:
                {
                    articles.AddRange(ArticleService.GetAll()
                                      .Where(article => article.ModerationStatus == ArticleModerationStatus.Accepted).ToList()
                                      .OrderByDescending(x => ArticleCommentService.GetArticleCommentsCount(x))
                                      .Skip((query.PageNumber - 1) * query.PageSize)
                                      .Take(query.PageSize)
                                      .ToList());

                    break;
                }

                case ArticlesSort.Likes:
                {
                    articles.AddRange(ArticleService.GetAll()
                                      .Where(article => article.ModerationStatus == ArticleModerationStatus.Accepted).ToList()
                                      .OrderByDescending(x => ArticleLikeService.GetArticleLikesCount(x))
                                      .Skip((query.PageNumber - 1) * query.PageSize)
                                      .Take(query.PageSize)
                                      .ToList());

                    break;
                }

                case ArticlesSort.Date:
                {
                    articles.AddRange(ArticleService.GetAll()
                                      .Where(article => article.ModerationStatus == ArticleModerationStatus.Accepted).ToList()
                                      .OrderByDescending(x => x.Date)
                                      .Skip((query.PageNumber - 1) * query.PageSize)
                                      .Take(query.PageSize)
                                      .ToList());

                    break;
                }

                default:
                {
                    articles.AddRange(ArticleService.GetAll()
                                      .Where(article => article.ModerationStatus == ArticleModerationStatus.Accepted).ToList()
                                      .OrderByDescending(x => x.Date)
                                      .Skip((query.PageNumber - 1) * query.PageSize)
                                      .Take(query.PageSize)
                                      .ToList());

                    break;
                }
                }
            }

            articles.ForEach(article =>
            {
                var likes = ArticleLikeService.GetAll()
                            .Where(x => x.Article == article)
                            .ToList();

                var comments = ArticleCommentService.GetAll()
                               .Where(x => x.Article == article)
                               .ToList();

                var isLiked = false;

                if (isLoggedIn)
                {
                    if (likes.FirstOrDefault(x => x.Author == user) != null)
                    {
                        isLiked = true;
                    }
                }

                var articleViewModel           = new ArticleViewModel(article, likes, comments, isLiked);
                articleViewModel.Author.Rating = ReviewService.GetSpecialistRating(article.Author);

                result.Add(articleViewModel);
            });

            return(result);
        }