diff --git a/app/api/repp/domain_contacts_v1.rb b/app/api/repp/domain_contacts_v1.rb index 5a38897d4..a5f337139 100644 --- a/app/api/repp/domain_contacts_v1.rb +++ b/app/api/repp/domain_contacts_v1.rb @@ -5,29 +5,33 @@ module Repp resource :domains do resource :contacts do patch '/' do - predecessor = current_user.registrar.contacts.find_by(code: params[:predecessor]) - successor = current_user.registrar.contacts.find_by(code: params[:successor]) + current_contact = current_user.registrar.contacts + .find_by(code: params[:current_contact_id]) + new_contact = current_user.registrar.contacts.find_by(code: params[:new_contact_id]) - unless predecessor + unless current_contact error!({ error: { type: 'invalid_request_error', - param: 'predecessor', - message: "No such contact: #{params[:predecessor]}" } }, :bad_request) + param: 'current_contact_id', + message: "No such contact: #{params[:current_contact_id]}"} }, + :bad_request) end - unless successor + unless new_contact error!({ error: { type: 'invalid_request_error', - param: 'successor', - message: "No such contact: #{params[:successor]}" } }, :bad_request) + param: 'new_contact_id', + message: "No such contact: #{params[:new_contact_id]}" } }, + :bad_request) end - if predecessor == successor + if current_contact == new_contact error!({ error: { type: 'invalid_request_error', message: 'New contact ID must be different from current' \ ' contact ID' } }, :bad_request) end - affected_domains, skipped_domains = TechDomainContact.replace(predecessor, successor) + affected_domains, skipped_domains = TechDomainContact + .replace(current_contact, new_contact) @response = { affected_domains: affected_domains, skipped_domains: skipped_domains } end end diff --git a/app/controllers/registrar/tech_contacts_controller.rb b/app/controllers/registrar/tech_contacts_controller.rb index fccb10f78..9d4568ad6 100644 --- a/app/controllers/registrar/tech_contacts_controller.rb +++ b/app/controllers/registrar/tech_contacts_controller.rb @@ -6,7 +6,8 @@ class Registrar uri = URI.parse("#{ENV['repp_url']}domains/contacts") request = Net::HTTP::Patch.new(uri) - request.set_form_data(predecessor: params[:predecessor], successor: params[:successor]) + request.set_form_data(current_contact_id: params[:current_contact_id], + new_contact_id: params[:new_contact_id]) request.basic_auth(current_user.username, current_user.password) if Rails.env.test? diff --git a/app/models/tech_domain_contact.rb b/app/models/tech_domain_contact.rb index 55cc45aed..04f36c4e4 100644 --- a/app/models/tech_domain_contact.rb +++ b/app/models/tech_domain_contact.rb @@ -1,9 +1,9 @@ class TechDomainContact < DomainContact # Audit log is needed, therefore no raw SQL - def self.replace(predecessor, successor) + def self.replace(current_contact, new_contact) affected_domains = [] skipped_domains = [] - tech_contacts = where(contact: predecessor) + tech_contacts = where(contact: current_contact) transaction do tech_contacts.each do |tech_contact| @@ -12,7 +12,7 @@ class TechDomainContact < DomainContact next end - tech_contact.contact = successor + tech_contact.contact = new_contact tech_contact.save! affected_domains << tech_contact.domain.name end diff --git a/app/views/registrar/bulk_change/_tech_contact_form.html.erb b/app/views/registrar/bulk_change/_tech_contact_form.html.erb index f8e0a29d3..f759177b2 100644 --- a/app/views/registrar/bulk_change/_tech_contact_form.html.erb +++ b/app/views/registrar/bulk_change/_tech_contact_form.html.erb @@ -7,11 +7,11 @@
- <%= label_tag :predecessor, t('.predecessor') %> + <%= label_tag :current_contact_id %>
- <%= text_field_tag :predecessor, params[:predecessor], + <%= text_field_tag :current_contact_id, params[:current_contact_id], list: :contacts, required: true, autofocus: true, @@ -21,11 +21,11 @@
- <%= label_tag :successor, t('.successor') %> + <%= label_tag :new_contact_id %>
- <%= text_field_tag :successor, params[:successor], + <%= text_field_tag :new_contact_id, params[:new_contact_id], list: :contacts, required: true, class: 'form-control' %> diff --git a/config/locales/registrar/bulk_change.en.yml b/config/locales/registrar/bulk_change.en.yml index 0bbd222bd..29a69b0a9 100644 --- a/config/locales/registrar/bulk_change.en.yml +++ b/config/locales/registrar/bulk_change.en.yml @@ -8,8 +8,6 @@ en: bulk_transfer: Bulk transfer tech_contact_form: - predecessor: Current contact ID - successor: New contact ID submit_btn: Replace technical contacts help_btn: Toggle help help: >- diff --git a/doc/repp/v1/domain_contacts.md b/doc/repp/v1/domain_contacts.md index 8a024e763..b412e9f73 100644 --- a/doc/repp/v1/domain_contacts.md +++ b/doc/repp/v1/domain_contacts.md @@ -8,8 +8,8 @@ Replaces all domain contacts of the current registrar. $ curl https://repp.internet.ee/v1/domains/contacts \ -X PATCH \ -u username:password \ - -d predecessor=foo \ - -d successor=bar + -d current_contact_id=foo \ + -d new_contact_id=bar ``` ### Example response ``` diff --git a/test/integration/api/domain_contacts_test.rb b/test/integration/api/domain_contacts_test.rb index b9d405219..8d619f969 100644 --- a/test/integration/api/domain_contacts_test.rb +++ b/test/integration/api/domain_contacts_test.rb @@ -2,7 +2,8 @@ require 'test_helper' class APIDomainContactsTest < ActionDispatch::IntegrationTest def test_replace_all_tech_contacts_of_the_current_registrar - patch '/repp/v1/domains/contacts', { predecessor: 'william-001', successor: 'john-001' }, + patch '/repp/v1/domains/contacts', { current_contact_id: 'william-001', + new_contact_id: 'john-001' }, { 'HTTP_AUTHORIZATION' => http_auth_key } assert_nil domains(:shop).tech_contacts.find_by(code: 'william-001') @@ -13,14 +14,16 @@ class APIDomainContactsTest < ActionDispatch::IntegrationTest def test_skip_discarded_domains domains(:airport).update!(statuses: [DomainStatus::DELETE_CANDIDATE]) - patch '/repp/v1/domains/contacts', { predecessor: 'william-001', successor: 'john-001' }, + patch '/repp/v1/domains/contacts', { current_contact_id: 'william-001', + new_contact_id: 'john-001' }, { 'HTTP_AUTHORIZATION' => http_auth_key } assert domains(:airport).tech_contacts.find_by(code: 'william-001') end def test_return_affected_domains_in_alphabetical_order - patch '/repp/v1/domains/contacts', { predecessor: 'william-001', successor: 'john-001' }, + patch '/repp/v1/domains/contacts', { current_contact_id: 'william-001', + new_contact_id: 'john-001' }, { 'HTTP_AUTHORIZATION' => http_auth_key } assert_response :ok @@ -33,7 +36,8 @@ class APIDomainContactsTest < ActionDispatch::IntegrationTest domains(:shop).update!(statuses: [DomainStatus::DELETE_CANDIDATE]) domains(:airport).update!(statuses: [DomainStatus::DELETE_CANDIDATE]) - patch '/repp/v1/domains/contacts', { predecessor: 'william-001', successor: 'john-001' }, + patch '/repp/v1/domains/contacts', { current_contact_id: 'william-001', + new_contact_id: 'john-001' }, { 'HTTP_AUTHORIZATION' => http_auth_key } assert_response :ok @@ -42,52 +46,58 @@ class APIDomainContactsTest < ActionDispatch::IntegrationTest end def test_keep_other_tech_contacts_intact - patch '/repp/v1/domains/contacts', { predecessor: 'william-001', successor: 'john-001' }, + patch '/repp/v1/domains/contacts', { current_contact_id: 'william-001', + new_contact_id: 'john-001' }, { 'HTTP_AUTHORIZATION' => http_auth_key } assert domains(:shop).tech_contacts.find_by(code: 'acme-ltd-001') end def test_keep_admin_contacts_intact - patch '/repp/v1/domains/contacts', { predecessor: 'william-001', successor: 'john-001' }, + patch '/repp/v1/domains/contacts', { current_contact_id: 'william-001', + new_contact_id: 'john-001' }, { 'HTTP_AUTHORIZATION' => http_auth_key } assert domains(:airport).admin_contacts.find_by(code: 'william-001') end def test_restrict_contacts_to_the_current_registrar - patch '/repp/v1/domains/contacts', { predecessor: 'jack-001', successor: 'william-002' }, + patch '/repp/v1/domains/contacts', { current_contact_id: 'jack-001', + new_contact_id: 'william-002' }, { 'HTTP_AUTHORIZATION' => http_auth_key } assert_response :bad_request assert_equal ({ error: { type: 'invalid_request_error', - param: 'predecessor', + param: 'current_contact_id', message: 'No such contact: jack-001' } }), JSON.parse(response.body, symbolize_names: true) end - def test_non_existent_predecessor - patch '/repp/v1/domains/contacts', { predecessor: 'non-existent', successor: 'john-001' }, + def test_non_existent_current_contact + patch '/repp/v1/domains/contacts', { current_contact_id: 'non-existent', + new_contact_id: 'john-001' }, { 'HTTP_AUTHORIZATION' => http_auth_key } assert_response :bad_request assert_equal ({ error: { type: 'invalid_request_error', - param: 'predecessor', + param: 'current_contact_id', message: 'No such contact: non-existent' } }), JSON.parse(response.body, symbolize_names: true) end - def test_non_existent_successor - patch '/repp/v1/domains/contacts', { predecessor: 'william-001', successor: 'non-existent' }, + def test_non_existent_new_contact + patch '/repp/v1/domains/contacts', { current_contact_id: 'william-001', + new_contact_id: 'non-existent' }, { 'HTTP_AUTHORIZATION' => http_auth_key } assert_response :bad_request assert_equal ({ error: { type: 'invalid_request_error', - param: 'successor', + param: 'new_contact_id', message: 'No such contact: non-existent' } }), JSON.parse(response.body, symbolize_names: true) end def test_disallow_self_replacement - patch '/repp/v1/domains/contacts', { predecessor: 'william-001', successor: 'william-001' }, + patch '/repp/v1/domains/contacts', { current_contact_id: 'william-001', + new_contact_id: 'william-001' }, { 'HTTP_AUTHORIZATION' => http_auth_key } assert_response :bad_request assert_equal ({ error: { type: 'invalid_request_error', diff --git a/test/integration/registrar/bulk_change/tech_contact_test.rb b/test/integration/registrar/bulk_change/tech_contact_test.rb index 2999a8853..993f166a0 100644 --- a/test/integration/registrar/bulk_change/tech_contact_test.rb +++ b/test/integration/registrar/bulk_change/tech_contact_test.rb @@ -7,7 +7,7 @@ class RegistrarAreaTechContactBulkChangeTest < ActionDispatch::IntegrationTest def test_replace_domain_contacts_of_current_registrar request_stub = stub_request(:patch, /domains\/contacts/) - .with(body: { predecessor: 'william-001', successor: 'john-001' }, + .with(body: { current_contact_id: 'william-001', new_contact_id: 'john-001' }, basic_auth: ['test_bestnames', 'testtest']) .to_return(body: { affected_domains: %w[foo.test bar.test], skipped_domains: %w[baz.test qux.test] }.to_json,