示例#1
0
        public async Task <IEnumerable <CommentReadView> > FindByPost(int postId, User?user = null)
        {
            var comments = (await Connection.QueryAsync <CommentRecord>(
                                @"WITH RECURSIVE commenttree AS (
                    SELECT r.* FROM comment r WHERE post_id = @PostId AND parent_id = 0 AND was_deleted = FALSE 
                    UNION ALL
                    SELECT c.* FROM comment c
                    INNER JOIN commenttree ct ON ct.id = c.parent_id
                    WHERE c.was_deleted = FALSE
                    ) SELECT * FROM commenttree
                    ORDER BY parent_id, creation_date DESC;",
                                new { PostId = postId }
                                ));

            IUserReader userReader = GetReader <IUserReader>();
            IVoteReader voteReader = GetReader <IVoteReader>();

            List <CommentReadView> views = new List <CommentReadView>();

            foreach (CommentRecord comment in comments)
            {
                CommentReadView view = Map(comment);
                view.User = (await userReader.FindById(comment.UserId)) !;

                if (user != null)
                {
                    view.Vote = await voteReader.FindByCommentAndUser(comment.Id, user.Id);
                }

                views.Add(view);
            }

            return(BuildCommentTree(views));
        }
示例#2
0
        public async Task <CommentReadView?> FindById(int id, User?user = null)
        {
            var comments = await Connection.QueryAsync <CommentRecord>(
                @"WITH RECURSIVE commenttree AS (
                    SELECT r.* FROM comment r WHERE id = @Id AND was_deleted = FALSE
                    UNION ALL
                    SELECT c.* FROM comment c
                    INNER JOIN commenttree ct ON ct.id = c.parent_id
                    WHERE c.was_deleted = FALSE
                    ) SELECT * FROM commenttree
                    ORDER BY parent_id, creation_date ASC;",
                new { Id = id }
                );

            IUserReader userReader = GetReader <IUserReader>();
            IVoteReader voteReader = GetReader <IVoteReader>();

            List <CommentReadView> views = new List <CommentReadView>();

            foreach (CommentRecord comment in comments)
            {
                CommentReadView view = Map(comment);
                view.User = (await userReader.FindById(comment.UserId)) !;

                if (user != null)
                {
                    view.Vote = await voteReader.FindByCommentAndUser(comment.Id, user.Id);
                }

                views.Add(view);
            }

            // We're assuming there will always be one top level comment.
            return(BuildCommentTree(views)[0]);
        }
示例#3
0
        public async Task <PagedResultSet <CommentReadView> > FindByUser(string username, PaginationInfo paging, User?user = null)
        {
            var comments = await Connection.QueryAsync <CommentRecord>(
                @"SELECT comment.* FROM comment 
                    LEFT JOIN ""user"" ON comment.user_id = ""user"".id 
                    WHERE ""user"".username = @Username AND was_deleted = FALSE 
                    ORDER BY creation_date DESC 
                    LIMIT @Limit 
                    OFFSET @Offset ",
                new {
                Username = username,
                Limit    = paging.PageNumber,
                Offset   = paging.Offset
            }
                );

            //Get total count
            int totalCount = await Connection.ExecuteScalarAsync <int>(
                @"SELECT COUNT(*) FROM comment 
                    LEFT JOIN ""user"" ON comment.user_id = ""user"".id 
                    WHERE ""user"".username = @Username AND was_deleted = FALSE",
                new { Username = username }
                );

            IUserReader userReader = GetReader <IUserReader>();
            IVoteReader voteReader = GetReader <IVoteReader>();

            List <CommentReadView> views = new List <CommentReadView>();

            foreach (CommentRecord comment in comments)
            {
                CommentReadView view = Map(comment);
                view.User = (await userReader.FindById(comment.UserId)) !;

                if (user != null)
                {
                    view.Vote = await voteReader.FindByCommentAndUser(comment.Id, user.Id);
                }

                views.Add(view);
            }

            return(new PagedResultSet <CommentReadView>(views, paging));
        }