diff --git a/packages/backend/server/src/__tests__/e2e/comment/resolver.spec.ts b/packages/backend/server/src/__tests__/e2e/comment/resolver.spec.ts index 423625f7b6..f23d293feb 100644 --- a/packages/backend/server/src/__tests__/e2e/comment/resolver.spec.ts +++ b/packages/backend/server/src/__tests__/e2e/comment/resolver.spec.ts @@ -687,6 +687,63 @@ e2e( } ); +e2e( + 'should create reply and send comment mention notification to comment author', + async t => { + const docId = randomUUID(); + await app.create(Mockers.DocUser, { + workspaceId: teamWorkspace.id, + docId, + userId: owner.id, + type: DocRole.Owner, + }); + + await app.login(member); + const createResult = await app.gql({ + query: createCommentMutation, + variables: { + input: { + workspaceId: teamWorkspace.id, + docId, + docMode: DocMode.page, + docTitle: 'test', + content: { + type: 'paragraph', + content: [{ type: 'text', text: 'test' }], + }, + }, + }, + }); + + // owner login to create reply and send notification to comment author: member + await app.login(owner); + const count = app.queue.count('notification.sendComment'); + const result = await app.gql({ + query: createReplyMutation, + variables: { + input: { + commentId: createResult.createComment.id, + docMode: DocMode.page, + docTitle: 'test', + content: { + type: 'paragraph', + content: [{ type: 'text', text: 'test' }], + }, + }, + }, + }); + + t.truthy(result.createReply.id); + t.is(result.createReply.commentId, createResult.createComment.id); + t.is(app.queue.count('notification.sendComment'), count + 1); + const notification = app.queue.last('notification.sendComment'); + t.is(notification.name, 'notification.sendComment'); + t.is(notification.payload.userId, member.id); + t.is(notification.payload.body.replyId, result.createReply.id); + t.is(notification.payload.isMention, true); + } +); + e2e('should create reply work when user is Commenter', async t => { const docId = randomUUID(); await app.create(Mockers.DocUser, { diff --git a/packages/backend/server/src/core/comment/resolver.ts b/packages/backend/server/src/core/comment/resolver.ts index e65e8b0cf5..389585ffe6 100644 --- a/packages/backend/server/src/core/comment/resolver.ts +++ b/packages/backend/server/src/core/comment/resolver.ts @@ -396,11 +396,34 @@ export class CommentResolver { }); } + // send comment mention notification to comment author on reply + if (reply && comment.userId !== sender.id) { + await this.queue.add('notification.sendComment', { + isMention: true, + userId: comment.userId, + body: { + workspaceId: comment.workspaceId, + createdByUserId: sender.id, + commentId: comment.id, + replyId: reply.id, + doc: { + id: comment.docId, + title: docTitle, + mode: docMode, + }, + }, + }); + } + // send comment mention notification to mentioned users if (mentions) { for (const mentionUserId of mentions) { - // skip if the mention user is the doc owner - if (mentionUserId === owner?.userId || mentionUserId === sender.id) { + // skip if the mention user is the doc owner or the comment author + if ( + mentionUserId === owner?.userId || + mentionUserId === sender.id || + mentionUserId === comment.userId + ) { continue; }