// comment.js // Copyright (C) 2022 DTP Technologies, LLC // License: Apache-2.0 'use strict'; const path = require('path'); const mongoose = require('mongoose'); const Schema = mongoose.Schema; const CommentHistorySchema = new Schema({ created: { type: Date }, content: { type: String, maxlength: 3000 }, }); const { RESOURCE_TYPE_LIST, ResourceStats, ResourceStatsDefaults, CommentStats, CommentStatsDefaults, } = require(path.join(__dirname, 'lib', 'resource-stats.js')); const COMMENT_STATUS_LIST = [ 'published', 'removed', 'mod-warn', 'mod-removed', ]; const CommentSchema = new Schema({ created: { type: Date, default: Date.now, required: true, index: 1 }, resourceType: { type: String, enum: RESOURCE_TYPE_LIST, required: true }, resource: { type: Schema.ObjectId, required: true, index: 1, refPath: 'resourceType' }, 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' }, status: { type: String, enum: COMMENT_STATUS_LIST, default: 'published', required: true }, content: { type: String, required: true, maxlength: 3000 }, contentHistory: { type: [CommentHistorySchema], select: false }, flags: { isNSFW: { type: Boolean, default: false, required: true }, }, resourceStats: { type: ResourceStats, default: ResourceStatsDefaults, required: true }, commentStats: { 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 */ CommentSchema.index({ resource: 1, replyTo: 1, status: 1, }, { partialFilterExpression: { replyTo: { $exists: true } }, name: 'comment_replies', }); module.exports = mongoose.model('Comment', CommentSchema);