diff --git a/api/models/dbConnect.js b/api/lib/db/connectDb.js similarity index 94% rename from api/models/dbConnect.js rename to api/lib/db/connectDb.js index f9a8455442..c30f830383 100644 --- a/api/models/dbConnect.js +++ b/api/lib/db/connectDb.js @@ -17,7 +17,7 @@ if (!cached) { cached = global.mongoose = { conn: null, promise: null }; } -async function dbConnect() { +async function connectDb() { if (cached.conn) { return cached.conn; } @@ -41,4 +41,4 @@ async function dbConnect() { return cached.conn; } -module.exports = dbConnect; +module.exports = connectDb; diff --git a/api/lib/db/migrateDb.js b/api/lib/db/migrateDb.js new file mode 100644 index 0000000000..2bd1cb358f --- /dev/null +++ b/api/lib/db/migrateDb.js @@ -0,0 +1,62 @@ +const mongoose = require('mongoose'); +const { Conversation, } = require('../../models/Conversation'); +const { getMessages, } = require('../../models/'); + +async function migrateDb() { + try { + const conversations = await Conversation.find({ model: null }).exec(); + + if (!conversations || conversations.length === 0) + return { message: '[Migrate] No conversations to migrate' }; + + for (let convo of conversations) { + const messages = await getMessages({ + conversationId: convo.conversationId, + messageId: { $exists: false } + }); + + let model; + let oldId; + const promises = []; + messages.forEach((message, i) => { + const msgObj = message.toObject(); + const newId = msgObj.id; + if (i === 0) { + message.parentMessageId = '00000000-0000-0000-0000-000000000000'; + } else { + message.parentMessageId = oldId; + } + + oldId = newId; + message.messageId = newId; + if (message.sender.toLowerCase() !== 'user' && !model) { + model = message.sender.toLowerCase(); + } + + if (message.sender.toLowerCase() === 'user') { + message.isCreatedByUser = true; + } + promises.push(message.save()); + }); + await Promise.all(promises); + + await Conversation.findOneAndUpdate( + { conversationId: convo.conversationId }, + { model }, + { new: true } + ).exec(); + } + + try { + await mongoose.connection.db.collection('messages').dropIndex('id_1'); + } catch (error) { + console.log("[Migrate] Index doesn't exist or already dropped"); + } + } catch (error) { + console.log(error); + return { message: '[Migrate] Error migrating conversations' }; + } +} + + +module.exports = migrateDb; \ No newline at end of file diff --git a/api/models/Conversation.js b/api/models/Conversation.js index 7506fafe43..ea48644318 100644 --- a/api/models/Conversation.js +++ b/api/models/Conversation.js @@ -1,5 +1,4 @@ const mongoose = require('mongoose'); -const crypto = require('crypto'); const { getMessages, deleteMessages } = require('./Message'); const convoSchema = mongoose.Schema( @@ -65,13 +64,14 @@ const getConvo = async (user, conversationId) => { }; module.exports = { + Conversation, saveConvo: async (user, { conversationId, newConversationId, title, ...convo }) => { try { const messages = await getMessages({ conversationId }); const update = { ...convo, messages }; if (title) { update.title = title; - update.user = user + update.user = user; } if (newConversationId) { update.conversationId = newConversationId; @@ -97,9 +97,13 @@ module.exports = { }, updateConvo: async (user, { conversationId, ...update }) => { try { - return await Conversation.findOneAndUpdate({ conversationId: conversationId, user }, update, { - new: true - }).exec(); + return await Conversation.findOneAndUpdate( + { conversationId: conversationId, user }, + update, + { + new: true + } + ).exec(); } catch (error) { console.log(error); return { message: 'Error updating conversation' }; @@ -132,63 +136,8 @@ module.exports = { } }, deleteConvos: async (user, filter) => { - let deleteCount = await Conversation.deleteMany({...filter, user}).exec(); + let deleteCount = await Conversation.deleteMany({ ...filter, user }).exec(); deleteCount.messages = await deleteMessages(filter); return deleteCount; - }, - migrateDb: async () => { - try { - const conversations = await Conversation.find({ model: null }).exec(); - - if (!conversations || conversations.length === 0) - return { message: '[Migrate] No conversations to migrate' }; - - for (let convo of conversations) { - const messages = await getMessages({ - conversationId: convo.conversationId, - messageId: { $exists: false } - }); - - let model; - let oldId; - const promises = []; - messages.forEach((message, i) => { - const msgObj = message.toObject(); - const newId = msgObj.id; - if (i === 0) { - message.parentMessageId = '00000000-0000-0000-0000-000000000000'; - } else { - message.parentMessageId = oldId; - } - - oldId = newId; - message.messageId = newId; - if (message.sender.toLowerCase() !== 'user' && !model) { - model = message.sender.toLowerCase(); - } - - if (message.sender.toLowerCase() === 'user') { - message.isCreatedByUser = true; - } - promises.push(message.save()); - }); - await Promise.all(promises); - - await Conversation.findOneAndUpdate( - { conversationId: convo.conversationId }, - { model }, - { new: true } - ).exec(); - } - - try { - await mongoose.connection.db.collection('messages').dropIndex('id_1'); - } catch (error) { - console.log("[Migrate] Index doesn't exist or already dropped"); - } - } catch (error) { - console.log(error); - return { message: '[Migrate] Error migrating conversations' }; - } } }; diff --git a/api/models/index.js b/api/models/index.js index cd75b9c6a3..d9c5dc8e9d 100644 --- a/api/models/index.js +++ b/api/models/index.js @@ -1,15 +1,15 @@ -const { saveMessage, deleteMessagesSince, deleteMessages } = require('./Message'); +const { getMessages, saveMessage, deleteMessagesSince, deleteMessages } = require('./Message'); const { getCustomGpts, updateCustomGpt, updateByLabel, deleteCustomGpts } = require('./CustomGpt'); -const { getConvoTitle, getConvo, saveConvo, migrateDb } = require('./Conversation'); +const { getConvoTitle, getConvo, saveConvo } = require('./Conversation'); module.exports = { + getMessages, saveMessage, deleteMessagesSince, deleteMessages, getConvoTitle, getConvo, saveConvo, - migrateDb, getCustomGpts, updateCustomGpt, updateByLabel, diff --git a/api/server/index.js b/api/server/index.js index dd9a500ed5..cb9781623a 100644 --- a/api/server/index.js +++ b/api/server/index.js @@ -1,7 +1,7 @@ const express = require('express'); const session = require('express-session') -const dbConnect = require('../models/dbConnect'); -const { migrateDb } = require('../models'); +const connectDb = require('../lib/db/connectDb'); +const migrateDb = require('../lib/db/migrateDb'); const path = require('path'); const cors = require('cors'); const routes = require('./routes'); @@ -10,7 +10,7 @@ const port = process.env.PORT || 3080; const host = process.env.HOST || 'localhost' const userSystemEnabled = process.env.ENABLE_USER_SYSTEM || false const projectPath = path.join(__dirname, '..', '..', 'client'); -dbConnect().then(() => { +connectDb().then(() => { console.log('Connected to MongoDB'); migrateDb(); });