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
                }));
            }
        }
Beispiel #3
0
        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));
        }