feat: Comment resolving (#7115)
This commit is contained in:
@@ -13,6 +13,7 @@ import type { ProsemirrorData } from "@shared/types";
|
||||
import { ProsemirrorHelper } from "@shared/utils/ProsemirrorHelper";
|
||||
import { CommentValidation } from "@shared/validations";
|
||||
import { schema } from "@server/editor";
|
||||
import { ValidationError } from "@server/errors";
|
||||
import Document from "./Document";
|
||||
import User from "./User";
|
||||
import ParanoidModel from "./base/ParanoidModel";
|
||||
@@ -26,6 +27,11 @@ import TextLength from "./validators/TextLength";
|
||||
as: "createdBy",
|
||||
paranoid: false,
|
||||
},
|
||||
{
|
||||
model: User,
|
||||
as: "resolvedBy",
|
||||
paranoid: false,
|
||||
},
|
||||
],
|
||||
}))
|
||||
@Table({ tableName: "comments", modelName: "comment" })
|
||||
@@ -54,12 +60,15 @@ class Comment extends ParanoidModel<
|
||||
@Column(DataType.UUID)
|
||||
createdById: string;
|
||||
|
||||
@Column(DataType.DATE)
|
||||
resolvedAt: Date | null;
|
||||
|
||||
@BelongsTo(() => User, "resolvedById")
|
||||
resolvedBy: User;
|
||||
resolvedBy: User | null;
|
||||
|
||||
@ForeignKey(() => User)
|
||||
@Column(DataType.UUID)
|
||||
resolvedById: string;
|
||||
resolvedById: string | null;
|
||||
|
||||
@BelongsTo(() => Document, "documentId")
|
||||
document: Document;
|
||||
@@ -75,6 +84,51 @@ class Comment extends ParanoidModel<
|
||||
@Column(DataType.UUID)
|
||||
parentCommentId: string;
|
||||
|
||||
// methods
|
||||
|
||||
/**
|
||||
* Resolve the comment. Note this does not save the comment to the database.
|
||||
*
|
||||
* @param resolvedBy The user who resolved the comment
|
||||
*/
|
||||
public resolve(resolvedBy: User) {
|
||||
if (this.isResolved) {
|
||||
throw ValidationError("Comment is already resolved");
|
||||
}
|
||||
if (this.parentCommentId) {
|
||||
throw ValidationError("Cannot resolve a reply");
|
||||
}
|
||||
|
||||
this.resolvedById = resolvedBy.id;
|
||||
this.resolvedBy = resolvedBy;
|
||||
this.resolvedAt = new Date();
|
||||
}
|
||||
|
||||
/**
|
||||
* Unresolve the comment. Note this does not save the comment to the database.
|
||||
*/
|
||||
public unresolve() {
|
||||
if (!this.isResolved) {
|
||||
throw ValidationError("Comment is not resolved");
|
||||
}
|
||||
|
||||
this.resolvedById = null;
|
||||
this.resolvedBy = null;
|
||||
this.resolvedAt = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Whether the comment is resolved
|
||||
*/
|
||||
public get isResolved() {
|
||||
return !!this.resolvedAt;
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert the comment data to plain text
|
||||
*
|
||||
* @returns The plain text representation of the comment data
|
||||
*/
|
||||
public toPlainText() {
|
||||
const node = Node.fromJSON(schema, this.data);
|
||||
return ProsemirrorHelper.toPlainText(node, schema);
|
||||
|
||||
Reference in New Issue
Block a user