Pull up methods

#660
This commit is contained in:
Artur Beljajev 2018-01-23 16:41:10 +02:00
parent c586932418
commit a5db4e3bfb
4 changed files with 64 additions and 47 deletions

7
.reek
View file

@ -103,13 +103,11 @@ UncommunicativeVariableName:
- Epp::Contact#attrs_from - Epp::Contact#attrs_from
- Epp::Contact#check_availability - Epp::Contact#check_availability
- Epp::Domain#check_availability - Epp::Domain#check_availability
- Epp::Domain#copy_and_transfer_contact
- Epp::Domain#domain_contact_attrs_from - Epp::Domain#domain_contact_attrs_from
- Epp::Domain#domain_status_list_from - Epp::Domain#domain_status_list_from
- Epp::Domain#domain_statuses_attrs - Epp::Domain#domain_statuses_attrs
- Epp::Domain#nameservers_from - Epp::Domain#nameservers_from
- Epp::Domain#parse_period_unit_from_frame - Epp::Domain#parse_period_unit_from_frame
- Epp::Domain#transfer_domain_contacts
- Epp::Domain#validate_contacts - Epp::Domain#validate_contacts
- Invoice#cancel_overdue_invoices - Invoice#cancel_overdue_invoices
- Legacy::Db - Legacy::Db
@ -317,7 +315,6 @@ DuplicateMethodCall:
- Epp::Domain#parse_legal_document_from_frame - Epp::Domain#parse_legal_document_from_frame
- Epp::Domain#query_transfer - Epp::Domain#query_transfer
- Epp::Domain#renew - Epp::Domain#renew
- Epp::Domain#transfer_domain_contacts
- Epp::Domain#update - Epp::Domain#update
- Epp::Domain#validate_contacts - Epp::Domain#validate_contacts
- Epp::Domain#validate_exp_dates - Epp::Domain#validate_exp_dates
@ -795,7 +792,6 @@ TooManyStatements:
- Epp::Domain#approve_transfer - Epp::Domain#approve_transfer
- Epp::Domain#attrs_from - Epp::Domain#attrs_from
- Epp::Domain#check_availability - Epp::Domain#check_availability
- Epp::Domain#copy_and_transfer_contact
- Epp::Domain#destroy_attrs - Epp::Domain#destroy_attrs
- Epp::Domain#dnskeys_attrs - Epp::Domain#dnskeys_attrs
- Epp::Domain#domain_contact_attrs_from - Epp::Domain#domain_contact_attrs_from
@ -811,7 +807,6 @@ TooManyStatements:
- Epp::Domain#reject_transfer - Epp::Domain#reject_transfer
- Epp::Domain#renew - Epp::Domain#renew
- Epp::Domain#transfer - Epp::Domain#transfer
- Epp::Domain#transfer_domain_contacts
- Epp::Domain#update - Epp::Domain#update
- Epp::Domain#validate_contacts - Epp::Domain#validate_contacts
- Invoice#cancel - Invoice#cancel
@ -881,7 +876,6 @@ UtilityFunction:
- EppErrors#construct_msg_args_and_value - EppErrors#construct_msg_args_and_value
- Versions#user_from_id_role_username - Versions#user_from_id_role_username
- Depp::Keyrelay#expiry - Depp::Keyrelay#expiry
- Epp::Domain#copy_and_transfer_contact
- Epp::Domain#nameservers_from - Epp::Domain#nameservers_from
- Epp::Domain::DnsSecKeys#mark - Epp::Domain::DnsSecKeys#mark
- Epp::Domain::DnsSecKeys#xm_copy - Epp::Domain::DnsSecKeys#xm_copy
@ -956,7 +950,6 @@ FeatureEnvy:
- Epp::Domain#destroy_attrs - Epp::Domain#destroy_attrs
- Epp::Domain#domain_contact_attrs_from - Epp::Domain#domain_contact_attrs_from
- Epp::Domain#domain_status_list_from - Epp::Domain#domain_status_list_from
- Epp::Domain#transfer_domain_contacts
- LegalDocument#calc_checksum - LegalDocument#calc_checksum
- Nameserver#find_by_hash_params - Nameserver#find_by_hash_params
- RegistrantUser#find_or_create_by_idc_data - RegistrantUser#find_or_create_by_idc_data

View file

@ -6,8 +6,18 @@ module Concerns::Domain::Transferable
end end
def transfer(new_registrar) def transfer(new_registrar)
old_registrar = registrar
self.registrar = new_registrar self.registrar = new_registrar
regenerate_transfer_code regenerate_transfer_code
domain_transfers.create!(
transfer_requested_at: Time.zone.now,
transfer_from: old_registrar,
transfer_to: new_registrar
)
transfer_contacts(new_registrar.id)
end end
private private
@ -16,5 +26,43 @@ module Concerns::Domain::Transferable
self.transfer_code = SecureRandom.hex self.transfer_code = SecureRandom.hex
end end
def transfer_contacts(registrar_id)
transfer_registrant(registrar_id)
transfer_domain_contacts(registrar_id)
end
def transfer_registrant(registrar_id)
return if registrant.registrar_id == registrar_id
self.registrant_id = copy_and_transfer_contact(registrant_id, registrar_id).id
end
def transfer_domain_contacts(registrar_id)
copied_ids = []
contacts.each do |c|
next if copied_ids.include?(c.id) || c.registrar_id == registrar_id
if registrant_id_was == c.id # registrant was copied previously, do not copy it again
oc = OpenStruct.new(id: registrant_id)
else
oc = copy_and_transfer_contact(c.id, registrar_id)
end
domain_contacts.where(contact_id: c.id).update_all({ contact_id: oc.id }) # n+1 workaround
copied_ids << c.id
end
end
def copy_and_transfer_contact(contact_id, registrar_id)
c = Contact.find(contact_id) # n+1 workaround
oc = c.deep_clone
oc.code = nil
oc.registrar_id = registrar_id
oc.copy_from_id = c.id
oc.generate_code
oc.remove_address unless Contact.address_processing?
oc.save!(validate: false)
oc
end
alias_method :regenerate_transfer_code, :generate_transfer_code alias_method :regenerate_transfer_code, :generate_transfer_code
end end

View file

@ -641,46 +641,6 @@ class Epp::Domain < Domain
end end
end end
# TODO: Eager load problems here. Investigate how it's possible not to query contact again
# Check if versioning works with update_column
def transfer_contacts(registrar_id)
transfer_registrant(registrar_id)
transfer_domain_contacts(registrar_id)
end
def copy_and_transfer_contact(contact_id, registrar_id)
c = Contact.find(contact_id) # n+1 workaround
oc = c.deep_clone
oc.code = nil
oc.registrar_id = registrar_id
oc.copy_from_id = c.id
oc.generate_code
oc.remove_address unless Contact.address_processing?
oc.save!(validate: false)
oc
end
def transfer_registrant(registrar_id)
return if registrant.registrar_id == registrar_id
self.registrant_id = copy_and_transfer_contact(registrant_id, registrar_id).id
end
def transfer_domain_contacts(registrar_id)
copied_ids = []
contacts.each do |c|
next if copied_ids.include?(c.id) || c.registrar_id == registrar_id
if registrant_id_was == c.id # registrant was copied previously, do not copy it again
oc = OpenStruct.new(id: registrant_id)
else
oc = copy_and_transfer_contact(c.id, registrar_id)
end
domain_contacts.where(contact_id: c.id).update_all({ contact_id: oc.id }) # n+1 workaround
copied_ids << c.id
end
end
# rubocop: enable Metrics/PerceivedComplexity # rubocop: enable Metrics/PerceivedComplexity
# rubocop: enable Metrics/CyclomaticComplexity # rubocop: enable Metrics/CyclomaticComplexity
# rubocop: disable Metrics/MethodLength # rubocop: disable Metrics/MethodLength

View file

@ -39,4 +39,20 @@ class DomainTest < ActiveSupport::TestCase
assert_equal new_registrar, @domain.registrar assert_equal new_registrar, @domain.registrar
refute_same @domain.transfer_code, old_transfer_code refute_same @domain.transfer_code, old_transfer_code
end end
def test_transfer_creates_domain_transfer_object
new_registrar = registrars(:goodnames)
assert_difference 'DomainTransfer.count' do
@domain.transfer(new_registrar)
end
end
def test_transfer_copies_contacts
new_registrar = registrars(:goodnames)
assert_difference 'Contact.count', 2 do
@domain.transfer(new_registrar)
end
end
end end