95 lines
2.4 KiB
JavaScript
95 lines
2.4 KiB
JavaScript
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
|