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);
        }
예제 #4
0
        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);
        }
예제 #6
0
        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()));
        }