public PagedList <FuelType> GetFuelTypes(FuelTypeResourceParameters fuelTypeParameters)
        {
            if (fuelTypeParameters == null)
            {
                throw new ArgumentNullException(nameof(fuelTypeParameters));
            }

            var collection = _context.FuelType as IQueryable <FuelType>;

            if (!string.IsNullOrWhiteSpace(fuelTypeParameters.SearchQuery))
            {
                var searchQuery = fuelTypeParameters.SearchQuery.Trim();
                collection = collection.Where(a => a.Name.Contains(searchQuery));
            }

            if (!string.IsNullOrWhiteSpace(fuelTypeParameters.OrderBy))
            {
                var fuelTypePropertyMappingDictionary = _propertyMappingService.GetFuelTypePropertyMapping <FuelTypeDto, FuelType>();

                collection = collection.ApplySort(fuelTypeParameters.OrderBy, fuelTypePropertyMappingDictionary);
            }

            //Paging.... happens LAST
            return(PagedList <FuelType> .Create(collection,
                                                fuelTypeParameters.PageNumber,
                                                fuelTypeParameters.PageSize));
        }
        private IEnumerable <LinkDto> CreateLinksForFuelType(
            FuelTypeResourceParameters fuelTypeResourceParameters,
            bool hasNext, bool hasPrevious)
        {
            var links = new List <LinkDto>();

            // self
            links.Add(
                new LinkDto(CreateFuelTypesResourceUri(
                                fuelTypeResourceParameters, ResourceUriType.Current)
                            , "self", "GET"));

            if (hasNext)
            {
                links.Add(
                    new LinkDto(CreateFuelTypesResourceUri(
                                    fuelTypeResourceParameters, ResourceUriType.NextPage),
                                "nextPage", "GET"));
            }

            if (hasPrevious)
            {
                links.Add(
                    new LinkDto(CreateFuelTypesResourceUri(
                                    fuelTypeResourceParameters, ResourceUriType.PreviousPage),
                                "previousPage", "GET"));
            }

            return(links);
        }
        public IActionResult GetFuelTypes(
            [FromQuery] FuelTypeResourceParameters fuelTypeResourceParameters)
        {
            if (!_propertyMappingService.ValidFuelTypeMappingExistsFor <FuelTypeDto, Entities.FuelType>
                    (fuelTypeResourceParameters.OrderBy))
            {
                return(BadRequest());
            }

            var fuelTypeFromRepo = _fuelTypeRepository.GetFuelTypes(fuelTypeResourceParameters);

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

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

            var links = CreateLinksForFuelType(fuelTypeResourceParameters,
                                               fuelTypeFromRepo.HasNext,
                                               fuelTypeFromRepo.HasPrevious);

            var shapedFuelTypes = _mapper.Map <IEnumerable <FuelTypeDto> >(fuelTypeFromRepo)
                                  .ShapeData(fuelTypeResourceParameters.Fields);

            var shapedFuelTypesWithLinks = shapedFuelTypes.Select(fueltypes =>
            {
                var fuelTypeAsDictionary = fueltypes as IDictionary <string, object>;
                var fuelTypeLinks        = CreateLinksForFuelType((string)fuelTypeAsDictionary["Id"], null);
                fuelTypeAsDictionary.Add("links", fuelTypeLinks);
                return(fuelTypeAsDictionary);
            });

            var linkedCollectionResource = new
            {
                value = shapedFuelTypesWithLinks,
                links
            };

            return(Ok(linkedCollectionResource));
        }
        private string CreateFuelTypesResourceUri(
            FuelTypeResourceParameters fuelTypeResourceParameters,
            ResourceUriType type)
        {
            switch (type)
            {
            case ResourceUriType.PreviousPage:
                return(Url.Link("GetFuelType",
                                new
                {
                    fields = fuelTypeResourceParameters.Fields,
                    orderBy = fuelTypeResourceParameters.OrderBy,
                    pageNumber = fuelTypeResourceParameters.PageNumber - 1,
                    pageSize = fuelTypeResourceParameters.PageSize,
                    searchQuery = fuelTypeResourceParameters.SearchQuery
                }));

            case ResourceUriType.NextPage:
                return(Url.Link("GetFuelType",
                                new
                {
                    fields = fuelTypeResourceParameters.Fields,
                    orderBy = fuelTypeResourceParameters.OrderBy,
                    pageNumber = fuelTypeResourceParameters.PageNumber + 1,
                    pageSize = fuelTypeResourceParameters.PageSize,
                    searchQuery = fuelTypeResourceParameters.SearchQuery
                }));

            case ResourceUriType.Current:
            default:
                return(Url.Link("GetFuelType",
                                new
                {
                    fields = fuelTypeResourceParameters.Fields,
                    orderBy = fuelTypeResourceParameters.OrderBy,
                    pageNumber = fuelTypeResourceParameters.PageNumber,
                    pageSize = fuelTypeResourceParameters.PageSize,
                    searchQuery = fuelTypeResourceParameters.SearchQuery
                }));
            }
        }