/// <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); }
/// <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); } }