mirror of
https://github.com/internetee/registry.git
synced 2025-05-17 17:59:47 +02:00
Automatic error handling
This commit is contained in:
parent
dce3357e1e
commit
fb8cba9ef4
6 changed files with 73 additions and 40 deletions
|
@ -6,8 +6,7 @@ module Epp::DomainsHelper
|
||||||
if @domain.save && @domain.attach_contacts(domain_contacts)
|
if @domain.save && @domain.attach_contacts(domain_contacts)
|
||||||
render '/epp/domains/create'
|
render '/epp/domains/create'
|
||||||
else
|
else
|
||||||
handle_domain_name_errors
|
handle_errors
|
||||||
handle_contact_errors
|
|
||||||
render '/epp/error'
|
render '/epp/error'
|
||||||
raise ActiveRecord::Rollback
|
raise ActiveRecord::Rollback
|
||||||
end
|
end
|
||||||
|
@ -50,17 +49,17 @@ module Epp::DomainsHelper
|
||||||
res
|
res
|
||||||
end
|
end
|
||||||
|
|
||||||
def handle_domain_name_errors
|
def handle_errors
|
||||||
[:epp_domain_taken, :epp_domain_reserved].each do |x|
|
error_code_map = {
|
||||||
if @domain.errors.added?(:name, x)
|
'2302' => [:epp_domain_taken, :epp_domain_reserved],
|
||||||
epp_errors << {code: '2302', msg: @domain.errors[:name].first}
|
'2306' => [:blank],
|
||||||
end
|
'2303' => [:epp_contact_not_found]
|
||||||
end
|
}
|
||||||
end
|
|
||||||
|
|
||||||
def handle_contact_errors
|
@domain.errors.each do |key, err|
|
||||||
if @domain.errors.added?(:admin_contacts, :blank)
|
error_code_map.each do |code, values|
|
||||||
epp_errors << {code: '2306', msg: @domain.errors[:admin_contacts].first}
|
epp_errors << {code: code, msg: err} and break if values.any? {|x| @domain.errors.added?(key, x) }
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -17,14 +17,9 @@ class Domain < ActiveRecord::Base
|
||||||
|
|
||||||
has_and_belongs_to_many :nameservers
|
has_and_belongs_to_many :nameservers
|
||||||
|
|
||||||
validates_presence_of :name
|
validates :name_dirty, domain_name: true, uniqueness: { message: I18n.t('errors.messages.epp_domain_taken') }
|
||||||
|
|
||||||
validates :name, domain_name: true, uniqueness: { message: I18n.t('errors.messages.epp_domain_taken') }
|
|
||||||
validates :name_puny, domain_name: true
|
|
||||||
validates :period, numericality: { only_integer: true, greater_than: 0, less_than: 100 }
|
validates :period, numericality: { only_integer: true, greater_than: 0, less_than: 100 }
|
||||||
validates :owner_contact, presence: true
|
validates :name, :owner_contact, presence: true
|
||||||
# validates :tech_contacts_count
|
|
||||||
#validate :admin_contacts_count, on: :update
|
|
||||||
|
|
||||||
def name=(value)
|
def name=(value)
|
||||||
value.strip!
|
value.strip!
|
||||||
|
@ -36,7 +31,9 @@ class Domain < ActiveRecord::Base
|
||||||
def attach_contacts(contacts)
|
def attach_contacts(contacts)
|
||||||
contacts.each do |k, v|
|
contacts.each do |k, v|
|
||||||
v.each do |x|
|
v.each do |x|
|
||||||
attach_contact(k, Contact.find_by(code: x[:contact]))
|
contact = Contact.find_by(code: x[:contact])
|
||||||
|
attach_contact(k, contact) and next if contact
|
||||||
|
errors.add(:domain_contacts, I18n.t('errors.messages.epp_contact_not_found'))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -51,3 +51,4 @@ en:
|
||||||
epp_domain_taken: 'Domain name already exists'
|
epp_domain_taken: 'Domain name already exists'
|
||||||
epp_obj_does_not_exist: 'Object does not exist'
|
epp_obj_does_not_exist: 'Object does not exist'
|
||||||
epp_command_failed: 'Command failed'
|
epp_command_failed: 'Command failed'
|
||||||
|
epp_contact_not_found: "Contact was not found"
|
||||||
|
|
|
@ -6,8 +6,28 @@ describe 'EPP Domain', epp: true do
|
||||||
context 'with valid user' do
|
context 'with valid user' do
|
||||||
before(:each) { Fabricate(:epp_user) }
|
before(:each) { Fabricate(:epp_user) }
|
||||||
|
|
||||||
|
it 'returns error if contact does not exists' do
|
||||||
|
Fabricate(:contact, code: 'jd1234')
|
||||||
|
|
||||||
|
response = epp_request('domains/create.xml')
|
||||||
|
expect(response[:results][0][:result_code]).to eq('2303')
|
||||||
|
expect(response[:results][0][:msg]).to eq('Contact was not found')
|
||||||
|
|
||||||
|
expect(response[:results][1][:result_code]).to eq('2303')
|
||||||
|
expect(response[:results][1][:msg]).to eq('Contact was not found')
|
||||||
|
|
||||||
|
expect(response[:results][2][:result_code]).to eq('2303')
|
||||||
|
expect(response[:results][2][:msg]).to eq('Contact was not found')
|
||||||
|
|
||||||
|
expect(response[:clTRID]).to eq('ABC-12345')
|
||||||
|
end
|
||||||
|
|
||||||
context 'with citizen as an owner' do
|
context 'with citizen as an owner' do
|
||||||
before(:each) { Fabricate(:contact, code: 'jd1234') }
|
before(:each) {
|
||||||
|
Fabricate(:contact, code: 'jd1234')
|
||||||
|
Fabricate(:contact, code: 'sh8013')
|
||||||
|
Fabricate(:contact, code: 'sh801333')
|
||||||
|
}
|
||||||
|
|
||||||
it 'creates a domain' do
|
it 'creates a domain' do
|
||||||
response = epp_request('domains/create.xml')
|
response = epp_request('domains/create.xml')
|
||||||
|
@ -16,11 +36,8 @@ describe 'EPP Domain', epp: true do
|
||||||
expect(response[:clTRID]).to eq('ABC-12345')
|
expect(response[:clTRID]).to eq('ABC-12345')
|
||||||
|
|
||||||
expect(Domain.first.registrar.name).to eq('Zone Media OÜ')
|
expect(Domain.first.registrar.name).to eq('Zone Media OÜ')
|
||||||
expect(Domain.first.tech_contacts.count).to eq 1
|
expect(Domain.first.tech_contacts.count).to eq 2
|
||||||
expect(Domain.first.admin_contacts.count).to eq 1
|
expect(Domain.first.admin_contacts.count).to eq 1
|
||||||
|
|
||||||
tech_contact = Domain.first.tech_contacts.first
|
|
||||||
expect(tech_contact.code).to eq('jd1234')
|
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'does not create duplicate domain' do
|
it 'does not create duplicate domain' do
|
||||||
|
@ -39,18 +56,9 @@ describe 'EPP Domain', epp: true do
|
||||||
expect(response[:clTRID]).to eq('ABC-12345')
|
expect(response[:clTRID]).to eq('ABC-12345')
|
||||||
end
|
end
|
||||||
|
|
||||||
it 'creates a domain with other contacts' do
|
it 'does not create domain without contacts and registrant' do
|
||||||
Fabricate(:contact, code: 'sh8013')
|
response = epp_request('domains/create_wo_contacts_and_registrant.xml')
|
||||||
Fabricate(:contact, code: 'sh801333')
|
expect(response[:result_code]).to eq('2306')
|
||||||
|
|
||||||
response = epp_request('domains/create.xml')
|
|
||||||
expect(response[:result_code]).to eq('1000')
|
|
||||||
expect(response[:msg]).to eq('Command completed successfully')
|
|
||||||
expect(response[:clTRID]).to eq('ABC-12345')
|
|
||||||
|
|
||||||
expect(Domain.first.tech_contacts.count).to eq 2
|
|
||||||
expect(Domain.first.admin_contacts.count).to eq 1
|
|
||||||
expect(Domain.first.owner_contact).to_not be nil
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
|
||||||
|
<command>
|
||||||
|
<create>
|
||||||
|
<domain:create
|
||||||
|
xmlns:domain="urn:ietf:params:xml:ns:domain-1.0">
|
||||||
|
<domain:name>example.ee</domain:name>
|
||||||
|
<domain:period unit="y">1</domain:period>
|
||||||
|
<domain:ns>
|
||||||
|
<domain:hostObj>ns1.example.net</domain:hostObj>
|
||||||
|
<domain:hostObj>ns2.example.net</domain:hostObj>
|
||||||
|
</domain:ns>
|
||||||
|
<domain:authInfo>
|
||||||
|
<domain:pw>2fooBAR</domain:pw>
|
||||||
|
</domain:authInfo>
|
||||||
|
</domain:create>
|
||||||
|
</create>
|
||||||
|
<clTRID>ABC-12345</clTRID>
|
||||||
|
</command>
|
||||||
|
</epp>
|
|
@ -23,13 +23,21 @@ module Epp
|
||||||
def parse_response raw
|
def parse_response raw
|
||||||
res = Nokogiri::XML(raw)
|
res = Nokogiri::XML(raw)
|
||||||
|
|
||||||
{
|
obj = {
|
||||||
result_code: res.css('epp response result').first[:code],
|
results: [],
|
||||||
msg: res.css('epp response result msg').text,
|
|
||||||
clTRID: res.css('epp trID clTRID').text,
|
clTRID: res.css('epp trID clTRID').text,
|
||||||
parsed: res.remove_namespaces!,
|
parsed: res.remove_namespaces!,
|
||||||
raw: raw
|
raw: raw
|
||||||
}
|
}
|
||||||
|
|
||||||
|
res.css('epp response result').each do |x|
|
||||||
|
obj[:results] << {result_code: x[:code], msg: x.css('msg').text}
|
||||||
|
end
|
||||||
|
|
||||||
|
obj[:result_code] = obj[:results][0][:result_code]
|
||||||
|
obj[:msg] = obj[:results][0][:msg]
|
||||||
|
|
||||||
|
obj
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue