mirror of
https://github.com/yinxin630/fiora.git
synced 2026-06-04 21:03:18 +08:00
* Support delete user by username * Increase auto seal duration * Support seal offline user * Update deleteUser.ts
118 lines
4.0 KiB
TypeScript
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;
|