public string GetPaginationMetadata(PagedList <GameModel> pages,
                                            GameResourceParameters gameResourceParameters, HttpContext httpContext)
        {
            var previousPageLink = pages.HasPrevious
                ? CreateGamesResourceUri(httpContext, gameResourceParameters,
                                         ResourceUriType.PreviousPage)
                : null;

            var nextPageLink = pages.HasNext
                ? CreateGamesResourceUri(httpContext, gameResourceParameters,
                                         ResourceUriType.NextPage)
                : null;

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

            return(JsonConvert.SerializeObject(paginationMetadata));
        }
        public IEnumerable <GameModel> ApplyFilters(IEnumerable <GameModel> models,
                                                    GameResourceParameters gameResourceParameters)
        {
            var filters = new BaseFilterStrategy[]
            {
                new GenreFilterStrategy(gameResourceParameters), new PlatformTypeFilterStrategy(gameResourceParameters),
                new PublisherFilterStrategy(gameResourceParameters), new SearchFilterStrategy(gameResourceParameters)
            };

            return(filters.Aggregate(models, (current, filter) => filter.ApplyFilter(current)));
        }
 private Func <Func <int, int>, string> GetLink(HttpContext httpContext,
                                                GameResourceParameters gameResourceParameters, string action = "GetGames")
 {
     return(getPageNumber => _linkGenerator.GetPathByAction(httpContext, action, values:
                                                            new
     {
         fields = gameResourceParameters.Fields,
         orderBy = gameResourceParameters.OrderBy,
         searchQuery = gameResourceParameters.SearchQuery,
         genre = gameResourceParameters.Genre,
         pageNumber = getPageNumber(gameResourceParameters.PageNumber),
         pageSize = gameResourceParameters.PageSize
     }));
 }
        private async Task <IList <GameModel> > GetGameModels(GameResourceParameters gameResourceParameters)
        {
            var games             = (await _gameService.GetGamesAsync()).ToList();
            var gamesWithComments = games.Select(async g =>
            {
                var comments = await _commentService.GetAllCommentsForGame(g.Id);
                g.Comments   = comments.ToList();
                return(g);
            }).ToList();

            var results    = (await Task.WhenAll(gamesWithComments)).ToList();
            var gameModels = results.AsQueryable()
                             .ApplySort(gameResourceParameters.OrderBy);

            return(_gameControllerHelper.ApplyFilters(gameModels, gameResourceParameters).ToList());
        }
        private string CreateGamesResourceUri(HttpContext httpContext, GameResourceParameters gameResourceParameters,
                                              ResourceUriType type)
        {
            var f = GetLink(httpContext, gameResourceParameters);

            switch (type)
            {
            case ResourceUriType.PreviousPage:
                return(f(n => n - 1));

            case ResourceUriType.NextPage:
                return(f(n => n + 1));

            default:
                return(f(n => n));
            }
        }
        public async Task <IActionResult> GetGames([FromQuery] GameResourceParameters gameResourceParameters)
        {
            if (!_typeHelperService.TypeHasProperties <GameModel>
                    (gameResourceParameters.Fields))
            {
                return(BadRequest());
            }

            var filteredModels = await GetGameModels(gameResourceParameters);

            var pages = PagedList <GameModel> .Create(filteredModels.ToList(), gameResourceParameters.PageNumber,
                                                      gameResourceParameters.PageSize);

            var paginationMetadata =
                _gameControllerHelper.GetPaginationMetadata(pages, gameResourceParameters, HttpContext);

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

            return(Ok(pages.ShapeData(gameResourceParameters.Fields)));
        }
示例#7
0
 public SearchFilterStrategy(GameResourceParameters parameterValue) => _parameterValue = parameterValue;
 public PublisherFilterStrategy(GameResourceParameters parameterValue) => _parameterValue = parameterValue;
 public PlatformTypeFilterStrategy(GameResourceParameters parameterValue) => _parameterValue = parameterValue;
 public GenreFilterStrategy(GameResourceParameters parameterValue) => _parameterValue = parameterValue;