diff --git a/app/jobs/onceoff/fix_primary_emails_for_staged_users.rb b/app/jobs/onceoff/fix_primary_emails_for_staged_users.rb index a4c64188c26..15fe43a14bb 100644 --- a/app/jobs/onceoff/fix_primary_emails_for_staged_users.rb +++ b/app/jobs/onceoff/fix_primary_emails_for_staged_users.rb @@ -2,18 +2,22 @@ module Jobs class FixPrimaryEmailsForStagedUsers < Jobs::Onceoff def execute_onceoff(args) users = User.where(active: false, staged: true).joins(:email_tokens) - destroyer = UserDestroyer.new(Discourse.system_user) + acting_user = Discourse.system_user + destroyer = UserDestroyer.new(acting_user) users.group("email_tokens.email") .having("COUNT(email_tokens.email) > 1") .count .each_key do |email| - users.where("email_tokens.email = ?", email) - .order(id: :asc) - .offset(1) - .each do |user| + query = users.where("email_tokens.email = ?", email).order(id: :asc) + original_user = query.first + + query.offset(1).each do |user| + user.posts.each do |post| + post.set_owner(original_user, acting_user) + end destroyer.destroy(user) end end diff --git a/spec/jobs/fix_primary_emails_for_staged_users_spec.rb b/spec/jobs/fix_primary_emails_for_staged_users_spec.rb index 1951c3b6506..ccc6ea2c1a5 100644 --- a/spec/jobs/fix_primary_emails_for_staged_users_spec.rb +++ b/spec/jobs/fix_primary_emails_for_staged_users_spec.rb @@ -8,6 +8,10 @@ RSpec.describe Jobs::FixPrimaryEmailsForStagedUsers do staged_user2 = Fabricate(:user, staged: true, active: false) staged_user3 = Fabricate(:user, staged: true, active: false) + post1 = Fabricate(:post, user: staged_user2) + post2 = Fabricate(:post, user: staged_user2) + post3 = Fabricate(:post, user: staged_user3) + [staged_user, staged_user2, staged_user3].each do |user| user.email_tokens = [Fabricate.create(:email_token, email: common_email, user: user)] end @@ -18,8 +22,10 @@ RSpec.describe Jobs::FixPrimaryEmailsForStagedUsers do expect { described_class.new.execute_onceoff({}) } .to change { User.count }.by(-2) + .and change { staged_user.posts.count }.by(3) expect(User.all).to contain_exactly(Discourse.system_user, staged_user, active_user) + expect(staged_user.posts.all).to contain_exactly(post1, post2, post3) expect(staged_user.reload.email).to eq(common_email) end end