protected void VerifyCommentSegmentIsAnonProtected(CommentSegment segment) { if (segment != null && segment.Comments != null) { foreach (var c in segment.Comments) { EnsureAnonIsProtected(c); VerifyCommentSegmentIsAnonProtected(c.Children); } } }
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"); } }
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); } }
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); }
// 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)); }
//// 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)); }