Class: BlueStateDigital::SignupForm

Inherits:
ApiDataModel show all
Defined in:
lib/blue_state_digital/signup_form.rb

Constant Summary collapse

FIELDS =
[:id, :name, :slug, :public_title, :create_dt]

Constants inherited from ApiDataModel

ApiDataModel::FIELD

Instance Attribute Summary

Attributes inherited from ApiDataModel

#connection

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from ApiDataModel

#initialize, #to_hash

Constructor Details

This class inherits a constructor from BlueStateDigital::ApiDataModel

Class Method Details

.clone(clone_from_id:, slug:, name:, public_title:, connection:) ⇒ Object



23
24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/blue_state_digital/signup_form.rb', line 23

def self.clone(clone_from_id:, slug:, name:, public_title:, connection:)
  params = {signup_form_id: clone_from_id, title: public_title, signup_form_name: name, slug: slug}
  xml_response = connection.perform_request '/signup/clone_form', {}, 'POST', params

  doc = Nokogiri::XML(xml_response)
  record = doc.xpath('//signup_form').first
  if record
    id = record.xpath('id').text.to_i
    SignupForm.new(id: id, name: name, slug: slug, public_title: public_title, connection: connection)
  else
    raise "Cloning signup form failed with message: #{xml_response}"
  end
end

Instance Method Details

#form_fieldsObject



80
81
82
83
84
85
86
87
88
89
90
91
# File 'lib/blue_state_digital/signup_form.rb', line 80

def form_fields
  if @_form_fields.nil?
    xml_response = connection.perform_request '/signup/list_form_fields', {signup_form_id: id}, 'GET', nil
    doc = Nokogiri::XML(xml_response)

    @_form_fields = []
    doc.xpath('//signup_form_field').each do |form_field_record|
      @_form_fields << SignupFormField.from_xml(form_field_record)
    end
  end
  @_form_fields
end

#process_signup(field_data:, email_opt_in: false, source: nil, subsource: nil) ⇒ Object

field_data is a hash mapping field labels to field values, like Name’ => ‘Alice’



38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/blue_state_digital/signup_form.rb', line 38

def (field_data:, email_opt_in: false, source: nil, subsource: nil)
  # Construct the XML to send
  builder = Builder::XmlMarkup.new
  builder.instruct! :xml, version: '1.0', encoding: 'utf-8'
  xml_body = builder.api do |api|
    api.(id: self.id) do |form|
      form_fields.each do |field|
        form.(field_data[field.label], id: field.id)
      end
      unless email_opt_in.nil?
        form.email_opt_in(email_opt_in ? '1' : '0')            
      end
      form.source(source) unless source.nil?
      form.subsource(subsource) unless subsource.nil?
    end
  end

  # Post it to the endpoint
  begin
    response = connection.perform_request_raw '/signup/process_signup', {}, 'POST', xml_body
    if response.status >= 200 && response.status < 300
      return true
    else
      raise "process signup failed with message: #{response.body}"
    end
  rescue BlueStateDigital::XmlErrorResponse => err
    begin
      errors = {}
      error_xmls = Nokogiri::XML(err.message).xpath('//error')
      error_xmls.each do |error_xml|
        field = form_fields.select{|field| field.id.to_s == error_xml.xpath('signup_form_field_id').text}.first
        errors[field.label] = error_xml.xpath('description').text
        raise "process_signup failed with errors: #{errors}"
      end
    end
  end
end

#set_cons_group(cons_group_id) ⇒ Object



76
77
78
# File 'lib/blue_state_digital/signup_form.rb', line 76

def set_cons_group(cons_group_id)
  connection.perform_request('/signup/set_cons_group', {signup_form_id: self.id}, 'POST', {cons_group_id: cons_group_id})
end