summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHazelnoot <acomputerdog@gmail.com>2025-07-23 16:10:14 -0400
committerdakkar <dakkar@thenautilus.net>2025-07-27 18:01:11 +0100
commitea9335bcc8f59b187140f7c9ea876389ac0af9a4 (patch)
treea3a1d76df1f185c7cea7e1c8de58707bc943a002
parentfix user suspension / unsuspension not updating caches (diff)
downloadsharkey-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.ts32
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]);
}
}