Skip to content

Commit b26eeb1

Browse files
committed
refresh app_access_token when expired
1 parent 923eb1e commit b26eeb1

File tree

2 files changed

+50
-11
lines changed

2 files changed

+50
-11
lines changed

lib/funky/connections/api.rb

Lines changed: 5 additions & 10 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_id}%7C#{app_secret}"
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_id}%7C#{app_secret}"
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_id}%7C#{app_secret}&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_id}%7C#{app_secret}"
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,10 +93,6 @@ def self.app_secret
9493
Funky.configuration.app_secret
9594
end
9695

97-
def self.post_http_request(uri)
98-
Net::HTTP::Post.new uri
99-
end
100-
10196
def self.create_batch_for(ids, fields)
10297
ids.map do |id|
10398
{"method":"GET", "relative_url": "/v2.8/#{id}?fields=#{fields}"}

lib/funky/connections/base.rb

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,30 @@ 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

1218
def self.response_for(http_request, uri, max_retries = 5)
19+
uri = uri_with_query(uri, access_token: app_access_token)
20+
http_request = req_with_query(http_request, access_token: app_access_token)
21+
1322
response = Net::HTTP.start(uri.host, 443, use_ssl: true) do |http|
1423
http.request http_request
1524
end
1625
if response.is_a? Net::HTTPSuccess
1726
response
1827
elsif response.is_a? Net::HTTPServerError
1928
sleep_and_retry_response_for(http_request, uri, max_retries, response.body)
29+
elsif response.is_a?(Net::HTTPBadRequest) && response.body =~ /access token/i
30+
@app_access_token = nil
31+
response_for(http_request, uri)
2032
else
2133
raise ContentNotFound, "Error #{response.code}: #{response.body}"
2234
end
@@ -37,6 +49,38 @@ def self.json_for(uri, max_retries = 3)
3749
response = response_for(get_http_request(uri), uri)
3850
JSON.parse(response.body, symbolize_names: true)
3951
end
52+
53+
def self.uri_with_query(uri, query={})
54+
return nil if uri.nil?
55+
new_query = URI.decode_www_form(uri.query).to_h.merge(query)
56+
uri.query = URI.encode_www_form(new_query)
57+
uri
58+
end
59+
60+
def self.req_with_query(http_request, query={})
61+
return nil if http_request.nil?
62+
new_uri = uri_with_query(http_request.uri, query)
63+
case http_request
64+
when Net::HTTP::Get
65+
get_http_request(new_uri)
66+
when Net::HTTP::Post
67+
req = Net::HTTP::Post.new new_uri
68+
req.set_form_data URI.decode_www_form(http_request.body)
69+
req
70+
end
71+
end
72+
73+
def self.app_access_token
74+
@app_access_token ||= begin
75+
uri = URI::HTTPS.build host: host, path: "/v2.8/oauth/access_token",
76+
query: URI.encode_www_form({client_id: app_id, client_secret: app_secret, grant_type: 'client_credentials'})
77+
req = get_http_request(uri)
78+
response = Net::HTTP.start(uri.host, 443, use_ssl: true) do |http|
79+
http.request req
80+
end
81+
JSON.parse(response.body, symbolize_names: true)[:access_token]
82+
end
83+
end
4084
end
4185
end
4286
end

0 commit comments

Comments
 (0)