private static NavigationCursor GetForwardCursor(IList <Story> stories, int pageSize) { if (0 == stories.Count) { return(null); } if (pageSize > stories.Count) { return(null); } var id = stories[stories.Count - 1].Id; return(NavigationCursor.Forward(id, pageSize)); }
public async Task <IActionResult> Get(string page, [FromCommaSeparatedQuery(Name = "include")] IEnumerable <string> includes) { var flags = EnumFlags.Parse <StoryIncludes>(includes); var query = new GetStoriesListQuery(User) { IncludeAuthors = StoryIncludes.Authors == (flags & StoryIncludes.Authors), IncludeComments = StoryIncludes.Comments == (flags & StoryIncludes.Comments), Cursor = (null != page && NavigationCursorEncoder.TryParse(page, out var cursor)) ? cursor : NavigationCursor.Forward(0, blogSettings.PageSize) }; var result = await mediator.Send(query, HttpContext.RequestAborted); if (false == result.IsSuccess()) { foreach (var exception in result.Exceptions) { logger.LogError(exception, "[StoriesController.Get]"); } return(BadRequest(result.Exceptions)); } var include = EnumFlags.ToQueryString(flags); string backward = null; string forward = null; if (null != result.Backward) { backward = Url.Action("Get", "Stories", new { page = NavigationCursorEncoder.ToEncodedString(result.Backward), include = include.ToString() }); } if (null != result.Forward) { forward = Url.Action("Get", "Stories", new { page = NavigationCursorEncoder.ToEncodedString(result.Forward), include = include.ToString() }); } return(Ok(new ListResult <StoryModel, ResourcesMetaInfo> { Data = result.Select(story => { var model = mapper.Map <StoryModel>(story); model.Author = result.Authors.FindIndex(story.Author); return model; }), Meta = new ResourcesMetaInfo { Resources = new AuthorsResource { Authors = result.Authors.Select(author => mapper.Map <AuthorModel>(author)) }, Navigation = new Navigation { Previous = backward, Next = forward } } })); } }