import Users from 'meteor/vulcan:users'; /** * @summary Comments schema * @type {Object} */ const schema = { /** ID */ _id: { type: String, optional: true, viewableBy: ['guests'], }, /** The `_id` of the parent comment, if there is one */ parentCommentId: { type: String, // regEx: SimpleSchema.RegEx.Id, max: 500, viewableBy: ['guests'], insertableBy: ['members'], optional: true, resolveAs: 'parentComment: Comment', hidden: true // never show this }, /** The `_id` of the top-level parent comment, if there is one */ topLevelCommentId: { type: String, // regEx: SimpleSchema.RegEx.Id, max: 500, viewableBy: ['guests'], insertableBy: ['members'], optional: true, resolveAs: 'topLevelComment: Comment', hidden: true // never show this }, /** The timestamp of comment creation */ createdAt: { type: Date, optional: true, viewableBy: ['admins'], autoValue: (documentOrModifier) => { if (documentOrModifier && !documentOrModifier.$set) return new Date() // if this is an insert, set createdAt to current timestamp } }, /** The timestamp of the comment being posted. For now, comments are always created and posted at the same time */ postedAt: { type: Date, optional: true, viewableBy: ['guests'], autoValue: (documentOrModifier) => { if (documentOrModifier && !documentOrModifier.$set) return new Date() // if this is an insert, set createdAt to current timestamp } }, /** The comment body (Markdown) */ body: { type: String, max: 3000, viewableBy: ['guests'], insertableBy: ['members'], editableBy: ['members'], control: "textarea" }, /** The HTML version of the comment body */ htmlBody: { type: String, optional: true, viewableBy: ['guests'], }, /** The comment author's name */ author: { type: String, optional: true, viewableBy: ['guests'], autoValue: (documentOrModifier) => { // if userId is changing, change the author name too const userId = documentOrModifier.userId || documentOrModifier.$set && documentOrModifier.$set.userId if (userId) return Users.getDisplayNameById(userId) } }, /** Whether the comment is inactive. Inactive comments' scores gets recalculated less often */ inactive: { type: Boolean, optional: true, viewableBy: ['guests'], }, /** The post's `_id` */ postId: { type: String, optional: true, viewableBy: ['guests'], insertableBy: ['members'], // regEx: SimpleSchema.RegEx.Id, max: 500, resolveAs: 'post: Post', hidden: true // never show this }, /** The comment author's `_id` */ userId: { type: String, optional: true, viewableBy: ['guests'], insertableBy: ['members'], hidden: true, resolveAs: 'user: User', }, /** Whether the comment is deleted. Delete comments' content doesn't appear on the site. */ isDeleted: { type: Boolean, optional: true, viewableBy: ['guests'], }, userIP: { type: String, optional: true, viewableBy: ['admins'], }, userAgent: { type: String, optional: true, viewableBy: ['admins'], }, referrer: { type: String, optional: true, viewableBy: ['admins'], } }; export default schema;