diff --git a/app/helpers/epp/contacts_helper.rb b/app/helpers/epp/contacts_helper.rb index 024c1269a..fd0c9ff34 100644 --- a/app/helpers/epp/contacts_helper.rb +++ b/app/helpers/epp/contacts_helper.rb @@ -135,6 +135,9 @@ module Epp::ContactsHelper contact_hash = contact_hash.merge( Address.extract_attributes((prms.try(:[], :postalInfo) || [])) ) + contact_hash[:disclosure_attributes] = + ContactDisclosure.extract_attributes(parsed_frame) + contact_hash end diff --git a/app/models/contact.rb b/app/models/contact.rb index bdd4de6f2..d06af8cb5 100644 --- a/app/models/contact.rb +++ b/app/models/contact.rb @@ -8,6 +8,7 @@ class Contact < ActiveRecord::Base has_one :local_address has_one :international_address + has_one :disclosure, class_name: 'ContactDisclosure' has_many :domain_contacts has_many :domains, through: :domain_contacts @@ -15,9 +16,8 @@ class Contact < ActiveRecord::Base belongs_to :created_by, class_name: 'EppUser', foreign_key: :created_by_id belongs_to :updated_by, class_name: 'EppUser', foreign_key: :updated_by_id - accepts_nested_attributes_for :local_address, :international_address + accepts_nested_attributes_for :local_address, :international_address, :disclosure - # validates_presence_of :code, :phone, :email, :ident validates :code, :phone, :email, :ident, presence: true validate :ident_must_be_valid @@ -25,7 +25,6 @@ class Contact < ActiveRecord::Base validates :phone, format: /\+[0-9]{1,3}\.[0-9]{1,14}?/ # /\+\d{3}\.\d+/ validates :email, format: /@/ - # validates_uniqueness_of :code, message: :epp_id_taken validates :code, uniqueness: { message: :epp_id_taken } delegate :name, to: :international_address diff --git a/app/models/contact_disclosure.rb b/app/models/contact_disclosure.rb new file mode 100644 index 000000000..61bd4794a --- /dev/null +++ b/app/models/contact_disclosure.rb @@ -0,0 +1,46 @@ +class ContactDisclosure < ActiveRecord::Base + belongs_to :contact + + # value is true or false depending on disclosure flag + # rules are the contents of disclose element + class << self + def extract_attributes(parsed_frame) + disclosure_hash = {} + rules = parsed_frame.css('disclose').first + return disclosure_hash unless rules.present? + value = rules.attributes['flag'].value + disclosure_hash = parse_disclose_xml(rules) + + disclosure_hash.each do |k, _v| + disclosure_hash[k] = value + end + disclosure_hash + end + + private + + def parse_disclose_xml(rules) + { int_name: parse_element_attributes_for('name', rules.children, 'int'), + int_org_name: parse_element_attributes_for('org_name', rules.children, 'int'), + int_addr: parse_element_attributes_for('addr', rules.children, 'int'), + loc_name: parse_element_attributes_for('name', rules.children, 'loc'), + loc_org_name: parse_element_attributes_for('org_name', rules.children, 'loc'), + loc_addr: parse_element_attributes_for('addr', rules.children, 'loc'), + phone: rules.css('voice').present?, + email: rules.css('email').present?, + fax: rules.css('fax').present? + }.delete_if { |_k, v| v.nil? || v == false } + end + + # el is the element we are looking for + # rules are the contents of disclose element + # value is loc/int depending on what type of el we are looking for + def parse_element_attributes_for(el, rules, value) + rules.css(el).each do |rule| + next unless rule.try(:attributes) || rule.attributes['type'] + return rule.attributes['type'].value.present? if rule.attributes['type'].value == value + end + nil + end + end +end diff --git a/db/migrate/20140828133057_create_contact_disclosures.rb b/db/migrate/20140828133057_create_contact_disclosures.rb new file mode 100644 index 000000000..2fcd3393c --- /dev/null +++ b/db/migrate/20140828133057_create_contact_disclosures.rb @@ -0,0 +1,19 @@ +class CreateContactDisclosures < ActiveRecord::Migration + def change + create_table :contact_disclosures do |t| + t.integer :contact_id + + t.boolean :int_name, default: false + t.boolean :int_org_name, default: false + t.boolean :int_addr, default: false + t.boolean :loc_name, default: false + t.boolean :loc_org_name, default: false + t.boolean :loc_addr, default: false + t.boolean :phone, default: false + t.boolean :fax, default: false + t.boolean :email, default: false + + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb index 44356c295..d4ed1d865 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20140828080320) do +ActiveRecord::Schema.define(version: 20140828133057) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -31,6 +31,21 @@ ActiveRecord::Schema.define(version: 20140828080320) do t.string "type" end + create_table "contact_disclosures", force: true do |t| + t.integer "contact_id" + t.boolean "int_name", default: false + t.boolean "int_org_name", default: false + t.boolean "int_addr", default: false + t.boolean "loc_name", default: false + t.boolean "loc_org_name", default: false + t.boolean "loc_addr", default: false + t.boolean "phone", default: false + t.boolean "fax", default: false + t.boolean "email", default: false + t.datetime "created_at" + t.datetime "updated_at" + end + create_table "contacts", force: true do |t| t.string "code" t.string "type" @@ -104,6 +119,11 @@ ActiveRecord::Schema.define(version: 20140828080320) do t.string "period_unit", limit: 1 end + create_table "domains_nameservers", force: true do |t| + t.integer "domain_id" + t.integer "nameserver_id" + end + create_table "epp_sessions", force: true do |t| t.string "session_id" t.text "data" diff --git a/spec/models/contact_disclosure_spec.rb b/spec/models/contact_disclosure_spec.rb new file mode 100644 index 000000000..12acc8efd --- /dev/null +++ b/spec/models/contact_disclosure_spec.rb @@ -0,0 +1,28 @@ +require 'rails_helper' + +describe ContactDisclosure do + it { should belong_to(:contact) } +end + +describe '.extract_attributes' do + it 'should return empty hash for empty arguments' do + result = ContactDisclosure.extract_attributes(Nokogiri::XML::Document.new) + expect(result).to eq({}) + end + + it 'should return empty hash if no disclosure' do + parsed_frame = Nokogiri::XML(contact_create_xml).remove_namespaces! + result = ContactDisclosure.extract_attributes(parsed_frame) + expect(result).to eq({}) + end + + # TODO: remodel create contact xml to support disclosure + it 'should return disclosure has if disclosure' do + f = File.open('spec/epp/requests/contacts/create_with_two_addresses.xml') + parsed_frame = Nokogiri::XML(f).remove_namespaces! + f.close + result = ContactDisclosure.extract_attributes(parsed_frame) + expect(result).to eq({ phone: '0', email: '0' }) + end +end +