public ActionResult <IEnumerable <IngredientDto> > GetIngredients([FromQuery] IngredientParametersDto ingredientParametersDto)
        {
            var ingredientsFromRepo = _ingredientRepository.GetIngredients(ingredientParametersDto);

            var previousPageLink = ingredientsFromRepo.HasPrevious
                    ? CreateIngredientsResourceUri(ingredientParametersDto,
                                                   ResourceUriType.PreviousPage)
                    : null;

            var nextPageLink = ingredientsFromRepo.HasNext
                ? CreateIngredientsResourceUri(ingredientParametersDto,
                                               ResourceUriType.NextPage)
                : null;

            var paginationMetadata = new
            {
                totalCount  = ingredientsFromRepo.TotalCount,
                pageSize    = ingredientsFromRepo.PageSize,
                pageNumber  = ingredientsFromRepo.PageNumber,
                totalPages  = ingredientsFromRepo.TotalPages,
                hasPrevious = ingredientsFromRepo.HasPrevious,
                hasNext     = ingredientsFromRepo.HasNext,
                previousPageLink,
                nextPageLink
            };

            Response.Headers.Add("X-Pagination",
                                 JsonSerializer.Serialize(paginationMetadata));

            var ingredientsDto = _mapper.Map <IEnumerable <IngredientDto> >(ingredientsFromRepo);

            return(Ok(ingredientsDto));
        }
        public PagedList <Ingredient> GetIngredients(IngredientParametersDto ingredientParameters)
        {
            if (ingredientParameters == null)
            {
                throw new ArgumentNullException(nameof(ingredientParameters));
            }

            var collection = _context.Ingredients as IQueryable <Ingredient>;

            if (!string.IsNullOrWhiteSpace(ingredientParameters.QueryString))
            {
                var QueryString = ingredientParameters.QueryString.Trim();
                collection = collection.Where(i => i.Name.Contains(QueryString) ||
                                              i.Unit.Contains(QueryString));
            }

            if (!string.IsNullOrWhiteSpace(ingredientParameters.RecipeId.ToString()))
            {
                collection = collection.Where(i => i.RecipeId.Equals(ingredientParameters.RecipeId));
            }

            var sieveModel = new SieveModel
            {
                Sorts   = ingredientParameters.SortOrder,
                Filters = ingredientParameters.Filters
            };

            collection = _sieveProcessor.Apply(sieveModel, collection);

            return(PagedList <Ingredient> .Create(collection,
                                                  ingredientParameters.PageNumber,
                                                  ingredientParameters.PageSize));
        }
        private string CreateIngredientsResourceUri(
            IngredientParametersDto ingredientParametersDto,
            ResourceUriType type)
        {
            switch (type)
            {
            case ResourceUriType.PreviousPage:
                return(Url.Link("GetIngredients",
                                new
                {
                    filters = ingredientParametersDto.Filters,
                    orderBy = ingredientParametersDto.SortOrder,
                    pageNumber = ingredientParametersDto.PageNumber - 1,
                    pageSize = ingredientParametersDto.PageSize,
                    searchQuery = ingredientParametersDto.QueryString
                }));

            case ResourceUriType.NextPage:
                return(Url.Link("GetIngredients",
                                new
                {
                    filters = ingredientParametersDto.Filters,
                    orderBy = ingredientParametersDto.SortOrder,
                    pageNumber = ingredientParametersDto.PageNumber + 1,
                    pageSize = ingredientParametersDto.PageSize,
                    searchQuery = ingredientParametersDto.QueryString
                }));

            default:
                return(Url.Link("GetIngredients",
                                new
                {
                    filters = ingredientParametersDto.Filters,
                    orderBy = ingredientParametersDto.SortOrder,
                    pageNumber = ingredientParametersDto.PageNumber,
                    pageSize = ingredientParametersDto.PageSize,
                    searchQuery = ingredientParametersDto.QueryString
                }));
            }
        }