Skip to content

Commit eb7b967

Browse files
committed
refresh app_access_token when expired
1 parent 78e6453 commit eb7b967

File tree

2 files changed

+54
-24
lines changed

2 files changed

+54
-24
lines changed

lib/funky/connections/api.rb

Lines changed: 5 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ module Funky
88
module Connection
99
class API < Base
1010
def self.fetch_all(path_query)
11-
uri = URI "https://#{host}/v2.9/#{path_query}&limit=100&access_token=#{app_access_token}"
11+
uri = URI "https://#{host}/v2.9/#{path_query}&limit=100"
1212
fetch_data_with_paging_token(uri)
1313
end
1414

@@ -24,7 +24,7 @@ def self.fetch_data_with_paging_token(uri)
2424
end
2525

2626
def self.fetch(path_query, is_array: false)
27-
uri = URI "https://#{host}/v2.8/#{path_query}&limit=100&access_token=#{app_access_token}"
27+
uri = URI "https://#{host}/v2.8/#{path_query}&limit=100"
2828
is_array ? fetch_multiple_pages(uri).uniq : json_for(uri)
2929
rescue URI::InvalidURIError
3030
raise Funky::ContentNotFound, "Invalid URL"
@@ -66,17 +66,16 @@ def self.fetch_multiple_pages(uri)
6666
def self.request(id:, fields:)
6767
uri = URI::HTTPS.build host: host,
6868
path: "/v2.8/#{id}",
69-
query: "access_token=#{app_access_token}&fields=#{fields}"
69+
query: "fields=#{fields}"
7070
response_for(get_http_request(uri), uri)
7171
end
7272

7373
def self.batch_request(ids:, fields:)
7474
uri = URI::HTTPS.build host: host,
7575
path: "/",
76-
query: "include_headers=false&access_token=#{app_access_token}"
76+
query: "include_headers=false"
7777
batch = create_batch_for ids, fields
78-
http_request = post_http_request uri
79-
http_request.set_form_data batch: batch.to_json
78+
http_request = post_http_request(uri, batch: batch.to_json)
8079
response_for(http_request, uri)
8180
end
8281

@@ -94,18 +93,6 @@ def self.app_secret
9493
Funky.configuration.app_secret
9594
end
9695

97-
def self.app_access_token
98-
@app_access_token ||= begin
99-
uri = URI::HTTPS.build host: host, path: "/v2.8/oauth/access_token",
100-
query: URI.encode_www_form({client_id: app_id, client_secret: app_secret, grant_type: 'client_credentials'})
101-
Funky::Connection::API.json_for(uri)[:access_token]
102-
end
103-
end
104-
105-
def self.post_http_request(uri)
106-
Net::HTTP::Post.new uri
107-
end
108-
10996
def self.create_batch_for(ids, fields)
11097
ids.map do |id|
11198
{"method":"GET", "relative_url": "/v2.8/#{id}?fields=#{fields}"}

lib/funky/connections/base.rb

Lines changed: 49 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,28 +5,39 @@ class Base
55

66
private
77

8+
def self.post_http_request(uri, form_data={})
9+
http_request = Net::HTTP::Post.new uri
10+
http_request.set_form_data form_data
11+
http_request
12+
end
13+
814
def self.get_http_request(uri)
9-
Net::HTTP::Get.new(uri.request_uri)
15+
Net::HTTP::Get.new(uri)
1016
end
1117

12-
def self.response_for(http_request, uri, max_retries = 5)
18+
def self.response_for(http_request, uri, max_retries = 2)
19+
uri = uri_with_query(uri, access_token: app_access_token)
20+
req = req_with_query(http_request, access_token: app_access_token)
1321
response = Net::HTTP.start(uri.host, 443, use_ssl: true) do |http|
14-
http.request http_request
22+
http.request req
1523
end
1624
if response.is_a? Net::HTTPSuccess
1725
response
1826
elsif response.is_a? Net::HTTPServerError
19-
sleep_and_retry_response_for(http_request, uri, max_retries, response.body)
27+
sleep_and_retry_response_for(req, uri, max_retries, response.body)
28+
elsif response.is_a?(Net::HTTPBadRequest) && response.body =~ /access token/i
29+
@app_access_token = nil
30+
response_for(req, uri)
2031
else
2132
raise ContentNotFound, "Error #{response.code}: #{response.body}"
2233
end
2334
rescue SocketError => e
24-
sleep_and_retry_response_for(http_request, uri, max_retries, e.message)
35+
sleep_and_retry_response_for(req, uri, max_retries, e.message)
2536
end
2637

2738
def self.sleep_and_retry_response_for(http_request, uri, retries, message)
2839
if retries > 0
29-
sleep (6 - retries) ** 2
40+
sleep (3 - retries) ** 2
3041
response_for http_request, uri, retries - 1
3142
else
3243
raise ConnectionError, message
@@ -37,6 +48,38 @@ def self.json_for(uri, max_retries = 3)
3748
response = response_for(get_http_request(uri), uri)
3849
JSON.parse(response.body, symbolize_names: true)
3950
end
51+
52+
def self.uri_with_query(uri, query={})
53+
return nil if uri.nil?
54+
new_query = URI.decode_www_form(uri.query).to_h.merge(query)
55+
uri.query = URI.encode_www_form(new_query)
56+
uri
57+
end
58+
59+
def self.req_with_query(http_request, query={})
60+
return nil if http_request.nil?
61+
new_uri = uri_with_query(http_request.uri, query)
62+
case http_request
63+
when Net::HTTP::Get
64+
get_http_request(new_uri)
65+
when Net::HTTP::Post
66+
req = Net::HTTP::Post.new new_uri
67+
req.set_form_data URI.decode_www_form(http_request.body)
68+
req
69+
end
70+
end
71+
72+
def self.app_access_token
73+
@app_access_token ||= begin
74+
uri = URI::HTTPS.build host: host, path: "/v2.8/oauth/access_token",
75+
query: URI.encode_www_form({client_id: app_id, client_secret: app_secret, grant_type: 'client_credentials'})
76+
req = get_http_request(uri)
77+
response = Net::HTTP.start(uri.host, 443, use_ssl: true) do |http|
78+
http.request req
79+
end
80+
JSON.parse(response.body, symbolize_names: true)[:access_token]
81+
end
82+
end
4083
end
4184
end
4285
end

0 commit comments

Comments
 (0)