private IEnumerable <LinkDto> CreateLinksForReviews(ReviewResourceParameters reviewResourceParameters, bool hasNext, bool hasPrevious) { var links = new List <LinkDto>(); links.Add( new LinkDto(CreateReviewResourceUri(reviewResourceParameters, ResourceUriType.Current), "self", "GET")); if (hasNext) { links.Add( new LinkDto(CreateReviewResourceUri(reviewResourceParameters, ResourceUriType.NextPage), "nextPage", "GET")); } if (hasPrevious) { links.Add( new LinkDto(CreateReviewResourceUri(reviewResourceParameters, ResourceUriType.PreviousPage), "previousPage", "GET")); } return(links); }
public async Task <PagedList <Review> > GetAllReviews(ReviewResourceParameters reviewResourceParameters) { //var collectionBeforePaging = _context.Reviews // .OrderByDescending(r => r.DatePosted).AsQueryable(); var collectionBeforePaging = _context.Reviews.ApplySort(reviewResourceParameters.OrderBy, _propertyMappingService.GetPropertyMapping <ReviewDto, Review>()); if (!string.IsNullOrEmpty(reviewResourceParameters.ReviewTitle)) { var reviewTitleForWhereClause = reviewResourceParameters.ReviewTitle.Trim().ToLowerInvariant(); collectionBeforePaging = collectionBeforePaging .Where(a => a.ReviewTitle.ToLowerInvariant() == reviewTitleForWhereClause); } if (!string.IsNullOrEmpty(reviewResourceParameters.GameTitle)) { var gameTitleForWhereClause = reviewResourceParameters.GameTitle.Trim().ToLowerInvariant(); collectionBeforePaging = collectionBeforePaging .Where(a => a.Game.Title.ToLowerInvariant() == gameTitleForWhereClause); } if (!string.IsNullOrEmpty(reviewResourceParameters.SearchQuery)) { var searchQueryFromWhereClause = reviewResourceParameters.SearchQuery.Trim().ToLowerInvariant(); collectionBeforePaging = collectionBeforePaging .Where(a => a.ReviewTitle.ToLowerInvariant().Contains(searchQueryFromWhereClause) || a.Author.ToLowerInvariant().Contains(searchQueryFromWhereClause) || a.Game.Title.ToLowerInvariant().Contains(searchQueryFromWhereClause) || a.Game.Publisher.ToLowerInvariant().Contains(searchQueryFromWhereClause) || a.Game.Developer.ToLowerInvariant().Contains(searchQueryFromWhereClause) || a.Game.Genre.ToLowerInvariant().Contains(searchQueryFromWhereClause)); } return(await PagedList <Review> .Create(collectionBeforePaging, reviewResourceParameters.PageNumber, reviewResourceParameters.PageSize)); //return await _context.Reviews // .OrderByDescending(r => r.DatePosted) // .Skip(reviewResourceParameters.PageSize * (reviewResourceParameters.PageNumber - 1)) // .Take(reviewResourceParameters.PageSize) // .ToListAsync(); }
private string CreateReviewResourceUri(ReviewResourceParameters reviewResourceParameters, ResourceUriType type) { switch (type) { case ResourceUriType.PreviousPage: return(_urlHelper.Link("GetReviews", new { fields = reviewResourceParameters.Fields, orderBy = reviewResourceParameters.OrderBy, searchQuery = reviewResourceParameters.SearchQuery, gameTitle = reviewResourceParameters.GameTitle, reviewTitle = reviewResourceParameters.ReviewTitle, pageNumber = reviewResourceParameters.PageNumber - 1, pageSize = reviewResourceParameters.PageSize })); case ResourceUriType.NextPage: return(_urlHelper.Link("GetReviews", new { fields = reviewResourceParameters.Fields, orderBy = reviewResourceParameters.OrderBy, searchQuery = reviewResourceParameters.SearchQuery, gameTitle = reviewResourceParameters.GameTitle, reviewTitle = reviewResourceParameters.ReviewTitle, pageNumber = reviewResourceParameters.PageNumber + 1, pageSize = reviewResourceParameters.PageSize })); case ResourceUriType.Current: default: return(_urlHelper.Link("GetReviews", new { fields = reviewResourceParameters.Fields, orderBy = reviewResourceParameters.OrderBy, searchQuery = reviewResourceParameters.SearchQuery, gameTitle = reviewResourceParameters.GameTitle, reviewTitle = reviewResourceParameters.ReviewTitle, pageNumber = reviewResourceParameters.PageNumber, pageSize = reviewResourceParameters.PageSize })); } }
public async Task <IActionResult> GetReviews(ReviewResourceParameters reviewResourceParameters, [FromHeader(Name = "Accept")] string mediaType) { if (!_propertyMappingService.ValidMappingExistsFor <ReviewDto, Review>(reviewResourceParameters.OrderBy)) { return(BadRequest()); } if (!_typeHelperService.TypeHasProperties <ReviewDto>(reviewResourceParameters.Fields)) { return(BadRequest()); } var reviewsFromDb = await _reviewRepository.GetAllReviews(reviewResourceParameters); var reviews = Mapper.Map <IEnumerable <ReviewDto> >(reviewsFromDb); if (mediaType == "application/vnd.gamextime.hateoas+json") { var paginationMetadata = new { totalCount = reviewsFromDb.TotalCount, pageSize = reviewsFromDb.PageSize, currentPage = reviewsFromDb.CurrentPage, totalPages = reviewsFromDb.TotalPages, }; Response.Headers.Add("X-Pagination", Newtonsoft.Json.JsonConvert.SerializeObject(paginationMetadata)); var links = CreateLinksForReviews(reviewResourceParameters, reviewsFromDb.HasNext, reviewsFromDb.HasPrevious); var shapedReviews = reviews.ShapeData(reviewResourceParameters.Fields); var shapedReviewsWithLinks = shapedReviews.Select(review => { var reviewAsDictionary = review as IDictionary <string, object>; var reviewLinks = CreateLinksForReview((int)reviewAsDictionary["Id"], reviewResourceParameters.Fields); reviewAsDictionary.Add("links", reviewLinks); return(reviewAsDictionary); }); var linkedCollectionResource = new { value = shapedReviewsWithLinks, links = links }; return(Ok(linkedCollectionResource)); } else { var previousPageLink = reviewsFromDb.HasPrevious ? CreateReviewResourceUri(reviewResourceParameters, ResourceUriType.PreviousPage) : null; var nextPageLink = reviewsFromDb.HasNext ? CreateReviewResourceUri(reviewResourceParameters, ResourceUriType.NextPage) : null; var paginationMetadata = new { previousPageLink = previousPageLink, nextPageLink = nextPageLink, totalCount = reviewsFromDb.TotalCount, pageSize = reviewsFromDb.PageSize, currentPage = reviewsFromDb.CurrentPage, totalPages = reviewsFromDb.TotalPages }; Response.Headers.Add("X-Pagination", Newtonsoft.Json.JsonConvert.SerializeObject(paginationMetadata)); return(Ok(reviews.ShapeData(reviewResourceParameters.Fields))); } //return Ok(reviews); //return Ok(reviews.ShapeData(reviewResourceParameters.Fields)); }