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", );