hellosign-ruby-sdk 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +18 -0
- data/.rspec +2 -0
- data/.travis.yml +15 -0
- data/Gemfile +13 -0
- data/Guardfile +14 -0
- data/LICENSE.txt +22 -0
- data/README.md +58 -0
- data/Rakefile +16 -0
- data/hellosign-ruby-sdk.gemspec +27 -0
- data/lib/hello_sign.rb +32 -0
- data/lib/hello_sign/api.rb +7 -0
- data/lib/hello_sign/api/account.rb +69 -0
- data/lib/hello_sign/api/embedded.rb +27 -0
- data/lib/hello_sign/api/oauth.rb +63 -0
- data/lib/hello_sign/api/signature_request.rb +286 -0
- data/lib/hello_sign/api/team.rb +88 -0
- data/lib/hello_sign/api/template.rb +77 -0
- data/lib/hello_sign/api/unclaimed_draft.rb +127 -0
- data/lib/hello_sign/client.rb +211 -0
- data/lib/hello_sign/configuration.rb +56 -0
- data/lib/hello_sign/error.rb +48 -0
- data/lib/hello_sign/resource.rb +8 -0
- data/lib/hello_sign/resource/account.rb +24 -0
- data/lib/hello_sign/resource/base_resource.rb +60 -0
- data/lib/hello_sign/resource/embedded.rb +24 -0
- data/lib/hello_sign/resource/resource_array.rb +33 -0
- data/lib/hello_sign/resource/signature_request.rb +25 -0
- data/lib/hello_sign/resource/team.rb +24 -0
- data/lib/hello_sign/resource/template.rb +25 -0
- data/lib/hello_sign/resource/unclaimed_draft.rb +25 -0
- data/lib/hello_sign/version.rb +3 -0
- data/spec/fixtures/account.json +1 -0
- data/spec/fixtures/embedded.json +6 -0
- data/spec/fixtures/error.json +6 -0
- data/spec/fixtures/file.json +0 -0
- data/spec/fixtures/signature_request.json +2 -0
- data/spec/fixtures/signature_requests.json +14 -0
- data/spec/fixtures/team.json +19 -0
- data/spec/fixtures/template.json +1 -0
- data/spec/fixtures/templates.json +11 -0
- data/spec/fixtures/token.json +14 -0
- data/spec/fixtures/unclaimed_draft.json +6 -0
- data/spec/hello_sign/api/account_spec.rb +36 -0
- data/spec/hello_sign/api/embedded_spec.rb +19 -0
- data/spec/hello_sign/api/oauth_spec.rb +28 -0
- data/spec/hello_sign/api/signature_request_spec.rb +126 -0
- data/spec/hello_sign/api/team_spec.rb +94 -0
- data/spec/hello_sign/api/template_spec.rb +67 -0
- data/spec/hello_sign/api/unclaimed_draft_spec.rb +35 -0
- data/spec/hello_sign/client_spec.rb +132 -0
- data/spec/hello_sign/resource/base_resource_spec.rb +50 -0
- data/spec/hello_sign_spec.rb +35 -0
- data/spec/spec_helper.rb +78 -0
- metadata +216 -0
@@ -0,0 +1,88 @@
|
|
1
|
+
module HelloSign
|
2
|
+
module Api
|
3
|
+
|
4
|
+
#
|
5
|
+
# Contains all the api calls for the Team resource.
|
6
|
+
# Take a look at our {https://www.hellosign.com/api/reference#Team team api document}
|
7
|
+
# for more information about this.
|
8
|
+
#
|
9
|
+
# @author [hellosign]
|
10
|
+
#
|
11
|
+
module Team
|
12
|
+
|
13
|
+
#
|
14
|
+
# Returns information about your Team as well as a list of its members.
|
15
|
+
# If you do not belong to a Team, HelloSign::Error::NotFound will be raised
|
16
|
+
#
|
17
|
+
# @return [HelloSign::Resource::Team] your current Team
|
18
|
+
#
|
19
|
+
# @example
|
20
|
+
# team = @client.get_team
|
21
|
+
def get_team
|
22
|
+
HelloSign::Resource::Team.new get("/team")
|
23
|
+
end
|
24
|
+
|
25
|
+
#
|
26
|
+
# Creates a new Team and makes you a member. You must not currently belong to a Team to invoke.
|
27
|
+
# @option opts [String] name The name of your Team
|
28
|
+
#
|
29
|
+
# @return [HelloSign::Resource::Team] new created Team
|
30
|
+
#
|
31
|
+
# @example
|
32
|
+
# team = @client.create_team :name => 'Team America World Police'
|
33
|
+
def create_team opts
|
34
|
+
HelloSign::Resource::Team.new post("/team/create", :body => opts)
|
35
|
+
end
|
36
|
+
|
37
|
+
#
|
38
|
+
# Updates the name of your Team.
|
39
|
+
# @option opts [String] name The name of your Team
|
40
|
+
#
|
41
|
+
# @return [HelloSign::Resource::Team] a Team object
|
42
|
+
#
|
43
|
+
# @example
|
44
|
+
# team = @client.update_team :name => 'New Team Name'
|
45
|
+
def update_team opts
|
46
|
+
HelloSign::Resource::Team.new post("/team", :body => opts)
|
47
|
+
end
|
48
|
+
|
49
|
+
#
|
50
|
+
# Deletes your Team. Can only be invoked when you have a Team with only one member (yourself).
|
51
|
+
#
|
52
|
+
# @example
|
53
|
+
# team = @client.destroy_team
|
54
|
+
def destroy_team
|
55
|
+
post("/team/destroy")
|
56
|
+
end
|
57
|
+
|
58
|
+
#
|
59
|
+
# Adds or invites a user (specified using the email_address parameter) to your Team.
|
60
|
+
# If the user does not currently have a HelloSign Account, a new one will be created for them.
|
61
|
+
# If the user currently has a paid subscription, they will not automatically join the Team but instead will be sent an invitation to join.
|
62
|
+
# If a user is already a part of another Team, a "team_invite_failed" error will be returned.
|
63
|
+
# @option opts [String] account_id The id of the Account of the user to invite to your Team. The account id prevails if both email_address and acccount_id are provided.
|
64
|
+
# @option opts [String] email_address The email address of the Account of the user to invite to your Team. The account id prevails if both email_address and acccount_id are provided.
|
65
|
+
#
|
66
|
+
# @return [HelloSign::Resource::Team] updated Team object
|
67
|
+
#
|
68
|
+
# @example
|
69
|
+
# team = @client.add_member_to_team :email_address => 'george@example.com'
|
70
|
+
def add_member_to_team opts
|
71
|
+
HelloSign::Resource::Team.new post("/team/add_member", :body => opts)
|
72
|
+
end
|
73
|
+
|
74
|
+
|
75
|
+
#
|
76
|
+
# Removes a user from your Team. If the user had an outstanding invitation to your Team the invitation will be expired.
|
77
|
+
# @option opts [String] account_id The id of the Account of the user to invite to your Team. The account id prevails if both email_address and acccount_id are provided.
|
78
|
+
# @option opts [String] email_address The email address of the Account of the user to invite to your Team. The account id prevails if both email_address and acccount_id are provided.
|
79
|
+
#
|
80
|
+
# @return [HelloSign::Resource::Team] updated Team object
|
81
|
+
# @example
|
82
|
+
# team = @client.remove_member_from_team :email_address => 'george@example.com'
|
83
|
+
def remove_member_from_team opts
|
84
|
+
HelloSign::Resource::Team.new post("/team/remove_member", :body => opts)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
module HelloSign
|
2
|
+
module Api
|
3
|
+
|
4
|
+
#
|
5
|
+
# Contains all the api calls for the Template resource.
|
6
|
+
# Take a look at our {https://www.hellosign.com/api/templatesAndApiWalkthrough template form api document}
|
7
|
+
# for more information about this.
|
8
|
+
#
|
9
|
+
# @author [hellosign]
|
10
|
+
#
|
11
|
+
module Template
|
12
|
+
|
13
|
+
#
|
14
|
+
# Retrieves the Template specified by the id parameter.
|
15
|
+
# @option opts [String] template_id The id of the Template to retrieve.
|
16
|
+
#
|
17
|
+
# @return [HelloSign::Resource::Template] a Template object
|
18
|
+
#
|
19
|
+
# @example
|
20
|
+
# template = @client.get_template :template_id => 'f57db65d3f933b5316d398057a36176831451a35'
|
21
|
+
#
|
22
|
+
def get_template opts
|
23
|
+
HelloSign::Resource::Template.new get("/template/#{opts[:template_id]}")
|
24
|
+
end
|
25
|
+
|
26
|
+
#
|
27
|
+
# Retrieves the Templates for the current user account.
|
28
|
+
#
|
29
|
+
# @option opts [Integer] page (1) Which page number of the Template List to return.
|
30
|
+
#
|
31
|
+
# @return [HelloSign::Resource::ResourceArray] a ResourceArray object
|
32
|
+
# @example
|
33
|
+
# templates = @client.get_templates :page => 1
|
34
|
+
#
|
35
|
+
def get_templates opts={}
|
36
|
+
path = '/template/list'
|
37
|
+
path += opts[:page] ? "?page=#{opts[:page]}" : ""
|
38
|
+
HelloSign::Resource::ResourceArray.new get(path, opts), "templates", HelloSign::Resource::Template
|
39
|
+
end
|
40
|
+
|
41
|
+
|
42
|
+
#
|
43
|
+
# Gives the specified Account on your team access to a Template
|
44
|
+
#
|
45
|
+
# @option opts [String] template_id The id of the Template to give access to.
|
46
|
+
# @option opts [String] account_id The id of the Account to get access. The account_id prevails if account_id and email_address are both provided.
|
47
|
+
# @option opts [String] email_address The email address of the Account to give access to the Template. The account_id prevails if account_id and email_address are both provided.
|
48
|
+
#
|
49
|
+
# @return [Template] a Template object
|
50
|
+
# @example
|
51
|
+
# templates = @client.add_user_to_template :template_id => 'f57db65d3f933b5316d398057a36176831451a35', :email_address => 'george@example.com'
|
52
|
+
#
|
53
|
+
def add_user_to_template opts
|
54
|
+
path = "/template/add_user/#{opts[:template_id]}"
|
55
|
+
opts.delete(:template_id)
|
56
|
+
HelloSign::Resource::Template.new post(path, :body => opts)
|
57
|
+
end
|
58
|
+
|
59
|
+
#
|
60
|
+
# Removes the specified Account's access to the specified Template.
|
61
|
+
# The user can be designated using their account ID or email address.
|
62
|
+
# @option opts [String] template_id The id of the Template to remove the Account access to.
|
63
|
+
# @option opts [String] account_id The id of the Account to remove access to the Template. The account_id prevails if account_id and email_address are both provided.
|
64
|
+
# @option opts [String] email_address The email address of the Account to remove access to the Template. The account_id prevails if account_id and email_address are both provided.
|
65
|
+
#
|
66
|
+
# @return [Template] a Template object
|
67
|
+
# @example
|
68
|
+
# templates = @client.remove_user_from_template :template_id => 'f57db65d3f933b5316d398057a36176831451a35', :email_address => 'george@example.com'
|
69
|
+
#
|
70
|
+
def remove_user_from_template opts
|
71
|
+
path = "/template/remove_user/#{opts[:template_id]}"
|
72
|
+
opts.delete(:template_id)
|
73
|
+
HelloSign::Resource::Template.new post(path, :body => opts)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,127 @@
|
|
1
|
+
module HelloSign
|
2
|
+
module Api
|
3
|
+
|
4
|
+
#
|
5
|
+
# Contains all the api calls for the UnclaimedDraft resource.
|
6
|
+
# Take a look at our {https://www.hellosign.com/api/reference#UnclaimedDraft unclaimed draft document}
|
7
|
+
# for more information about this.
|
8
|
+
#
|
9
|
+
# @author [hellosign]
|
10
|
+
#
|
11
|
+
module UnclaimedDraft
|
12
|
+
|
13
|
+
#
|
14
|
+
# Creates a new Draft that can be claimed using the claim URL.
|
15
|
+
# The first authenticated user to access the URL will claim the Draft and will be shown either the "Sign and send" or the "Request signature" page with the Draft loaded.
|
16
|
+
# Subsequent access to the claim URL will result in a 404 not found.
|
17
|
+
# If the type is "send_document" then only the file parameter is required.
|
18
|
+
# If the type is "request_signature", then the identities of the signers and optionally
|
19
|
+
# the location of signing elements on the page are also required.
|
20
|
+
# @option opts [Integer] test_mode (0) Whether this is a test, the signature request will not be legally binding if set to 1.
|
21
|
+
# @option opts [Array<String>] files Use files to indicate the uploaded file(s) to send for signature. Currently we only support use of either the files parameter or file_urls parameter, not both.
|
22
|
+
# @option opts [Array<String>] file_urls Use file_urls to have HelloSign download the file(s) to send for signature. Currently we only support use of either the files parameter or file_urls parameter, not both.
|
23
|
+
# @option opts [String] type The type of unclaimed draft to create. Use "send_document" to create a claimable file, and "request_signature" for a claimable signature request. If the type is "request_signature" then signers name and email_address are not optional.
|
24
|
+
# @option opts [String] subject The subject in the email that will be sent to the signers.
|
25
|
+
# @option opts [String] message The custom message in the email that will be sent to the signers.
|
26
|
+
# @option opts [String] signing_redirect_url The URL you want the signer redirected to after they successfully sign. (optional)
|
27
|
+
#
|
28
|
+
# @option opts [Array<Hash>] signers List of signers, each item is a Hash with these keys:
|
29
|
+
# * :name (String) Sender' name
|
30
|
+
# * :email_address (String) Sender's email address
|
31
|
+
# * :order (Integer) The order the signer is required to sign in (optional)
|
32
|
+
# * :pin (Integer) The 4-digit code that will secure this signer's signature page. You must have a business plan to use this feature. (optional)
|
33
|
+
# @option opts [Array<String>] cc_email_addresses The email addresses that should be CCed.
|
34
|
+
# @option opts [String] form_fields_per_document
|
35
|
+
#
|
36
|
+
# @return [HelloSign::Resource::UnclaimedDraft] a UnclaimedDraft object
|
37
|
+
#
|
38
|
+
# @example send_document
|
39
|
+
# unclaimed_draft = @client.create_unclaimed_draft(
|
40
|
+
# :test_mode => 1,
|
41
|
+
# :files => ['NDA.pdf', 'AppendixA.pdf']
|
42
|
+
# )
|
43
|
+
# @example request_signature
|
44
|
+
# unclaimed_draft = @client.create_unclaimed_draft(
|
45
|
+
# :test_mode => 1,
|
46
|
+
# :type => 'request_signature',
|
47
|
+
# :subject => 'The NDA we talked about',
|
48
|
+
# :message => 'Please sign this NDA and then we can discuss more. Let me know if you have any questions.',
|
49
|
+
# :signers => [{
|
50
|
+
# :email_address => 'jack@example.com',
|
51
|
+
# :name => 'Jack',
|
52
|
+
# :order => 0
|
53
|
+
# },{
|
54
|
+
# :email_address => 'jill@example.com',
|
55
|
+
# :name => 'Jill',
|
56
|
+
# :order => 1
|
57
|
+
# }
|
58
|
+
# ],
|
59
|
+
# :cc_email_addresses => ['lawyer@example.com', 'lawyer@example2.com'],
|
60
|
+
# :files => ['NDA.pdf', 'AppendixA.pdf']
|
61
|
+
# )
|
62
|
+
#
|
63
|
+
def create_unclaimed_draft opts
|
64
|
+
prepare_files opts
|
65
|
+
if opts[:type] == 'request_signature'
|
66
|
+
prepare_signers opts
|
67
|
+
end
|
68
|
+
|
69
|
+
HelloSign::Resource::UnclaimedDraft.new post('/unclaimed_draft/create', :body => opts)
|
70
|
+
end
|
71
|
+
|
72
|
+
|
73
|
+
#
|
74
|
+
# Creates a new embedded unclaimed draft object that can be launched in an iframe using the claim URL.
|
75
|
+
# @option opts [Integer] test_mode (0) Whether this is a test, the signature request will not be legally binding if set to 1.
|
76
|
+
# @option opts [Integer] is_for_embedded_signing set this to 1 to to mix embedded requesting and embedded signing.
|
77
|
+
# @option opts [Array<String>] files Use files to indicate the uploaded file(s) to send for signature. Currently we only support use of either the files parameter or file_urls parameter, not both.
|
78
|
+
# @option opts [Array<String>] file_urls Use file_urls to have HelloSign download the file(s) to send for signature. Currently we only support use of either the files parameter or file_urls parameter, not both.
|
79
|
+
# @option opts [String] type The type of unclaimed draft to create. Should be "request_signature" for a claimable signature request. If the type is "request_signature" then signers name and email_address are not optional.
|
80
|
+
# @option opts [String] subject The subject in the email that will be sent to the signers.
|
81
|
+
# @option opts [String] requester_email_address The email address of the requester.
|
82
|
+
# @option opts [String] message The custom message in the email that will be sent to the signers.
|
83
|
+
# @option opts [String] signing_redirect_url The URL you want the signer redirected to after they successfully sign. (optional)
|
84
|
+
#
|
85
|
+
# @option opts [Array<Hash>] signers List of signers, each item is a Hash with these keys:
|
86
|
+
# * :name (String) Sender' name
|
87
|
+
# * :email_address (String) Sender's email address
|
88
|
+
# * :order (Integer) The order the signer is required to sign in (optional)
|
89
|
+
# * :pin (Integer) The 4-digit code that will secure this signer's signature page. You must have a business plan to use this feature. (optional)
|
90
|
+
# @option opts [Array<String>] cc_email_addresses The email addresses that should be CCed.
|
91
|
+
#
|
92
|
+
# @return [HelloSign::Resource::UnclaimedDraft] a UnclaimedDraft object
|
93
|
+
|
94
|
+
# @example request_signature
|
95
|
+
# unclaimed_draft = @client.create_embedded_unclaimed_draft(
|
96
|
+
# :test_mode => 1,
|
97
|
+
# :type => 'request_signature',
|
98
|
+
# :subject => 'The NDA we talked about',
|
99
|
+
# :requester_email_address => requester@example.com",
|
100
|
+
# :message => 'Please sign this NDA and then we can discuss more. Let me know if you have any questions.',
|
101
|
+
# :signers => [{
|
102
|
+
# :email_address => 'jack@example.com',
|
103
|
+
# :name => 'Jack',
|
104
|
+
# :order => 0
|
105
|
+
# },{
|
106
|
+
# :email_address => 'jill@example.com',
|
107
|
+
# :name => 'Jill',
|
108
|
+
# :order => 1
|
109
|
+
# }
|
110
|
+
# ],
|
111
|
+
# :cc_email_addresses => ['lawyer@example.com', 'lawyer@example2.com'],
|
112
|
+
# :files => ['NDA.pdf', 'AppendixA.pdf']
|
113
|
+
# )
|
114
|
+
#
|
115
|
+
def create_embedded_unclaimed_draft opts
|
116
|
+
opts[:client_id] ||= self.client_id
|
117
|
+
prepare_files opts
|
118
|
+
if opts[:type] == 'request_signature'
|
119
|
+
prepare_signers opts
|
120
|
+
end
|
121
|
+
|
122
|
+
HelloSign::Resource::UnclaimedDraft.new post('/unclaimed_draft/create_embedded', :body => opts)
|
123
|
+
end
|
124
|
+
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
@@ -0,0 +1,211 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
require 'multi_json'
|
3
|
+
require 'hello_sign/error'
|
4
|
+
require 'hello_sign/configuration'
|
5
|
+
require 'hello_sign/resource'
|
6
|
+
require 'hello_sign/api'
|
7
|
+
require 'logger'
|
8
|
+
|
9
|
+
module HelloSign
|
10
|
+
|
11
|
+
#
|
12
|
+
# You'll need the HelloSign::Client to do just about everything, from creating
|
13
|
+
# signatures to updating account information.
|
14
|
+
#
|
15
|
+
# @example
|
16
|
+
# client = HelloSign::Client.new :email_address => "me@hellosign.com", :password => "mypassword"
|
17
|
+
#
|
18
|
+
# @author [hellosign]
|
19
|
+
class Client
|
20
|
+
include Api::Account
|
21
|
+
include Api::SignatureRequest
|
22
|
+
include Api::Template
|
23
|
+
include Api::Team
|
24
|
+
include Api::UnclaimedDraft
|
25
|
+
include Api::Embedded
|
26
|
+
include Api::OAuth
|
27
|
+
|
28
|
+
attr_accessor :end_point, :oauth_end_point, :api_version, :user_agent, :client_id, :client_secret, :email_address, :password, :api_key, :auth_token, :logging, :log_level
|
29
|
+
|
30
|
+
ERRORS = {
|
31
|
+
400 => Error::BadRequest,
|
32
|
+
401 => Error::Unauthorized,
|
33
|
+
403 => Error::Forbidden,
|
34
|
+
404 => Error::NotFound,
|
35
|
+
405 => Error::MethodNotAllowed,
|
36
|
+
409 => Error::Conflict,
|
37
|
+
410 => Error::Gone,
|
38
|
+
500 => Error::InternalServerError,
|
39
|
+
502 => Error::BadGateway,
|
40
|
+
503 => Error::ServiceUnavailable
|
41
|
+
}
|
42
|
+
|
43
|
+
#
|
44
|
+
# Creates a new HelloSign Client
|
45
|
+
|
46
|
+
# @option opts [String] email_address email address
|
47
|
+
# @option opts [String] password password
|
48
|
+
# @option opts [String] api_key Api key
|
49
|
+
# @return [HelloSign::Client] a new HelloSign::Client
|
50
|
+
def initialize(opts={})
|
51
|
+
options = HelloSign.options.merge(opts)
|
52
|
+
HelloSign::Configuration::VALID_OPTIONS_KEYS.each do |key|
|
53
|
+
self.send("#{key}=", options[key])
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
#
|
58
|
+
# Make a http get request
|
59
|
+
# @param path [String] relative path of the request
|
60
|
+
# @option options [Hash] params params of the url
|
61
|
+
#
|
62
|
+
def get(path, options={})
|
63
|
+
response = request(path, :get, options)
|
64
|
+
validate response
|
65
|
+
parse response
|
66
|
+
end
|
67
|
+
|
68
|
+
#
|
69
|
+
# Make a http post request
|
70
|
+
# @param path [String] relative path of the request
|
71
|
+
# @option options [Hash] params params of the url
|
72
|
+
# @option options [Hash] body request body
|
73
|
+
#
|
74
|
+
def post(path, options={})
|
75
|
+
response = request(path, :post, options)
|
76
|
+
validate response
|
77
|
+
parse response
|
78
|
+
end
|
79
|
+
|
80
|
+
#
|
81
|
+
# Make a http put request
|
82
|
+
# @param path [String] relative path of the request
|
83
|
+
# @option options [Hash] params params of the url
|
84
|
+
# @option options [Hash] body request body
|
85
|
+
#
|
86
|
+
def put(path, options={})
|
87
|
+
response = request(path, :put, options)
|
88
|
+
validate response
|
89
|
+
parse response
|
90
|
+
end
|
91
|
+
|
92
|
+
#
|
93
|
+
# Make a http delete request
|
94
|
+
# @param path [String] relative path of the request
|
95
|
+
# @option options [Hash] params params of the url
|
96
|
+
#
|
97
|
+
def delete(path, options={})
|
98
|
+
response = request(path, :delete, options)
|
99
|
+
validate response
|
100
|
+
parse response
|
101
|
+
end
|
102
|
+
|
103
|
+
private
|
104
|
+
|
105
|
+
def request(path, method, options={})
|
106
|
+
make_connection(options).send method do |request|
|
107
|
+
if options[:oauth_request]
|
108
|
+
request.url "#{path}", options[:params]
|
109
|
+
else
|
110
|
+
request.url "#{api_version}#{path}", options[:params]
|
111
|
+
end
|
112
|
+
request.body = options[:body]
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
def make_connection options
|
117
|
+
url = options[:oauth_request] ? oauth_end_point : end_point
|
118
|
+
|
119
|
+
if @logging
|
120
|
+
logger = Logger.new(STDOUT)
|
121
|
+
logger.level = @log_level
|
122
|
+
end
|
123
|
+
|
124
|
+
connection = Faraday.new(:url => url, :headers => {user_agent: user_agent}) do |faraday|
|
125
|
+
faraday.request :multipart
|
126
|
+
faraday.request :url_encoded
|
127
|
+
faraday.response :logger, logger if @logging
|
128
|
+
faraday.adapter :net_http
|
129
|
+
end
|
130
|
+
if options[:no_auth]
|
131
|
+
elsif auth_token
|
132
|
+
connection.authorization :Bearer, auth_token
|
133
|
+
elsif api_key
|
134
|
+
connection.basic_auth api_key, ''
|
135
|
+
elsif email_address
|
136
|
+
connection.basic_auth email_address, password
|
137
|
+
else
|
138
|
+
end
|
139
|
+
connection
|
140
|
+
end
|
141
|
+
|
142
|
+
def validate(response)
|
143
|
+
if response.status >= 400
|
144
|
+
raise ERRORS[response.status].new error_message(response)
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
def parse(response)
|
149
|
+
if response["content-type"] == "application/pdf"
|
150
|
+
response.body
|
151
|
+
elsif response.body.strip.empty?
|
152
|
+
{}
|
153
|
+
else
|
154
|
+
MultiJson.load response.body
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
def error_message(response)
|
159
|
+
"Server responded with code #{response.status}\n" \
|
160
|
+
"Request URI: #{response.to_hash[:url].to_s}\n"\
|
161
|
+
"Message: #{response.body}"
|
162
|
+
end
|
163
|
+
|
164
|
+
def prepare_files opts
|
165
|
+
if opts[:files]
|
166
|
+
opts[:files].each_with_index do |file, index|
|
167
|
+
if file.is_a? String
|
168
|
+
opts[:"file[#{index}]"] = Faraday::UploadIO.new(file, 'application/pdf')
|
169
|
+
elsif defined? ActionDispatch::Http::UploadedFile
|
170
|
+
if file.is_a? ActionDispatch::Http::UploadedFile
|
171
|
+
opts[:"file[#{index}]"] = UploadIO.new(file.tempfile, 'application/pdf')
|
172
|
+
end
|
173
|
+
else
|
174
|
+
raise HelloSign::Error::NotSupportedType.new "#{file.class} is not a supported. Must be a string or ActionDispatch::Http::UploadedFile"
|
175
|
+
end
|
176
|
+
end
|
177
|
+
opts.delete(:files)
|
178
|
+
elsif opts[:file_urls]
|
179
|
+
opts[:file_urls].each_with_index do |file, index|
|
180
|
+
opts[:"file_url[#{index}]"] = file
|
181
|
+
end
|
182
|
+
opts.delete(:file_urls)
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
186
|
+
def prepare_signers opts
|
187
|
+
prepare opts, :signers
|
188
|
+
end
|
189
|
+
|
190
|
+
def prepare_ccs opts
|
191
|
+
prepare opts, :ccs
|
192
|
+
end
|
193
|
+
|
194
|
+
def prepare opts, key
|
195
|
+
return unless opts[key]
|
196
|
+
opts[key].each_with_index do |value, index|
|
197
|
+
if value.is_a? String
|
198
|
+
opts[:"#{key}[#{index}]"] = value
|
199
|
+
else
|
200
|
+
if value[:role]
|
201
|
+
opts[:"#{key}[#{value[:role]}]"] = value
|
202
|
+
value.delete(:role)
|
203
|
+
else
|
204
|
+
opts[:"#{key}[#{index}]"] = value
|
205
|
+
end
|
206
|
+
end
|
207
|
+
end
|
208
|
+
opts.delete(key)
|
209
|
+
end
|
210
|
+
end
|
211
|
+
end
|