diff --git a/app/helpers/epp/contacts_helper.rb b/app/helpers/epp/contacts_helper.rb index 29fce5d49..d5b6868b0 100644 --- a/app/helpers/epp/contacts_helper.rb +++ b/app/helpers/epp/contacts_helper.rb @@ -40,4 +40,17 @@ module Epp::ContactsHelper render '/epp/error' end end + + def check_contact + ph = params_hash['epp']['command']['check']['check'] + @contacts = Contact.check_availability( ph[:id] ) + + if @contacts.any? + render '/epp/contacts/check' + else + @code = '2303' + @msg = "Object does not exist" + render 'epp/error' + end + end end diff --git a/app/models/contact.rb b/app/models/contact.rb index 5d024f2cb..6b85e8fb2 100644 --- a/app/models/contact.rb +++ b/app/models/contact.rb @@ -14,4 +14,22 @@ class Contact < ActiveRecord::Base code = Isikukood.new(ident) errors.add(:ident, 'bad format') unless code.valid? end + + class << self + def check_availability(codes) + codes = [codes] if codes.is_a?(String) + + res = [] + codes.each do |x| + if Contact.find_by(code: x) + res << {code: x, avail: 0, reason: 'in use'} + else + res << {code: x, avail: 1} + end + end + + res + end + end + end diff --git a/app/views/epp/contacts/check.xml.builder b/app/views/epp/contacts/check.xml.builder new file mode 100644 index 000000000..670736022 --- /dev/null +++ b/app/views/epp/contacts/check.xml.builder @@ -0,0 +1,22 @@ +xml.epp_head do + xml.response do + xml.result('code' => '1000') do + xml.msg 'Command completed successfully' + end + + xml.resData do + xml.tag!('contact:chkData', 'xmlns:contact' => 'http://www.nic.cz/xml/epp/contact-1.6', + 'xsi:schemaLocation' => 'http://www.nic.cz/xml/epp/contact-1.6 contact-1.6.xsd') do + #xml.tag!('contact:id', @contact.code) + @contacts.each do |contact| + xml.tag!('contact:cd') do + xml.tag! "contact:id", contact[:code], avail: contact[:avail] + xml.tag!('contact:reason', contact[:reason]) unless contact[:avail] == 1 + end + end + end + end + + xml << render('/epp/shared/trID') + end +end diff --git a/spec/epp/contact_spec.rb b/spec/epp/contact_spec.rb index c7ddf1dd7..d9c7222da 100644 --- a/spec/epp/contact_spec.rb +++ b/spec/epp/contact_spec.rb @@ -45,6 +45,16 @@ describe 'EPP Contact', epp: true do expect(response[:msg]).to eq('Object does not exist') end + it 'checks contacts' do + Fabricate(:contact) + Fabricate(:contact, id:'sh8914') + + response = epp_request('contacts/check.xml') + expect(response[:result_code]).to eq('1000') + expect(response[:msg]).to eq('Command completed successfully') + + end + end end diff --git a/spec/epp/requests/contacts/check.xml b/spec/epp/requests/contacts/check.xml new file mode 100644 index 000000000..acc052a32 --- /dev/null +++ b/spec/epp/requests/contacts/check.xml @@ -0,0 +1,13 @@ + + + + + + sh8913 + sh8914 + + + ABC-12345 + + diff --git a/spec/models/contact_spec.rb b/spec/models/contact_spec.rb index b5bb81f41..a3136ce5e 100644 --- a/spec/models/contact_spec.rb +++ b/spec/models/contact_spec.rb @@ -25,3 +25,33 @@ describe Contact do end end end + +describe Contact, '.check_availability' do + + before(:each) { + Fabricate(:contact, code: "asd12") + Fabricate(:contact, code: "asd13") + } + + it 'should return array if argument is string' do + response = Contact.check_availability("asd12") + expect(response.class).to be Array + expect(response.length).to eq(1) + end + + it 'should return in_use and available codes' do + response = Contact.check_availability(["asd12","asd13","asd14"]) + expect(response.class).to be Array + expect(response.length).to eq(3) + + expect(response[0][:avail]).to eq(0) + expect(response[0][:code]).to eq("asd12") + + expect(response[1][:avail]).to eq(0) + expect(response[1][:code]).to eq("asd13") + + expect(response[2][:avail]).to eq(1) + expect(response[2][:code]).to eq("asd14") + end +end +