public async Task <IRestResponse <List <Review> > > GetReviews(ReviewsResourceParameters parameters) { RestRequest restRequest = new RestRequest(Method.GET); restRequest.AddHeader("Accept", "application/json"); if (!string.IsNullOrEmpty(parameters.ResourceUrl)) { restRequest.Resource = parameters.ResourceUrl; } else { restRequest.AddParameter("pageNumber", parameters.PageNumber); restRequest.AddParameter("pageSize", parameters.PageSize); } if (!string.IsNullOrEmpty(parameters.MovieGenre)) { restRequest.AddParameter("movieGenre", parameters.MovieGenre); } if (!string.IsNullOrEmpty(parameters.SortBy)) { restRequest.AddParameter("sortBy", parameters.SortBy); } return(await _restClient.ExecuteTaskAsync <List <Review> >(restRequest)); }
public async Task <List <Review> > GetReviews(ReviewsResourceParameters reviewsResourceParameters) { var reviews = _dbContext.Reviews .Include(r => r.Movie) .Include(r => r.Reviewer) .AsQueryable(); // Filter by MovieId if (reviewsResourceParameters.MovieId != null) { reviews = reviews.Where(r => r.MovieId == reviewsResourceParameters.MovieId); } // Filter by ReviewerId if (reviewsResourceParameters.ReviewerId != null) { reviews = reviews.Where(r => r.ReviewerId == reviewsResourceParameters.ReviewerId); } // Filter by MovieGenre if (!string.IsNullOrEmpty(reviewsResourceParameters.MovieGenre)) { reviews = reviews.Where( r => r.Movie.Genre == reviewsResourceParameters.MovieGenre.Trim()); } // Apply sorting reviews = await ApplySorting(reviews, reviewsResourceParameters.SortBy); return(await reviews.ToListAsync()); }
private IEnumerable <ReturnModelLink> CreateLinksForReviews( ReviewsResourceParameters reviewsResourceParameters, bool hasNext, bool hasPrevious) { var links = new List <ReturnModelLink>(); links.Add(new ReturnModelLink(CreateReviewsResourceUri(reviewsResourceParameters, ResourceUriType.Current), "self", "GET")); if (hasNext) { links.Add(new ReturnModelLink(CreateReviewsResourceUri(reviewsResourceParameters, ResourceUriType.NextPage), "nextPage", "GET")); } if (hasPrevious) { links.Add(new ReturnModelLink(CreateReviewsResourceUri(reviewsResourceParameters, ResourceUriType.PreviousPage), "previousPage", "GET")); } return(links); }
public async Task <IActionResult> GetReviews([FromQuery] ReviewsResourceParameters reviewsResourceParameters) { if (!_typeHelperService.TypeHasProperties <ReviewReturnModel>( reviewsResourceParameters.Fields)) { return(BadRequest()); } var reviews = await _reviewData.GetReviews(reviewsResourceParameters); var returnModel = Mapper.Map <List <ReviewReturnModel> >(reviews); var pagedReturnModel = await PagedList <ReviewReturnModel> .Create(returnModel, reviewsResourceParameters.PageNumber, reviewsResourceParameters.PageSize); var previousPageLink = pagedReturnModel.HasPrevious ? CreateReviewsResourceUri(reviewsResourceParameters, ResourceUriType.PreviousPage) : null; var nextPageLink = pagedReturnModel.HasNext ? CreateReviewsResourceUri(reviewsResourceParameters, ResourceUriType.NextPage) : null; var paginationMetadata = new { totalCount = pagedReturnModel.TotalCount, pageSize = pagedReturnModel.PageSize, currentPage = pagedReturnModel.CurrentPage, totalPages = pagedReturnModel.TotalPages, previousPageLink = previousPageLink, nextPageLink = nextPageLink }; Response.Headers.Add("X-Pagination", Newtonsoft.Json.JsonConvert.SerializeObject(paginationMetadata)); var links = CreateLinksForReviews(reviewsResourceParameters, pagedReturnModel.HasNext, pagedReturnModel.HasPrevious); var shapedReturnModel = pagedReturnModel.AsEnumerable().ShapeData(reviewsResourceParameters.Fields); var shapedReturnModelWithLinks = shapedReturnModel.Select(review => { var reviewAsDictionary = review as IDictionary <string, object>; var reviewLinks = CreateLinksForReview( (int)reviewAsDictionary["Id"], reviewsResourceParameters.Fields); reviewAsDictionary.Add("links", reviewLinks); return(reviewAsDictionary); }); return(Ok(shapedReturnModelWithLinks)); }
public async Task <IActionResult> ReviewsAjax(ReviewsResourceParameters parameters) { var response = await _reviewData.GetReviews(parameters); if (!response.IsSuccessful) { return(View("Error", new ErrorViewModel(response.ErrorMessage, response.ErrorException.ToString()))); } Response.Headers.Add("X-Pagination", response.Headers .FirstOrDefault(h => h.Name == "X-Pagination").Value.ToString()); return(PartialView("_Reviews", response.Data)); }
public async Task <IActionResult> Reviews(ReviewsResourceParameters parameters) { var response = await _reviewData.GetReviews(parameters); if (!response.IsSuccessful) { return(View("Error", new ErrorViewModel(response.ErrorMessage, response.ErrorException.ToString()))); } ViewBag.PaginationMetadata = JsonConvert.DeserializeObject(response.Headers .FirstOrDefault(h => h.Name == "X-Pagination").Value.ToString()); ViewBag.MovieGenres = new MovieGenres(parameters.MovieGenre); return(View(response.Data)); }
private string CreateReviewsResourceUri(ReviewsResourceParameters reviewsResourceParameters, ResourceUriType type) { switch (type) { case ResourceUriType.PreviousPage: return(_urlHelper.Link("GetReviews", new { fields = reviewsResourceParameters.Fields, sortBy = reviewsResourceParameters.SortBy, movieGenre = reviewsResourceParameters.MovieGenre, pageNumber = reviewsResourceParameters.PageNumber - 1, pageSize = reviewsResourceParameters.PageSize })); case ResourceUriType.NextPage: return(_urlHelper.Link("GetReviews", new { fields = reviewsResourceParameters.Fields, sortBy = reviewsResourceParameters.SortBy, movieGenre = reviewsResourceParameters.MovieGenre, pageNumber = reviewsResourceParameters.PageNumber + 1, pageSize = reviewsResourceParameters.PageSize })); case ResourceUriType.Current: default: return(_urlHelper.Link("GetReviews", new { fields = reviewsResourceParameters.Fields, sortBy = reviewsResourceParameters.SortBy, movieGenre = reviewsResourceParameters.MovieGenre, pageNumber = reviewsResourceParameters.PageNumber, pageSize = reviewsResourceParameters.PageSize })); } }