public IActionResult GetDogs([FromQuery] DogsResourceParameters parameters, [FromHeader(Name = "Accept")] string mediaType) { if (!MediaTypeHeaderValue.TryParse(mediaType, out MediaTypeHeaderValue parsedMediaType)) { return(BadRequest()); } if (!_propertyMappingService.ValidMappingExistsFor <DogDto, Dog>(parameters.OrderBy)) { return(BadRequest()); } if (!_propertyCheckerService.TypeHasProperties <DogDto>(parameters.Fields)) { return(BadRequest()); } var dogsFromRepo = _dogRepository.GetAllDogs(parameters); Response.AddPagination(dogsFromRepo.TotalCount, dogsFromRepo.PageSize, dogsFromRepo.CurrentPage, dogsFromRepo.TotalPages, null, null); if (parsedMediaType.MediaType == "application/vnd.marvin.hateoas+json") { var linkedCollectionResource = GetLinkedCollectionResource(parameters, dogsFromRepo); return(Ok(linkedCollectionResource)); } return(Ok(_mapper.Map <IEnumerable <DogDto> >(dogsFromRepo).ShapeData(parameters.Fields))); }
private DogsLinkedCollectionResource GetLinkedCollectionResource(DogsResourceParameters parameters, PagedList <Dog> dogsFromRepo) { var links = CreateLinksForAuthors(parameters, dogsFromRepo.HasNext, dogsFromRepo.HasPrevious); var shapedDogs = _mapper.Map <IEnumerable <DogDto> >(dogsFromRepo).ShapeData(parameters.Fields); var shapedDogsWithLinks = shapedDogs.Select(dog => { var dogAsDictionary = dog as IDictionary <string, object>; var dogsLinks = CreateLinksForDog((int)dogAsDictionary["Id"], (int)dogAsDictionary["OwnerId"], null); dogAsDictionary.Add("links", dogsLinks); return(dogAsDictionary); }); return(new DogsLinkedCollectionResource(shapedDogsWithLinks, links)); }
private string CreateDogsResourceUri(DogsResourceParameters parameters, ResourceUriType type) { switch (type) { case ResourceUriType.PreviousPage: return(Url.Link("GetDogs", new { fields = parameters.Fields, orderBy = parameters.OrderBy, pageNumber = parameters.PageNumber - 1, pageSize = parameters.PageSize, name = parameters.Name, renoLikesIt = parameters.RenoLikesIt, bodyType = parameters.BodyType, gender = parameters.Gender })); case ResourceUriType.NextPage: return(Url.Link("GetDogs", new { fields = parameters.Fields, orderBy = parameters.OrderBy, pageNumber = parameters.PageNumber + 1, pageSize = parameters.PageSize, name = parameters.Name, renoLikesIt = parameters.RenoLikesIt, bodyType = parameters.BodyType, gender = parameters.Gender })); case ResourceUriType.Current: default: return(Url.Link("GetDogs", new { fields = parameters.Fields, orderBy = parameters.OrderBy, pageNumber = parameters.PageNumber, pageSize = parameters.PageSize, name = parameters.Name, renoLikesIt = parameters.RenoLikesIt, bodyType = parameters.BodyType, gender = parameters.Gender })); } }
private IEnumerable <LinkDto> CreateLinksForAuthors(DogsResourceParameters parameters, bool hasNext, bool hasPrevious) { var links = new List <LinkDto>(); links.Add(new LinkDto(CreateDogsResourceUri(parameters, ResourceUriType.Current), "self", "GET")); if (hasNext) { links.Add(new LinkDto(CreateDogsResourceUri(parameters, ResourceUriType.NextPage), "next_page", "GET")); } if (hasPrevious) { links.Add(new LinkDto(CreateDogsResourceUri(parameters, ResourceUriType.PreviousPage), "previous_page", "GET")); } return(links); }
public PagedList <Dog> GetAllDogs(DogsResourceParameters parameters) { if (parameters == null) { throw new ArgumentNullException(nameof(parameters)); } var collection = _context.Dogs as IQueryable <Dog>; if (!string.IsNullOrWhiteSpace(parameters.Name)) { var name = parameters.Name.ToLower().Trim(); collection = collection.Where(d => d.Name.ToLower().Contains(name)); } if (parameters.RenoLikesIt.HasValue) { collection = collection.Where(d => d.RenoLikesIt == parameters.RenoLikesIt.Value); } if (parameters.BodyType.HasValue) { collection = collection.Where(d => d.BodyType == parameters.BodyType); } if (parameters.Gender.HasValue) { collection = collection.Where(d => d.Gender == parameters.Gender); } if (!string.IsNullOrWhiteSpace(parameters.OrderBy)) { var dogPropertyMappingDictionary = _propertyMappingService.GetPropertyMapping <DogDto, Dog>(); collection = collection.ApplySort(parameters.OrderBy, dogPropertyMappingDictionary); } return(PagedList <Dog> .Create( collection, parameters.PageNumber, parameters.PageSize)); }