summaryrefslogtreecommitdiff
path: root/packages/backend/src/core/AntennaService.ts
diff options
context:
space:
mode:
authoranatawa12 <anatawa12@icloud.com>2025-04-16 09:49:27 +0900
committerGitHub <noreply@github.com>2025-04-16 09:49:27 +0900
commit4bd23c4c8c9a250276551738e18918e41f375014 (patch)
tree4ebe4fc8f7d206e0ed278dada9850ebb1e6bd161 /packages/backend/src/core/AntennaService.ts
parentMerge branch 'develop' of https://github.com/misskey-dev/misskey into develop (diff)
downloadmisskey-4bd23c4c8c9a250276551738e18918e41f375014.tar.gz
misskey-4bd23c4c8c9a250276551738e18918e41f375014.tar.bz2
misskey-4bd23c4c8c9a250276551738e18918e41f375014.zip
feat: migrate antenna on account move (#15843)
* feat: migrate antenna on account move * docs(changelog): アカウントの移行時にアンテナのフィルターのユーザが更新されない問題を修正 * refactor: move to AntennaService
Diffstat (limited to 'packages/backend/src/core/AntennaService.ts')
-rw-r--r--packages/backend/src/core/AntennaService.ts36
1 files changed, 36 insertions, 0 deletions
diff --git a/packages/backend/src/core/AntennaService.ts b/packages/backend/src/core/AntennaService.ts
index 7db3e69155..ec79675b06 100644
--- a/packages/backend/src/core/AntennaService.ts
+++ b/packages/backend/src/core/AntennaService.ts
@@ -5,6 +5,7 @@
import { Inject, Injectable } from '@nestjs/common';
import * as Redis from 'ioredis';
+import { In } from 'typeorm';
import { FanoutTimelineService } from '@/core/FanoutTimelineService.js';
import type { GlobalEvents } from '@/core/GlobalEventService.js';
import { GlobalEventService } from '@/core/GlobalEventService.js';
@@ -220,6 +221,41 @@ export class AntennaService implements OnApplicationShutdown {
}
@bindThis
+ public async onMoveAccount(src: MiUser, dst: MiUser): Promise<void> {
+ // There is a possibility for users to add the srcUser to their antennas, but it's low, so we don't check it.
+
+ // Get MiAntenna[] from cache and filter to select antennas with the src user is in the users list
+ const srcUserAcct = this.utilityService.getFullApAccount(src.username, src.host).toLowerCase();
+ const antennasToMigrate = (await this.getAntennas()).filter(antenna => {
+ return antenna.users.some(user => {
+ const { username, host } = Acct.parse(user);
+ return this.utilityService.getFullApAccount(username, host).toLowerCase() === srcUserAcct;
+ });
+ });
+
+ if (antennasToMigrate.length === 0) return;
+
+ const antennaIds = antennasToMigrate.map(x => x.id);
+
+ // Update the antennas by appending dst users acct to the users list
+ const dstUserAcct = '@' + Acct.toString({ username: dst.username, host: dst.host });
+
+ await this.antennasRepository.createQueryBuilder('antenna')
+ .update()
+ .set({
+ users: () => 'array_append(antenna.users, :dstUserAcct)',
+ })
+ .where('antenna.id IN (:...antennaIds)', { antennaIds })
+ .setParameters({ dstUserAcct })
+ .execute();
+
+ // announce update to event
+ for (const newAntenna of await this.antennasRepository.findBy({ id: In(antennaIds) })) {
+ this.globalEventService.publishInternalEvent('antennaUpdated', newAntenna);
+ }
+ }
+
+ @bindThis
public dispose(): void {
this.redisForSub.off('message', this.onRedisMessage);
}