public PagedList <Center> GetCenters(CentersResourceParameters centersResourceParameters)
        {
            if (centersResourceParameters == null)
            {
                throw new ArgumentNullException(nameof(centersResourceParameters));
            }

            IQueryable <Center> centers = _dataContext.Centers as IQueryable <Center>;

            if (!string.IsNullOrWhiteSpace(centersResourceParameters.Name))
            {
                var name = centersResourceParameters.Name.Trim();
                centers = centers.Where(x => x.Name == name);
            }

            if (!string.IsNullOrWhiteSpace(centersResourceParameters.SearchQuery))
            {
                var searchQuery = centersResourceParameters.SearchQuery.Trim();
                centers = centers.Where(x => x.Name.Contains(searchQuery) ||
                                        x.Location.Contains(searchQuery));
            }

            if (!string.IsNullOrWhiteSpace(centersResourceParameters.OrderBy))
            {
                var centerPropertyMappingDictionary = _propertyMappingService.GetPropertyMapping <CenterDto, Center> ();

                centers = centers.ApplySort(centersResourceParameters.OrderBy, centerPropertyMappingDictionary);
            }

            return(PagedList <Center> .Create(centers, centersResourceParameters.PageNumber, centersResourceParameters.PageSize));
        }
        public IActionResult GetCenters([FromQuery] CentersResourceParameters centersResourceParameters, [FromHeader(Name = "Accept")] string mediaType)
        {
            if (!MediaTypeHeaderValue.TryParse(mediaType, out MediaTypeHeaderValue parsedMediaType))
            {
                return(BadRequest(new
                {
                    message = "Accept header mediaType is not allowed"
                }));
            }

            if (!_propertyMappingService.ValidMappingExistsFor <CenterDto, Center> (centersResourceParameters.OrderBy))
            {
                return(BadRequest());
            }

            if (!_propertyCheckerService.TypeHasProperties <CenterDto> (centersResourceParameters.Fields))
            {
                return(BadRequest());
            }

            var centers = _centerRepository.GetCenters(centersResourceParameters);

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

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

            var links        = CreateLinksForCenters(centersResourceParameters, centers.HasNext, centers.HasPrevious);
            var shapeCenters = _mapper.Map <IEnumerable <CenterDto> > (centers).ShapeData(centersResourceParameters.Fields);

            if (parsedMediaType.MediaType == "application/vnd.marvin.hateoas+json")
            {
                var shapeCentersWithLinks = shapeCenters.Select(center =>
                {
                    var centerAsDictionary = center as IDictionary <string, object>;
                    var centerLinks        = CreateLinksForCenter((Guid)centerAsDictionary["CenterId"], null);

                    centerAsDictionary.Add("links", centerLinks);

                    return(centerAsDictionary);
                });

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

                return(Ok(linkedCollectionResource));
            }

            return(Ok(shapeCenters));
        }
        private string CreateCenterResourceUri(CentersResourceParameters centersResourceParameters, ResourceUriType type)
        {
            switch (type)
            {
            case ResourceUriType.PreviousPage:
                return(Url.Link("GetCenters", new
                {
                    fields = centersResourceParameters.Fields,
                    orderBy = centersResourceParameters.OrderBy,
                    pageNumber = centersResourceParameters.PageNumber - 1,
                    pageSize = centersResourceParameters.PageSize,
                    name = centersResourceParameters.Name,
                    searchQuery = centersResourceParameters.SearchQuery
                }));

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

            case ResourceUriType.Current:
            default:
                return(Url.Link("GetCenters", new
                {
                    fields = centersResourceParameters.Fields,
                    orderBy = centersResourceParameters.OrderBy,
                    pageNumber = centersResourceParameters.PageNumber,
                    pageSize = centersResourceParameters.PageSize,
                    name = centersResourceParameters.Name,
                    searchQuery = centersResourceParameters.SearchQuery
                }));
            }
        }
        private IEnumerable <LinkDto> CreateLinksForCenters(CentersResourceParameters centersResourceParameters, bool hasNext, bool hasPrevious)
        {
            var links = new List <LinkDto> ();

            // self
            links.Add(
                new LinkDto(CreateCenterResourceUri(
                                centersResourceParameters, ResourceUriType.Current), "self", "GET"));
            if (hasNext)
            {
                links.Add(
                    new LinkDto(CreateCenterResourceUri(centersResourceParameters, ResourceUriType.NextPage),
                                "nextPage", "GET"));
            }

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

            return(links);
        }