public async Task <PagedList <Dish> > GetAllAsync(int restaurantId, DishesResourceParameters dishesResourceParameters)
        {
            if (dishesResourceParameters == null)
            {
                throw new ArgumentNullException(nameof(dishesResourceParameters));
            }

            var collection = _context.Dishes.Where(d => d.RestaurantId == restaurantId);

            //filtering
            if (dishesResourceParameters.MaximumPrice != null)
            {
                collection = collection.Where(d => d.Price <= dishesResourceParameters.MaximumPrice);
            }

            if (!string.IsNullOrWhiteSpace(dishesResourceParameters.SearchQuery))
            {
                var searchQuery = dishesResourceParameters.SearchQuery.Trim();

                collection = collection.Where(d =>
                                              d.Name.Contains(searchQuery) ||
                                              d.Description.Contains(searchQuery));
            }

            //sorting
            if (string.IsNullOrWhiteSpace(dishesResourceParameters.SortBy))
            {
                //default sorting
                return(await PagedList <Dish> .ToPagedListAsync(collection.OrderBy(d => d.Name),
                                                                dishesResourceParameters.PageNumber, dishesResourceParameters.PageSize));
            }

            //custom sorting
            collection = SortDishes(collection, dishesResourceParameters.SortBy, dishesResourceParameters.SortDirection);

            //pagination
            return(await PagedList <Dish> .ToPagedListAsync(collection,
                                                            dishesResourceParameters.PageNumber, dishesResourceParameters.PageSize));
        }
        public async Task <ActionResult <IEnumerable <DishDto> > > GetDishes(int restaurantId, [FromQuery] DishesResourceParameters dishesResourceParameters)
        {
            if (!await _dishesRepository.RestaurantExists(restaurantId))
            {
                return(NotFound());
            }

            var dishes = await _dishesRepository.GetAllAsync(restaurantId, dishesResourceParameters);

            var metadata = new
            {
                dishes.TotalCount,
                dishes.PagesSize,
                dishes.CurrentPage,
                dishes.TotalPages,
                dishes.HasNext,
                dishes.HasPrevious,
            };

            Response.Headers.Add("X-Pagination", JsonConvert.SerializeObject(metadata));

            return(Ok(_mapper.Map <IEnumerable <DishDto> >(dishes)));
        }