Пример #1
0
 protected void VerifyCommentSegmentIsAnonProtected(CommentSegment segment)
 {
     if (segment != null && segment.Comments != null)
     {
         foreach (var c in segment.Comments)
         {
             EnsureAnonIsProtected(c);
             VerifyCommentSegmentIsAnonProtected(c.Children);
         }
     }
 }
Пример #2
0
 protected void VerifyCommentSegmentIsAnonProtected(CommentSegment segment)
 {
     if (segment != null && segment.Comments != null)
     {
         foreach (var c in segment.Comments)
         {
             EnsureAnonIsProtected(c);
             VerifyCommentSegmentIsAnonProtected(c.Children);
         }
     }
     else
     {
         Assert.Fail("segment is null or has no comments");
     }
 }
Пример #3
0
        public void CompareSegments(CommentSegment expected, CommentSegment actual)
        {
            //compare segments
            Assert.AreEqual(expected.TotalCount, actual.TotalCount, "Segments don't match on child query");
            Assert.AreEqual(expected.SegmentCount, actual.SegmentCount, "Segments don't match on child query");
            Assert.AreEqual(expected.TotalCount, actual.TotalCount, "Segments don't match on child query");
            Assert.AreEqual(expected.Comments.Count, actual.Comments.Count, "Segments don't match on child query");

            for (int i = 0; i < expected.TotalCount; i++)
            {
                var eComment = expected.Comments[i];
                var aComment = actual.Comments[i];
                Assert.AreEqual(eComment.ID, aComment.ID);
                Assert.AreEqual(eComment.UserName, aComment.UserName);
                Assert.AreEqual(eComment.Content, aComment.Content);
            }
        }
Пример #4
0
        public void Ensure_CommentSegment_Defaults()
        {
            var segment = new CommentSegment();

            Assert.AreEqual(-1, segment.StartingIndex);
            Assert.AreEqual(-1, segment.EndingIndex);
            Assert.AreEqual(0, segment.TotalCount);
            Assert.AreEqual(false, segment.HasMore);
            Assert.AreEqual(0, segment.RemainingCount);

            var nestedComment = new NestedComment();

            Assert.AreNotEqual(null, nestedComment.Children, "Expecting segment to be non-null");
            segment = nestedComment.Children;
            Assert.AreEqual(-1, segment.StartingIndex);
            Assert.AreEqual(-1, segment.EndingIndex);
            Assert.AreEqual(0, segment.TotalCount);
            Assert.AreEqual(false, segment.HasMore);
            Assert.AreEqual(0, segment.RemainingCount);
        }
        public override async Task <CommentSegment> ExecuteAsync()
        {
            bool addChildren = !_context.HasValue; //logic here is that if context is negative user is viewing permalink
            var  segment     = await base.GetSegment(addChildren);

            if (_context.HasValue)
            {
                //build the context upward
                var primary = fullTree.Where(x => x.ID == _commentID).FirstOrDefault();
                if (primary != null)
                {
                    var parent = (primary.ParentID != null ? fullTree.Where(x => x.ID == primary.ParentID).FirstOrDefault() : null);

                    int previousChildCount = primary.ChildCount.Value;
                    int currentContext     = 0;
                    var childSegment       = segment;
                    while (parent != null && (currentContext < _context || _context == 0))
                    {
                        var parentNestedComment = parent.Map(User, SubmitterName, _commentVotes);
                        parentNestedComment.Children = childSegment;
                        childSegment      = new CommentSegment(parentNestedComment);
                        childSegment.Sort = _sort;
                        parent            = (parent.ParentID != null ? fullTree.Where(x => x.ID == parent.ParentID).FirstOrDefault() : null);

                        //HACK: So we have a bit of a bug here. If we provide valid counts here the UI will attempt to offer loading capabilities
                        //if this happens the ajax loading will most likely load duplicate comments as sorting doesn't appy to history, if dups get loaded
                        //the UI goes all kinds of cray cray. So, until I can think of a clean solution, we will load context history as having no siblings
                        //childSegment.TotalCount = parent == null ? 0 : parent.ChildCount.Value;
                        childSegment.TotalCount = 1;
                        currentContext++;
                    }
                    segment = childSegment;
                }
            }

            return(segment);
        }
Пример #6
0
        // GET: Renders Primary Submission Comments Page
        public async Task <ActionResult> Comments(int?submissionID, string subverseName, int?commentID, string sort, int?context)
        {
            #region Validation

            if (submissionID == null)
            {
                return(GenericErrorView(new ErrorViewModel()
                {
                    Description = "Can not find what was requested because input is not valid"
                }));
            }

            var submission = _db.Submissions.Find(submissionID.Value);

            if (submission == null)
            {
                return(NotFoundErrorView());
            }

            // make sure that the combination of selected subverse and submission subverse are linked
            if (!submission.Subverse.Equals(subverseName, StringComparison.OrdinalIgnoreCase))
            {
                return(NotFoundErrorView());
            }

            var subverse = DataCache.Subverse.Retrieve(subverseName);
            //var subverse = _db.Subverse.Find(subversetoshow);

            if (subverse == null)
            {
                return(NotFoundErrorView());
            }

            if (subverse.IsAdminDisabled.HasValue && subverse.IsAdminDisabled.Value)
            {
                ViewBag.Subverse = subverse.Name;
                return(SubverseDisabledErrorView());
            }

            #endregion

            if (commentID != null)
            {
                ViewBag.StartingCommentId  = commentID;
                ViewBag.CommentToHighLight = commentID;
            }

            #region Set ViewBag
            ViewBag.Subverse   = subverse;
            ViewBag.Submission = submission;
            //This is a required view bag property in _Layout.cshtml
            ViewBag.SelectedSubverse = subverse.Name;

            var SortingMode = (sort == null ? "top" : sort).ToLower();
            ViewBag.SortingMode = SortingMode;

            #endregion

            #region Track Views

            // experimental: register a new session for this subverse
            string clientIpAddress = UserHelper.UserIpAddress(Request);
            if (clientIpAddress != String.Empty)
            {
                // generate salted hash of client IP address
                string ipHash = IpHash.CreateHash(clientIpAddress);

                // register a new session for this subverse
                SessionHelper.Add(subverse.Name, ipHash);

                //TODO: This needs to be executed in seperate task
                #region TODO

                // register a new view for this thread
                // check if this hash is present for this submission id in viewstatistics table
                var existingView = _db.ViewStatistics.Find(submission.ID, ipHash);

                // this IP has already viwed this thread, skip registering a new view
                if (existingView == null)
                {
                    // this is a new view, register it for this submission
                    var view = new ViewStatistic {
                        SubmissionID = submission.ID, ViewerID = ipHash
                    };
                    _db.ViewStatistics.Add(view);
                    submission.Views++;
                    await _db.SaveChangesAsync();
                }

                #endregion
            }

            #endregion
            CommentSegment model = null;
            if (commentID != null)
            {
                ViewBag.CommentToHighLight = commentID.Value;
                model = await GetCommentContext(submission.ID, commentID.Value, context, sort);
            }
            else
            {
                model = await GetCommentSegment(submission.ID, null, 0, sort);
            }

            var q = new QuerySubverseModerators(subverseName);
            ViewBag.ModeratorList = await q.ExecuteAsync();

            return(View("~/Views/Home/Comments.cshtml", model));
        }
Пример #7
0
        //// POST: votecomment/{commentId}/{typeOfVote}
        //[HttpPost]
        //[Authorize]
        //[VoatValidateAntiForgeryToken]
        //public async Task<JsonResult> VoteComment(int commentId, int typeOfVote)
        //{
        //    var cmd = new CommentVoteCommand(commentId, typeOfVote, IpHash.CreateHash(UserHelper.UserIpAddress(this.Request)));
        //    var result = await cmd.Execute();
        //    return Json(result);
        //}



        // GET: Renders Primary Submission Comments Page
        public async Task <ActionResult> Comments(int?submissionID, string subverseName, int?commentID, string sort, int?context)
        {
            #region Validation

            if (submissionID == null)
            {
                return(ErrorView(new ErrorViewModel()
                {
                    Description = "Can not find what was requested because input is not valid"
                }));
            }

            var q = new QuerySubmission(submissionID.Value, true).SetUserContext(User);

            var submission = await q.ExecuteAsync().ConfigureAwait(false);

            if (submission == null)
            {
                return(ErrorView(ErrorViewModel.GetErrorViewModel(ErrorType.NotFound)));
            }

            // make sure that the combination of selected subverse and submission subverse are linked
            if (!submission.Subverse.IsEqual(subverseName))
            {
                return(ErrorView(ErrorViewModel.GetErrorViewModel(ErrorType.NotFound)));
            }

            var subverse = DataCache.Subverse.Retrieve(subverseName);

            if (subverse == null)
            {
                return(ErrorView(ErrorViewModel.GetErrorViewModel(ErrorType.NotFound)));
            }

            if (subverse.IsAdminDisabled.HasValue && subverse.IsAdminDisabled.Value)
            {
                ViewBag.Subverse = subverse.Name;
                return(ErrorView(ErrorViewModel.GetErrorViewModel(ErrorType.SubverseDisabled)));
            }

            #endregion

            if (commentID != null)
            {
                ViewBag.StartingCommentId  = commentID;
                ViewBag.CommentToHighLight = commentID;
            }

            #region Set ViewBag
            ViewBag.Subverse   = subverse;
            ViewBag.Submission = submission;
            //This is a required view bag property in _Layout.cshtml - Update: hmmm, don't think so but too lazy to look
            ViewBag.SelectedSubverse = subverse.Name;

            var sortingMode = GetSortMode(sort);

            ViewBag.SortingMode = sortingMode;

            #endregion

            var cmd = new LogVisitCommand(null, submissionID.Value, Request.RemoteAddress()).SetUserContext(User);
            cmd.Execute();

            CommentSegment model = null;
            if (commentID != null)
            {
                ViewBag.CommentToHighLight = commentID.Value;
                model = await GetCommentContext(submission.ID, commentID.Value, context, sortingMode);
            }
            else
            {
                model = await GetCommentSegment(submission.ID, null, 0, sortingMode);
            }

            var q2 = new QuerySubverseModerators(subverseName).SetUserContext(User);
            ViewBag.ModeratorList = await q2.ExecuteAsync();



            ViewBag.NavigationViewModel = new NavigationViewModel()
            {
                Description = "Subverse",
                Name        = subverseName,
                MenuType    = MenuType.Subverse,
                BasePath    = VoatUrlFormatter.BasePath(new DomainReference(DomainType.Subverse, subverseName)),
                Sort        = null
            };

            return(View("~/Views/Home/Comments.cshtml", model));
        }