feat: replies to comments
A comment can answer another one (replyTo), one level deep: answering a reply joins the same thread, and it must be on the same ticket. Whoever wrote the comment gets a new REPLIED notification, and the activity says "respondió a un comentario". A comment deleted while it has replies stays, without its text (deleted: true), so the thread still reads; it goes with its last reply and does not count in commentCount. The ticket page shows threads with their replies indented and a "Responder" box; REST, GraphQL and the MCP (add_comment, get_issue) take and show replyTo. Existing comments are unchanged. Docs, Word and PDF updated. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -45,6 +45,13 @@ import {
|
||||
|
||||
/* Query-side adapters (MongoDB). */
|
||||
|
||||
/** Comments projected before there were replies have neither field. */
|
||||
const commentFromDoc = (doc: CommentDoc): CommentReadModel => ({
|
||||
...fromDoc(doc),
|
||||
replyTo: doc.replyTo ?? null,
|
||||
deleted: doc.deleted ?? false,
|
||||
});
|
||||
|
||||
const escapeRegex = (text: string) =>
|
||||
text.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
||||
|
||||
@@ -446,7 +453,7 @@ export class MongoFindCommentsRepository extends FindCommentsRepository {
|
||||
|
||||
async findById(id: string): Promise<CommentReadModel | null> {
|
||||
const doc = await this.comments.findById(id).lean<CommentDoc>();
|
||||
return doc ? fromDoc(doc) : null;
|
||||
return doc ? commentFromDoc(doc) : null;
|
||||
}
|
||||
|
||||
async findByIssue(
|
||||
@@ -463,11 +470,15 @@ export class MongoFindCommentsRepository extends FindCommentsRepository {
|
||||
.lean<CommentDoc[]>(),
|
||||
this.comments.countDocuments({ issueId }),
|
||||
]);
|
||||
return { items: docs.map(fromDoc), total };
|
||||
return { items: docs.map(commentFromDoc), total };
|
||||
}
|
||||
|
||||
countByIssue(issueId: string): Promise<number> {
|
||||
return this.comments.countDocuments({ issueId });
|
||||
return this.comments.countDocuments({ issueId, deleted: { $ne: true } });
|
||||
}
|
||||
|
||||
countReplies(commentId: string): Promise<number> {
|
||||
return this.comments.countDocuments({ replyTo: commentId });
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user