summaryrefslogtreecommitdiff
path: root/packages/backend/src/core/DeleteAccountService.ts
diff options
context:
space:
mode:
authordakkar <dakkar@thenautilus.net>2024-08-30 12:08:31 +0100
committerdakkar <dakkar@thenautilus.net>2024-08-30 12:08:31 +0100
commit6151099f5ba07d14a651aea8f816dd280d74209d (patch)
tree4b014a2f4b198facc8bdd92c70b49fec2801d51a /packages/backend/src/core/DeleteAccountService.ts
parentmerge: thunk the min/max promises (!603) (diff)
parentMerge pull request #14391 from misskey-dev/develop (diff)
downloadsharkey-6151099f5ba07d14a651aea8f816dd280d74209d.tar.gz
sharkey-6151099f5ba07d14a651aea8f816dd280d74209d.tar.bz2
sharkey-6151099f5ba07d14a651aea8f816dd280d74209d.zip
Merge remote-tracking branch 'misskey/master' into feature/misskey-2024.8
Diffstat (limited to 'packages/backend/src/core/DeleteAccountService.ts')
-rw-r--r--packages/backend/src/core/DeleteAccountService.ts60
1 files changed, 52 insertions, 8 deletions
diff --git a/packages/backend/src/core/DeleteAccountService.ts b/packages/backend/src/core/DeleteAccountService.ts
index 79b614edba..7f1b8f3efb 100644
--- a/packages/backend/src/core/DeleteAccountService.ts
+++ b/packages/backend/src/core/DeleteAccountService.ts
@@ -4,12 +4,15 @@
*/
import { Inject, Injectable } from '@nestjs/common';
-import type { UsersRepository } from '@/models/_.js';
+import { Not, IsNull } from 'typeorm';
+import type { FollowingsRepository, MiUser, UsersRepository } from '@/models/_.js';
import { QueueService } from '@/core/QueueService.js';
-import { UserSuspendService } from '@/core/UserSuspendService.js';
import { DI } from '@/di-symbols.js';
import { bindThis } from '@/decorators.js';
import { GlobalEventService } from '@/core/GlobalEventService.js';
+import { UserEntityService } from '@/core/entities/UserEntityService.js';
+import { ApRendererService } from '@/core/activitypub/ApRendererService.js';
+import { ModerationLogService } from '@/core/ModerationLogService.js';
@Injectable()
export class DeleteAccountService {
@@ -17,9 +20,14 @@ export class DeleteAccountService {
@Inject(DI.usersRepository)
private usersRepository: UsersRepository,
- private userSuspendService: UserSuspendService,
+ @Inject(DI.followingsRepository)
+ private followingsRepository: FollowingsRepository,
+
+ private userEntityService: UserEntityService,
+ private apRendererService: ApRendererService,
private queueService: QueueService,
private globalEventService: GlobalEventService,
+ private moderationLogService: ModerationLogService,
) {
}
@@ -27,16 +35,52 @@ export class DeleteAccountService {
public async deleteAccount(user: {
id: string;
host: string | null;
- }): Promise<void> {
+ }, moderator?: MiUser): Promise<void> {
const _user = await this.usersRepository.findOneByOrFail({ id: user.id });
if (_user.isRoot) throw new Error('cannot delete a root account');
+ if (moderator != null) {
+ this.moderationLogService.log(moderator, 'deleteAccount', {
+ userId: user.id,
+ userUsername: _user.username,
+ userHost: user.host,
+ });
+ }
+
// 物理削除する前にDelete activityを送信する
- await this.userSuspendService.doPostSuspend(user).catch(e => {});
+ if (this.userEntityService.isLocalUser(user)) {
+ // 知り得る全SharedInboxにDelete配信
+ const content = this.apRendererService.addContext(this.apRendererService.renderDelete(this.userEntityService.genLocalUserUri(user.id), user));
- this.queueService.createDeleteAccountJob(user, {
- soft: false,
- });
+ const queue: string[] = [];
+
+ const followings = await this.followingsRepository.find({
+ where: [
+ { followerSharedInbox: Not(IsNull()) },
+ { followeeSharedInbox: Not(IsNull()) },
+ ],
+ select: ['followerSharedInbox', 'followeeSharedInbox'],
+ });
+
+ const inboxes = followings.map(x => x.followerSharedInbox ?? x.followeeSharedInbox);
+
+ for (const inbox of inboxes) {
+ if (inbox != null && !queue.includes(inbox)) queue.push(inbox);
+ }
+
+ for (const inbox of queue) {
+ this.queueService.deliver(user, content, inbox, true);
+ }
+
+ this.queueService.createDeleteAccountJob(user, {
+ soft: false,
+ });
+ } else {
+ // リモートユーザーの削除は、完全にDBから物理削除してしまうと再度連合してきてアカウントが復活する可能性があるため、soft指定する
+ this.queueService.createDeleteAccountJob(user, {
+ soft: true,
+ });
+ }
await this.usersRepository.update(user.id, {
isDeleted: true,