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))); }
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}"); } }
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 })); } }
public PagedList <Article> GetArticles(ArticleQueryParameters parameters) {
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))); }