Пример #1
0
        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)));
        }
Пример #2
0
        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));
        }
Пример #3
0
        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
                }));
            }
        }
Пример #4
0
        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));
        }