diff --git a/locales/index.d.ts b/locales/index.d.ts index bf49869bf8..cec098e770 100644 --- a/locales/index.d.ts +++ b/locales/index.d.ts @@ -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. * diff --git a/packages/backend/src/core/AccountMoveService.ts b/packages/backend/src/core/AccountMoveService.ts index 24d11f29ff..0eb8a76bff 100644 --- a/packages/backend/src/core/AccountMoveService.ts +++ b/packages/backend/src/core/AccountMoveService.ts @@ -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 { + // 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 diff --git a/sharkey-locales/en-US.yml b/sharkey-locales/en-US.yml index 6e49b0ba37..157ab4db92 100644 --- a/sharkey-locales/en-US.yml +++ b/sharkey-locales/en-US.yml @@ -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: