lib/prontoforms/client.rb
# frozen_string_literal: true
require 'faraday'
require 'json'
require 'prontoforms/resource_list'
require 'prontoforms/form_space'
require 'prontoforms/form_submission'
require 'prontoforms/user'
module ProntoForms
# Allows you to retrieve resources from ProntoForms and perform other
# functions with the API.
class Client
# @return [String] ProntoForms API key ID
attr_reader :api_key_id
# @return [String] ProntoForms API key secret
attr_reader :api_key_secret
# Create a client and use provided API credentials
# @param api_key_id Your ProntoForms REST API key
# @param api_key_secret Your ProntoForms REST API secret
def initialize(api_key_id, api_key_secret)
@api_key_id = api_key_id
@api_key_secret = api_key_secret
end
# Defines a resource that can be retrieved in a list
# @return [nil]
# @api private
# @!macro [attach] resource_list
# @method $1
# Retrieve a list of $2 resources
# @return [ResourceList] A ResourceList containing $2 results
def self.resource_list(method, resource, url = resource.resource_name)
define_method(method) do |query: {}|
res = connection.get do |req|
req.url url
query.each { |k, v| req.params[k] = v }
end
data = JSON.parse(res.body)
return nil if data.fetch('pageData').size.zero?
ResourceList.new(data, { 'p' => 0, 's' => 100 }.merge(query), method,
resource, self)
end
end
resource_list :form_spaces, FormSpace
resource_list :form_submissions, FormSubmission
# Retrieve a user by identifier
# @param id [String] The user identifier
# @return [User] A User object for the requested user
def user(id)
raise ArgumentError, 'id must be provided' if id.nil?
res = connection.get do |req|
req.url "users/#{id}"
end
User.new(JSON.parse(res.body), self)
end
# Retrieve a form space by its identifier
# @param id [String] The form space identifier
# @return [FormSpace] A FormSpace object
def form_space(id)
raise ArgumentError, 'id must be provided' if id.nil?
res = connection.get do |req|
req.url "formspaces/#{id}"
end
FormSpace.new(JSON.parse(res.body), self)
end
# Retrieve a form submission by identifier
# @param id [String] The form submission identifier
# @return [FormSubmission] A FormSubmission object
def form_submission(id)
return nil if id.nil?
res = connection.get do |req|
req.url "data/#{id}"
end
FormSubmission.new(JSON.parse(res.body), self)
end
# Create a connection that can be used to execute a request against the
# ProntoForms API.
# @return [Faraday::Connection]
# @api private
def connection
Faraday.new(url: 'https://api.prontoforms.com/api/1.1') do |conn|
conn.basic_auth(api_key_id, api_key_secret)
conn.use Faraday::Response::RaiseError
end
end
end
end