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))); }
public SearchFilterStrategy(GameResourceParameters parameterValue) => _parameterValue = parameterValue;
public PublisherFilterStrategy(GameResourceParameters parameterValue) => _parameterValue = parameterValue;
public PlatformTypeFilterStrategy(GameResourceParameters parameterValue) => _parameterValue = parameterValue;
public GenreFilterStrategy(GameResourceParameters parameterValue) => _parameterValue = parameterValue;