handle scheduled notes when migrating account - fixes #931

I'm not sure we want the "change ownership of notes if dst is local",
though
This commit is contained in:
dakkar 2025-02-24 13:07:23 +00:00
parent acf1b661a2
commit 687cb5b168
3 changed files with 33 additions and 2 deletions

1
locales/index.d.ts vendored
View file

@ -5904,6 +5904,7 @@ export interface Locale extends ILocale {
*  Followers from this account will automatically be migrated to the new account
*  This account will unfollow all users it is currently following
*  You will be unable to create new notes etc. on this account
*  Scheduled notes will be migrated to the new account if it's on this same instance
*
* While migration of followers is automatic, you must manually prepare some steps to migrate the list of users you are following. To do so, carry out a follows export that you will later import on the new account in the settings menu. The same procedure applies to your lists as well as your muted and blocked users.
*

View file

@ -9,7 +9,7 @@ import { IsNull, In, MoreThan, Not } from 'typeorm';
import { bindThis } from '@/decorators.js';
import { DI } from '@/di-symbols.js';
import type { MiLocalUser, MiRemoteUser, MiUser } from '@/models/User.js';
import type { BlockingsRepository, FollowingsRepository, InstancesRepository, MiMeta, MutingsRepository, UserListMembershipsRepository, UsersRepository } from '@/models/_.js';
import type { BlockingsRepository, FollowingsRepository, InstancesRepository, MiMeta, MutingsRepository, UserListMembershipsRepository, UsersRepository, NoteScheduleRepository, MiNoteSchedule } from '@/models/_.js';
import type { RelationshipJobData, ThinUser } from '@/queue/types.js';
import { IdService } from '@/core/IdService.js';
@ -49,6 +49,9 @@ export class AccountMoveService {
@Inject(DI.instancesRepository)
private instancesRepository: InstancesRepository,
@Inject(DI.noteScheduleRepository)
private noteScheduleRepository: NoteScheduleRepository,
private userEntityService: UserEntityService,
private idService: IdService,
private apPersonService: ApPersonService,
@ -119,6 +122,7 @@ export class AccountMoveService {
await Promise.all([
this.copyBlocking(src, dst),
this.copyMutings(src, dst),
this.updateScheduledNotes(src, dst),
this.updateLists(src, dst),
]);
} catch {
@ -201,6 +205,32 @@ export class AccountMoveService {
await this.mutingsRepository.insert(arrayToInsert);
}
@bindThis
public async updateScheduledNotes(src: ThinUser, dst: MiUser): Promise<void> {
// we're moving to a different local user: change scheduled notes' ownership
if (dst.host === null) {
await this.noteScheduleRepository.update(
{ userId: src.id },
{ userId: dst.id },
);
return;
}
// we're moving to a remote user: delete scheduled notes
const scheduledNotes = await this.noteScheduleRepository.findBy({
userId: src.id,
}) as MiNoteSchedule[];
for (const note of scheduledNotes) {
await this.queueService.ScheduleNotePostQueue.remove(`schedNote:${note.id}`);
}
await this.noteScheduleRepository.delete({
userId: src.id,
});
}
/**
* Update lists while moving accounts.
* - No removal of the old account from the lists

View file

@ -206,7 +206,7 @@ _serverSettings:
inquiryUrl: "Contact URL"
inquiryUrlDescription: "Specify the URL of a web page that contains a contact form or the instance operators' contact information."
_accountMigration:
moveAccountDescription: "This will migrate your account to a different one.\n ・Followers from this account will automatically be migrated to the new account\n ・This account will unfollow all users it is currently following\n ・You will be unable to create new notes etc. on this account\n\nWhile migration of followers is automatic, you must manually prepare some steps to migrate the list of users you are following. To do so, carry out a follows export that you will later import on the new account in the settings menu. The same procedure applies to your lists as well as your muted and blocked users.\n\n(This explanation applies to Sharkey v13.12.0 and later. Other ActivityPub software, such as Mastodon, might function differently.)"
moveAccountDescription: "This will migrate your account to a different one.\n ・Followers from this account will automatically be migrated to the new account\n ・This account will unfollow all users it is currently following\n ・You will be unable to create new notes etc. on this account\n ・Scheduled notes will be migrated to the new account if it's on this same instance\n\nWhile migration of followers is automatic, you must manually prepare some steps to migrate the list of users you are following. To do so, carry out a follows export that you will later import on the new account in the settings menu. The same procedure applies to your lists as well as your muted and blocked users.\n\n(This explanation applies to Sharkey v13.12.0 and later. Other ActivityPub software, such as Mastodon, might function differently.)"
_achievements:
_types:
_notes1: