diff --git a/app/models/contact/ident.rb b/app/models/contact/ident.rb index d531b833c..8d1179afe 100644 --- a/app/models/contact/ident.rb +++ b/app/models/contact/ident.rb @@ -13,6 +13,7 @@ class Contact::Ident validates :type, presence: true, inclusion: { in: proc { types } } validates :country_code, presence: true, iso31661_alpha2: true validates_with MismatchValidator + validates_with BirthDateValidator, if: :birthday? def self.epp_code_map { @@ -26,6 +27,7 @@ class Contact::Ident [:code, :invalid_national_id], [:code, :invalid_reg_no], [:code, :invalid_iso8601_date], + [:code, :invalid_birth_date], [:country_code, :invalid_iso31661_alpha2] ] } diff --git a/app/models/epp/contact.rb b/app/models/epp/contact.rb index 6f53eaed5..6bd5507b9 100644 --- a/app/models/epp/contact.rb +++ b/app/models/epp/contact.rb @@ -8,9 +8,6 @@ class Epp::Contact < Contact # disable STI, there is type column present self.inheritance_column = :sti_disabled - VALID_BIRTH_DATE_FROM = Time.zone.today - 150.years - VALID_BIRTH_DATE_TO = Time.zone.tomorrow - before_validation :manage_permissions def manage_permissions @@ -19,28 +16,6 @@ class Epp::Contact < Contact throw(:abort) end - validate :validate_birthday_ident - - def validate_birthday_ident - return unless Depp::Contact::SELECTION_TYPES[2].include?(ident_type) - - begin - Date.parse(ident) - rescue ArgumentError - add_epp_error('2308', nil, nil, I18n.t('epp.contacts.errors.valid_ident_date_format')) - @error = true - return - end - - contact_ident_date = Date.parse(ident) - valid_time_range = VALID_BIRTH_DATE_FROM...VALID_BIRTH_DATE_TO - return if valid_time_range.cover?(contact_ident_date) - - add_epp_error('2308', nil, nil, I18n.t('epp.contacts.errors.valid_ident_date_range')) - @error = true - nil - end - class << self # support legacy search def find_by_epp_code(code) diff --git a/app/validators/contact/ident/birth_date_validator.rb b/app/validators/contact/ident/birth_date_validator.rb new file mode 100644 index 000000000..38cfc98f9 --- /dev/null +++ b/app/validators/contact/ident/birth_date_validator.rb @@ -0,0 +1,26 @@ +class Contact::Ident::BirthDateValidator < ActiveModel::Validator + VALID_BIRTH_DATE_FROM = Time.zone.today - 150.years + VALID_BIRTH_DATE_TO = Time.zone.tomorrow + + def validate(record) + record.errors.add(:code, :invalid_birth_date) if birth_date_wrong?(record) + end + + private + + def birth_date_wrong?(record) + return unless record.birthday? + + begin + Date.parse(record.code) + rescue ArgumentError + return true + end + + contact_ident_date = Date.parse(record.code) + valid_time_range = VALID_BIRTH_DATE_FROM...VALID_BIRTH_DATE_TO + return if valid_time_range.cover?(contact_ident_date) + + true + end +end diff --git a/config/locales/epp/contacts.en.yml b/config/locales/epp/contacts.en.yml index 341630299..fe4ed7ccf 100644 --- a/config/locales/epp/contacts.en.yml +++ b/config/locales/epp/contacts.en.yml @@ -8,12 +8,6 @@ en: valid_ident: >- Ident update is not allowed. Consider creating new contact object - valid_ident_date_format: >- - Ident update is not allowed. - Date format is invalid - valid_ident_date_range: >- - Ident update is not allowed. - Age must be over 0 and under 150 ident_update: >- Only ident type and country can be updated in case of invalid ident. Please create new contact object to update ident code diff --git a/config/locales/idents.yml b/config/locales/idents.yml index 33b935833..8e6a677de 100644 --- a/config/locales/idents.yml +++ b/config/locales/idents.yml @@ -9,3 +9,4 @@ en: code: invalid_national_id: does not conform to national identification number format of %{country} invalid_reg_no: does not conform to registration number format of %{country} + invalid_birth_date: Birth date is invalid, age must be over 0 and under 150 diff --git a/test/integration/epp/contact/create/base_test.rb b/test/integration/epp/contact/create/base_test.rb index 5d965596a..72d8597c4 100644 --- a/test/integration/epp/contact/create/base_test.rb +++ b/test/integration/epp/contact/create/base_test.rb @@ -119,7 +119,7 @@ class EppContactCreateBaseTest < EppTestCase response_xml = Nokogiri::XML(response.body) assert_correct_against_schema response_xml - assert_epp_response :data_management_policy_violation + assert_epp_response :parameter_value_syntax_error request_xml.sub! ">#{birthday_wrong_format}<", ">#{birthday_above_valid_range}<" assert_no_difference 'Contact.count' do @@ -129,7 +129,7 @@ class EppContactCreateBaseTest < EppTestCase response_xml = Nokogiri::XML(response.body) assert_correct_against_schema response_xml - assert_epp_response :data_management_policy_violation + assert_epp_response :parameter_value_syntax_error request_xml.sub! ">#{birthday_above_valid_range}<", ">#{birthday_below_valid_range}<" assert_no_difference 'Contact.count' do @@ -139,7 +139,7 @@ class EppContactCreateBaseTest < EppTestCase response_xml = Nokogiri::XML(response.body) assert_correct_against_schema response_xml - assert_epp_response :data_management_policy_violation + assert_epp_response :parameter_value_syntax_error end def test_responces_error_with_email_error