const mongoose = require('mongoose') const { Schema } = mongoose const messageSchema = new Schema({ senderId: { type: mongoose.Schema.Types.ObjectId, ref: 'User', required: true }, receiverId: { type: mongoose.Schema.Types.ObjectId, ref: 'User', required: true }, content: { type: String, required: false, trim: true }, file: { type: String, required: false }, fileType: { type: String, enum: ['image', 'video', 'file', 'voice', 'location'], required: false }, replyToId: { type: mongoose.Schema.Types.ObjectId, ref: 'Message', required: false }, forwardedFrom: { userId: { type: mongoose.Schema.Types.ObjectId, ref: 'User' }, userName: String, displayName: String }, createdAt: { type: Date, default: Date.now }, readStatus: { type: Number, default: 0 }, /** Countdown length in seconds — timer starts when receiver views the message */ selfDestructSeconds: { type: Number, required: false }, /** When the receiver opened the message and the self-destruct timer started */ selfDestructStartedAt: { type: Date, required: false }, /** Auto-delete after this time (self-destruct messages) */ expiresAt: { type: Date, required: false, index: true }, /** View-once photo / video / voice */ viewOnce: { type: Boolean, default: false }, viewOnceOpenedAt: { type: Date, required: false }, reactions: [ { userId: { type: mongoose.Schema.Types.ObjectId, ref: 'User', required: true }, emoji: { type: String, required: true, trim: true } } ] }) // GET /api/v1/chat فیلتر $or روی هر دو جهتِ {senderId,receiverId} می‌زنه و createdAt // رو سورت می‌کنه؛ messageController.js هم شمارشِ نخونده‌ها رو با {receiverId,senderId, // readStatus} و {receiverId,readStatus} می‌زنه — همه‌ی این‌ها روی هر بارِ باز کردنِ // لیستِ چت/یه ترد اجرا می‌شن، بدونِ ایندکس یعنی scan کاملِ کالکشن messageSchema.index({ senderId: 1, receiverId: 1, createdAt: -1 }) messageSchema.index({ receiverId: 1, senderId: 1, createdAt: -1 }) messageSchema.index({ receiverId: 1, readStatus: 1 }) const MessageModel = mongoose.model('Message', messageSchema) module.exports = MessageModel