예제 #1
0
        public async Task <IActionResult> Get([FromQuery] ArtistResourceParameters resourceParameters)
        {
            var artists       = _artistRepo.GetAllPagination(resourceParameters);
            var mappedArtists = _mapper.Map <IEnumerable <ArtistDto> >(artists);

            //constructing links to previus next page
            var previousPage = artists.HasPrevious ?
                               _linkService.CreateResourceUri(resourceParameters, ResourceType.PreviousPage) : null;

            var nextPage = artists.HasNext ?
                           _linkService.CreateResourceUri(resourceParameters, ResourceType.NextPage) : null;

            var paginationMetadata = new
            {
                totalCount       = artists.TotalCount,
                pageSize         = artists.PageSize,
                currentPage      = artists.CurrentPage,
                totalPages       = artists.TotalPages,
                previousPageLink = previousPage,
                nextPageLink     = nextPage
            };

            mappedArtists = mappedArtists.Select(artist =>
            {
                artist = _linkService.CreateLinks(artist);
                return(artist);
            });

            return(Ok(new {
                Values = mappedArtists,
                Links = paginationMetadata
            }));
        }
        public IEnumerable <LinkDto> CreateLinksForArtists(
            ArtistResourceParameters parameters,
            bool hasNext, bool hasPrevious)
        {
            var links = new List <LinkDto>();

            links.Add(new LinkDto(CreateArtistsResourceUri(
                                      parameters, ResourceUriType.Current),
                                  "self", "GET"));

            if (hasNext)
            {
                links.Add(new LinkDto(CreateArtistsResourceUri(
                                          parameters, ResourceUriType.NextPageUri),
                                      "nextPage", "GET"));
            }

            if (hasPrevious)
            {
                links.Add(new LinkDto(CreateArtistsResourceUri(
                                          parameters, ResourceUriType.PreviousPageUri),
                                      "previousPage", "GET"));
            }

            return(links);
        }
        private string CreateArtistsResourceUri(
            ArtistResourceParameters parameters,
            ResourceUriType resourceUriType)
        {
            switch (resourceUriType)
            {
            case ResourceUriType.PreviousPageUri:
                return(Url.Link("GetArtists",
                                new
                {
                    fields = parameters.Fields,
                    orderBy = parameters.OrderBy,
                    pageSize = parameters.PageSize,
                    pageNumber = parameters.PageNumber - 1,
                    mainCategory = parameters.MainCategory,
                    searchQuery = parameters.SearchQuery
                }));

            case ResourceUriType.NextPageUri:
                return(Url.Link("GetArtists",
                                new
                {
                    fields = parameters.Fields,
                    orderBy = parameters.OrderBy,
                    pageSize = parameters.PageSize,
                    pageNumber = parameters.PageNumber + 1,
                    mainCategory = parameters.MainCategory,
                    searchQuery = parameters.SearchQuery
                }));

            case ResourceUriType.Current:
            default:
                return(Url.Link("GetArtists",
                                new
                {
                    fields = parameters.Fields,
                    orderBy = parameters.OrderBy,
                    pageSize = parameters.PageSize,
                    pageNumber = parameters.PageNumber,
                    mainCategory = parameters.MainCategory,
                    searchQuery = parameters.SearchQuery
                }));
            }
        }
예제 #4
0
        public PagedList <Artist> GetAllPagination(ArtistResourceParameters resourceParams)
        {
            var collectionBeforPaging = _context.Artists.OrderBy(a => a.Name).AsQueryable();

            //if name filter exists
            if (!string.IsNullOrEmpty(resourceParams.Name))
            {
                collectionBeforPaging = collectionBeforPaging
                                        .Where(a => a.Name == resourceParams.Name);
            }

            //searh if exists
            if (!string.IsNullOrEmpty(resourceParams.SearchQuery))
            {
                collectionBeforPaging = collectionBeforPaging
                                        .Where(a => a.Name.Contains(resourceParams.SearchQuery));
            }

            return(PagedList <Artist> .Create(collectionBeforPaging, resourceParams.PageNumber, resourceParams.PageSize));
        }
예제 #5
0
        public PagedList <Artist> GetArtists(
            ArtistResourceParameters parameters)
        {
            if (parameters == null)
            {
                throw new ArgumentNullException(nameof(parameters));
            }

            var artists = context.Artists as IQueryable <Artist>;

            // Filtering
            if (!string.IsNullOrWhiteSpace(parameters.MainCategory))
            {
                var mainCategory = parameters.MainCategory.Trim();
                artists = artists.Where(a => a.MainCategory == mainCategory);
            }

            // Searching
            if (!string.IsNullOrWhiteSpace(parameters.SearchQuery))
            {
                var stringQuery = parameters.SearchQuery.Trim();
                artists = artists
                          .Where(a => a.FirstName.Contains(stringQuery) ||
                                 a.LastName.Contains(stringQuery));
            }

            // Ordering
            if (!string.IsNullOrWhiteSpace(parameters.OrderBy))
            {
                var artistPropertiesMappingDictionary =
                    mappingService.GetPropertyMapping <ArtistDto, Artist>();

                artists = artists.ApplySort(parameters.OrderBy,
                                            artistPropertiesMappingDictionary);
            }

            return(PagedList <Artist> .Create(artists,
                                              parameters.PageSize, parameters.PageNumber));
        }
        public IActionResult GetArtists(
            [FromQuery] ArtistResourceParameters parameters,
            [FromHeader(Name = "Accept")] string mediaType)
        {
            if (!mappingService.ValidMappingExistsFor <ArtistDto, Artist>
                    (parameters.OrderBy))
            {
                return(BadRequest());
            }

            if (!propertyChecker.TypeHasProperties <ArtistDto>(parameters.Fields))
            {
                return(BadRequest());
            }

            if (!MediaTypeHeaderValue.TryParse(mediaType,
                                               out MediaTypeHeaderValue parsedMediaType))
            {
                return(BadRequest());
            }

            var artists = repository.GetArtists(parameters);

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

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

            var includeLinks = parsedMediaType.SubTypeWithoutSuffix.EndsWith(
                "hateoas", StringComparison.InvariantCultureIgnoreCase);

            IEnumerable <LinkDto> links = new List <LinkDto>();

            if (includeLinks)
            {
                links = CreateLinksForArtists(parameters,
                                              artists.HasNext, artists.HasPrev);
            }

            var primaryMediaType = includeLinks ?
                                   parsedMediaType.SubTypeWithoutSuffix
                                   .Substring(0, parsedMediaType.SubTypeWithoutSuffix.Length - 8) :
                                   parsedMediaType.SubTypeWithoutSuffix;

            if (primaryMediaType == "vnd.mrwhiteness.full")
            {
                var fullResources = mapper.Map
                                    <IEnumerable <ArtistFullDto> >(artists)
                                    .ShapeData(parameters.Fields);

                if (includeLinks)
                {
                    var fullResourcesWithLinks = fullResources.Select(artist =>
                    {
                        var artistAsDictionary = artist
                                                 as IDictionary <string, object>;
                        var artistLinks = CreateLinksForArtist(
                            (Guid)artistAsDictionary["Id"], null);
                        artistAsDictionary.Add("links", artistLinks);
                        return(artistAsDictionary);
                    });

                    var fullLinkedCollectionResource = new
                    {
                        values = fullResourcesWithLinks,
                        links
                    };

                    return(Ok(fullLinkedCollectionResource));
                }

                return(Ok(fullResources));
            }

            var friendlyResources = mapper.Map
                                    <IEnumerable <ArtistDto> >(artists)
                                    .ShapeData(parameters.Fields);

            if (includeLinks)
            {
                var friendlyResourcesWithLinks = friendlyResources.Select(artist =>
                {
                    var artistAsDictionary = artist
                                             as IDictionary <string, object>;
                    var artistLinks = CreateLinksForArtist(
                        (Guid)artistAsDictionary["Id"], null);
                    artistAsDictionary.Add("links", artistLinks);
                    return(artistAsDictionary);
                });

                var friendlyLinkedCollectionResource = new
                {
                    values = friendlyResourcesWithLinks,
                    links
                };

                return(Ok(friendlyLinkedCollectionResource));
            }

            return(Ok(friendlyResources));
        }