public void TimestampParsing() { var originalTime = new System.DateTime(2019, 10, 15, 8, 30, 0).ToUniversalTime(); var originalTimestamp = originalTime.ToString("O"); var originalTimestampId = originalTimestamp; var originalCommentId = ArticleReactionTimestampId.TimestampToJQueryFriendlyString(originalTimestamp); var originalComment = new ArticleReaction() { TimestampId = originalTimestampId }; Assert.AreEqual(originalTime, originalComment.PublishDate); Assert.AreEqual(originalTimestamp, originalComment.TimestampAsString); Assert.AreEqual(originalCommentId, originalComment.ReactionId); Assert.AreEqual(originalTimestampId, originalComment.TimestampId); Assert.IsEmpty(originalComment.ReactingToId); var replyTime = originalTime.AddMinutes(30); var replyTimestamp = replyTime.ToString("O"); var replyCommentId = originalCommentId + "_" + ArticleReactionTimestampId.TimestampToJQueryFriendlyString(replyTimestamp); var replyTimestampId = $"{replyTimestamp}_{originalTimestamp}"; var replyComment = new ArticleReaction() { TimestampId = replyTimestampId }; Assert.AreEqual(replyTime, replyComment.PublishDate); Assert.AreEqual(replyTimestamp, replyComment.TimestampAsString); Assert.AreEqual(replyCommentId, replyComment.ReactionId); Assert.AreEqual(replyTimestampId, replyComment.TimestampId); Assert.AreEqual(originalComment.ReactionId, replyComment.ReactingToId); }
public void EmptyReactionTimestampIdWorks() { var reactionTimestampId = new ArticleReactionTimestampId(""); Assert.IsEmpty(reactionTimestampId.ReactionId); Assert.AreEqual(0, reactionTimestampId.NestingLevel); }
public void ConvertToJQueryFriendlyAndBack() { var timestampString = System.DateTime.UtcNow.ToString("O"); var jqueryFriendlyString = ArticleReactionTimestampId.TimestampToJQueryFriendlyString(timestampString); // from https://stackoverflow.com/a/2837646/1001100 Assert.IsFalse(Regex.IsMatch(jqueryFriendlyString, @"[!""#$%&'()*+,.\/:;<=>?@[\\\]^`{|}~]")); var backToTimestampString = ArticleReactionTimestampId.JQueryFriendlyToTimestampString(jqueryFriendlyString); Assert.AreEqual(timestampString, backToTimestampString); }
public async Task <IActionResult> commentsPost(string year, string month, string slug, string userComment, string sinceTimestamp = "", string replyTo = "") { // Make sure replyTo doesnt have a nesting level equal or greater than the site level var replyTimestampId = new ArticleReactionTimestampId(replyTo); while (replyTimestampId.NestingLevel >= WebSiteOptions.CommentNestLevels && !String.IsNullOrEmpty(replyTimestampId.ReactingToId)) { replyTimestampId = new ArticleReactionTimestampId(replyTimestampId.ReactingToId); } var articleSlug = $"{year}/{month}/{slug}"; if (!await _articleManager.ValidateReaction(articleSlug, ArticleReactionType.Comment, userComment, CurrentUserId, CurrentUserName, User.IsInRole(ApplicationRole.ADMINISTRATOR))) { return(BadRequest()); } var timestamp = DateTime.UtcNow; var timestampId = await articleStore.AddReaction(articleSlug, ArticleReactionType.Comment, userComment, CurrentUserId, CurrentUserName, timestamp, replyTimestampId.TimestampId); if (String.IsNullOrEmpty(timestampId)) { return(BadRequest()); } else { return(new JsonResult( new BlogArticleReaction { commentId = (new ArticleReactionTimestampId(timestampId)).ReactionId, articleSlug = articleSlug, authorName = CurrentUserName, authorImageUrl = "/images/unknownPersonPlaceholder.png", timestamp = timestamp.ToString("O"), isMine = true, canReply = false, canHide = false, canDelete = false, editState = "saving", htmlContent = @"<div class=""spinner-border m-5"" role=""status""> <span class=""sr-only"">Saving your comment...</span> </div>", replyToId = replyTimestampId.ReactionId } )); } }
public void DetermineParentFromId() { var rootDate = System.DateTime.UtcNow; var id1 = new ArticleReactionTimestampId(rootDate); var id2 = new ArticleReactionTimestampId(rootDate.AddDays(1), id1.ReactionId); var id3 = new ArticleReactionTimestampId(rootDate.AddDays(2), id2.ReactionId); var id4 = new ArticleReactionTimestampId(rootDate.AddDays(3), id3.ReactionId); Assert.IsEmpty(id1.ReactingToId); Assert.AreEqual(1, id1.NestingLevel); Assert.AreEqual(id1.ReactionId, id2.ReactingToId); Assert.AreEqual(2, id2.NestingLevel); Assert.AreEqual(id2.ReactionId, id3.ReactingToId); Assert.AreEqual(3, id3.NestingLevel); Assert.AreEqual(id3.ReactionId, id4.ReactingToId); Assert.AreEqual(4, id4.NestingLevel); }
public async Task <string> AddReaction(string articleSlug, ArticleReactionType articleReactionType, string content, string userId, string userName, DateTime timestamp, string replyingTo = "") { var reactionId = new ArticleReactionTimestampId(timestamp, replyingTo); var d = new Document { [SLUG] = articleSlug, [TIMESTAMP] = reactionId.TimestampId, [CONTENT] = content, }; if (!String.IsNullOrWhiteSpace(userId)) { d[AUTHOR_ID] = userId; } if (!String.IsNullOrWhiteSpace(userName)) { d[AUTHOR_NAME] = userName; } switch (articleReactionType) { case ArticleReactionType.Comment: d[ARTICLE_TYPE] = ARTICLE_TYPE_COMMENT; break; case ArticleReactionType.Edit: d[ARTICLE_TYPE] = ARTICLE_TYPE_COMMENTEDIT; break; case ArticleReactionType.Hide: d[ARTICLE_TYPE] = ARTICLE_TYPE_COMMENTHIDE; break; case ArticleReactionType.Delete: d[ARTICLE_TYPE] = ARTICLE_TYPE_COMMENTDELETE; break; default: throw new ArgumentException($"Unknown reaction type {articleReactionType}", "articleReactionType"); } var table = Table.LoadTable(_dbClient, _options.DynamoDbTableName); _ = await table.PutItemAsync(d); return(reactionId.ReactionId); }
public void ReactingToIdIsCorrerct() { var timestampId = "2020-02-28T21:41:06.1781051Z_2019-12-26T10:12:00.6799989Z"; var reactionId = "2019-12-26T10c12c00p6799989Z_2020-02-28T21c41c06p1781051Z"; var reactingToId = "2019-12-26T10c12c00p6799989Z"; var comment = new ArticleReaction { TimestampId = timestampId }; Assert.AreEqual(reactionId, comment.ReactionId); Assert.AreEqual(reactingToId, comment.ReactingToId); var computed = new ArticleReactionTimestampId(reactionId); Assert.AreEqual(reactionId, computed.ReactionId); Assert.AreEqual(reactingToId, computed.ReactingToId); }
public void TimestampIdConvertedProperly() { var rootDate = System.DateTime.UtcNow; var replyDate = rootDate.AddDays(1); var rootId = new ArticleReactionTimestampId(rootDate); var replyId = new ArticleReactionTimestampId(replyDate, rootId.ReactionId); // Assert ToString() returns as timestamps Assert.AreEqual(replyId.ToString(), ArticleReactionTimestampId.JQueryFriendlyToTimestampString(replyId.ToString())); // Assert ReactionId returns as JQuery-friendly Assert.AreEqual(replyId.ReactionId, ArticleReactionTimestampId.TimestampToJQueryFriendlyString(replyId.ReactionId)); // Assert reactionID gets converted back to timestamps internally var replyIdFromPrevious = new ArticleReactionTimestampId(replyId.ReactionId); Assert.AreEqual(replyIdFromPrevious.ToString(), ArticleReactionTimestampId.JQueryFriendlyToTimestampString(replyIdFromPrevious.ToString())); }