File size: 4,011 Bytes
3b6afc0 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 |
const connectDb = require('@librechat/backend/lib/db/connectDb');
const migrateDb = require('@librechat/backend/lib/db/migrateDb');
const { registerUser } = require('@librechat/backend/server/services/auth.service');
const { askQuestion, silentExit } = require('./helpers');
const User = require('@librechat/backend/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);
await migrateDb();
} catch (e) {
console.error(e);
silentExit(1);
}
/**
* Show the welcome / help menu
*/
console.purple('--------------------------');
console.purple('Create a new user account!');
console.purple('--------------------------');
// If we don't have enough arguments, show the help menu
if (process.argv.length < 5) {
console.orange('Usage: npm run create-user <email> <name> <username>');
console.orange('Note: if you do not pass in the arguments, you will be prompted for them.');
console.orange(
'If you really need to pass in the password, you can do so as the 4th argument (not recommended for security).',
);
console.purple('--------------------------');
}
/**
* Set up the variables we need and get the arguments if they were passed in
*/
let email = '';
let password = '';
let name = '';
let username = '';
// If we have the right number of arguments, lets use them
if (process.argv.length >= 4) {
email = process.argv[2];
name = process.argv[3];
if (process.argv.length >= 5) {
username = process.argv[4];
}
if (process.argv.length >= 6) {
console.red('Warning: password passed in as argument, this is not secure!');
password = process.argv[5];
}
}
/**
* If we don't have the right number of arguments, lets prompt the user for them
*/
if (!email) {
email = await askQuestion('Email:');
}
// Validate the email
if (!email.includes('@')) {
console.red('Error: Invalid email address!');
silentExit(1);
}
const defaultName = email.split('@')[0];
if (!name) {
name = await askQuestion('Name: (default is: ' + defaultName + ')');
if (!name) {
name = defaultName;
}
}
if (!username) {
username = await askQuestion('Username: (default is: ' + defaultName + ')');
if (!username) {
username = defaultName;
}
}
if (!password) {
password = await askQuestion('Password: (leave blank, to generate one)');
if (!password) {
// Make it a random password, length 18
password = Math.random().toString(36).slice(-18);
console.orange('Your password is: ' + password);
}
}
// Validate the user doesn't already exist
const userExists = await User.findOne({ $or: [{ email }, { username }] });
if (userExists) {
console.red('Error: A user with that email or username already exists!');
silentExit(1);
}
/**
* Now that we have all the variables we need, lets create the user
*/
const user = { email, password, name, username, confirm_password: password };
let result;
try {
result = await registerUser(user);
} catch (error) {
console.red('Error: ' + error.message);
silentExit(1);
}
// Check the result
if (result.status !== 200) {
console.red('Error: ' + result.message);
silentExit(1);
}
// Done!
console.green('User created successfully!');
silentExit(0);
})();
|