-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathconnection.rb
More file actions
75 lines (64 loc) · 2.29 KB
/
connection.rb
File metadata and controls
75 lines (64 loc) · 2.29 KB
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
require 'faraday'
require 'json'
module ConvertKit
class Connection
MIME_TYPE = 'application/json'.freeze
HTTP_METHODS = %i(get post delete put).freeze
def initialize(url, options = {})
@url = url
@connection = Faraday.new(url: @url, headers: default_headers(options)) do |builder|
if options[:auth_token]
builder.request :authorization, 'Bearer', options[:auth_token]
end
end
end
# Defined wrapper methods for Faraday's HTTP methods
HTTP_METHODS.each do |method|
define_method(method) do |path, params = {}|
# Allow delete requests to have a body. See https://github.com/lostisland/faraday/issues/693#issuecomment-466086832
if method == :delete
response = @connection.public_send(method, path) do |request|
request.body = process_request(method, params)
end
else
response = @connection.public_send(method, path, process_request(method, params))
end
process_response(response)
end
end
private
def default_headers(options)
headers = { 'Content-Type' => MIME_TYPE }
headers['X-Kit-Api-Key'] = options[:api_key] if options[:api_key]
headers
end
def process_request(method, params)
return params if method == :get
return params if params.empty?
JSON.generate(params)
end
def process_response(response)
# Need to parse the response body for successful and error responses
response.env.body = JSON.parse(response.env.body) unless response.body.strip.empty?
# Based on error responses mentioned in https://developers.convertkit.com/v4_alpha.html#api-basics
case response.status
when 404
raise ConvertKit::ResourceNotFoundError, response.body
when 422
raise ConvertKit::BadDataError, response.body
when 429
raise ConvertKit::RateLimitError, response.body
when 500
raise ConvertKit::ServerError, response.body
when 502
raise ConvertKit::BadGatewayError, response.body
when 503
raise ConvertKit::ServiceUnavailableError, response.body
when 504
raise ConvertKit::GatewayTimeoutError, response.body
else
response # Let the caller handle the response
end
end
end
end