2023-02-05 23:05:07 -05:00
|
|
|
const mongoose = require('mongoose');
|
2023-03-17 22:20:36 -04:00
|
|
|
const mongoMeili = require('../lib/db/mongoMeili');
|
2023-02-04 20:08:46 -05:00
|
|
|
|
2023-02-05 23:05:07 -05:00
|
|
|
const messageSchema = mongoose.Schema({
|
2023-03-13 12:35:55 +08:00
|
|
|
messageId: {
|
2023-02-05 23:05:07 -05:00
|
|
|
type: String,
|
|
|
|
|
unique: true,
|
2023-03-16 19:38:16 -04:00
|
|
|
required: true,
|
2023-03-17 22:20:36 -04:00
|
|
|
index: true,
|
2023-03-16 19:38:16 -04:00
|
|
|
meiliIndex: true
|
2023-02-05 23:05:07 -05:00
|
|
|
},
|
|
|
|
|
conversationId: {
|
|
|
|
|
type: String,
|
2023-03-16 17:20:26 -04:00
|
|
|
required: true,
|
|
|
|
|
meiliIndex: true
|
2023-02-05 23:05:07 -05:00
|
|
|
},
|
2023-02-19 21:06:21 -05:00
|
|
|
conversationSignature: {
|
|
|
|
|
type: String,
|
|
|
|
|
// required: true
|
|
|
|
|
},
|
|
|
|
|
clientId: {
|
|
|
|
|
type: String,
|
|
|
|
|
},
|
|
|
|
|
invocationId: {
|
2023-02-20 21:52:08 -05:00
|
|
|
type: String,
|
2023-02-19 21:06:21 -05:00
|
|
|
},
|
2023-02-05 23:05:07 -05:00
|
|
|
parentMessageId: {
|
|
|
|
|
type: String,
|
2023-02-19 21:06:21 -05:00
|
|
|
// required: true
|
2023-02-05 23:05:07 -05:00
|
|
|
},
|
|
|
|
|
sender: {
|
|
|
|
|
type: String,
|
2023-03-16 17:20:26 -04:00
|
|
|
required: true,
|
|
|
|
|
meiliIndex: true
|
2023-02-05 23:05:07 -05:00
|
|
|
},
|
|
|
|
|
text: {
|
|
|
|
|
type: String,
|
2023-03-16 16:22:08 -04:00
|
|
|
required: true,
|
|
|
|
|
meiliIndex: true
|
2023-02-05 23:05:07 -05:00
|
|
|
},
|
2023-03-13 05:20:35 +08:00
|
|
|
isCreatedByUser: {
|
|
|
|
|
type: Boolean,
|
|
|
|
|
required: true,
|
|
|
|
|
default: false
|
2023-03-14 03:38:47 +08:00
|
|
|
},
|
|
|
|
|
error: {
|
|
|
|
|
type: Boolean,
|
|
|
|
|
default: false
|
|
|
|
|
},
|
2023-03-16 17:20:26 -04:00
|
|
|
_meiliIndex: {
|
|
|
|
|
type: Boolean,
|
|
|
|
|
required: false,
|
|
|
|
|
select: false,
|
|
|
|
|
default: false
|
|
|
|
|
}
|
2023-03-13 05:20:35 +08:00
|
|
|
}, { timestamps: true });
|
2023-02-05 23:05:07 -05:00
|
|
|
|
2023-03-16 19:38:16 -04:00
|
|
|
messageSchema.plugin(mongoMeili, {
|
2023-03-17 22:20:36 -04:00
|
|
|
host: process.env.MEILI_HOST,
|
|
|
|
|
apiKey: process.env.MEILI_KEY,
|
|
|
|
|
indexName: 'messages', // Will get created automatically if it doesn't exist already
|
|
|
|
|
primaryKey: 'messageId',
|
2023-03-16 19:38:16 -04:00
|
|
|
});
|
2023-03-16 16:22:08 -04:00
|
|
|
|
2023-02-05 23:05:07 -05:00
|
|
|
const Message = mongoose.models.Message || mongoose.model('Message', messageSchema);
|
|
|
|
|
|
|
|
|
|
module.exports = {
|
2023-03-16 16:22:08 -04:00
|
|
|
messageSchema,
|
|
|
|
|
Message,
|
2023-03-14 03:38:47 +08:00
|
|
|
saveMessage: async ({ messageId, conversationId, parentMessageId, sender, text, isCreatedByUser=false, error }) => {
|
2023-02-08 00:02:29 -05:00
|
|
|
try {
|
2023-03-13 12:35:55 +08:00
|
|
|
await Message.findOneAndUpdate({ messageId }, {
|
2023-02-08 00:02:29 -05:00
|
|
|
conversationId,
|
|
|
|
|
parentMessageId,
|
|
|
|
|
sender,
|
2023-03-13 05:26:17 +08:00
|
|
|
text,
|
2023-03-14 03:38:47 +08:00
|
|
|
isCreatedByUser,
|
|
|
|
|
error
|
2023-03-13 05:26:17 +08:00
|
|
|
}, { upsert: true, new: true });
|
2023-03-13 12:35:55 +08:00
|
|
|
return { messageId, conversationId, parentMessageId, sender, text, isCreatedByUser };
|
2023-02-08 00:02:29 -05:00
|
|
|
} catch (error) {
|
|
|
|
|
console.error(error);
|
|
|
|
|
return { message: 'Error saving message' };
|
|
|
|
|
}
|
2023-02-06 14:05:02 -05:00
|
|
|
},
|
2023-03-13 12:35:55 +08:00
|
|
|
deleteMessagesSince: async ({ messageId, conversationId }) => {
|
2023-03-13 05:26:17 +08:00
|
|
|
try {
|
2023-03-13 21:59:25 -04:00
|
|
|
const message = await Message.findOne({ messageId }).exec()
|
2023-03-13 05:26:17 +08:00
|
|
|
|
|
|
|
|
if (message)
|
|
|
|
|
return await Message.find({ conversationId }).deleteMany({ createdAt: { $gt: message.createdAt } }).exec();
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.error(error);
|
|
|
|
|
return { message: 'Error deleting messages' };
|
|
|
|
|
}
|
|
|
|
|
},
|
2023-02-08 15:26:42 -05:00
|
|
|
getMessages: async (filter) => {
|
|
|
|
|
try {
|
2023-03-13 05:20:35 +08:00
|
|
|
return await Message.find(filter).sort({createdAt: 1}).exec()
|
2023-02-08 15:26:42 -05:00
|
|
|
} catch (error) {
|
|
|
|
|
console.error(error);
|
|
|
|
|
return { message: 'Error getting messages' };
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
deleteMessages: async (filter) => {
|
|
|
|
|
try {
|
|
|
|
|
return await Message.deleteMany(filter).exec()
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.error(error);
|
|
|
|
|
return { message: 'Error deleting messages' };
|
|
|
|
|
}
|
|
|
|
|
}
|
2023-02-05 23:05:07 -05:00
|
|
|
}
|