diff --git a/app/services/users/merge_and_archive.rb b/app/services/users/merge_and_archive.rb index a8e165f495..ce426162e9 100644 --- a/app/services/users/merge_and_archive.rb +++ b/app/services/users/merge_and_archive.rb @@ -8,19 +8,25 @@ class MergeAndArchive attribute :user_to_merge attribute :user_to_keep attribute :set_uid, :boolean, default: false + attribute :logger, default: -> { Rails.logger } private :user_to_merge, :user_to_keep, :set_uid def call(dry_run: true) + logger.info "Dry Run" if dry_run + ApplicationRecord.transaction do move_applications(from_user: user_to_merge, to_user: user_to_keep) move_participant_id_changes(from_user: user_to_merge, to_user: user_to_keep) user_to_keep.participant_id_changes.find_or_create_by!(from_participant_id: user_to_merge.ecf_id, to_participant_id: user_to_keep.ecf_id) uid_to_keep = user_to_merge.uid if user_to_merge.uid.present? && user_to_keep.uid.blank? - Rails.logger.info("Archiving user ID=#{user_to_merge.id}") + logger.info("Archiving user ID=#{user_to_merge.id}") Users::Archiver.new(user: user_to_merge.reload).archive! - user_to_keep.update!(uid: uid_to_keep) if uid_to_keep && set_uid + if uid_to_keep && set_uid + logger.info("Setting UID=#{uid_to_keep} on user ID=#{user_to_keep.id}") + user_to_keep.update!(uid: uid_to_keep) + end raise ActiveRecord::Rollback if dry_run end @@ -30,12 +36,16 @@ def call(dry_run: true) def move_applications(from_user:, to_user:) from_user.applications.each do |application| + logger.info("Moving application ID=#{application.id} from user ID=#{from_user.id} to user ID=#{to_user.id}") application.update!(user: to_user) end end def move_participant_id_changes(from_user:, to_user:) - from_user.participant_id_changes.update!(user: to_user) + if from_user.participant_id_changes.any? + logger.info("Moving participant ID changes IDs=#{from_user.participant_id_changes.pluck(:id)} from user ID=#{from_user.id} to user ID=#{to_user.id}") + from_user.participant_id_changes.update!(user: to_user) + end end end end diff --git a/lib/tasks/merge_user_into_another.rake b/lib/tasks/merge_user_into_another.rake index a597cff0ec..9aedf0ead5 100644 --- a/lib/tasks/merge_user_into_another.rake +++ b/lib/tasks/merge_user_into_another.rake @@ -22,7 +22,5 @@ task :merge_user_into_another, %i[user_ecf_id_to_merge user_ecf_id_to_keep dry_r exit 1 end - logger.info "Dry Run" if dry_run - - Users::MergeAndArchive.new(user_to_merge:, user_to_keep:, set_uid: true).call(dry_run:) + Users::MergeAndArchive.new(user_to_merge:, user_to_keep:, set_uid: true, logger:).call(dry_run:) end diff --git a/spec/lib/tasks/merge_user_into_another_spec.rb b/spec/lib/tasks/merge_user_into_another_spec.rb index 73bde01e1e..2fa55cad83 100644 --- a/spec/lib/tasks/merge_user_into_another_spec.rb +++ b/spec/lib/tasks/merge_user_into_another_spec.rb @@ -8,7 +8,7 @@ let(:user_to_keep) { create(:user) } let(:service_double) { instance_double(Users::MergeAndArchive) } - before { allow(Users::MergeAndArchive).to receive(:new).with(user_to_merge:, user_to_keep:, set_uid: true) { merge_and_archive_service } } + before { allow(Users::MergeAndArchive).to receive(:new).with(user_to_merge:, user_to_keep:, set_uid: true, logger: an_instance_of(Logger)) { merge_and_archive_service } } after { Rake::Task["merge_user_into_another"].reenable } subject(:run_task) { Rake::Task["merge_user_into_another"].invoke(user_to_merge.ecf_id, user_to_keep.ecf_id, dry_run) }