📃 feat: add list-balances, remove-user, and improve User scripts (#1418)

* Refactoring opening of DB to config/helpers.js

* Adding two user scripts:

- 'delete-user' to remove a user definitely
- 'list-balances' to show the balances of all the users
This commit is contained in:
Linus Gasser 2023-12-30 19:25:12 +01:00 committed by GitHub
parent 8735db0980
commit 1a95bef677
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
10 changed files with 137 additions and 82 deletions

View file

@ -1,36 +1,11 @@
const path = require('path');
require('module-alias')({ base: path.resolve(__dirname, '..', 'api') });
const { askQuestion, silentExit } = require('./helpers');
const { askQuestion, silentExit, connectWithTimeout } = require('./helpers');
const Transaction = require('~/models/Transaction');
const connectDb = require('~/lib/db/connectDb');
const User = require('~/models/User');
(async () => {
/**
* Connect to the database
* - If it takes a while, we'll warn the user
*/
// Warn the user if this is taking a while
let timeout = setTimeout(() => {
console.orange(
'This is taking a while... You may need to check your connection if this fails.',
);
timeout = setTimeout(() => {
console.orange('Still going... Might as well assume the connection failed...');
timeout = setTimeout(() => {
console.orange('Error incoming in 3... 2... 1...');
}, 13000);
}, 10000);
}, 5000);
// Attempt to connect to the database
try {
console.orange('Warming up the engines...');
await connectDb();
clearTimeout(timeout);
} catch (e) {
console.error(e);
silentExit(1);
}
await connectWithTimeout();
/**
* Show the welcome / help menu

View file

@ -1,36 +1,11 @@
const path = require('path');
require('module-alias')({ base: path.resolve(__dirname, '..', 'api') });
const { askQuestion, silentExit } = require('./helpers');
const { askQuestion, silentExit, connectWithTimeout } = require('./helpers');
const banViolation = require('~/cache/banViolation');
const connectDb = require('~/lib/db/connectDb');
const User = require('~/models/User');
(async () => {
/**
* Connect to the database
* - If it takes a while, we'll warn the user
*/
// Warn the user if this is taking a while
let timeout = setTimeout(() => {
console.orange(
'This is taking a while... You may need to check your connection if this fails.',
);
timeout = setTimeout(() => {
console.orange('Still going... Might as well assume the connection failed...');
timeout = setTimeout(() => {
console.orange('Error incoming in 3... 2... 1...');
}, 13000);
}, 10000);
}, 5000);
// Attempt to connect to the database
try {
console.orange('Warming up the engines...');
await connectDb();
clearTimeout(timeout);
} catch (e) {
console.error(e);
silentExit(1);
}
await connectWithTimeout();
console.purple('---------------------');
console.purple('Ban a user account!');

View file

@ -1,36 +1,11 @@
const path = require('path');
require('module-alias')({ base: path.resolve(__dirname, '..', 'api') });
const { registerUser } = require('~/server/services/AuthService');
const { askQuestion, silentExit } = require('./helpers');
const connectDb = require('~/lib/db/connectDb');
const { askQuestion, silentExit, connectWithTimeout } = require('./helpers');
const User = require('~/models/User');
(async () => {
/**
* Connect to the database
* - If it takes a while, we'll warn the user
*/
// Warn the user if this is taking a while
let timeout = setTimeout(() => {
console.orange(
'This is taking a while... You may need to check your connection if this fails.',
);
timeout = setTimeout(() => {
console.orange('Still going... Might as well assume the connection failed...');
timeout = setTimeout(() => {
console.orange('Error incoming in 3... 2... 1...');
}, 13000);
}, 10000);
}, 5000);
// Attempt to connect to the database
try {
console.orange('Warming up the engines...');
await connectDb();
clearTimeout(timeout);
} catch (e) {
console.error(e);
silentExit(1);
}
await connectWithTimeout();
/**
* Show the welcome / help menu

48
config/delete-user.js Normal file
View file

@ -0,0 +1,48 @@
const path = require('path');
require('module-alias')({ base: path.resolve(__dirname, '..', 'api') });
const { connectWithTimeout, askQuestion, silentExit } = require('./helpers');
const User = require('~/models/User');
(async () => {
await connectWithTimeout();
/**
* Show the welcome / help menu
*/
console.purple('---------------');
console.purple('Deleting a user');
console.purple('---------------');
let email = '';
if (process.argv.length >= 3) {
email = process.argv[2];
} else {
email = await askQuestion('Email:');
}
let user = await User.findOne({ email: email });
if (user !== null) {
if ((await askQuestion(`Delete user ${user}?`)) === 'y') {
user = await User.findOneAndDelete({ _id: user._id });
if (user !== null) {
console.yellow(`Deleted user ${user}`);
} else {
console.yellow(`Couldn't delete user with email ${email}`);
}
}
} else {
console.yellow(`Didn't find user with email ${email}`);
}
silentExit(0);
})();
process.on('uncaughtException', (err) => {
if (!err.message.includes('fetch failed')) {
console.error('There was an uncaught error:');
console.error(err);
}
if (!err.message.includes('fetch failed')) {
process.exit(1);
}
});

View file

@ -6,6 +6,7 @@ const fs = require('fs');
const path = require('path');
const readline = require('readline');
const { execSync } = require('child_process');
const { connectDb } = require('@librechat/backend/lib/db');
const askQuestion = (query) => {
const rl = readline.createInterface({
@ -43,6 +44,33 @@ const silentExit = (code = 0) => {
process.exit(code);
};
async function connectWithTimeout() {
/**
* Connect to the database
* - If it takes a while, we'll warn the user
*/
let timeout = setTimeout(() => {
console.orange(
'This is taking a while... You may need to check your connection if this fails.',
);
timeout = setTimeout(() => {
console.orange('Still going... Might as well assume the connection failed...');
timeout = setTimeout(() => {
console.orange('Error incoming in 3... 2... 1...');
}, 13000);
}, 10000);
}, 5000);
// Attempt to connect to the database
try {
console.orange('Warming up the engines...');
await connectDb();
clearTimeout(timeout);
} catch (e) {
console.error(e);
silentExit(1);
}
}
// Set the console colours
console.orange = (msg) => console.log('\x1b[33m%s\x1b[0m', msg);
console.green = (msg) => console.log('\x1b[32m%s\x1b[0m', msg);
@ -58,5 +86,6 @@ module.exports = {
askQuestion,
silentExit,
isDockerRunning,
connectWithTimeout,
deleteNodeModules,
};

39
config/list-balances.js Normal file
View file

@ -0,0 +1,39 @@
const path = require('path');
require('module-alias')({ base: path.resolve(__dirname, '..', 'api') });
const { connectWithTimeout, silentExit } = require('./helpers');
const Balance = require('~/models/Balance');
const User = require('~/models/User');
(async () => {
await connectWithTimeout();
/**
* Show the welcome / help menu
*/
console.purple('-----------------------------');
console.purple('Show the balance of all users');
console.purple('-----------------------------');
let users = await User.find({});
for (const user of users) {
let balance = await Balance.findOne({ user: user._id });
if (balance !== null) {
console.green(`User ${user.name} has a balance of ${balance.tokenCredits}`);
} else {
console.yellow(`User ${user.name} has no balance`);
}
}
silentExit(0);
})();
process.on('uncaughtException', (err) => {
if (!err.message.includes('fetch failed')) {
console.error('There was an uncaught error:');
console.error(err);
}
if (!err.message.includes('fetch failed')) {
process.exit(1);
}
});