Skip to content
This repository has been archived by the owner on Dec 21, 2023. It is now read-only.

Commit

Permalink
Fix account merging in maintenance script (mastodon#15264)
Browse files Browse the repository at this point in the history
Also include AccountNote and AccountDeletionRequest to the list of classes
needing to be reassigned the merged account.
  • Loading branch information
ClearlyClaire authored Dec 4, 2020
1 parent d849aad commit fbe7519
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 3 deletions.
7 changes: 5 additions & 2 deletions app/models/concerns/account_merging.rb
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ def merge_with!(other_account)
Status, StatusPin, MediaAttachment, Poll, Report, Tombstone, Favourite,
Follow, FollowRequest, Block, Mute, AccountIdentityProof,
AccountModerationNote, AccountPin, AccountStat, ListAccount,
PollVote, Mention
PollVote, Mention, AccountDeletionRequest, AccountNote
]

owned_classes.each do |klass|
Expand All @@ -28,7 +28,10 @@ def merge_with!(other_account)
end
end

target_classes = [Follow, FollowRequest, Block, Mute, AccountModerationNote, AccountPin]
target_classes = [
Follow, FollowRequest, Block, Mute, AccountModerationNote, AccountPin,
AccountNote
]

target_classes.each do |klass|
klass.where(target_account_id: other_account.id).find_each do |record|
Expand Down
45 changes: 44 additions & 1 deletion lib/mastodon/maintenance_cli.rb
Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,8 @@ class AccountStat < ApplicationRecord
belongs_to :account, inverse_of: :account_stat
end

# Dummy class, to make migration possible across version changes
class Account < ApplicationRecord
# Dummy class, to make migration possible across version changes
has_one :user, inverse_of: :account
has_one :account_stat, inverse_of: :account

Expand All @@ -69,6 +69,49 @@ def local?
def acct
local? ? username : "#{username}@#{domain}"
end

# This is a duplicate of the AccountMerging concern because we need it to
# be independent from code version.
def merge_with!(other_account)
# Since it's the same remote resource, the remote resource likely
# already believes we are following/blocking, so it's safe to
# re-attribute the relationships too. However, during the presence
# of the index bug users could have *also* followed the reference
# account already, therefore mass update will not work and we need
# to check for (and skip past) uniqueness errors

owned_classes = [
Status, StatusPin, MediaAttachment, Poll, Report, Tombstone, Favourite,
Follow, FollowRequest, Block, Mute, AccountIdentityProof,
AccountModerationNote, AccountPin, AccountStat, ListAccount,
PollVote, Mention
]
owned_classes << AccountDeletionRequest if ActiveRecord::Base.connection.table_exists?(:account_deletion_requests)
owned_classes << AccountNote if ActiveRecord::Base.connection.table_exists?(:account_notes)

owned_classes.each do |klass|
klass.where(account_id: other_account.id).find_each do |record|
begin
record.update_attribute(:account_id, id)
rescue ActiveRecord::RecordNotUnique
next
end
end
end

target_classes = [Follow, FollowRequest, Block, Mute, AccountModerationNote, AccountPin]
target_classes << AccountNote if ActiveRecord::Base.connection.table_exists?(:account_notes)

target_classes.each do |klass|
klass.where(target_account_id: other_account.id).find_each do |record|
begin
record.update_attribute(:target_account_id, id)
rescue ActiveRecord::RecordNotUnique
next
end
end
end
end
end

class User < ApplicationRecord
Expand Down

0 comments on commit fbe7519

Please sign in to comment.