merge: Fix Postgres / TypeORM errors *FOR STABLE* (!1192)

View MR for information: https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/1192

Approved-by: Hazelnoot <acomputerdog@gmail.com>
This commit is contained in:
Hazelnoot 2025-07-27 18:02:25 +00:00
commit 2f67882f82

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';
@ -21,6 +21,7 @@ import { LoggerService } from '@/core/LoggerService.js';
import type Logger from '@/logger.js'; import type Logger from '@/logger.js';
import { renderInlineError } from '@/misc/render-inline-error.js'; import { renderInlineError } from '@/misc/render-inline-error.js';
import { trackPromise } from '@/misc/promise-tracker.js'; import { trackPromise } from '@/misc/promise-tracker.js';
import { InternalEventService } from '@/core/InternalEventService.js';
@Injectable() @Injectable()
export class UserSuspendService { export class UserSuspendService {
@ -36,12 +37,16 @@ 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,
private apRendererService: ApRendererService, private apRendererService: ApRendererService,
private moderationLogService: ModerationLogService, private moderationLogService: ModerationLogService,
private readonly cacheService: CacheService, private readonly cacheService: CacheService,
private readonly internalEventService: InternalEventService,
loggerService: LoggerService, loggerService: LoggerService,
) { ) {
@ -56,6 +61,8 @@ export class UserSuspendService {
isSuspended: true, isSuspended: true,
}); });
await this.internalEventService.emit(user.host == null ? 'localUserUpdated' : 'remoteUserUpdated', { id: user.id });
await this.moderationLogService.log(moderator, 'suspend', { await this.moderationLogService.log(moderator, 'suspend', {
userId: user.id, userId: user.id,
userUsername: user.username, userUsername: user.username,
@ -74,6 +81,8 @@ export class UserSuspendService {
isSuspended: false, isSuspended: false,
}); });
await this.internalEventService.emit(user.host == null ? 'localUserUpdated' : 'remoteUserUpdated', { id: user.id });
await this.moderationLogService.log(moderator, 'unsuspend', { await this.moderationLogService.log(moderator, 'unsuspend', {
userId: user.id, userId: user.id,
userUsername: user.username, userUsername: user.username,
@ -178,30 +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')
.orWhere({
followeeId: user.id,
followerHost: Not(IsNull()),
})
.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({ SET "isFollowerHibernated" = false
followeeId: user.id, FROM "user"
followerHost: Not(IsNull()), WHERE "user"."id" = "following"."followerId"
}) AND "user"."isHibernated" = false -- Don't unfreeze if the follower is *actually* frozen
.update({ AND "followeeId" = $1
isFollowerHibernated: false, AND "followeeHost" IS NOT NULL
}) `, [user.id]);
.execute();
} }
} }