From dd38b7dfe6f3e866ce9fb756a52ad4af177c7e1c Mon Sep 17 00:00:00 2001 From: Martin Lensment Date: Fri, 2 Jan 2015 13:12:01 +0200 Subject: [PATCH] Refactor domain contact uniq validation method --- app/models/domain.rb | 41 +++++++++----------- app/validators/uniqueness_multi_validator.rb | 3 +- 2 files changed, 20 insertions(+), 24 deletions(-) diff --git a/app/models/domain.rb b/app/models/domain.rb index 7c55d8719..f372b4bd6 100644 --- a/app/models/domain.rb +++ b/app/models/domain.rb @@ -59,8 +59,16 @@ class Domain < ActiveRecord::Base validates :nameservers, uniqueness_multi: { attribute: 'hostname' } - validate :validate_tech_contacts_uniqueness - validate :validate_admin_contacts_uniqueness + validates :tech_domain_contacts, uniqueness_multi: { + association: 'domain_contacts', + attribute: 'contact_code_cache' + } + + validates :admin_domain_contacts, uniqueness_multi: { + association: 'domain_contacts', + attribute: 'contact_code_cache' + } + validates :domain_statuses, uniqueness_multi: { attribute: 'value' } validates :dnskeys, uniqueness_multi: { attribute: 'public_key' } validate :validate_nameserver_ips @@ -71,6 +79,14 @@ class Domain < ActiveRecord::Base # if proc works only on changes on domain sadly has_paper_trail class_name: 'DomainVersion', meta: { snapshot: :create_snapshot }, if: proc(&:new_version) + def tech_domain_contacts + domain_contacts.select { |x| x.contact_type == DomainContact::TECH } + end + + def admin_domain_contacts + domain_contacts.select { |x| x.contact_type == DomainContact::ADMIN } + end + def new_version return false if versions.try(:last).try(:snapshot) == create_snapshot true @@ -160,27 +176,6 @@ class Domain < ActiveRecord::Base end end - def validate_tech_contacts_uniqueness - contacts = domain_contacts.reject(&:marked_for_destruction?).select { |x| x.contact_type == DomainContact::TECH } - validate_domain_contacts_uniqueness(contacts) - end - - def validate_admin_contacts_uniqueness - contacts = domain_contacts.reject(&:marked_for_destruction?).select { |x| x.contact_type == DomainContact::ADMIN } - validate_domain_contacts_uniqueness(contacts) - end - - def validate_domain_contacts_uniqueness(contacts) - validated = [] - contacts.each do |dc| - existing = contacts.select { |x| x.contact_id == dc.contact_id } - next unless existing.length > 1 - validated << dc - errors.add(:domain_contacts, :invalid) if errors[:domain_contacts].blank? - dc.errors.add(:contact_code_cache, :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 index bb79e2815..54589d68e 100644 --- a/app/validators/uniqueness_multi_validator.rb +++ b/app/validators/uniqueness_multi_validator.rb @@ -7,7 +7,8 @@ class UniquenessMultiValidator < ActiveModel::EachValidator 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? + association = options[:association] || attribute + record.errors.add(association, :invalid) if record.errors[association].blank? x.errors.add(options[:attribute], :taken) end end