private IEnumerable <LinkDto> CreateBoardsLinks(BoardsParams boardsParams, bool hasPrevious, bool hasNext) { var links = new List <LinkDto>(); links.Add( new LinkDto(CreateBoardResourceUri(boardsParams, UriTypeEnum.Current), "self", "GET")); if (hasNext) { links.Add( new LinkDto(CreateBoardResourceUri(boardsParams, UriTypeEnum.NextPage), "nextPage", "GET") ); } if (hasPrevious) { links.Add( new LinkDto(CreateBoardResourceUri(boardsParams, UriTypeEnum.PreviousPage), "previousPage", "GET") ); } return(links); }
private string CreateBoardResourceUri(BoardsParams uriParams, UriTypeEnum uriType) { switch (uriType) { case UriTypeEnum.PreviousPage: return(Url.Link("GetBoards", new { pageNumber = uriParams.PageNumber - 1, pageSize = uriParams.PageSize })); case UriTypeEnum.NextPage: return(Url.Link("GetBoards", new { pageNumber = uriParams.PageNumber + 1, pageSize = uriParams.PageSize })); case UriTypeEnum.Current: default: return(Url.Link("GetBoards", new { pageNumber = uriParams.PageNumber, pageSize = uriParams.PageSize })); } }
public async Task <PagedList <Board> > GetBoardsAsync(BoardsParams boardsParams) { var collection = await _boardRepository.GetBoardsAsync(); var pagedList = PagedList <Board> .Create(collection, boardsParams.PageNumber, boardsParams.PageSize); return(pagedList); }
//[Produces("application/json", "application/xml", "application/vnd.restwall.hateoas+json")] public async Task <ActionResult> GetBoardsAsync([FromQuery] BoardsParams boardsParams, [FromHeader(Name = "Accept")] string mediaType) { if (!MediaTypeHeaderValue.TryParse(mediaType, out MediaTypeHeaderValue parsedMediaType)) { return(BadRequest()); } var boards = await _boardService.GetBoardsAsync(boardsParams); if (boards == null) { return(NotFound()); } if (!boards.Any()) { return(NotFound()); } var previousPageLink = boards.HasPrevious ? CreateBoardResourceUri(boardsParams, UriTypeEnum.PreviousPage) : null; var nextPageLink = boards.HasNext ? CreateBoardResourceUri(boardsParams, UriTypeEnum.NextPage) : null; var paginationMetaData = new { totalCount = boards.TotalCount, pageSize = boards.PageSize, currentPage = boards.CurrentPage, totalPages = boards.TotalPages, previousPageLink, nextPageLink }; var paginationMetaDataJson = System.Text.Json.JsonSerializer.Serialize(paginationMetaData); Response.Headers.Add("X-Pagination", paginationMetaDataJson); var includeLinks = parsedMediaType.SubTypeWithoutSuffix.EndsWith("hateoas", StringComparison.InvariantCultureIgnoreCase); if (includeLinks) { var boardsWithLinks = new List <ResponseBoardLinksDto>(); foreach (var item in boards) { IEnumerable <LinkDto> links = new List <LinkDto>(); links = CreateBoardLinks(item.Id); var boardWithLinks = _mapper.Map <ResponseBoardLinksDto>(item); boardWithLinks.Links = links; boardsWithLinks.Add(boardWithLinks); } var envelopeWithLinks = new EnvelopeResponseBoardLinksDto(); envelopeWithLinks.Value = boardsWithLinks; envelopeWithLinks.Links = CreateBoardsLinks(boardsParams, boards.HasPrevious, boards.HasNext); return(Ok(envelopeWithLinks)); } var responseDtos = _mapper.Map <IEnumerable <ResponseBoardDto> >(boards); return(Ok(responseDtos)); }