From 3fb2b38c92983c6fdea70dc840053fbe7fc2c1bf Mon Sep 17 00:00:00 2001 From: Hazelnoot Date: Sun, 14 Sep 2025 09:52:47 -0400 Subject: [PATCH] process account migrations on the relationship queue --- packages/backend/src/core/AccountMoveService.ts | 3 +-- packages/backend/src/core/QueueService.ts | 8 +++++++- .../core/activitypub/models/ApPersonService.ts | 2 +- .../backend/src/queue/QueueProcessorService.ts | 1 + .../processors/RelationshipProcessorService.ts | 16 +++++++++++++++- 5 files changed, 25 insertions(+), 5 deletions(-) diff --git a/packages/backend/src/core/AccountMoveService.ts b/packages/backend/src/core/AccountMoveService.ts index 122045ef6c..74236157ac 100644 --- a/packages/backend/src/core/AccountMoveService.ts +++ b/packages/backend/src/core/AccountMoveService.ts @@ -128,8 +128,7 @@ export class AccountMoveService { to: { id: followeeId }, })), process.env.NODE_ENV === 'test' ? 10000 : 1000 * 60 * 60 * 24); - // TODO add this to relationship queue - await this.postMoveProcess(src, dst); + await this.queueService.createMoveJob(src, dst); return iObj; } diff --git a/packages/backend/src/core/QueueService.ts b/packages/backend/src/core/QueueService.ts index 5020614676..e8183f2c13 100644 --- a/packages/backend/src/core/QueueService.ts +++ b/packages/backend/src/core/QueueService.ts @@ -706,7 +706,13 @@ export class QueueService implements OnModuleInit { } @bindThis - private generateRelationshipJobData(name: 'follow' | 'unfollow' | 'block' | 'unblock', data: RelationshipJobData, opts: Bull.JobsOptions = {}): { + public createMoveJob(from: ThinUser, to: ThinUser) { + const job = this.generateRelationshipJobData('move', { from, to }); + return this.relationshipQueue.add(job.name, job.data, job.opts); + } + + @bindThis + private generateRelationshipJobData(name: 'follow' | 'unfollow' | 'block' | 'unblock' | 'move', data: RelationshipJobData, opts: Bull.JobsOptions = {}): { name: string, data: RelationshipJobData, opts: Bull.JobsOptions, diff --git a/packages/backend/src/core/activitypub/models/ApPersonService.ts b/packages/backend/src/core/activitypub/models/ApPersonService.ts index 25cd0ce8c0..793da186f2 100644 --- a/packages/backend/src/core/activitypub/models/ApPersonService.ts +++ b/packages/backend/src/core/activitypub/models/ApPersonService.ts @@ -988,7 +988,7 @@ export class ApPersonService implements OnModuleInit { return 'skip: alsoKnownAs does not include from.uri'; } - await this.accountMoveService.postMoveProcess(src, dst); + await this.queueService.createMoveJob(src, dst); return 'ok'; } diff --git a/packages/backend/src/queue/QueueProcessorService.ts b/packages/backend/src/queue/QueueProcessorService.ts index 35dc812652..a84705c019 100644 --- a/packages/backend/src/queue/QueueProcessorService.ts +++ b/packages/backend/src/queue/QueueProcessorService.ts @@ -423,6 +423,7 @@ export class QueueProcessorService implements OnApplicationShutdown { case 'unfollow': return this.relationshipProcessorService.processUnfollow(job); case 'block': return this.relationshipProcessorService.processBlock(job); case 'unblock': return this.relationshipProcessorService.processUnblock(job); + case 'move': return this.relationshipProcessorService.processMove(job); default: throw new Error(`unrecognized job type ${job.name} for relationship`); } }; diff --git a/packages/backend/src/queue/processors/RelationshipProcessorService.ts b/packages/backend/src/queue/processors/RelationshipProcessorService.ts index 408b02fb38..3964fa7952 100644 --- a/packages/backend/src/queue/processors/RelationshipProcessorService.ts +++ b/packages/backend/src/queue/processors/RelationshipProcessorService.ts @@ -7,6 +7,8 @@ import { Inject, Injectable } from '@nestjs/common'; import { UserFollowingService } from '@/core/UserFollowingService.js'; import { UserBlockingService } from '@/core/UserBlockingService.js'; +import { CacheService } from '@/core/CacheService.js'; +import { AccountMoveService } from '@/core/AccountMoveService.js'; import { bindThis } from '@/decorators.js'; import type Logger from '@/logger.js'; @@ -28,8 +30,10 @@ export class RelationshipProcessorService { private queueLoggerService: QueueLoggerService, private userFollowingService: UserFollowingService, private userBlockingService: UserBlockingService, + private readonly cacheService: CacheService, + private readonly accountMoveService: AccountMoveService, ) { - this.logger = this.queueLoggerService.logger.createSubLogger('follow-block'); + this.logger = this.queueLoggerService.logger.createSubLogger('relationship'); } @bindThis @@ -75,4 +79,14 @@ export class RelationshipProcessorService { await this.userBlockingService.unblock(blockee, blocker); return 'ok'; } + + public async processMove(job: Bull.Job): Promise { + this.logger.info(`${job.data.from.id} is trying to migrate to ${job.data.to.id}`); + const [src, dst] = await Promise.all([ + this.cacheService.findUserById(job.data.from.id), + this.cacheService.findUserById(job.data.to.id), + ]); + await this.accountMoveService.postMoveProcess(src, dst); + return 'ok'; + } }