예제 #1
0
        public IActionResult GetArticles([FromQuery] ArticleQueryParameters articleParameters)
        {
            if (articleParameters == null)
            {
                return(BadRequest(JsonConvert.SerializeObject("Null params")));
            }

            if (!articleParameters.ValidYearRange)
            {
                return(BadRequest(JsonConvert.SerializeObject("Max date cannot be less than min date")));
            }

            if (articleParameters.Tags != null)
            {
                articleParameters.Tags = articleParameters.Tags.TrimEnd();
            }

            PagedList <Article> articles = null;

            try
            {
                articles = articleService.GetArticles(articleParameters);
            }
            catch (ServiceException ex)
            {
                logger.LogError(ex.Message);
                return(BadRequest(JsonConvert.SerializeObject("Server error")));
            }

            if (articles == null)
            {
                return(Ok(new List <Article>()));
            }

            var metadata = new
            {
                articles.TotalCount,
                articles.PageSize,
                articles.CurrentPage,
                articles.TotalPages,
                articles.HasNext,
                articles.HasPrevious
            };

            Response.Headers.Add("X-Pagination", JsonConvert.SerializeObject(metadata));

            logger.LogInformation($"Returned {articles.TotalCount} articles from database.");

            return(Ok(JsonConvert.SerializeObject(articles)));
        }
예제 #2
0
 public PagedList <Article> GetArticles(ArticleQueryParameters parameters)
 {
     if (parameters == null)
     {
         throw new ServiceNullArgumentException("articlequeryparams was null");
     }
     try
     {
         return(daoFactory.GetArticleRepo().GetArticles(parameters));
     }
     catch (DALException ex)
     {
         throw new ServiceException($"DAL exception : {ex.Message}");
     }
 }
예제 #3
0
        private string CreateResourceUri(ArticleQueryParameters queryParameters, ResourceUriType type)
        {
            switch (type)
            {
            case ResourceUriType.PreviousPage:
                return(_urlHelper.Link(GetArticlesActionName,
                                       new
                {
                    category = queryParameters.Category,
                    fields = queryParameters.Fields,
                    search = queryParameters.Search,
                    orderBy = queryParameters.OrderBy,
                    pageNumber = queryParameters.PageNumber - 1,
                    pageSize = queryParameters.PageSize
                }));

            case ResourceUriType.NextPage:
                return(_urlHelper.Link(GetArticlesActionName,
                                       new
                {
                    category = queryParameters.Category,
                    fields = queryParameters.Fields,
                    search = queryParameters.Search,
                    orderBy = queryParameters.OrderBy,
                    pageNumber = queryParameters.PageNumber + 1,
                    pageSize = queryParameters.PageSize
                }));

            default:
                return(_urlHelper.Link(GetArticlesActionName,
                                       new
                {
                    category = queryParameters.Category,
                    fields = queryParameters.Fields,
                    search = queryParameters.Search,
                    orderBy = queryParameters.OrderBy,
                    pageNumber = queryParameters.PageNumber,
                    pageSize = queryParameters.PageSize
                }));
            }
        }
예제 #4
0
 public PagedList <Article> GetArticles(ArticleQueryParameters parameters)
 {
예제 #5
0
        public IActionResult GetArticles([FromQuery] ArticleQueryParameters queryParameters)
        {
            var result =
                _articlePropertyMapping.ValidMappingExistsFor <ArticleListViewModel, Article>(queryParameters.OrderBy);

            if (!result.Item1)
            {
                foreach (var invalidField in result.Item2)
                {
                    AddError("orderBy", $"{invalidField} is not a valid orderBy parameter");
                }
            }

            result = _typeMappingHelper.TypeHasProperties <ArticleListViewModel>(queryParameters.Fields);
            if (!result.Item1)
            {
                foreach (var invalidField in result.Item2)
                {
                    AddError("fields", $"{invalidField} is not a valid fields parameter");
                }
            }

            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            var articles = _unitOfWork.Articles.GetArticles();

            articles = articles.ApplySort(queryParameters.OrderBy,
                                          _articlePropertyMapping.GetPropertyMapping <ArticleListViewModel, Article>());

            if (!string.IsNullOrWhiteSpace(queryParameters.Category))
            {
                var categorySlug = queryParameters.Category.Trim().ToLower();
                articles = articles.Where(a => a.Category.Slug == categorySlug);
            }

            if (!string.IsNullOrWhiteSpace(queryParameters.Search))
            {
                var searchQuery = queryParameters.Search.Trim().ToLowerInvariant();
                articles = articles.Where(a => a.Title.ToLowerInvariant().Contains(searchQuery) ||
                                          a.Body.ToLowerInvariant().Contains(searchQuery));
            }

            var pagedArticles =
                PagedList <Article> .Create(articles, queryParameters.PageNumber, queryParameters.PageSize);

            var previousPageLink = pagedArticles.HasPrevious
                ? CreateResourceUri(queryParameters, ResourceUriType.PreviousPage)
                : null;

            var nextPageLink = pagedArticles.HasNext
                ? CreateResourceUri(queryParameters, ResourceUriType.NextPage)
                : null;

            var paginationMetadata = new
            {
                totalCount  = pagedArticles.TotalCount,
                pageSize    = pagedArticles.PageSize,
                currentPage = pagedArticles.CurrentPage,
                totalPages  = pagedArticles.TotalPages,
                previousPageLink,
                nextPageLink
            };

            Response.Headers.Add("X-Pagination", JsonConvert.SerializeObject(paginationMetadata));

            var articleVm = Mapper.Map <IEnumerable <ArticleListViewModel> >(pagedArticles);

            return(Ok(articleVm.ShapeData(queryParameters.Fields)));
        }