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)));
            }
        }