public PagedList <Dispenser> GetDispensers(DispenserResourceParameters dispenserResourseParameters)
        {
            if (dispenserResourseParameters == null)
            {
                throw new ArgumentNullException(nameof(dispenserResourseParameters));
            }

            var collection = _context.Dispensers as IQueryable <Dispenser>;

            if (!string.IsNullOrWhiteSpace(dispenserResourseParameters.Type))
            {
                var type = dispenserResourseParameters.Type.Trim();
                collection = collection.Where(a => a.DispenserType == type);
            }

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

            if (!string.IsNullOrWhiteSpace(dispenserResourseParameters.OrderBy))
            {
                var dispenserPropertyMappingDictionary = _propertyMappingService.GetDispenserPropertyMapping <DispenserDto, Dispenser>();

                collection = collection.ApplySort(dispenserResourseParameters.OrderBy, dispenserPropertyMappingDictionary);
            }

            //Paging.... happens LAST
            return(PagedList <Dispenser> .Create(collection,
                                                 dispenserResourseParameters.PageNumber,
                                                 dispenserResourseParameters.PageSize));
        }
        private IEnumerable <LinkDto> CreateLinksForDispenser(
            DispenserResourceParameters dispenserResourceParameters,
            bool hasNext, bool hasPrevious)
        {
            var links = new List <LinkDto>();

            // self
            links.Add(
                new LinkDto(CreateDispensersResourceUri(
                                dispenserResourceParameters, ResourceUriType.Current)
                            , "self", "GET"));

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

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

            return(links);
        }
        public IActionResult GetDispensers(Guid terminalId,
                                           [FromQuery] DispenserResourceParameters dispenserResourceParameters)
        {
            if (!_propertyMappingService.ValidCompanyMappingExistsFor <CompanyDto, Entities.Company>
                    (dispenserResourceParameters.OrderBy))
            {
                return(BadRequest());
            }

            dispenserResourceParameters.TerminalId = terminalId;
            var dispenserFromRepo = _dispenserRepository.GetDispensers(dispenserResourceParameters);

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

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

            var links = CreateLinksForDispenser(dispenserResourceParameters,
                                                dispenserFromRepo.HasNext,
                                                dispenserFromRepo.HasPrevious);

            var shapedDispensers = _mapper.Map <IEnumerable <DispenserDto> >(dispenserFromRepo)
                                   .ShapeData(dispenserResourceParameters.Fields);

            var shapedDispensersWithLinks = shapedDispensers.Select(dispenser =>
            {
                var dispenserAsDictionary = dispenser as IDictionary <string, object>;
                var dispenserLinks        = CreateLinksForDispenser(terminalId.ToString(), dispenserAsDictionary["Id"].ToString(), null);
                dispenserAsDictionary.Add("links", dispenserLinks);
                return(dispenserAsDictionary);
            });

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

            return(Ok(linkedCollectionResource));
        }
        private string CreateDispensersResourceUri(
            DispenserResourceParameters dispenserResourceParameters,
            ResourceUriType type)
        {
            switch (type)
            {
            case ResourceUriType.PreviousPage:
                return(Url.Link("GetDispensers",
                                new
                {
                    fields = dispenserResourceParameters.Fields,
                    orderBy = dispenserResourceParameters.OrderBy,
                    pageNumber = dispenserResourceParameters.PageNumber - 1,
                    pageSize = dispenserResourceParameters.PageSize,
                    mainCategory = dispenserResourceParameters.Type,
                    searchQuery = dispenserResourceParameters.SearchQuery
                }));

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

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