コード例 #1
0
        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);
        }
コード例 #2
0
        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();
        }
コード例 #3
0
        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
                }));
            }
        }
コード例 #4
0
        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));
        }