class Formio::Client

Attributes

email[R]
password[R]
project_url[R]

Public Class Methods

new(project_url, email: nil, password: nil, auth_token: nil) click to toggle source
# File lib/formio/client.rb, line 3
def initialize(project_url, email: nil, password: nil, auth_token: nil)
  @project_url = project_url
  @email = email
  @password = password
  @auth_token = auth_token
  login if email.present? && password.present?
end

Public Instance Methods

auth_token()
Alias for: login
compact_formio_hash(data, max_level=2) click to toggle source
# File lib/formio/client.rb, line 227
def compact_formio_hash(data, max_level=2)
  return unless data.is_a?(Hash) || data.is_a?(Array)
  data.each do |k,v|
    if max_level <= 0
      data.delete k
    else
      if(v.is_a?(Hash))
        compact_formio_hash(v, max_level - 1)
      end
      if(v.is_a?(Array))
        v.each { |elem| compact_formio_hash(elem, max_level) }
      end
    end
  end.compact
end
connection() click to toggle source
# File lib/formio/client.rb, line 178
def connection
  require 'faraday/detailed_logger'
  @connection ||= Faraday::Connection.new(project_url,
    ssl: { verify: true }
  ) do |builder|
    require 'faraday_curl'
    # require 'faraday-detailed_logger'
    require 'faraday-cookie_jar'
    # builder.request  :multipart
    # builder.use ::FaradayMiddleware::ParseJson, content_type: 'application/json'
    # builder.request  :url_encoded
    builder.request :curl
    builder.adapter  :net_http
    # builder.response :detailed_logger # <-- Inserts the logger into the connection.
  end
end
create(form:, values:) click to toggle source
# File lib/formio/client.rb, line 21
def create(form:, values:)
  values.each do |(k,_)|
    values[k] ||= ""
  end
  response = connection.post do |req|
    req.url "/#{form}/submission/"
    set_headers(req)
    req.body = {
      data: values
    }.to_json
  end
  if response.status >= 200 && response.status < 300
    Record.new(parse_response(response.body))
  else
    parse_response(response.body)['details'].map { |x| x['message'] }
  end
end
create_form(formio_form) click to toggle source
# File lib/formio/client.rb, line 112
def create_form(formio_form)
  raise "Must supply a formio form" unless formio_form.is_a?(::Formio::Form)
  response = connection.post do |req|
    req.url "/form"
    set_headers(req)
    req.body = formio_form.to_json
  end
  if response.status != 201
    raise (JSON.parse(response.body)['message'])
  end
  true
end
current_user() click to toggle source
# File lib/formio/client.rb, line 195
def current_user
  response = connection.get do |req|
    req.url '/current'
    set_headers(req)
  end
  return nil unless response.status >= 200 && response.status < 300
  Record.new(parse_response(response.body))
end
delete(form, submission_id) click to toggle source
# File lib/formio/client.rb, line 90
def delete(form, submission_id)
  response = connection.delete do |req|
    req.url "/#{form}/submission/#{submission_id}"
    set_headers(req)
  end
  response.status == 200
end
delete_form(form_name) click to toggle source
# File lib/formio/client.rb, line 137
def delete_form(form_name)
  response = connection.delete do |req|
    req.url "/#{form_name}"
    set_headers(req)
  end
  response.status == 200 || response.body == 'Invalid alias'
end
find_by(form, values=[]) click to toggle source
# File lib/formio/client.rb, line 73
def find_by(form, values=[])
  response = connection.get do |req|
    req.url "/#{form}/exists"
    set_headers(req)
    values.each do |(k,v)|
      k = 'data.' + k.to_s unless k.to_s.start_with?('data.')
      req.params[k] = v
    end
  end
  return find_by(form, values) if response.status == 502
  if response.status == 200
    return find_by_id(form, JSON.parse(response.body)['_id'])
  else
    Record::Nil.new
  end
end
find_by_id(form, submission_id) click to toggle source
# File lib/formio/client.rb, line 60
def find_by_id(form, submission_id)
  response = connection.get do |req|
    req.url "/#{form}/submission/#{submission_id}"
    set_headers(req)
  end
  return find_by_id form, submission_id if response.status == 502
  if response.status == 200
    Record.new(parse_response(response.body))
  else
    Record::Nil.new
  end
end
form_meta_data(form = 'form') click to toggle source
# File lib/formio/client.rb, line 98
def form_meta_data(form = 'form')
  response = connection.get do |req|
    req.url "/#{form}"
    set_headers(req)
  end
  response = parse_response(response.body)
  if response.is_a?(Array)
    return response.map do |f|
      ::Formio::Form.new f
    end
  end
  ::Formio::Form.new(response)
end
index(form) click to toggle source
# File lib/formio/client.rb, line 11
def index(form)
  response = connection.get do |req|
    req.url "/#{form}/submission?limit=1000000&skip=0&sort=-created"
    set_headers(req)
  end
  parse_response(response.body).map do |formio_hash|
    Record.new(formio_hash)
  end
end
login() click to toggle source
# File lib/formio/client.rb, line 204
def login
  @auth_token ||= begin
    return unless email
    formio_conn = Faraday::Connection.new("https://formio.form.io", ssl: { verify: true })

    login_response = formio_conn.post do |req|
      req.url "/user/login"
      req.headers['Content-Type'] = 'application/json'
      req.headers['Accept'] = 'application/json'
      req.body = {
        data: {
          email: email,
          password: password
        }
      }.to_json
    end
    login_response.headers['x-jwt-token']
  end
end
Also aliased as: auth_token
parse_response(response) click to toggle source
# File lib/formio/client.rb, line 151
def parse_response(response)
  # return early if it's already valid json
  # Some requests simply return json, some
  # have to be decoded
  begin
    return JSON.parse(response)
  rescue JSON::ParserError
  end

  read_gzip_data = -> (stringio) {
    begin
      Zlib::GzipReader.new(stringio, encoding: 'ASCII-8BIT')
    rescue Zlib::GzipFile::Error
      puts "An issue occured with formio: #{response}"
    rescue e
      puts "An issue occured with formio #{response}"
    end
  }

  response
    .try { |it| StringIO.new(it) }
    .try { |stringio| read_gzip_data.call(stringio) }
    .try { |reader| reader.read }
    .try { |json_string| JSON.parse(json_string) }
    .yield_self { |parsed_json| parsed_json || [] }
end
set_headers(req) click to toggle source
# File lib/formio/client.rb, line 145
def set_headers(req)
  req.headers['Content-Type'] = 'application/json'
  req.headers['Accept'] = 'application/json'
  req.headers['x-jwt-token'] = auth_token
end
update(record, max_depth: 2) click to toggle source
# File lib/formio/client.rb, line 39
def update(record, max_depth: 2)
  raise "Must supply a formio form" unless record.is_a?(Record)
  response = connection.put do |req|
    req.url "/#{record.form_name}/submission/#{record.id}"
    req.url "/form/#{record.form_id}/submission/#{record.id}" if record.form_id
    set_headers(req)
    req.body = compact_formio_hash(record.formio_hash, max_depth).to_json
  end

  return update(record) if response.status == 502
  if response.status >= 200 && response.status < 300
    Record.new(parse_response(response.body))
  else
    parse_response(response.body)['details'].map { |x| x['message'] }
  end

rescue Net::OpenTimeout
  binding.pry
  retry
end
update_form(formio_form) click to toggle source
# File lib/formio/client.rb, line 125
def update_form(formio_form)
  raise "Must supply a formio form" unless formio_form.is_a?(::Formio::Form)
  response = connection.put do |req|
    req.url "/form/#{formio_form.id}"
    set_headers(req)
    req.body = formio_form.to_json
  end
  if response.status >= 200 && response.status < 300
    parse_response(response.body)
  end
end