public IActionResult GetProductsFromSupermarket(int supermarketId, ProductResourceParameters productResourceParameters, [FromHeader(Name = "Accept")] string mediaType) { if (!_supermarketRepository.SupermarketExists(supermarketId)) { return(NotFound()); } // check mappings are valid if (!_productPropertyMappingService.ValidMappingExistsFor <ProductDTO, Product> (productResourceParameters.OrderBy)) { return(BadRequest()); } // check all fields are valid if (!_typeHelperService.TypeHasProperties <ProductDTO> (productResourceParameters.Fields)) { return(BadRequest()); } var productsFromRepo = _supermarketRepository.GetAllProductsFromSupermarket(supermarketId, productResourceParameters); var products = Mapper.Map <IEnumerable <ProductDTO> >(productsFromRepo); if (mediaType == "application/vnd.idp.hateoas+json") { var paginationMetadata = new { totalCount = productsFromRepo.TotalCount, pageSize = productsFromRepo.PageSize, currentPage = productsFromRepo.CurrentPage, totalPages = productsFromRepo.TotalPages }; Response.Headers.Add("X-Pagination", JsonConvert.SerializeObject(paginationMetadata)); var links = CreateLinksForProducts(productResourceParameters, productsFromRepo.HasNext, productsFromRepo.HasPrevious); var shapedProducts = products.ShapeData(productResourceParameters.Fields); var shapedProductsWithLinks = shapedProducts.Select(product => { var productAsDictionary = product as IDictionary <string, object>; var productLinks = CreateLinksForProduct( (int)productAsDictionary["ProductId"], productResourceParameters.Fields); productAsDictionary.Add("links", productLinks); return(productAsDictionary); }); var linkedCollectionResource = new { value = shapedProductsWithLinks, links = links }; return(Ok(linkedCollectionResource)); } else { var previousPageLink = productsFromRepo.HasPrevious ? CreateProductResourceUri(productResourceParameters, ResourceUriType.PreviousPage) : null; var nextPageLink = productsFromRepo.HasNext ? CreateProductResourceUri(productResourceParameters, ResourceUriType.NextPage) : null; var paginationMetadata = new { previousPageLink, nextPageLink, totalCount = productsFromRepo.TotalCount, pageSize = productsFromRepo.PageSize, currentPage = productsFromRepo.CurrentPage, totalPages = productsFromRepo.TotalPages }; Response.Headers.Add("X-Pagination", JsonConvert.SerializeObject(paginationMetadata)); return(Ok(products.ShapeData(productResourceParameters.Fields))); } }