Spaces:
Running
Running
| const mongoose = require('mongoose'); | |
| // Define a simple sub-schema for replies | |
| const ReplySchema = new mongoose.Schema({ | |
| userId: { type: mongoose.Schema.Types.ObjectId, ref: 'User', default: null }, | |
| guestName: { type: String, default: 'Anonymous' }, | |
| content: { type: String, required: true, maxLength: 500 }, | |
| createdAt: { type: Date, default: Date.now } | |
| }); | |
| const ReviewSchema = new mongoose.Schema({ | |
| mediaId: { type: mongoose.Schema.Types.ObjectId, ref: 'Media', required: true, index: true }, | |
| userId: { type: mongoose.Schema.Types.ObjectId, ref: 'User', default: null }, | |
| guestName: { type: String, default: 'Anonymous Brutalist' }, | |
| rating: { type: Number, required: true, min: 1, max: 10 }, | |
| content: { type: String, required: true, maxLength: 2000 }, | |
| isSpoiler: { type: Boolean, default: false }, | |
| // Array of embedded replies | |
| replies: [ReplySchema], | |
| upvotes: [{ type: mongoose.Schema.Types.ObjectId, ref: 'User' }], | |
| downvotes: [{ type: mongoose.Schema.Types.ObjectId, ref: 'User' }], | |
| weight: { type: Number, default: 1.0 } | |
| }, { timestamps: true }); | |
| ReviewSchema.index({ mediaId: 1, createdAt: -1 }); | |
| module.exports = mongoose.model('Review', ReviewSchema); | |