add authorType to Comment

master
rob 2 years ago
parent 48f3b52876
commit c8c25521bf

@ -26,7 +26,8 @@ const CommentSchema = new Schema({
created: { type: Date, default: Date.now, required: true, index: 1 }, created: { type: Date, default: Date.now, required: true, index: 1 },
resourceType: { type: String, enum: RESOURCE_TYPE_LIST, required: true }, resourceType: { type: String, enum: RESOURCE_TYPE_LIST, required: true },
resource: { type: Schema.ObjectId, required: true, index: 1, refPath: 'resourceType' }, resource: { type: Schema.ObjectId, required: true, index: 1, refPath: 'resourceType' },
author: { type: Schema.ObjectId, required: true, index: 1, ref: 'User' }, authorType: { type: String, enum: ['User', 'CoreUser'], required: true},
author: { type: Schema.ObjectId, required: true, index: 1, refPath: 'authorType' },
replyTo: { type: Schema.ObjectId, index: 1, ref: 'Comment' }, replyTo: { type: Schema.ObjectId, index: 1, ref: 'Comment' },
status: { type: String, enum: COMMENT_STATUS_LIST, default: 'published', required: true }, status: { type: String, enum: COMMENT_STATUS_LIST, default: 'published', required: true },
content: { type: String, required: true, maxlength: 3000 }, content: { type: String, required: true, maxlength: 3000 },
@ -37,12 +38,27 @@ const CommentSchema = new Schema({
stats: { type: CommentStats, default: CommentStatsDefaults, required: true }, stats: { type: CommentStats, default: CommentStatsDefaults, required: true },
}); });
/*
* An index to optimize finding comments authored by a specific author. It helps
* to use authorType as a pre-filter, then find the author by ID. This compound
* index accomplishes that. The author's comments are then indexed by status for
* additional filtering and speed.
*/
CommentSchema.index({
authorType: 1,
author: 1,
status: 1,
}, {
name: 'comment_author_by_type',
});
/* /*
* An index to optimize finding replies to a specific comment * An index to optimize finding replies to a specific comment
*/ */
CommentSchema.index({ CommentSchema.index({
resource: 1, resource: 1,
replyTo: 1, replyTo: 1,
status: 1,
}, { }, {
partialFilterExpression: { replyTo: { $exists: true } }, partialFilterExpression: { replyTo: { $exists: true } },
name: 'comment_replies', name: 'comment_replies',

@ -80,6 +80,7 @@ class CommentService extends SiteService {
comment.created = NOW; comment.created = NOW;
comment.resourceType = resourceType; comment.resourceType = resourceType;
comment.resource = resource._id; comment.resource = resource._id;
comment.authorType = author.type;
comment.author = author._id; comment.author = author._id;
if (commentDefinition.replyTo) { if (commentDefinition.replyTo) {
comment.replyTo = mongoose.Types.ObjectId(commentDefinition.replyTo); comment.replyTo = mongoose.Types.ObjectId(commentDefinition.replyTo);
@ -125,6 +126,7 @@ class CommentService extends SiteService {
comment = comment.toObject(); comment = comment.toObject();
comment.author = author; comment.author = author;
return comment; return comment;
} }
@ -187,7 +189,11 @@ class CommentService extends SiteService {
async getForResource (resource, statuses, pagination) { async getForResource (resource, statuses, pagination) {
const comments = await Comment const comments = await Comment
.find({ resource: resource._id, replyTo: { $exists: false }, status: { $in: statuses } }) .find({ // index: 'comment_replies'
resource: resource._id,
replyTo: { $exists: false },
status: { $in: statuses },
})
.sort({ created: -1 }) .sort({ created: -1 })
.skip(pagination.skip) .skip(pagination.skip)
.limit(pagination.cpp) .limit(pagination.cpp)
@ -198,7 +204,11 @@ class CommentService extends SiteService {
async getForAuthor (author, pagination) { async getForAuthor (author, pagination) {
const comments = await Comment const comments = await Comment
.find({ author: author._id, status: { $in: ['published', 'mod-warn'] } }) .find({ // index: 'comment_author_by_type'
authorType: author.type,
author: author._id,
status: { $in: ['published', 'mod-warn'] },
})
.sort({ created: -1 }) .sort({ created: -1 })
.skip(pagination.skip) .skip(pagination.skip)
.limit(pagination.cpp) .limit(pagination.cpp)

Loading…
Cancel
Save