Пример #1
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="userLanguages"></param>
        /// <param name="db"></param>
        /// <param name="userInfo"></param>
        /// <returns></returns>
        public static IQueryable <Post> QueryValidPosts(List <string> userLanguages, ZapContext db, PostQueryUserInfo userInfo = null)
        {
            IQueryable <Post> validposts = db.Posts
                                           .Where(p => !p.IsDeleted)
                                           .Where(p => !p.IsDraft);

            if (userInfo != null)
            {
                var ig = userInfo.IgnoredGroups;
                validposts = validposts
                             .Where(p => !ig.Contains(p.Group.GroupId));

                var ip = userInfo.IgnoredPosts;
                validposts = validposts
                             .Where(p => !ip.Contains(p.PostId));

                var allLang = userInfo.ViewAllLanguages;
                if (!allLang)
                {
                    var languages = userLanguages ?? new List <string>()
                    {
                        "en"
                    };
                    validposts = validposts
                                 .Where(p => p.Language == null || languages.Contains(p.Language));
                }
            }
            else
            {
                if (userLanguages == null)
                {
                    validposts = db.Posts
                                 .Where(p => !p.IsDeleted)
                                 .Where(p => !p.IsDraft);
                }
                else
                {
                    validposts = db.Posts
                                 .Where(p => !p.IsDeleted)
                                 .Where(p => !p.IsDraft)
                                 .Where(p => p.Language == null || userLanguages.Contains(p.Language));
                }
            }

            return(validposts);
        }
Пример #2
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="start"></param>
        /// <param name="count"></param>
        /// <param name="postquery"></param>
        /// <param name="userInfo"></param>
        /// <param name="numComments"></param>
        /// <param name="limitComments"></param>
        /// <returns></returns>
        public static async Task <List <PostViewModel> > QueryPostsVm(int start, int count, IQueryable <PostQueryInfo> postquery, PostQueryUserInfo userInfo = null, int numComments = 5, bool limitComments = false)
        {
            int    userId    = 0;
            string userAppId = null;

            if (userInfo != null)
            {
                userId    = userInfo.Id;
                userAppId = userInfo.AppId;
            }

            if (limitComments)
            {
                var sposts = await postquery
                             .Skip(start)
                             .Take(count)
                             .Select(p => new PostViewModel()
                {
                    Hot       = p.hot ?? 0,
                    PostTitle = p.p.PostTitle,
                    Content   = p.p.Content,
                    PostId    = p.p.PostId,
                    GroupId   = p.p.Group.GroupId,
                    GroupName = p.p.Group.GroupName,
                    IsSticky  = p.p.IsSticky,
                    UserName  = p.p.UserId.Name,
                    UserId    = p.p.UserId.Id,
                    UserAppId = p.p.UserId.AppId,
                    UserProfileImageVersion = p.p.UserId.ProfileImage.Version,
                    Score                 = p.p.Score,
                    TimeStamp             = p.p.TimeStamp,
                    TimeStampEdited       = p.p.TimeStampEdited,
                    IsNSFW                = p.p.IsNSFW,
                    ViewerIsFollowing     = p.p.FollowedByUsers.Select(v => v.AppId).Contains(userAppId),
                    ViewerIsMod           = p.p.Group.Moderators.Select(m => m.AppId).Contains(userAppId),
                    ViewerUpvoted         = p.p.VotesUp.Select(v => v.AppId).Contains(userAppId),
                    ViewerDownvoted       = p.p.VotesDown.Select(v => v.AppId).Contains(userAppId),
                    ViewerIsBanishedGroup = p.p.Group.Banished.Any(g => g.User.AppId == userAppId) ? true : false,
                    ViewerIgnoredUser     = p.p.UserId.AppId == userAppId ? false : p.p.UserId.IgnoredByUsers.Select(u => u.AppId).Contains(userAppId),
                    ViewerIgnoredPost     = p.p.UserId.AppId == userAppId ? false : p.p.IgnoredByUsers.Select(u => u.AppId).Contains(userAppId),
                    NumRootComments       = p.RootComments.Count(),
                    CommentVms            = p.p.Comments.Where(c => !c.IsReply) // Initial posts only
                                            .OrderByDescending(c => c.Score)
                                            .ThenBy(c => c.TimeStamp)
                                            .Take(numComments)
                                            .SelectMany(rootComment =>
                                                        rootComment.Replies
                                                        .OrderByDescending(c1 => c1.Score)
                                                        .ThenBy(c1 => c1.TimeStamp)
                                                        .Take(numComments)
                                                        .Union(rootComment.Replies
                                                               .SelectMany(rcreplies => rcreplies.Replies
                                                                           .OrderByDescending(c1 => c1.Score)
                                                                           .ThenBy(c1 => c1.TimeStamp)
                                                                           .Take(numComments)
                                                                           )
                                                               )
                                                        .Union(new List <Comment>()
                    {
                        rootComment
                    })
                                                        ) // Return replies 3 layers deep
                                            .Select(c => new PostCommentsViewModel()
                    {
                        PostId              = p.p.PostId,
                        CommentId           = c.CommentId,
                        Text                = c.Text,
                        Score               = c.Score,
                        IsReply             = c.IsReply,
                        NumReplies          = c.Replies.Count(),
                        IsDeleted           = c.IsDeleted,
                        TimeStamp           = c.TimeStamp,
                        TimeStampEdited     = c.TimeStampEdited,
                        UserId              = c.UserId.Id,
                        UserName            = c.UserId.Name,
                        UserAppId           = c.UserId.AppId,
                        ProfileImageVersion = c.UserId.ProfileImage.Version,
                        ViewerUpvoted       = userAppId == null ? false : c.VotesUp.Select(v => v.AppId).Contains(userAppId),
                        ViewerDownvoted     = userAppId == null ? false : c.VotesDown.Select(v => v.AppId).Contains(userAppId),
                        ViewerIgnoredUser   = userAppId == null ? false : c.UserId.AppId == userAppId ? false : c.UserId.IgnoredByUsers.Select(u => u.AppId).Contains(userAppId),
                        ParentCommentId     = c.Parent == null ? 0 : c.Parent.CommentId,
                        ParentUserId        = c.Parent == null ? 0 : c.Parent.UserId.Id,
                        ParentUserAppId     = c.Parent == null ? "" : c.Parent.UserId.AppId,
                        ParentUserName      = c.Parent == null ? "" : c.Parent.UserId.Name,
                    }),
                })
                             .AsNoTracking()
                             .ToListAsync().ConfigureAwait(true);

                return(sposts);
            }
            else
            {
                var sposts = await postquery
                             .Skip(start)
                             .Take(count)
                             .Select(p => new PostViewModel()
                {
                    Hot       = p.hot ?? 0,
                    PostTitle = p.p.PostTitle,
                    Content   = p.p.Content,
                    PostId    = p.p.PostId,
                    GroupId   = p.p.Group.GroupId,
                    GroupName = p.p.Group.GroupName,
                    IsSticky  = p.p.IsSticky,
                    UserName  = p.p.UserId.Name,
                    UserId    = p.p.UserId.Id,
                    UserAppId = p.p.UserId.AppId,
                    UserProfileImageVersion = p.p.UserId.ProfileImage.Version,
                    Score                 = p.p.Score,
                    TimeStamp             = p.p.TimeStamp,
                    TimeStampEdited       = p.p.TimeStampEdited,
                    IsNSFW                = p.p.IsNSFW,
                    ViewerIsFollowing     = p.p.FollowedByUsers.Select(v => v.AppId).Contains(userAppId),
                    ViewerIsMod           = p.p.Group.Moderators.Select(m => m.AppId).Contains(userAppId),
                    ViewerUpvoted         = p.p.VotesUp.Select(v => v.AppId).Contains(userAppId),
                    ViewerDownvoted       = p.p.VotesDown.Select(v => v.AppId).Contains(userAppId),
                    ViewerIsBanishedGroup = p.p.Group.Banished.Any(g => g.User.AppId == userAppId) ? true : false,
                    ViewerIgnoredUser     = p.p.UserId.AppId == userAppId ? false : p.p.UserId.IgnoredByUsers.Select(u => u.AppId).Contains(userAppId),
                    ViewerIgnoredPost     = p.p.UserId.AppId == userAppId ? false : p.p.IgnoredByUsers.Select(u => u.AppId).Contains(userAppId),
                    NumRootComments       = p.RootComments.Count(),
                    CommentVms            = p.p.Comments.Select(c => new PostCommentsViewModel()
                    {
                        PostId              = p.p.PostId,
                        CommentId           = c.CommentId,
                        Text                = c.Text,
                        Score               = c.Score,
                        IsReply             = c.IsReply,
                        NumReplies          = c.Replies.Count(),
                        IsDeleted           = c.IsDeleted,
                        TimeStamp           = c.TimeStamp,
                        TimeStampEdited     = c.TimeStampEdited,
                        UserId              = c.UserId.Id,
                        UserName            = c.UserId.Name,
                        UserAppId           = c.UserId.AppId,
                        ProfileImageVersion = c.UserId.ProfileImage.Version,
                        ViewerUpvoted       = userAppId == null ? false : c.VotesUp.Select(v => v.AppId).Contains(userAppId),
                        ViewerDownvoted     = userAppId == null ? false : c.VotesDown.Select(v => v.AppId).Contains(userAppId),
                        ViewerIgnoredUser   = userAppId == null ? false : c.UserId.AppId == userAppId ? false : c.UserId.IgnoredByUsers.Select(u => u.AppId).Contains(userAppId),
                        ParentCommentId     = c.Parent == null ? 0 : c.Parent.CommentId,
                        ParentUserId        = c.Parent == null ? 0 : c.Parent.UserId.Id,
                        ParentUserAppId     = c.Parent == null ? "" : c.Parent.UserId.AppId,
                        ParentUserName      = c.Parent == null ? "" : c.Parent.UserId.Name,
                    }),
                })
                             .AsNoTracking()
                             .ToListAsync().ConfigureAwait(true);

                return(sposts);
            }
        }