fiora/packages/bin/scripts/deleteUser.ts
碎碎酱 dbd315ffc8
Optimization for manage new users (#448)
* Support delete user by username

* Increase auto seal duration

* Support seal offline user

* Update deleteUser.ts
2021-09-24 11:45:56 +08:00

118 lines
4.0 KiB
TypeScript

/* eslint-disable no-console */
import chalk from 'chalk';
import inquirer from 'inquirer';
import User from '@fiora/database/mongoose/models/user';
import Message from '@fiora/database/mongoose/models/message';
import Group, { GroupDocument } from '@fiora/database/mongoose/models/group';
import Friend from '@fiora/database/mongoose/models/friend';
import History from '@fiora/database/mongoose/models/history';
import initMongoDB, { mongoose } from '@fiora/database/mongoose/initMongoDB';
export async function deleteUser(userIdOrName: string, confirm = true) {
if (!userIdOrName) {
console.log(chalk.red('Wrong command, [userIdOrName] is missing.'));
return;
}
await initMongoDB();
try {
const user = await User.findOne(
mongoose.isValidObjectId(userIdOrName)
? { _id: userIdOrName }
: { username: userIdOrName },
);
if (user) {
console.log(
'Found user:',
chalk.blue(user._id.toString()),
chalk.green(user.username),
);
if (confirm) {
const shouldDeleteUser = await inquirer.prompt({
type: 'confirm',
name: 'result',
message: 'Confirm to delete user?',
});
if (!shouldDeleteUser.result) {
return;
}
}
const messages = await Message.find({ from: user._id });
const deleteHistoryResult = await History.deleteMany({
message: {
$in: messages.map((message) => message.id),
},
});
console.log('Delete history result:', deleteHistoryResult);
console.log(chalk.yellow('Delete messages created by this user'));
const deleteMessageResult = await Message.deleteMany({
from: user._id,
});
console.log('Delete result:', deleteMessageResult);
console.log(
chalk.yellow('Leave the group that the user has joined'),
);
const groups = await Group.find({
members: user._id,
});
// eslint-disable-next-line no-inner-declarations
async function leaveGroup(group: GroupDocument) {
if (!user) {
return;
}
console.log('Leave', group.name);
const index = group.members.indexOf(user?._id);
group.members.splice(index, 1);
if (group.creator?.toString() === user?._id.toString()) {
// @ts-ignore
group.creator = null;
}
await group.save();
}
await Promise.all(groups.map(leaveGroup));
console.log(
chalk.yellow(
'Delete the friend relationship related to this user',
),
);
const deleteFriendResult1 = await Friend.deleteMany({
from: user._id,
});
const deleteFriendResult2 = await Friend.deleteMany({
to: user._id,
});
console.log(
'Delete result:',
deleteFriendResult1,
deleteFriendResult2,
);
console.log(chalk.yellow('Delete this user'));
const deleteUserResult = await User.deleteMany({
_id: user._id,
});
console.log('Delete result:', deleteUserResult);
console.log(chalk.green('Successfully deleted user'));
} else {
console.log(chalk.red(`User [${userIdOrName}] does not exist`));
}
} catch (err) {
console.log(chalk.red('Failed to delete user!', err.message));
}
}
async function run() {
const userIdOrName = process.argv[3];
await deleteUser(userIdOrName);
process.exit(0);
}
export default run;