diff --git a/app/api/repp/contact_v1.rb b/app/api/repp/contact_v1.rb index cdcc3ff6f..6a3cae33b 100644 --- a/app/api/repp/contact_v1.rb +++ b/app/api/repp/contact_v1.rb @@ -34,18 +34,29 @@ module Repp desc 'Creates a new contact object' params do requires :contact, type: Hash, allow_blank: false do + # Contact info requires :name, type: String, desc: 'Full name of contact' - requires :ident, type: String, desc: 'Government identifier of contact' - requires :ident_type, type: String, desc: 'Type of contact ident' - requires :ident_country_code, type: String, desc: 'Ident country code' - requires :country_code, type: String, desc: 'Address country' requires :phone, type: String, desc: 'Phone number of contact. In format of +country_prefix.number' requires :email, type: String, desc: 'Email address of contact' - optional :fax, type: String, desc: 'Fax number of contact' - optional :street, type: String, desc: 'Address street' - optional :city, type: String, desc: 'Address city' - optional :zip, type: String, desc: 'Address ZIP' + optional :fax, type: String, allow_blank: true, desc: 'Fax number of contact' + + # Ident + requires :ident, type: Hash do + requires :ident, type: String, allow_blank: false, desc: 'Government identifier of contact' + requires :ident_type, type: String, allow_blank: false, desc: 'Type of contact ident' + requires :ident_country_code, type: String, allow_blank: false, desc: 'Ident country code' + end + + # Physical address + optional :addr, type: Hash do + requires :country_code, type: String, allow_blank: false, desc: 'Address country' + requires :street, type: String, allow_blank: false, desc: 'Address street' + requires :city, type: String, allow_blank: false, desc: 'Address city' + requires :zip, type: String, allow_blank: false, desc: 'Address ZIP' + end end + + # Legal document optional :legal_document, type: Hash, allow_blank: false do requires :body, type: String, desc: 'Raw data of legal document' requires :type, type: String, desc: 'Format of legal document' @@ -54,9 +65,20 @@ module Repp post '/' do @legal_doc = params[:legal_documents] - @contact = Contact.new(params[:contact]) - @contact.registrar = current_user.registrar - action = Actions::ContactCreate.new(@contact, @legal_doc) + @contact_params = params[:contact] + + # Ident object + @ident = @contact_params[:ident] + @contact_params.delete(:ident) + + # Address + %w[city street zip country_code].each { |k| @contact_params[k] = @contact_params[:addr][k] } + @contact_params.delete(:addr) + + @contact = Epp::Contact.new(@contact_params, current_user.registrar, epp: false) + puts "#{params[:contact]}" + + action = Actions::ContactCreate.new(@contact, @legal_doc, @ident) if action.call @response = { contact: { id: @contact.code } } @@ -89,7 +111,7 @@ module Repp end end - post '/:code' do + put '/:code' do @contact = current_user.registrar.contacts.find_by(code: params[:code]) (status(:not_found) && return) unless @contact diff --git a/app/controllers/epp/contacts_controller.rb b/app/controllers/epp/contacts_controller.rb index 5b2323919..cfaaeb89e 100644 --- a/app/controllers/epp/contacts_controller.rb +++ b/app/controllers/epp/contacts_controller.rb @@ -25,7 +25,7 @@ module Epp @contact = Epp::Contact.new(params[:parsed_frame], current_user.registrar) collected_data = ::Deserializers::Xml::ContactCreate.new(params[:parsed_frame]) - action = Actions::ContactCreate.new(@contact, collected_data.legal_document) + action = Actions::ContactCreate.new(@contact, collected_data.legal_document, collected_data.ident) if action.call if !address_processing? && address_given? diff --git a/app/models/actions/contact_create.rb b/app/models/actions/contact_create.rb index a79876f4e..4cb6607ae 100644 --- a/app/models/actions/contact_create.rb +++ b/app/models/actions/contact_create.rb @@ -1,15 +1,17 @@ module Actions class ContactCreate - attr_reader :contact, :legal_document + attr_reader :contact, :legal_document, :ident - def initialize(contact, legal_document) + def initialize(contact, legal_document, ident) @contact = contact @legal_document = legal_document + @ident = ident end def call maybe_remove_address maybe_attach_legal_doc + validate_ident commit end @@ -23,6 +25,24 @@ module Actions contact.country_code = nil end + def validate_ident + if ident.present? && ident[:ident_type].blank? + contact.add_epp_error('2003', nil, 'ident_type', I18n.t('errors.messages.required_ident_attribute_missing')) + @error = true + end + + if ident.present? && ident[:ident_type] != 'birthday' && ident[:ident_country_code].blank? + contact.add_epp_error('2003', nil, 'ident_country_code', I18n.t('errors.messages.required_ident_attribute_missing')) + @error = true + end + + identifier = ::Contact::Ident.new(code: ident[:ident], type: ident[:ident_type], + country_code: ident[:ident_country_code]) + + identifier.validate + contact.identifier = identifier + end + def maybe_attach_legal_doc return unless legal_document @@ -36,8 +56,9 @@ module Actions end def commit - contact.generate_code + return false if @error + contact.generate_code contact.save end end diff --git a/app/models/epp/contact.rb b/app/models/epp/contact.rb index 6867b037d..50ebac065 100644 --- a/app/models/epp/contact.rb +++ b/app/models/epp/contact.rb @@ -30,12 +30,13 @@ class Epp::Contact < Contact at end - def new(frame, registrar) + def new(frame, registrar, epp: true) return super if frame.blank? + attrs = epp ? attrs_from(frame, new_record: true) : frame super( - attrs_from(frame, new_record: true).merge( - code: frame.css('id').text, + attrs.merge( + code: epp ? frame.css('id').text : frame[:id], registrar: registrar ) ) diff --git a/lib/deserializers/xml/contact_create.rb b/lib/deserializers/xml/contact_create.rb index 7f5cb3709..5bd9c768a 100644 --- a/lib/deserializers/xml/contact_create.rb +++ b/lib/deserializers/xml/contact_create.rb @@ -18,6 +18,10 @@ module Deserializers def legal_document @legal_document ||= ::Deserializers::Xml::LegalDocument.new(frame).call end + + def ident + @ident ||= ::Deserializers::Xml::Ident.new(frame).call + end end end end