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); }