private IEnumerable <LinkDto> CreateLinksForCategories( CategoriesResourceParameters categoriesResourceParameters, bool hasNext, bool hasPrevious) { var links = new List <LinkDto> { new LinkDto(CreateCategoriesResourceUri(categoriesResourceParameters, ResourceUriType.Current) , "self", "GET") }; if (hasNext) { links.Add( new LinkDto(CreateCategoriesResourceUri(categoriesResourceParameters, ResourceUriType.NextPage), "nextPage", "GET")); } if (hasPrevious) { links.Add( new LinkDto(CreateCategoriesResourceUri(categoriesResourceParameters, ResourceUriType.PreviousPage), "previousPage", "GET")); } return(links); }
private string CreateCategoriesResourceUri(CategoriesResourceParameters categoriesResourceParameters, ResourceUriType type) { switch (type) { case ResourceUriType.PreviousPage: return(_urlHelper.Link("GetCategories", new { fields = categoriesResourceParameters.Fields, orderBy = categoriesResourceParameters.OrderBy, searchQuery = categoriesResourceParameters.SearchQuery, pageNumber = categoriesResourceParameters.PageIndex - 1, pageSize = categoriesResourceParameters.PageSize })); case ResourceUriType.NextPage: return(_urlHelper.Link("GetCategories", new { fields = categoriesResourceParameters.Fields, orderBy = categoriesResourceParameters.OrderBy, searchQuery = categoriesResourceParameters.SearchQuery, pageNumber = categoriesResourceParameters.PageIndex + 1, pageSize = categoriesResourceParameters.PageSize })); case ResourceUriType.Current: default: return(_urlHelper.Link("GetCategories", new { fields = categoriesResourceParameters.Fields, orderBy = categoriesResourceParameters.OrderBy, searchQuery = categoriesResourceParameters.SearchQuery, pageNumber = categoriesResourceParameters.PageIndex, pageSize = categoriesResourceParameters.PageSize })); } }
public Task <PagedList <Category> > GetCategoriesAsync(CategoriesResourceParameters categoriesResourceParameters) { var collectionBeforePaging = QueryableExtensions.ApplySort(_categoryRepository .FindAllCategoriesPagedOf(categoriesResourceParameters.PageIndex, categoriesResourceParameters.PageSize), categoriesResourceParameters.OrderBy, _propertyMappingService.GetPropertyMapping <CategoryUiModel, Category>()); if (!string.IsNullOrEmpty(categoriesResourceParameters.SearchQuery)) { // trim & ignore casing var searchQueryForWhereClause = categoriesResourceParameters.SearchQuery .Trim().ToLowerInvariant(); collectionBeforePaging.QueriedItems = collectionBeforePaging.QueriedItems .Where(a => a.Name.ToLowerInvariant().Contains(searchQueryForWhereClause)); } return(Task.Run(() => PagedList <Category> .Create(collectionBeforePaging, categoriesResourceParameters.PageIndex, categoriesResourceParameters.PageSize))); }
public async Task <IActionResult> GetCategoriesAsync([FromQuery] CategoriesResourceParameters categoriesResourceParameters, [FromHeader(Name = "Accept")] string mediaType) { if (!_propertyMappingService.ValidMappingExistsFor <CategoryUiModel, Category> (categoriesResourceParameters.OrderBy)) { return(BadRequest()); } if (!_typeHelperService.TypeHasProperties <CategoryUiModel> (categoriesResourceParameters.Fields)) { return(BadRequest()); } var categoriesQueryable = await _inquiryAllCategoriesProcessor.GetCategoriesAsync(categoriesResourceParameters); var categories = Mapper.Map <IEnumerable <CategoryUiModel> >(categoriesQueryable); if (mediaType.Contains("application/vnd.marvin.hateoas+json")) { var paginationMetadata = new { totalCount = categoriesQueryable.TotalCount, pageSize = categoriesQueryable.PageSize, currentPage = categoriesQueryable.CurrentPage, totalPages = categoriesQueryable.TotalPages, }; Response.Headers.Add("X-Pagination", JsonConvert.SerializeObject(paginationMetadata)); var links = CreateLinksForCategories(categoriesResourceParameters, categoriesQueryable.HasNext, categoriesQueryable.HasPrevious); var shapedCategories = categories.ShapeData(categoriesResourceParameters.Fields); var shapedCategoriesWithLinks = shapedCategories.Select(category => { var categoryAsDictionary = category as IDictionary <string, object>; var categoryLinks = CreateLinksForCategory((Guid)categoryAsDictionary["Id"], categoriesResourceParameters.Fields); categoryAsDictionary.Add("links", categoryLinks); return(categoryAsDictionary); }); var linkedCollectionResource = new { value = shapedCategoriesWithLinks, links = links }; return(Ok(linkedCollectionResource)); } else { var previousPageLink = categoriesQueryable.HasPrevious ? CreateCategoriesResourceUri(categoriesResourceParameters, ResourceUriType.PreviousPage) : null; var nextPageLink = categoriesQueryable.HasNext ? CreateCategoriesResourceUri(categoriesResourceParameters, ResourceUriType.NextPage) : null; var paginationMetadata = new { previousPageLink = previousPageLink, nextPageLink = nextPageLink, totalCount = categoriesQueryable.TotalCount, pageSize = categoriesQueryable.PageSize, currentPage = categoriesQueryable.CurrentPage, totalPages = categoriesQueryable.TotalPages }; Response.Headers.Add("X-Pagination", JsonConvert.SerializeObject(paginationMetadata)); return(Ok(categories.ShapeData(categoriesResourceParameters.Fields))); } }