summaryrefslogtreecommitdiff
path: root/packages/backend
diff options
context:
space:
mode:
authorHazelnoot <acomputerdog@gmail.com>2025-07-27 18:02:25 +0000
committerHazelnoot <acomputerdog@gmail.com>2025-07-27 18:02:25 +0000
commit2f67882f8292e26e77b92728b07e76261d8a1eeb (patch)
tree0a677e82933ddf4cfd8b80795820630b124f64cf /packages/backend
parentmerge: Fix factor scaling in rate limit *FOR STABLE* (!1194) (diff)
parentfix more freeze / unfreeze errors caused by TypeORM bugs (diff)
downloadsharkey-2f67882f8292e26e77b92728b07e76261d8a1eeb.tar.gz
sharkey-2f67882f8292e26e77b92728b07e76261d8a1eeb.tar.bz2
sharkey-2f67882f8292e26e77b92728b07e76261d8a1eeb.zip
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>
Diffstat (limited to 'packages/backend')
-rw-r--r--packages/backend/src/core/UserSuspendService.ts42
1 files changed, 25 insertions, 17 deletions
diff --git a/packages/backend/src/core/UserSuspendService.ts b/packages/backend/src/core/UserSuspendService.ts
index ddadab7022..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';
@@ -21,6 +21,7 @@ import { LoggerService } from '@/core/LoggerService.js';
import type Logger from '@/logger.js';
import { renderInlineError } from '@/misc/render-inline-error.js';
import { trackPromise } from '@/misc/promise-tracker.js';
+import { InternalEventService } from '@/core/InternalEventService.js';
@Injectable()
export class UserSuspendService {
@@ -36,12 +37,16 @@ export class UserSuspendService {
@Inject(DI.followRequestsRepository)
private followRequestsRepository: FollowRequestsRepository,
+ @Inject(DI.db)
+ private db: DataSource,
+
private userEntityService: UserEntityService,
private queueService: QueueService,
private globalEventService: GlobalEventService,
private apRendererService: ApRendererService,
private moderationLogService: ModerationLogService,
private readonly cacheService: CacheService,
+ private readonly internalEventService: InternalEventService,
loggerService: LoggerService,
) {
@@ -56,6 +61,8 @@ export class UserSuspendService {
isSuspended: true,
});
+ await this.internalEventService.emit(user.host == null ? 'localUserUpdated' : 'remoteUserUpdated', { id: user.id });
+
await this.moderationLogService.log(moderator, 'suspend', {
userId: user.id,
userUsername: user.username,
@@ -74,6 +81,8 @@ export class UserSuspendService {
isSuspended: false,
});
+ await this.internalEventService.emit(user.host == null ? 'localUserUpdated' : 'remoteUserUpdated', { id: user.id });
+
await this.moderationLogService.log(moderator, 'unsuspend', {
userId: user.id,
userUsername: user.username,
@@ -178,30 +187,29 @@ export class UserSuspendService {
// Freeze follow relations with all remote users
await this.followingsRepository
.createQueryBuilder('following')
- .orWhere({
- followeeId: user.id,
- followerHost: Not(IsNull()),
- })
.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({
- followeeId: user.id,
- followerHost: Not(IsNull()),
- })
- .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]);
}
}