diff options
| author | Hazelnoot <acomputerdog@gmail.com> | 2025-07-23 16:10:14 -0400 |
|---|---|---|
| committer | dakkar <dakkar@thenautilus.net> | 2025-07-27 18:01:11 +0100 |
| commit | ea9335bcc8f59b187140f7c9ea876389ac0af9a4 (patch) | |
| tree | a3a1d76df1f185c7cea7e1c8de58707bc943a002 | |
| parent | fix user suspension / unsuspension not updating caches (diff) | |
| download | sharkey-ea9335bcc8f59b187140f7c9ea876389ac0af9a4.tar.gz sharkey-ea9335bcc8f59b187140f7c9ea876389ac0af9a4.tar.bz2 sharkey-ea9335bcc8f59b187140f7c9ea876389ac0af9a4.zip | |
fix more freeze / unfreeze errors caused by TypeORM bugs
| -rw-r--r-- | packages/backend/src/core/UserSuspendService.ts | 32 |
1 files changed, 19 insertions, 13 deletions
diff --git a/packages/backend/src/core/UserSuspendService.ts b/packages/backend/src/core/UserSuspendService.ts index 1b54fb5e8a..5868ba6678 100644 --- a/packages/backend/src/core/UserSuspendService.ts +++ b/packages/backend/src/core/UserSuspendService.ts @@ -4,7 +4,7 @@ */ import { Inject, Injectable } from '@nestjs/common'; -import { Not, IsNull } from 'typeorm'; +import { Not, IsNull, DataSource } from 'typeorm'; import type { FollowingsRepository, FollowRequestsRepository, UsersRepository } from '@/models/_.js'; import { MiUser } from '@/models/User.js'; import { QueueService } from '@/core/QueueService.js'; @@ -37,6 +37,9 @@ export class UserSuspendService { @Inject(DI.followRequestsRepository) private followRequestsRepository: FollowRequestsRepository, + @Inject(DI.db) + private db: DataSource, + private userEntityService: UserEntityService, private queueService: QueueService, private globalEventService: GlobalEventService, @@ -184,26 +187,29 @@ export class UserSuspendService { // Freeze follow relations with all remote users await this.followingsRepository .createQueryBuilder('following') - .andWhere('following."followeeId" = :id', { id: user.id }) - .andWhere('following."followerHost" IS NOT NULL') .update({ isFollowerHibernated: true, }) + .where({ + followeeId: user.id, + followerHost: Not(IsNull()), + }) .execute(); } @bindThis private async unFreezeAll(user: MiUser): Promise<void> { // Restore follow relations with all remote users - await this.followingsRepository - .createQueryBuilder('following') - .innerJoin(MiUser, 'follower', 'user.id = following.followerId') - .andWhere('follower.isHibernated = false') // Don't unfreeze if the follower is *actually* frozen - .andWhere('following."followeeId" = :id', { id: user.id }) - .andWhere('following."followerHost" IS NOT NULL') - .update({ - isFollowerHibernated: false, - }) - .execute(); + + // TypeORM does not support UPDATE with JOIN: https://github.com/typeorm/typeorm/issues/564#issuecomment-310331468 + await this.db.query(` + UPDATE "following" + SET "isFollowerHibernated" = false + FROM "user" + WHERE "user"."id" = "following"."followerId" + AND "user"."isHibernated" = false -- Don't unfreeze if the follower is *actually* frozen + AND "followeeId" = $1 + AND "followeeHost" IS NOT NULL + `, [user.id]); } } |