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
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