fix more freeze / unfreeze errors caused by TypeORM bugs

This commit is contained in:
Hazelnoot 2025-07-23 16:10:14 -04:00 committed by dakkar
parent 73f2ee4fb3
commit ea9335bcc8

View file

@ -4,7 +4,7 @@
*/ */
import { Inject, Injectable } from '@nestjs/common'; 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 type { FollowingsRepository, FollowRequestsRepository, UsersRepository } from '@/models/_.js';
import { MiUser } from '@/models/User.js'; import { MiUser } from '@/models/User.js';
import { QueueService } from '@/core/QueueService.js'; import { QueueService } from '@/core/QueueService.js';
@ -37,6 +37,9 @@ export class UserSuspendService {
@Inject(DI.followRequestsRepository) @Inject(DI.followRequestsRepository)
private followRequestsRepository: FollowRequestsRepository, private followRequestsRepository: FollowRequestsRepository,
@Inject(DI.db)
private db: DataSource,
private userEntityService: UserEntityService, private userEntityService: UserEntityService,
private queueService: QueueService, private queueService: QueueService,
private globalEventService: GlobalEventService, private globalEventService: GlobalEventService,
@ -184,26 +187,29 @@ export class UserSuspendService {
// Freeze follow relations with all remote users // Freeze follow relations with all remote users
await this.followingsRepository await this.followingsRepository
.createQueryBuilder('following') .createQueryBuilder('following')
.andWhere('following."followeeId" = :id', { id: user.id })
.andWhere('following."followerHost" IS NOT NULL')
.update({ .update({
isFollowerHibernated: true, isFollowerHibernated: true,
}) })
.where({
followeeId: user.id,
followerHost: Not(IsNull()),
})
.execute(); .execute();
} }
@bindThis @bindThis
private async unFreezeAll(user: MiUser): Promise<void> { private async unFreezeAll(user: MiUser): Promise<void> {
// Restore follow relations with all remote users // Restore follow relations with all remote users
await this.followingsRepository
.createQueryBuilder('following') // TypeORM does not support UPDATE with JOIN: https://github.com/typeorm/typeorm/issues/564#issuecomment-310331468
.innerJoin(MiUser, 'follower', 'user.id = following.followerId') await this.db.query(`
.andWhere('follower.isHibernated = false') // Don't unfreeze if the follower is *actually* frozen UPDATE "following"
.andWhere('following."followeeId" = :id', { id: user.id }) SET "isFollowerHibernated" = false
.andWhere('following."followerHost" IS NOT NULL') FROM "user"
.update({ WHERE "user"."id" = "following"."followerId"
isFollowerHibernated: false, AND "user"."isHibernated" = false -- Don't unfreeze if the follower is *actually* frozen
}) AND "followeeId" = $1
.execute(); AND "followeeHost" IS NOT NULL
`, [user.id]);
} }
} }