seeuletter 1.1.0 → 1.4.1
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.
- checksums.yaml +5 -5
- data/.gitignore +14 -14
- data/Gemfile +4 -4
- data/LICENSE.txt +22 -22
- data/README.md +232 -142
- data/Rakefile +7 -7
- data/examples/README.md +31 -17
- data/examples/accounts.rb +27 -0
- data/examples/invoices.rb +21 -0
- data/examples/letter_price.rb +5 -5
- data/examples/letters.rb +49 -49
- data/examples/letters_electronic.rb +48 -0
- data/examples/postcards.rb +53 -0
- data/examples/users.rb +6 -0
- data/lib/seeuletter/client.rb +46 -25
- data/lib/seeuletter/errors/invalid_request_error.rb +4 -4
- data/lib/seeuletter/errors/seeuletter_error.rb +20 -20
- data/lib/seeuletter/resources/account.rb +30 -0
- data/lib/seeuletter/resources/invoice.rb +22 -0
- data/lib/seeuletter/resources/letter.rb +17 -14
- data/lib/seeuletter/resources/letter_price.rb +14 -14
- data/lib/seeuletter/resources/postcard.rb +14 -0
- data/lib/seeuletter/resources/resource_base.rb +109 -109
- data/lib/seeuletter/resources/user.rb +16 -0
- data/lib/seeuletter/version.rb +3 -3
- data/lib/seeuletter.rb +7 -7
- data/seeuletter.gemspec +24 -24
- metadata +15 -7
data/examples/letters.rb
CHANGED
@@ -1,49 +1,49 @@
|
|
1
|
-
$:.unshift File.expand_path("../lib", File.dirname(__FILE__))
|
2
|
-
require 'seeuletter'
|
3
|
-
|
4
|
-
# initialize Seeuletter object
|
5
|
-
seeuletter = Seeuletter::Client.new(api_key: '<PUT_YOU_API_KEY_HERE>')
|
6
|
-
|
7
|
-
html = %{
|
8
|
-
<html>
|
9
|
-
<head>
|
10
|
-
<style>
|
11
|
-
*, *:before, *:after {
|
12
|
-
-webkit-box-sizing: border-box;
|
13
|
-
-moz-box-sizing: border-box;
|
14
|
-
box-sizing: border-box;
|
15
|
-
}
|
16
|
-
.text {
|
17
|
-
margin-left: 50px;
|
18
|
-
padding-top: 450px;
|
19
|
-
font-size: 50px;
|
20
|
-
font-weight: 700;
|
21
|
-
}
|
22
|
-
</style>
|
23
|
-
</head>
|
24
|
-
|
25
|
-
<body>
|
26
|
-
<p class="text">Hello {{name}}!</p>
|
27
|
-
</body>
|
28
|
-
|
29
|
-
</html>
|
30
|
-
}
|
31
|
-
|
32
|
-
|
33
|
-
# send the letter
|
34
|
-
puts seeuletter.letters.create(
|
35
|
-
description: "Test letter from the Ruby Wrapper",
|
36
|
-
to: {
|
37
|
-
name: 'Erlich',
|
38
|
-
address_line1: '30 rue de rivoli',
|
39
|
-
address_line2: '',
|
40
|
-
address_city: 'Paris',
|
41
|
-
address_country: 'France',
|
42
|
-
address_postalcode: '75004'
|
43
|
-
},
|
44
|
-
source_file: html,
|
45
|
-
source_file_type: 'html',
|
46
|
-
postage_type: 'prioritaire',
|
47
|
-
variables: { name: 'Erlich'},
|
48
|
-
color: 'color'
|
49
|
-
)
|
1
|
+
$:.unshift File.expand_path("../lib", File.dirname(__FILE__))
|
2
|
+
require 'seeuletter'
|
3
|
+
|
4
|
+
# initialize Seeuletter object
|
5
|
+
seeuletter = Seeuletter::Client.new(api_key: '<PUT_YOU_API_KEY_HERE>')
|
6
|
+
|
7
|
+
html = %{
|
8
|
+
<html>
|
9
|
+
<head>
|
10
|
+
<style>
|
11
|
+
*, *:before, *:after {
|
12
|
+
-webkit-box-sizing: border-box;
|
13
|
+
-moz-box-sizing: border-box;
|
14
|
+
box-sizing: border-box;
|
15
|
+
}
|
16
|
+
.text {
|
17
|
+
margin-left: 50px;
|
18
|
+
padding-top: 450px;
|
19
|
+
font-size: 50px;
|
20
|
+
font-weight: 700;
|
21
|
+
}
|
22
|
+
</style>
|
23
|
+
</head>
|
24
|
+
|
25
|
+
<body>
|
26
|
+
<p class="text">Hello {{name}}!</p>
|
27
|
+
</body>
|
28
|
+
|
29
|
+
</html>
|
30
|
+
}
|
31
|
+
|
32
|
+
|
33
|
+
# send the letter
|
34
|
+
puts seeuletter.letters.create(
|
35
|
+
description: "Test letter from the Ruby Wrapper",
|
36
|
+
to: {
|
37
|
+
name: 'Erlich',
|
38
|
+
address_line1: '30 rue de rivoli',
|
39
|
+
address_line2: '',
|
40
|
+
address_city: 'Paris',
|
41
|
+
address_country: 'France',
|
42
|
+
address_postalcode: '75004'
|
43
|
+
},
|
44
|
+
source_file: html,
|
45
|
+
source_file_type: 'html',
|
46
|
+
postage_type: 'prioritaire',
|
47
|
+
variables: { name: 'Erlich'},
|
48
|
+
color: 'color'
|
49
|
+
)
|
@@ -0,0 +1,48 @@
|
|
1
|
+
$:.unshift File.expand_path("../lib", File.dirname(__FILE__))
|
2
|
+
require 'seeuletter'
|
3
|
+
|
4
|
+
# initialize Seeuletter object
|
5
|
+
seeuletter = Seeuletter::Client.new(api_key: '<PUT_YOU_API_KEY_HERE>')
|
6
|
+
|
7
|
+
html = %{
|
8
|
+
<html>
|
9
|
+
<head>
|
10
|
+
<style>
|
11
|
+
*, *:before, *:after {
|
12
|
+
-webkit-box-sizing: border-box;
|
13
|
+
-moz-box-sizing: border-box;
|
14
|
+
box-sizing: border-box;
|
15
|
+
}
|
16
|
+
.text {
|
17
|
+
margin-left: 50px;
|
18
|
+
padding-top: 450px;
|
19
|
+
font-size: 50px;
|
20
|
+
font-weight: 700;
|
21
|
+
}
|
22
|
+
</style>
|
23
|
+
</head>
|
24
|
+
|
25
|
+
<body>
|
26
|
+
<p class="text">Hello {{name}}!</p>
|
27
|
+
</body>
|
28
|
+
|
29
|
+
</html>
|
30
|
+
}
|
31
|
+
|
32
|
+
|
33
|
+
# send the letter
|
34
|
+
puts seeuletter.letters.createElectronic(
|
35
|
+
description: "Test electronic letter from the Ruby Wrapper",
|
36
|
+
to: {
|
37
|
+
email: 'erlich.dumas@example.com',
|
38
|
+
first_name: 'Erlich',
|
39
|
+
last_name: 'Dumas',
|
40
|
+
status: 'individual'
|
41
|
+
},
|
42
|
+
source_file: '<html>Hello {{name}}</html>',
|
43
|
+
source_file_type: 'html',
|
44
|
+
postage_type: 'lre',
|
45
|
+
variables: {
|
46
|
+
name: 'Erlich'
|
47
|
+
}
|
48
|
+
)
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
$LOAD_PATH.unshift File.expand_path('../lib', File.dirname(__FILE__))
|
4
|
+
require 'seeuletter'
|
5
|
+
|
6
|
+
# initialize Seeuletter object
|
7
|
+
seeuletter = Seeuletter::Client.new(api_key: '<PUT_YOU_API_KEY_HERE>')
|
8
|
+
|
9
|
+
html = %(
|
10
|
+
<html>
|
11
|
+
<head>
|
12
|
+
<style>
|
13
|
+
*, *:before, *:after {
|
14
|
+
-webkit-box-sizing: border-box;
|
15
|
+
-moz-box-sizing: border-box;
|
16
|
+
box-sizing: border-box;
|
17
|
+
}
|
18
|
+
.text {
|
19
|
+
margin-left: 50px;
|
20
|
+
padding-top: 450px;
|
21
|
+
font-size: 50px;
|
22
|
+
font-weight: 700;
|
23
|
+
}
|
24
|
+
</style>
|
25
|
+
</head>
|
26
|
+
|
27
|
+
<body>
|
28
|
+
<p class="text">Hello {{name}}!</p>
|
29
|
+
</body>
|
30
|
+
|
31
|
+
</html>
|
32
|
+
)
|
33
|
+
|
34
|
+
# list all postcards sent
|
35
|
+
puts seeuletter.postcards.list
|
36
|
+
|
37
|
+
# send a dummy the letter
|
38
|
+
puts seeuletter.postcards.create(
|
39
|
+
description: 'Test letter from the Ruby Wrapper',
|
40
|
+
to: {
|
41
|
+
name: 'Erlich',
|
42
|
+
address_line1: '30 rue de rivoli',
|
43
|
+
address_line2: '',
|
44
|
+
address_city: 'Paris',
|
45
|
+
address_country: 'France',
|
46
|
+
address_postalcode: '75004'
|
47
|
+
},
|
48
|
+
source_file_front: html,
|
49
|
+
source_file_front_type: 'html',
|
50
|
+
source_file_back: html,
|
51
|
+
source_file_back_type: 'html',
|
52
|
+
variables: { name: 'Erlich' }
|
53
|
+
)
|
data/examples/users.rb
ADDED
data/lib/seeuletter/client.rb
CHANGED
@@ -1,25 +1,46 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'seeuletter/resources/letter'
|
4
|
+
require 'seeuletter/resources/letter_price'
|
5
|
+
require 'seeuletter/resources/postcard'
|
6
|
+
require "seeuletter/resources/user"
|
7
|
+
require "seeuletter/resources/account"
|
8
|
+
require "seeuletter/resources/invoice"
|
9
|
+
|
10
|
+
module Seeuletter
|
11
|
+
class Client
|
12
|
+
attr_reader :config
|
13
|
+
|
14
|
+
def initialize(config = nil)
|
15
|
+
if config.nil? || config[:api_key].nil?
|
16
|
+
raise ArgumentError, ':api_key is a required argument to initialize Seeuletter'
|
17
|
+
end
|
18
|
+
|
19
|
+
@config = config
|
20
|
+
end
|
21
|
+
|
22
|
+
def letters
|
23
|
+
Seeuletter::Resources::Letter.new(config)
|
24
|
+
end
|
25
|
+
|
26
|
+
def letter_price
|
27
|
+
Seeuletter::Resources::LetterPrice.new(config)
|
28
|
+
end
|
29
|
+
|
30
|
+
def postcards
|
31
|
+
Seeuletter::Resources::Postcard.new(config)
|
32
|
+
end
|
33
|
+
|
34
|
+
def users
|
35
|
+
Seeuletter::Resources::User.new(config)
|
36
|
+
end
|
37
|
+
|
38
|
+
def accounts
|
39
|
+
Seeuletter::Resources::Account.new(config)
|
40
|
+
end
|
41
|
+
|
42
|
+
def invoices
|
43
|
+
Seeuletter::Resources::Invoice.new(config)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
module Seeuletter
|
2
|
-
class InvalidRequestError < SeeuletterError
|
3
|
-
end
|
4
|
-
end
|
1
|
+
module Seeuletter
|
2
|
+
class InvalidRequestError < SeeuletterError
|
3
|
+
end
|
4
|
+
end
|
@@ -1,20 +1,20 @@
|
|
1
|
-
module Seeuletter
|
2
|
-
|
3
|
-
class SeeuletterError < StandardError
|
4
|
-
attr_reader :http_status, :http_body, :json_body
|
5
|
-
|
6
|
-
def initialize(message, http_status=nil, http_body=nil, json_body=nil)
|
7
|
-
@http_status = http_status
|
8
|
-
@http_body = http_body
|
9
|
-
@json_body = json_body
|
10
|
-
status_string = @http_status.nil? ? "" : "(Status #{@http_status}) "
|
11
|
-
super("#{status_string}#{message} \n #{@http_body}")
|
12
|
-
end
|
13
|
-
|
14
|
-
def _response
|
15
|
-
@json_body
|
16
|
-
end
|
17
|
-
|
18
|
-
end
|
19
|
-
|
20
|
-
end
|
1
|
+
module Seeuletter
|
2
|
+
|
3
|
+
class SeeuletterError < StandardError
|
4
|
+
attr_reader :http_status, :http_body, :json_body
|
5
|
+
|
6
|
+
def initialize(message, http_status=nil, http_body=nil, json_body=nil)
|
7
|
+
@http_status = http_status
|
8
|
+
@http_body = http_body
|
9
|
+
@json_body = json_body
|
10
|
+
status_string = @http_status.nil? ? "" : "(Status #{@http_status}) "
|
11
|
+
super("#{status_string}#{message} \n #{@http_body}")
|
12
|
+
end
|
13
|
+
|
14
|
+
def _response
|
15
|
+
@json_body
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require "seeuletter/resources/resource_base"
|
2
|
+
|
3
|
+
module Seeuletter
|
4
|
+
module Resources
|
5
|
+
class Account < Seeuletter::Resources::ResourceBase
|
6
|
+
|
7
|
+
def initialize(config)
|
8
|
+
super(config)
|
9
|
+
@endpoint = "accounts"
|
10
|
+
end
|
11
|
+
|
12
|
+
def updateEmail(resource_id, email, headers={})
|
13
|
+
submit :put, resource_url(resource_id), {"email" => email}, headers
|
14
|
+
end
|
15
|
+
|
16
|
+
def list(options={})
|
17
|
+
raise SeeuletterError.new("Invalid REST operation : GET /accounts", "404", nil)
|
18
|
+
end
|
19
|
+
|
20
|
+
def find(resource_id)
|
21
|
+
raise SeeuletterError.new("Invalid REST operation : GET /accounts/:account_id", "404", nil)
|
22
|
+
end
|
23
|
+
|
24
|
+
def destroy(resource_id)
|
25
|
+
raise SeeuletterError.new("Invalid REST operation : DELETE /accounts/:account_id", "404", nil)
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require "seeuletter/resources/resource_base"
|
2
|
+
|
3
|
+
module Seeuletter
|
4
|
+
module Resources
|
5
|
+
class Invoice < Seeuletter::Resources::ResourceBase
|
6
|
+
|
7
|
+
def initialize(config)
|
8
|
+
super(config)
|
9
|
+
@endpoint = "invoices"
|
10
|
+
end
|
11
|
+
|
12
|
+
def create(options={}, headers={})
|
13
|
+
raise SeeuletterError.new("Invalid REST operation : POST /invoices", "404", nil)
|
14
|
+
end
|
15
|
+
|
16
|
+
def destroy(resource_id)
|
17
|
+
raise SeeuletterError.new("Invalid REST operation : DELETE /accounts/:invoice_id", "404", nil)
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -1,14 +1,17 @@
|
|
1
|
-
require "seeuletter/resources/resource_base"
|
2
|
-
|
3
|
-
module Seeuletter
|
4
|
-
module Resources
|
5
|
-
class Letter < Seeuletter::Resources::ResourceBase
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
end
|
1
|
+
require "seeuletter/resources/resource_base"
|
2
|
+
|
3
|
+
module Seeuletter
|
4
|
+
module Resources
|
5
|
+
class Letter < Seeuletter::Resources::ResourceBase
|
6
|
+
|
7
|
+
def initialize(config)
|
8
|
+
super(config)
|
9
|
+
@endpoint = "letters"
|
10
|
+
end
|
11
|
+
|
12
|
+
def createElectronic(options={}, headers={})
|
13
|
+
submit :post, resource_url("electronic"), options, headers
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -1,14 +1,14 @@
|
|
1
|
-
require "seeuletter/resources/resource_base"
|
2
|
-
|
3
|
-
module Seeuletter
|
4
|
-
module Resources
|
5
|
-
class LetterPrice < Seeuletter::Resources::ResourceBase
|
6
|
-
def initialize(config)
|
7
|
-
super(config)
|
8
|
-
@endpoint = "price/letter"
|
9
|
-
end
|
10
|
-
|
11
|
-
alias get list
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
1
|
+
require "seeuletter/resources/resource_base"
|
2
|
+
|
3
|
+
module Seeuletter
|
4
|
+
module Resources
|
5
|
+
class LetterPrice < Seeuletter::Resources::ResourceBase
|
6
|
+
def initialize(config)
|
7
|
+
super(config)
|
8
|
+
@endpoint = "price/letter"
|
9
|
+
end
|
10
|
+
|
11
|
+
alias get list
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -1,109 +1,109 @@
|
|
1
|
-
require "rest-client"
|
2
|
-
require "json"
|
3
|
-
require "uri"
|
4
|
-
|
5
|
-
module Seeuletter
|
6
|
-
module Resources
|
7
|
-
class ResourceBase
|
8
|
-
|
9
|
-
attr_reader :config, :endpoint
|
10
|
-
|
11
|
-
def initialize(config)
|
12
|
-
@config = config
|
13
|
-
end
|
14
|
-
|
15
|
-
def list(options={})
|
16
|
-
submit :get, endpoint_url, options
|
17
|
-
end
|
18
|
-
|
19
|
-
def find(resource_id)
|
20
|
-
submit :get, resource_url(resource_id)
|
21
|
-
end
|
22
|
-
|
23
|
-
def create(options={}, headers={})
|
24
|
-
submit :post, endpoint_url, options, headers
|
25
|
-
end
|
26
|
-
|
27
|
-
def destroy(resource_id)
|
28
|
-
submit :delete, resource_url(resource_id)
|
29
|
-
end
|
30
|
-
|
31
|
-
private
|
32
|
-
|
33
|
-
def submit(method, url, parameters={}, headers={})
|
34
|
-
clientVersion = Seeuletter::VERSION
|
35
|
-
|
36
|
-
begin
|
37
|
-
if method == :get || method == :delete
|
38
|
-
# Hack to URL encode nested objects like metadata.
|
39
|
-
url = "#{url}?#{build_nested_query(parameters)}"
|
40
|
-
response = RestClient.send(method, url, {
|
41
|
-
user_agent: 'Seeuletter/v1 RubyBindings/' + clientVersion,
|
42
|
-
"Seeuletter-Version" => config[:api_version]
|
43
|
-
})
|
44
|
-
else
|
45
|
-
headers = headers.merge({
|
46
|
-
user_agent: 'Seeuletter/v1 RubyBindings/' + clientVersion,
|
47
|
-
"Seeuletter-Version" => config[:api_version]
|
48
|
-
})
|
49
|
-
response = RestClient.send(method, url, parameters, headers)
|
50
|
-
end
|
51
|
-
|
52
|
-
body = JSON.parse(response)
|
53
|
-
|
54
|
-
body.define_singleton_method(:_response) do
|
55
|
-
response
|
56
|
-
end
|
57
|
-
|
58
|
-
return body
|
59
|
-
|
60
|
-
rescue RestClient::ExceptionWithResponse => e
|
61
|
-
handle_api_error(e)
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
private
|
66
|
-
|
67
|
-
def handle_api_error(error)
|
68
|
-
begin
|
69
|
-
response = JSON.parse(error.http_body.to_s)
|
70
|
-
message = response.fetch("error").fetch("message")
|
71
|
-
raise InvalidRequestError.new(message, error.http_code, error.http_body, error.response)
|
72
|
-
rescue JSON::ParserError, KeyError
|
73
|
-
# :nocov:
|
74
|
-
raise SeeuletterError.new("Invalid response object:", error.http_code, error.http_body)
|
75
|
-
# :nocov:
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
def build_nested_query(value, prefix = nil)
|
80
|
-
case value
|
81
|
-
when Array
|
82
|
-
value.map { |v|
|
83
|
-
build_nested_query(v, "#{prefix}[]")
|
84
|
-
}.join("&")
|
85
|
-
when Hash
|
86
|
-
value.map { |k, v|
|
87
|
-
build_nested_query(v, prefix ? "#{prefix}[#{URI.encode_www_form_component(k)}]" : URI.encode_www_form_component(k))
|
88
|
-
}.reject(&:empty?).join('&')
|
89
|
-
else
|
90
|
-
raise ArgumentError, "value must be an Array or Hash" if prefix.nil?
|
91
|
-
"#{prefix}=#{URI.encode_www_form_component(value)}"
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
def base_url
|
96
|
-
"https://#{config[:api_key]}:@api.seeuletter.com"
|
97
|
-
end
|
98
|
-
|
99
|
-
def endpoint_url
|
100
|
-
"#{base_url}/#{endpoint}"
|
101
|
-
end
|
102
|
-
|
103
|
-
def resource_url(resource_id)
|
104
|
-
"#{endpoint_url}/#{resource_id}"
|
105
|
-
end
|
106
|
-
|
107
|
-
end
|
108
|
-
end
|
109
|
-
end
|
1
|
+
require "rest-client"
|
2
|
+
require "json"
|
3
|
+
require "uri"
|
4
|
+
|
5
|
+
module Seeuletter
|
6
|
+
module Resources
|
7
|
+
class ResourceBase
|
8
|
+
|
9
|
+
attr_reader :config, :endpoint
|
10
|
+
|
11
|
+
def initialize(config)
|
12
|
+
@config = config
|
13
|
+
end
|
14
|
+
|
15
|
+
def list(options={})
|
16
|
+
submit :get, endpoint_url, options
|
17
|
+
end
|
18
|
+
|
19
|
+
def find(resource_id)
|
20
|
+
submit :get, resource_url(resource_id)
|
21
|
+
end
|
22
|
+
|
23
|
+
def create(options={}, headers={})
|
24
|
+
submit :post, endpoint_url, options, headers
|
25
|
+
end
|
26
|
+
|
27
|
+
def destroy(resource_id)
|
28
|
+
submit :delete, resource_url(resource_id)
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def submit(method, url, parameters={}, headers={})
|
34
|
+
clientVersion = Seeuletter::VERSION
|
35
|
+
|
36
|
+
begin
|
37
|
+
if method == :get || method == :delete
|
38
|
+
# Hack to URL encode nested objects like metadata.
|
39
|
+
url = "#{url}?#{build_nested_query(parameters)}"
|
40
|
+
response = RestClient.send(method, url, {
|
41
|
+
user_agent: 'Seeuletter/v1 RubyBindings/' + clientVersion,
|
42
|
+
"Seeuletter-Version" => config[:api_version]
|
43
|
+
})
|
44
|
+
else
|
45
|
+
headers = headers.merge({
|
46
|
+
user_agent: 'Seeuletter/v1 RubyBindings/' + clientVersion,
|
47
|
+
"Seeuletter-Version" => config[:api_version]
|
48
|
+
})
|
49
|
+
response = RestClient.send(method, url, parameters, headers)
|
50
|
+
end
|
51
|
+
|
52
|
+
body = JSON.parse(response)
|
53
|
+
|
54
|
+
body.define_singleton_method(:_response) do
|
55
|
+
response
|
56
|
+
end
|
57
|
+
|
58
|
+
return body
|
59
|
+
|
60
|
+
rescue RestClient::ExceptionWithResponse => e
|
61
|
+
handle_api_error(e)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
private
|
66
|
+
|
67
|
+
def handle_api_error(error)
|
68
|
+
begin
|
69
|
+
response = JSON.parse(error.http_body.to_s)
|
70
|
+
message = response.fetch("error").fetch("message")
|
71
|
+
raise InvalidRequestError.new(message, error.http_code, error.http_body, error.response)
|
72
|
+
rescue JSON::ParserError, KeyError
|
73
|
+
# :nocov:
|
74
|
+
raise SeeuletterError.new("Invalid response object:", error.http_code, error.http_body)
|
75
|
+
# :nocov:
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def build_nested_query(value, prefix = nil)
|
80
|
+
case value
|
81
|
+
when Array
|
82
|
+
value.map { |v|
|
83
|
+
build_nested_query(v, "#{prefix}[]")
|
84
|
+
}.join("&")
|
85
|
+
when Hash
|
86
|
+
value.map { |k, v|
|
87
|
+
build_nested_query(v, prefix ? "#{prefix}[#{URI.encode_www_form_component(k)}]" : URI.encode_www_form_component(k))
|
88
|
+
}.reject(&:empty?).join('&')
|
89
|
+
else
|
90
|
+
raise ArgumentError, "value must be an Array or Hash" if prefix.nil?
|
91
|
+
"#{prefix}=#{URI.encode_www_form_component(value)}"
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def base_url
|
96
|
+
"https://#{config[:api_key]}:@api.seeuletter.com"
|
97
|
+
end
|
98
|
+
|
99
|
+
def endpoint_url
|
100
|
+
"#{base_url}/#{endpoint}"
|
101
|
+
end
|
102
|
+
|
103
|
+
def resource_url(resource_id)
|
104
|
+
"#{endpoint_url}/#{resource_id}"
|
105
|
+
end
|
106
|
+
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|