import define from "../../define.js"; import deleteFollowing from "../../../../services/following/delete.js"; import { Users, Followings, Notifications } from "../../../../models/index.js"; import { insertModerationLog } from "../../../../services/insert-moderation-log.js"; import { doPostSuspend } from "../../../../services/suspend-user.js"; import { publishUserEvent } from "../../../../services/stream.js"; export const meta = { tags: [ "admin" ], requireCredential: true, requireModerator: true }; export const paramDef = { type: "object", properties: { userId: { type: "string", format: "misskey:id" } }, required: [ "userId" ] }; export default define(meta, paramDef, async (ps, me)=>{ const user = await Users.findOneBy({ id: ps.userId }); if (user == null) { throw new Error("user not found"); } if (user.isAdmin) { throw new Error("cannot suspend admin"); } if (user.isModerator) { throw new Error("cannot suspend moderator"); } await Users.update(user.id, { isSuspended: true }); insertModerationLog(me, "suspend", { targetId: user.id }); // Terminate streaming if (Users.isLocalUser(user)) { publishUserEvent(user.id, "terminate", {}); } (async ()=>{ await doPostSuspend(user).catch((e)=>{}); await unFollowAll(user).catch((e)=>{}); await readAllNotify(user).catch((e)=>{}); })(); }); async function unFollowAll(follower) { const followings = await Followings.findBy({ followerId: follower.id }); for (const following of followings){ const followee = await Users.findOneBy({ id: following.followeeId }); if (followee == null) { throw new Error(`Cant find followee ${following.followeeId}`); } await deleteFollowing(follower, followee, true); } } async function readAllNotify(notifier) { await Notifications.update({ notifierId: notifier.id, isRead: false }, { isRead: true }); }