summaryrefslogtreecommitdiff
path: root/packages/backend/src/core/UserSuspendService.ts
diff options
context:
space:
mode:
authorsyuilo <4439005+syuilo@users.noreply.github.com>2024-08-14 18:08:51 +0900
committersyuilo <4439005+syuilo@users.noreply.github.com>2024-08-14 18:08:51 +0900
commitcd210001e6ffd6232678cbc74f06f8e6d05a1d15 (patch)
tree63e8b72ac4d6d9fc604747871e9d700c1e431ae3 /packages/backend/src/core/UserSuspendService.ts
parentchore: fix some comments (#14394) (diff)
downloadsharkey-cd210001e6ffd6232678cbc74f06f8e6d05a1d15.tar.gz
sharkey-cd210001e6ffd6232678cbc74f06f8e6d05a1d15.tar.bz2
sharkey-cd210001e6ffd6232678cbc74f06f8e6d05a1d15.zip
enhance(backend): 凍結されたアカウントのフォローリクエストを表示しないように
Diffstat (limited to 'packages/backend/src/core/UserSuspendService.ts')
-rw-r--r--packages/backend/src/core/UserSuspendService.ts79
1 files changed, 76 insertions, 3 deletions
diff --git a/packages/backend/src/core/UserSuspendService.ts b/packages/backend/src/core/UserSuspendService.ts
index d594a223f4..7920e58e36 100644
--- a/packages/backend/src/core/UserSuspendService.ts
+++ b/packages/backend/src/core/UserSuspendService.ts
@@ -5,7 +5,7 @@
import { Inject, Injectable } from '@nestjs/common';
import { Not, IsNull } from 'typeorm';
-import type { FollowingsRepository } from '@/models/_.js';
+import type { FollowingsRepository, FollowRequestsRepository, UsersRepository } from '@/models/_.js';
import type { MiUser } from '@/models/User.js';
import { QueueService } from '@/core/QueueService.js';
import { GlobalEventService } from '@/core/GlobalEventService.js';
@@ -13,24 +13,75 @@ import { DI } from '@/di-symbols.js';
import { ApRendererService } from '@/core/activitypub/ApRendererService.js';
import { UserEntityService } from '@/core/entities/UserEntityService.js';
import { bindThis } from '@/decorators.js';
+import { RelationshipJobData } from '@/queue/types.js';
+import { ModerationLogService } from '@/core/ModerationLogService.js';
@Injectable()
export class UserSuspendService {
constructor(
+ @Inject(DI.usersRepository)
+ private usersRepository: UsersRepository,
+
@Inject(DI.followingsRepository)
private followingsRepository: FollowingsRepository,
+ @Inject(DI.followRequestsRepository)
+ private followRequestsRepository: FollowRequestsRepository,
+
private userEntityService: UserEntityService,
private queueService: QueueService,
private globalEventService: GlobalEventService,
private apRendererService: ApRendererService,
+ private moderationLogService: ModerationLogService,
) {
}
@bindThis
- public async doPostSuspend(user: { id: MiUser['id']; host: MiUser['host'] }): Promise<void> {
+ public async suspend(user: MiUser, moderator: MiUser): Promise<void> {
+ await this.usersRepository.update(user.id, {
+ isSuspended: true,
+ });
+
+ this.moderationLogService.log(moderator, 'suspend', {
+ userId: user.id,
+ userUsername: user.username,
+ userHost: user.host,
+ });
+
+ (async () => {
+ await this.postSuspend(user).catch(e => {});
+ await this.unFollowAll(user).catch(e => {});
+ })();
+ }
+
+ @bindThis
+ public async unsuspend(user: MiUser, moderator: MiUser): Promise<void> {
+ await this.usersRepository.update(user.id, {
+ isSuspended: false,
+ });
+
+ this.moderationLogService.log(moderator, 'unsuspend', {
+ userId: user.id,
+ userUsername: user.username,
+ userHost: user.host,
+ });
+
+ (async () => {
+ await this.postUnsuspend(user).catch(e => {});
+ })();
+ }
+
+ @bindThis
+ private async postSuspend(user: { id: MiUser['id']; host: MiUser['host'] }): Promise<void> {
this.globalEventService.publishInternalEvent('userChangeSuspendedState', { id: user.id, isSuspended: true });
+ this.followRequestsRepository.delete({
+ followeeId: user.id,
+ });
+ this.followRequestsRepository.delete({
+ followerId: user.id,
+ });
+
if (this.userEntityService.isLocalUser(user)) {
// 知り得る全SharedInboxにDelete配信
const content = this.apRendererService.addContext(this.apRendererService.renderDelete(this.userEntityService.genLocalUserUri(user.id), user));
@@ -58,7 +109,7 @@ export class UserSuspendService {
}
@bindThis
- public async doPostUnsuspend(user: MiUser): Promise<void> {
+ private async postUnsuspend(user: MiUser): Promise<void> {
this.globalEventService.publishInternalEvent('userChangeSuspendedState', { id: user.id, isSuspended: false });
if (this.userEntityService.isLocalUser(user)) {
@@ -86,4 +137,26 @@ export class UserSuspendService {
}
}
}
+
+ @bindThis
+ private async unFollowAll(follower: MiUser) {
+ const followings = await this.followingsRepository.find({
+ where: {
+ followerId: follower.id,
+ followeeId: Not(IsNull()),
+ },
+ });
+
+ const jobs: RelationshipJobData[] = [];
+ for (const following of followings) {
+ if (following.followeeId && following.followerId) {
+ jobs.push({
+ from: { id: following.followerId },
+ to: { id: following.followeeId },
+ silent: true,
+ });
+ }
+ }
+ this.queueService.createUnfollowJob(jobs);
+ }
}