| #!/usr/bin/env node |
| |
| |
| const path = require('path'); |
| const mongoose = require('mongoose'); |
| const { |
| Key, |
| User, |
| File, |
| Agent, |
| Token, |
| Group, |
| Action, |
| Preset, |
| Prompt, |
| Balance, |
| Message, |
| Session, |
| AclEntry, |
| ToolCall, |
| Assistant, |
| SharedLink, |
| PluginAuth, |
| MemoryEntry, |
| PromptGroup, |
| Transaction, |
| Conversation, |
| ConversationTag, |
| } = require('@librechat/data-schemas').createModels(mongoose); |
| require('module-alias')({ base: path.resolve(__dirname, '..', 'api') }); |
| const { askQuestion, silentExit } = require('./helpers'); |
| const connect = require('./connect'); |
|
|
| async function gracefulExit(code = 0) { |
| try { |
| await mongoose.disconnect(); |
| } catch (err) { |
| console.error('Error disconnecting from MongoDB:', err); |
| } |
| silentExit(code); |
| } |
|
|
| (async () => { |
| await connect(); |
|
|
| console.purple('---------------'); |
| console.purple('Deleting a user and all related data'); |
| console.purple('---------------'); |
|
|
| |
| let email = process.argv[2]?.trim(); |
| if (!email) { |
| email = (await askQuestion('Email:')).trim(); |
| } |
|
|
| |
| const user = await User.findOne({ email: email.toLowerCase() }); |
| if (!user) { |
| console.yellow(`No user found with email "${email}"`); |
| return gracefulExit(0); |
| } |
|
|
| |
| const confirmAll = await askQuestion( |
| `Really delete user ${user.email} (${user._id}) and ALL their data? (y/N)`, |
| ); |
| if (confirmAll.toLowerCase() !== 'y') { |
| console.yellow('Aborted.'); |
| return gracefulExit(0); |
| } |
|
|
| |
| const confirmTx = await askQuestion('Also delete all transaction history for this user? (y/N)'); |
| const deleteTx = confirmTx.toLowerCase() === 'y'; |
|
|
| const uid = user._id.toString(); |
|
|
| |
| const tasks = [ |
| Action.deleteMany({ user: uid }), |
| Agent.deleteMany({ author: uid }), |
| Assistant.deleteMany({ user: uid }), |
| Balance.deleteMany({ user: uid }), |
| ConversationTag.deleteMany({ user: uid }), |
| Conversation.deleteMany({ user: uid }), |
| Message.deleteMany({ user: uid }), |
| File.deleteMany({ user: uid }), |
| Key.deleteMany({ userId: uid }), |
| MemoryEntry.deleteMany({ userId: uid }), |
| PluginAuth.deleteMany({ userId: uid }), |
| Prompt.deleteMany({ author: uid }), |
| PromptGroup.deleteMany({ author: uid }), |
| Preset.deleteMany({ user: uid }), |
| Session.deleteMany({ user: uid }), |
| SharedLink.deleteMany({ user: uid }), |
| ToolCall.deleteMany({ user: uid }), |
| Token.deleteMany({ userId: uid }), |
| AclEntry.deleteMany({ principalId: user._id }), |
| ]; |
|
|
| if (deleteTx) { |
| tasks.push(Transaction.deleteMany({ user: uid })); |
| } |
|
|
| await Promise.all(tasks); |
|
|
| |
| await Group.updateMany({ memberIds: user._id }, { $pull: { memberIds: user._id } }); |
|
|
| |
| await User.deleteOne({ _id: uid }); |
|
|
| console.green(`✔ Successfully deleted user ${email} and all associated data.`); |
| if (!deleteTx) { |
| console.yellow('⚠️ Transaction history was retained.'); |
| } |
|
|
| return gracefulExit(0); |
| })().catch(async (err) => { |
| if (!err.message.includes('fetch failed')) { |
| console.error('There was an uncaught error:'); |
| console.error(err); |
| await mongoose.disconnect(); |
| process.exit(1); |
| } |
| }); |
|
|