Example #1
0
        public ActionResult User(string userName)
        {
            ViewBag.NavigationKey = "overview";

            var model = BuildUserModel(userName);

            var latestComments = _commentDao.GetCommentsForUser(model.User.Id,
                                                                sortBy: CommentSortBy.New,
                                                                timeFilter: CommentsTimeFilter.All,
                                                                skip: 0,
                                                                take: 3);

            model.Comments = new PagedList <CommentWrapped>(
                _commentWrapper.Wrap(latestComments, _userContext.CurrentUser),
                0,
                5,
                true);

            var latestPosts = _postDao.GetPosts(
                userId: model.User.Id,
                sortby: PostsSortBy.New,
                timeFilter: PostsTimeFilter.All,
                nsfw: _userContext.CurrentNsfw,
                skip: 0,
                take: 3);

            model.Posts = new PagedList <PostWrapped>(
                _postWrapper.Wrap(latestPosts, _userContext.CurrentUser),
                0,
                5,
                true);

            return(View(model));
        }
Example #2
0
        public ActionResult ReportedPosts(string subName)
        {
            ViewBag.ManageNavigationKey = "reportedposts";

            if (string.IsNullOrEmpty(subName))
            {
                throw new NotFoundException();
            }

            var sub = _subDao.GetSubByName(subName);

            if (sub == null)
            {
                throw new NotFoundException();
            }

            if (!_permissionDao.CanUserManageSubPosts(_userContext.CurrentUser, sub.Id))
            {
                throw new UnauthorizedException();
            }

            var postIds = _postDao.GetReportedPosts(new List <Guid> {
                sub.Id
            }, take: 30);

            var model = new ReportedPostsViewModel();

            model.Sub   = sub;
            model.Posts = new PagedList <PostWrapped>(_postWrapper.Wrap(postIds, _userContext.CurrentUser), 0, 30, postIds.HasMore);

            return(View(model));
        }
Example #3
0
        public ActionResult Unmoderated(string subName)
        {
            if (string.IsNullOrEmpty(subName))
            {
                throw new NotFoundException();
            }

            var sub = _subDao.GetSubByName(subName);

            if (sub == null)
            {
                throw new NotFoundException();
            }

            var postIds = _postDao.GetUnmoderatedPosts(new List <Guid> {
                sub.Id
            }, take: 30);

            var model = new SubPostsModel();

            model.Sub    = _subWrapper.Wrap(sub.Id, _userContext.CurrentUser);
            model.SortBy = PostsSortBy.New;
            model.Posts  = new PagedList <PostWrapped>(_postWrapper.Wrap(postIds, _userContext.CurrentUser), 0, 30, postIds.HasMore);

            return(View(model));
        }
Example #4
0
        public List <MessageWrapped> Wrap(List <Guid> messageIds, User currentUser)
        {
            if (currentUser == null)
            {
                throw new Exception("You must provide a user.");
            }

            var messages = new List <MessageWrapped>();

            foreach (var messageId in messageIds)
            {
                var message = _messageDao.GetMessageById(messageId);
                if (message != null)
                {
                    messages.Add(new MessageWrapped(message));
                }
            }

            var users    = new Dictionary <Guid, User>();
            var subs     = new Dictionary <Guid, Sub>();
            var comments = _commentWrapper.Wrap(
                messages.Where(x => x.Message.CommentId.HasValue)
                .Select(x => x.Message.CommentId.Value)
                .Distinct()
                .ToList(), currentUser)
                           .ToDictionary(x => x.Comment.Id, x => x);
            var posts = _postWrapper.Wrap(
                messages.Where(x => x.Message.PostId.HasValue)
                .Select(x => x.Message.PostId.Value)
                .Distinct()
                .ToList(), currentUser)
                        .ToDictionary(x => x.Post.Id, x => x);

            foreach (var message in messages)
            {
                if (!users.ContainsKey(message.Message.AuthorId))
                {
                    users.Add(message.Message.AuthorId, null);
                }
                if (message.Message.ToUser.HasValue && !users.ContainsKey(message.Message.ToUser.Value))
                {
                    users.Add(message.Message.ToUser.Value, null);
                }
                if (message.Message.FromSub.HasValue && !subs.ContainsKey(message.Message.FromSub.Value))
                {
                    subs.Add(message.Message.FromSub.Value, null);
                }
                if (message.Message.ToSub.HasValue && !subs.ContainsKey(message.Message.ToSub.Value))
                {
                    subs.Add(message.Message.ToSub.Value, null);
                }
            }

            var subsCanModerate = new HashSet <Guid>();

            foreach (var sub in subs.Keys)
            {
                if (_permissionDao.CanUserManageSubMail(currentUser, sub))
                {
                    subsCanModerate.Add(sub);
                }
            }

            foreach (var userId in users.Keys.ToList())
            {
                users[userId] = _membershipService.GetUserById(userId);
            }

            foreach (var subId in subs.Keys.ToList())
            {
                subs[subId] = _subDao.GetSubById(subId);
            }

            foreach (var message in messages)
            {
                message.Author  = users[message.Message.AuthorId];
                message.FromSub = message.Message.FromSub.HasValue ? subs[message.Message.FromSub.Value] : null;
                message.ToUser  = message.Message.ToUser.HasValue ? users[message.Message.ToUser.Value] : null;
                message.ToSub   = message.Message.ToSub.HasValue ? subs[message.Message.ToSub.Value] : null;

                if (message.ToUser != null && message.ToUser.Id == currentUser.Id)
                {
                    // this was a message to the current user, so the current user can reply to it.
                    message.CanReply = true;
                }
                else if (message.ToSub != null && subsCanModerate.Contains(message.ToSub.Id))
                {
                    // this message was sent to a sub, and this user is a moderator with the correct permissions to reply.
                    message.CanReply = true;
                }

                if (message.Author.Id == currentUser.Id)
                {
                    message.UserIsSender = true;
                }
                else if (message.ToUser != null && message.ToUser.Id == currentUser.Id)
                {
                    message.UserIsRecipiant = true;
                }
                else if (message.ToSub != null && subsCanModerate.Contains(message.ToSub.Id))
                {
                    message.UserIsRecipiant = true;
                }

                if (message.ToUser != null && message.ToUser.Id == currentUser.Id)
                {
                    message.CanMarkRead = true;
                }
                else if (message.ToSub != null && subsCanModerate.Contains(message.ToSub.Id))
                {
                    message.CanMarkRead = true;
                }

                if (message.CanMarkRead)
                {
                    message.IsUnread = message.Message.IsNew;
                }

                // add any comment or post this message represents (comment reply, mention, etc)
                if (message.Message.PostId.HasValue && posts.ContainsKey((message.Message.PostId.Value)))
                {
                    message.Post = posts[message.Message.PostId.Value];
                }
                if (message.Message.CommentId.HasValue && comments.ContainsKey((message.Message.CommentId.Value)))
                {
                    message.Comment = comments[message.Message.CommentId.Value];
                }
            }

            return(messages);
        }
Example #5
0
        public ActionResult SearchSub(string subName, string query, PostsSearchSortBy?sort, PostsTimeFilter?time, int?pageNumber, int?pageSize)
        {
            if (string.IsNullOrEmpty(subName))
            {
                return(Redirect(Url.Subs()));
            }

            if (sort == null)
            {
                sort = PostsSearchSortBy.Relevance;
            }

            if (time == null)
            {
                time = PostsTimeFilter.All;
            }

            var sub = _subDao.GetSubByName(subName);

            if (sub == null)
            {
                return(Redirect(Url.Subs(subName)));
            }

            if (pageNumber == null || pageNumber < 1)
            {
                pageNumber = 1;
            }
            if (pageSize == null)
            {
                pageSize = 25;
            }
            if (pageSize > 100)
            {
                pageSize = 100;
            }
            if (pageSize < 1)
            {
                pageSize = 1;
            }

            var model = new SearchResultsModel();

            model.Query         = query;
            model.SortBy        = sort.Value;
            model.TimeFilter    = time.Value;
            model.ResultType    = SearchResultType.Post;
            model.LimitingToSub = _subWrapper.Wrap(sub.Id, _userContext.CurrentUser);

            var postIds = _postDao.QueryPosts(query,
                                              model.LimitingToSub.Sub.Id,
                                              sortBy: sort.Value,
                                              timeFilter: time.Value,
                                              nsfw: _userContext.CurrentNsfw,
                                              skip: ((pageNumber - 1) * pageSize),
                                              take: pageSize);

            if (!string.IsNullOrEmpty(model.Query))
            {
                model.Posts = new PagedList <PostWrapped>(
                    _postWrapper.Wrap(postIds, _userContext.CurrentUser),
                    pageNumber.Value,
                    pageSize.Value,
                    postIds.HasMore);
            }

            return(View("Search", model));
        }