public ActionResult <IEnumerable <SongResult> > Get(SongResourceParameters parameters) { _logger.LogDebug("SongController.Get called with pageNumber {@pageNumber} and {@pageSize}", parameters.PageNumber, parameters.PageSize); //TODO: Enable a way to retrieve child objects without returning the whole parent var songbook = _repository.GetById(parameters.SongbookId); if (songbook == null) { return(NotFound()); } var songs = PagedList <SongResult> .Create(_mapper.Map <IEnumerable <SongResult> >(songbook.Songs.Skip(parameters.PageNumber - 1).Take(parameters.PageSize)), parameters.PageNumber, parameters.PageSize); var paginationMetadata = new { totalCount = songs.TotalCount, pageSize = songs.PageSize, currentPage = songs.CurrentPage, totalPages = songs.TotalPages }; Response.Headers.Add("X-Pagination", JsonSerializer.Serialize(paginationMetadata)); var songResults = _mapper.Map <IEnumerable <SongResult> >(songs); var collectionResult = new SongCollectionResult() { Results = songResults, Links = CreateLinksForSongs(parameters, songs.HasNext, songs.HasPrevious) }; return(Ok(collectionResult)); }
private string CreateSongResourceUri(SongResourceParameters parameters, ResourceUriType type) { switch (type) { case ResourceUriType.PreviousPage: return(Url.Link("GetSongs", new { pageNumber = parameters.PageNumber - 1, pageSize = parameters.PageSize })); case ResourceUriType.NextPage: return(Url.Link("GetSongs", new { pageNumber = parameters.PageNumber + 1, pageSize = parameters.PageSize })); default: return(Url.Link("GetSongs", new { pageNumber = parameters.PageNumber, pageSize = parameters.PageSize })); } }
private List <Link> CreateLinksForSongs(SongResourceParameters parameters, bool hasNext, bool hasPrevious) { var links = new List <Link>(); links.Add(new Link(CreateSongResourceUri(parameters, ResourceUriType.Current), "self", "GET")); links.Add(new Link(CreateSongResourceUri(parameters, ResourceUriType.Current), "delete_song", "DELETE")); if (hasNext) { links.Add(new Link(CreateSongResourceUri(parameters, ResourceUriType.NextPage), "next_page", "GET")); } if (hasPrevious) { links.Add(new Link(CreateSongResourceUri(parameters, ResourceUriType.PreviousPage), "previous_page", "GET")); } return(links); }