81 lines
2.1 KiB
TypeScript
81 lines
2.1 KiB
TypeScript
/**
|
|
* Register
|
|
*/
|
|
|
|
import bcrypt from 'bcryptjs';
|
|
import chalk from 'chalk';
|
|
|
|
import initMongoDB from '@fiora/database/mongoose/initMongoDB';
|
|
import User, { UserDocument } from '../../database/mongoose/models/user';
|
|
import Group from '../../database/mongoose/models/group';
|
|
|
|
import { SALT_ROUNDS } from '../../utils/const';
|
|
import getRandomAvatar from '../../utils/getRandomAvatar';
|
|
|
|
export async function register(username: string, password: string) {
|
|
if (!username) {
|
|
console.log(chalk.red('Wrong command, [username] is missing.'));
|
|
return;
|
|
}
|
|
if (!password) {
|
|
console.log(chalk.red('Wrong command, [password] is missing.'));
|
|
return;
|
|
}
|
|
|
|
await initMongoDB();
|
|
|
|
const user = await User.findOne({ username });
|
|
if (user) {
|
|
console.log(chalk.red('The username already exists'));
|
|
return;
|
|
}
|
|
|
|
const defaultGroup = await Group.findOne({ isDefault: true });
|
|
if (!defaultGroup) {
|
|
console.log(chalk.red('Default group does not exist'));
|
|
return;
|
|
}
|
|
|
|
const salt = await bcrypt.genSalt(SALT_ROUNDS);
|
|
const hash = await bcrypt.hash(password, salt);
|
|
|
|
let newUser = null;
|
|
try {
|
|
newUser = await User.create({
|
|
username,
|
|
salt,
|
|
password: hash,
|
|
avatar: getRandomAvatar(),
|
|
} as UserDocument);
|
|
} catch (createError) {
|
|
if (createError.name === 'ValidationError') {
|
|
console.log(
|
|
chalk.red(
|
|
'Username contains unsupported characters or the length exceeds the limit',
|
|
),
|
|
);
|
|
return;
|
|
}
|
|
console.log(chalk.red('Error:'), createError);
|
|
return;
|
|
}
|
|
|
|
if (!defaultGroup.creator) {
|
|
defaultGroup.creator = newUser._id;
|
|
}
|
|
if (newUser) {
|
|
defaultGroup.members.push(newUser._id);
|
|
}
|
|
await defaultGroup.save();
|
|
|
|
console.log(chalk.green(`Successfully created user [${username}]`));
|
|
}
|
|
|
|
async function run() {
|
|
const username = process.argv[3];
|
|
const password = process.argv[4];
|
|
await register(username, password);
|
|
process.exit(0);
|
|
}
|
|
export default run;
|