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