diff options
| author | syuilo <Syuilotan@yahoo.co.jp> | 2021-09-22 17:34:48 +0900 |
|---|---|---|
| committer | syuilo <Syuilotan@yahoo.co.jp> | 2021-09-22 17:34:48 +0900 |
| commit | 9208825975f56bab8aca7ae8d6507f6cfe0f599a (patch) | |
| tree | 2472c0ba06fd4adf6bdb150a1ddb48059b449034 /src/server/api/endpoints | |
| parent | enhance(client): リスト、アンテナタイムラインを個別ページ... (diff) | |
| download | sharkey-9208825975f56bab8aca7ae8d6507f6cfe0f599a.tar.gz sharkey-9208825975f56bab8aca7ae8d6507f6cfe0f599a.tar.bz2 sharkey-9208825975f56bab8aca7ae8d6507f6cfe0f599a.zip | |
feat(server): 管理者用アカウント削除API実装
動作確認済み
Resolve #7735
Diffstat (limited to 'src/server/api/endpoints')
| -rw-r--r-- | src/server/api/endpoints/admin/accounts/delete.ts | 58 | ||||
| -rw-r--r-- | src/server/api/endpoints/i/delete-account.ts | 4 |
2 files changed, 61 insertions, 1 deletions
diff --git a/src/server/api/endpoints/admin/accounts/delete.ts b/src/server/api/endpoints/admin/accounts/delete.ts new file mode 100644 index 0000000000..4e8a559805 --- /dev/null +++ b/src/server/api/endpoints/admin/accounts/delete.ts @@ -0,0 +1,58 @@ +import $ from 'cafy'; +import define from '../../../define'; +import { Users } from '@/models/index'; +import { doPostSuspend } from '@/services/suspend-user'; +import { publishUserEvent } from '@/services/stream'; +import { createDeleteAccountJob } from '@/queue'; +import { ID } from '@/misc/cafy-id'; + +export const meta = { + tags: ['admin'], + + requireCredential: true as const, + requireModerator: true, + + params: { + userId: { + validator: $.type(ID), + }, + } +}; + +export default define(meta, async (ps, me) => { + const user = await Users.findOne(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'); + } + + if (Users.isLocalUser(user)) { + // 物理削除する前にDelete activityを送信する + await doPostSuspend(user).catch(e => {}); + + createDeleteAccountJob(user, { + soft: false + }); + } else { + createDeleteAccountJob(user, { + soft: true // リモートユーザーの削除は、完全にDBから物理削除してしまうと再度連合してきてアカウントが復活する可能性があるため、soft指定する + }); + } + + await Users.update(user.id, { + isDeleted: true, + }); + + if (Users.isLocalUser(user)) { + // Terminate streaming + publishUserEvent(user.id, 'terminate', {}); + } +}); diff --git a/src/server/api/endpoints/i/delete-account.ts b/src/server/api/endpoints/i/delete-account.ts index 77f11925cd..10e5adf64a 100644 --- a/src/server/api/endpoints/i/delete-account.ts +++ b/src/server/api/endpoints/i/delete-account.ts @@ -35,7 +35,9 @@ export default define(meta, async (ps, user) => { // 物理削除する前にDelete activityを送信する await doPostSuspend(user).catch(e => {}); - createDeleteAccountJob(user); + createDeleteAccountJob(user, { + soft: false + }); await Users.update(user.id, { isDeleted: true, |