diff --git a/lib/deserializers/xml/dnssec.rb b/lib/deserializers/xml/dnssec.rb index 203e13197..f255716d4 100644 --- a/lib/deserializers/xml/dnssec.rb +++ b/lib/deserializers/xml/dnssec.rb @@ -56,6 +56,10 @@ module Deserializers end end + def call + key_data + ds_data + end + def mark_destroy_all(dns_keys) # if transition support required mark_destroy dns_keys when has ds/key values otherwise ... dns_keys.map { |inf_data| mark(inf_data) } diff --git a/lib/deserializers/xml/domain_update.rb b/lib/deserializers/xml/domain_update.rb new file mode 100644 index 000000000..f89eef8f2 --- /dev/null +++ b/lib/deserializers/xml/domain_update.rb @@ -0,0 +1,76 @@ +require 'deserializers/xml/legal_document' +require 'deserializers/xml/domain' +require 'deserializers/xml/nameserver' +require 'deserializers/xml/dnssec' +module Deserializers + module Xml + class DomainUpdate + attr_reader :frame, :registrar + + def initialize(frame, registrar) + @frame = frame + @registrar = registrar + end + + def call + obj = { domain: frame.css('name')&.text, registrant: registrant, contacts: contacts, + auth_info: if_present('pw'), nameservers: nameservers, dns_keys: dns_keys } + + obj.reject { |_key, val| val.blank? } + end + + def registrant + return if frame.css('chg > registrant').blank? + + { code: frame.css('chg > registrant').text, verified: frame.css('chg > registrant').attr('verified').to_s.downcase == 'yes' } + end + + def contacts + contacts = [] + frame.css('add > contact').each do |c| + contacts << { code: c.text, type: c['type'], action: 'add' } + end + + frame.css('rem > contact').each do |c| + contacts << { code: c.text, type: c['type'], action: 'rem' } + end + + contacts.present? ? contacts : nil + end + + def nameservers + nameservers = [] + frame.css('add > ns > hostAttr').each do |ns| + nsrv = { nameserver: ns.css('hostName').text, host_addr: [], action: 'add' } + ns.css('hostAddr').each { |ha| nsrv[:host_addr] << { proto: ha.attr('ip').to_s.downcase, addr: ha.text } } + nameservers << nsrv + end + + frame.css('rem > ns > hostAttr').each do |ns| + nsrv = { nameserver: ns.css('hostName').text, host_addr: [], action: 'rem' } + ns.css('hostAddr').each { |ha| nsrv[:host_addr] << { proto: ha.attr('ip').to_s.downcase, addr: ha.text } } + nameservers << nsrv + end + + nameservers.present? ? nameservers : nil + end + + def dns_keys + added = ::Deserializers::Xml::DnssecKeys.new(frame.css('add')).call + added.each { |k| k[:action] = 'add' } + removed = ::Deserializers::Xml::DnssecKeys.new(frame.css('rem')).call + removed.each { |k| k[:action] = 'rem' } + + return unless (added + removed).present? + + added + removed + end + + def if_present(css_path) + return if frame.css(css_path).blank? + + frame.css(css_path).text + end + end + end +end