public IActionResult GetAllStock(StockResourceParameters stockResourceParameters, [FromHeader(Name = "Accept")] string mediaType) { // check mappings are valid if (!_stockMappingService.ValidMappingExistsFor <SupermarketStockDTO, SupermarketStock> (stockResourceParameters.OrderBy)) { return(BadRequest()); } // check all fields are valid if (!_typeHelperService.TypeHasProperties <SupermarketStockDTO> (stockResourceParameters.Fields)) { return(BadRequest()); } // get all stock from repo var stockFromRepo = _supermarketRepository.GetAllStock(stockResourceParameters); var stock = Mapper.Map <IEnumerable <SupermarketStockDTO> >(stockFromRepo); if (mediaType == "application/vnd.idp.hateoas+json") { var paginationMetadata = new { totalCount = stockFromRepo.TotalCount, pageSize = stockFromRepo.PageSize, currentPage = stockFromRepo.CurrentPage, totalPages = stockFromRepo.TotalPages, }; Response.Headers.Add("X-Pagination", JsonConvert.SerializeObject(paginationMetadata)); var links = CreateLinksForSupermarketStocks(stockResourceParameters, stockFromRepo.HasNext, stockFromRepo.HasPrevious); var shapedStocks = stock.ShapeData(stockResourceParameters.Fields); var shapedStocksWithLinks = shapedStocks.Select(stocks => { var stockAsDictionary = stocks as IDictionary <string, object>; var stockLinks = CreateLinksForSupermarketStock( (int)stockAsDictionary["Id"], stockResourceParameters.Fields); stockAsDictionary.Add("links", stockLinks); return(stockAsDictionary); }); var linkedCollectionResource = new { value = shapedStocksWithLinks, links = links }; return(Ok(linkedCollectionResource)); } else { var previousPageLink = stockFromRepo.HasPrevious ? CreateProductResourceUri(stockResourceParameters, ResourceUriType.PreviousPage) : null; var nextPageLink = stockFromRepo.HasNext ? CreateProductResourceUri(stockResourceParameters, ResourceUriType.NextPage) : null; var paginationMetadata = new { totalCount = stockFromRepo.TotalCount, pageSize = stockFromRepo.PageSize, currentPage = stockFromRepo.CurrentPage, totalPages = stockFromRepo.TotalPages, previousPageLink, nextPageLink }; Response.Headers.Add("X-Pagination", JsonConvert.SerializeObject(paginationMetadata)); return(Ok(stock.ShapeData(stockResourceParameters.Fields))); } }