import mongoose, {Schema, PopulatedDoc, Document, Model} from "mongoose"; import SequenceFactory from "mongoose-sequence"; import { hasMigrated } from "~/lib/dbconfig"; import { populate, populateSelected } from "~/lib/functions"; import { IUser } from "~/models/user"; const AutoIncrement = SequenceFactory(mongoose); export interface IReview { _id: number; text: string; leftOn: number; whichChapter: number; author: PopulatedDoc; datePosted: Date; replyingTo: PopulatedDoc | null; replies: PopulatedDoc[] } const CommentSchema = new mongoose.Schema({ _id: { type: Number }, text: { type: String }, leftOn: { type: Number }, whichChapter: { type: Number }, author: { type: Number, ref: "User" }, datePosted: { type: Date, default: new Date() }, replyingTo: { default: null, type: Number, ref: "Review" }, replies: [{ default: null, type: Number, ref: "Review" }] }) CommentSchema.virtual('story', { ref: 'Story', localField: 'leftOn', foreignField: '_id', justOne: true, }); CommentSchema .pre('findOne', populate('replies')) .pre('find', populate('replies')) .pre("findOne", populate("commentAuthor")) .pre("find", populate("commentAuthor")) .pre("findOne", populateSelected("replyingTo", "-replies")) .pre("find", populateSelected("replyingTo", "-replies")); hasMigrated && CommentSchema.plugin(AutoIncrement, {id: "reviews"}) export const Review: Model = /* mongoose.models.Review || */ mongoose.model("Review", CommentSchema, "reviews")