public async Task <IActionResult> GetImages(ImagesResourceParameters imagesResourceParameters)
        {
            if (!this.propertyMappingService.ValidMappingExistsFor <ImageDto, Image>(imagesResourceParameters.OrderBy))
            {
                return(BadRequest());
            }

            if (!this.typeHelperService.TypeHasProperties <ImageDto>(imagesResourceParameters.Fields))
            {
                return(BadRequest());
            }
            var imagesFromRepo = await galleryRepository.GetImages(imagesResourceParameters);

            var previousPageLink = imagesFromRepo.HasPrevious ? CreateImagesResourceUri(imagesResourceParameters,
                                                                                        ResourceUriType.PreviousPage) : null;

            var nextPageLink = imagesFromRepo.HasNext ? CreateImagesResourceUri(imagesResourceParameters,
                                                                                ResourceUriType.NextPage) : null;

            var paginationMetadata = new
            {
                totalCount       = imagesFromRepo.TotalCount,
                pageSize         = imagesFromRepo.PageSize,
                currentPage      = imagesFromRepo.CurrentPage,
                totalPages       = imagesFromRepo.TotalPages,
                previousPageLink = previousPageLink,
                nextPageLink     = nextPageLink
            };

            Response.Headers.Add("X-Pagination",
                                 Newtonsoft.Json.JsonConvert.SerializeObject(paginationMetadata));

            var imagesToReturn = Mapper.Map <IEnumerable <ImageDto> >(imagesFromRepo);

            imagesToReturn = imagesToReturn.Select(x =>
            {
                x = CreateLinksForImage(x);
                return(x);
            });

            return(Ok(imagesToReturn.ShapeData(imagesResourceParameters.Fields)));
        }
        public async Task <PagedList <Image> > GetImages(ImagesResourceParameters imagesResourceParameters)
        {
            //var collection = this.context.Images
            //    .OrderBy(i => i.Title)
            //   .AsQueryable();

            var collection = this.context.Images
                             .ApplySort(imagesResourceParameters.OrderBy,
                                        propertyMappingService.GetPropertyMapping <ImageDto, Image>());

            if (!string.IsNullOrEmpty(imagesResourceParameters.Title))
            {
                var titleForWhereClause = imagesResourceParameters.Title.Trim().ToLowerInvariant();
                collection = collection.Where(x => x.Title.ToLowerInvariant() == titleForWhereClause);
            }

            return(await PagedList <Image> .Create(collection,
                                                   imagesResourceParameters.PageNumber,
                                                   imagesResourceParameters.PageSize));
        }
        private string CreateImagesResourceUri(ImagesResourceParameters imagesResourceParameters,
                                               ResourceUriType type)
        {
            switch (type)
            {
            case ResourceUriType.PreviousPage:
                return(this.urlHelper.Link("GetImages",
                                           new
                {
                    fields = imagesResourceParameters.Fields,
                    orderBy = imagesResourceParameters.OrderBy,
                    title = imagesResourceParameters.Title,
                    pageNumber = imagesResourceParameters.PageNumber - 1,
                    pageSize = imagesResourceParameters.PageSize
                }));

            case ResourceUriType.NextPage:
                return(this.urlHelper.Link("GetImages",
                                           new
                {
                    fields = imagesResourceParameters.Fields,
                    orderBy = imagesResourceParameters.OrderBy,
                    title = imagesResourceParameters.Title,
                    pageNumber = imagesResourceParameters.PageNumber + 1,
                    pageSize = imagesResourceParameters.PageSize
                }));

            default:
                return(this.urlHelper.Link("GetAuthors",
                                           new
                {
                    fields = imagesResourceParameters.Fields,
                    orderBy = imagesResourceParameters.OrderBy,
                    title = imagesResourceParameters.Title,
                    pageNumber = imagesResourceParameters.PageNumber,
                    pageSize = imagesResourceParameters.PageSize
                }));
            }
        }