From cd7151b46302d7fc38ba6ba0fbd544d62ab5b487 Mon Sep 17 00:00:00 2001 From: Martin Lensment Date: Fri, 2 Jan 2015 11:31:59 +0200 Subject: [PATCH] Refactor some validaors to different file --- app/models/domain.rb | 47 +++----------------- app/validators/uniqueness_multi_validator.rb | 14 ++++++ spec/epp/domain_spec.rb | 7 +++ 3 files changed, 26 insertions(+), 42 deletions(-) create mode 100644 app/validators/uniqueness_multi_validator.rb diff --git a/app/models/domain.rb b/app/models/domain.rb index 3af14098d..7c55d8719 100644 --- a/app/models/domain.rb +++ b/app/models/domain.rb @@ -56,11 +56,13 @@ class Domain < ActiveRecord::Base validate :validate_nameservers_count validate :validate_admin_contacts_count validate :validate_dnskeys_count - validate :validate_nameservers_uniqueness + + validates :nameservers, uniqueness_multi: { attribute: 'hostname' } + validate :validate_tech_contacts_uniqueness validate :validate_admin_contacts_uniqueness - validate :validate_domain_statuses_uniqueness - validate :validate_dnskeys_uniqueness + validates :domain_statuses, uniqueness_multi: { attribute: 'value' } + validates :dnskeys, uniqueness_multi: { attribute: 'public_key' } validate :validate_nameserver_ips attr_accessor :owner_contact_typeahead, :update_me @@ -149,19 +151,6 @@ class Domain < ActiveRecord::Base errors.add(:dnskeys, :out_of_range, { min: min, max: max }) end - def validate_nameservers_uniqueness - validated = [] - list = nameservers.reject(&:marked_for_destruction?) - list.each do |ns| - next if ns.hostname.blank? - existing = list.select { |x| x.hostname == ns.hostname } - next unless existing.length > 1 - validated << ns.hostname - errors.add(:nameservers, :invalid) if errors[:nameservers].blank? - ns.errors.add(:hostname, :taken) - end - end - def validate_nameserver_ips nameservers.each do |ns| next unless ns.hostname.end_with?(name) @@ -192,32 +181,6 @@ class Domain < ActiveRecord::Base end end - def validate_domain_statuses_uniqueness - validated = [] - list = domain_statuses.reject(&:marked_for_destruction?) - list.each do |status| - next if status.value.blank? - existing = list.select { |x| x.value == status.value } - next unless existing.length > 1 - validated << status.value - errors.add(:domain_statuses, :invalid) if errors[:domain_statuses].blank? - status.errors.add(:value, :taken) - end - end - - def validate_dnskeys_uniqueness - validated = [] - list = dnskeys.reject(&:marked_for_destruction?) - list.each do |dnskey| - next if dnskey.public_key.blank? - existing = list.select { |x| x.public_key == dnskey.public_key } - next unless existing.length > 1 - validated << dnskey.public_key - errors.add(:dnskeys, :invalid) if errors[:dnskeys].blank? - dnskey.errors.add(:public_key, :taken) - end - end - def validate_period return unless period.present? if period_unit == 'd' diff --git a/app/validators/uniqueness_multi_validator.rb b/app/validators/uniqueness_multi_validator.rb new file mode 100644 index 000000000..bb79e2815 --- /dev/null +++ b/app/validators/uniqueness_multi_validator.rb @@ -0,0 +1,14 @@ +class UniquenessMultiValidator < ActiveModel::EachValidator + def validate_each(record, attribute, value) + validated = [] + list = value.reject(&:marked_for_destruction?) + list.each do |x| + next if x.send(options[:attribute]).blank? + existing = list.select { |y| x.send(options[:attribute]) == y.send(options[:attribute]) } + next unless existing.length > 1 + validated << x.send(options[:attribute]) + record.errors.add(attribute, :invalid) if record.errors[attribute].blank? + x.errors.add(options[:attribute], :taken) + end + end +end diff --git a/spec/epp/domain_spec.rb b/spec/epp/domain_spec.rb index 0d6ed9ac4..274c2b921 100644 --- a/spec/epp/domain_spec.rb +++ b/spec/epp/domain_spec.rb @@ -980,6 +980,13 @@ describe 'EPP Domain', epp: true do expect(response[:results][4][:msg]).to eq('Status already exists on this domain') expect(response[:results][4][:value]).to eq('clientUpdateProhibited') + + expect(response[:results][5][:msg]).to eq('Public key already exists') + expect(response[:results][5][:value]).to eq('700b97b591ed27ec2590d19f06f88bba700b97b591ed27ec2590d19f') + + expect(response[:results][6][:msg]).to eq('Public key already exists') + expect(response[:results][6][:value]).to eq('841936717ae427ace63c28d04918569a841936717ae427ace63c28d0') + expect(d.domain_statuses.count).to eq(2) end