Пример #1
0
        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));
        }
Пример #2
0
        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
                    }
                }
            }));
        }
    }