muffin_man 1.2.0 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +3 -0
- data/README.md +21 -0
- data/lib/muffin_man/authorization/v1.rb +0 -1
- data/lib/muffin_man/finances/v0.rb +14 -9
- data/lib/muffin_man/lwa/auth_helper.rb +27 -0
- data/lib/muffin_man/reports/v20210630.rb +1 -1
- data/lib/muffin_man/solicitations/v1.rb +4 -2
- data/lib/muffin_man/sp_api_client.rb +30 -26
- data/lib/muffin_man/version.rb +1 -1
- data/lib/muffin_man.rb +1 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 82c3118e9e61b82872329714fbfbaf80fd7613ff98ce126992f2ac3b834e3a51
|
4
|
+
data.tar.gz: 201afe55ba25967d8e519ff5f6a0ac9a66e452462cc4fe805ab2a34b61edec9a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9411d153ce20efc02882b456a9b6be233cf88e691472d35bbca5b8890fc422395d5a925a66996c129a1a5835883ac66153415043a94e37ad2d9c6e7e3b17baf5
|
7
|
+
data.tar.gz: 7859bc864e708516ce37087a32791a1fbbae140af2307fbc8d7c530933517e1d914faf704151b7269c290853cfa3a44c741c552a8aadf06bf605cc5ba2745d28
|
data/.rubocop.yml
CHANGED
data/README.md
CHANGED
@@ -63,6 +63,27 @@ MuffinMan.configure do |config|
|
|
63
63
|
end
|
64
64
|
```
|
65
65
|
|
66
|
+
### Retrieiving the refresh token
|
67
|
+
|
68
|
+
To retrieve the refresh token from an LWA Website authorization workflow, you can use the LWA helper:
|
69
|
+
|
70
|
+
```ruby
|
71
|
+
# Get your auth code first, either through the Website oauth flow or Authorization API
|
72
|
+
credentials = {
|
73
|
+
client_id: CLIENT_ID,
|
74
|
+
client_secret: CLIENT_SECRET,
|
75
|
+
aws_access_key_id: AWS_ACCESS_KEY_ID,
|
76
|
+
aws_secret_access_key: AWS_SECRET_ACCESS_KEY,
|
77
|
+
sts_iam_role_arn: STS_IAM_ROLE_ARN, # Optional
|
78
|
+
scope: 'sellingpartnerapi::migration' # Grantless scope for MWS migration
|
79
|
+
}
|
80
|
+
client = MuffinMan::Authorization::V1.new(credentials)
|
81
|
+
resp = JSON.parse(client.get_authorization_code(seller_id, developer_id, mws_auth_token).body)
|
82
|
+
auth_code = resp['payload']['authorizationCode']
|
83
|
+
# Then query retrieve the refresh token to store
|
84
|
+
refresh_token = MuffinMan::Lwa::AuthHelper.get_refresh_token(CLIENT_ID, CLIENT_SECRET, auth_code)
|
85
|
+
```
|
86
|
+
|
66
87
|
## Contributing
|
67
88
|
|
68
89
|
Bug reports and pull requests are welcome on GitHub at https://github.com/patterninc/muffin_man. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/patterninc/muffin_man/blob/master/CODE_OF_CONDUCT.md).
|
@@ -1,14 +1,19 @@
|
|
1
1
|
module MuffinMan
|
2
2
|
module Finances
|
3
3
|
class V0 < SpApiClient
|
4
|
-
|
5
4
|
def list_financial_event_groups(max_results_per_page = nil, financial_event_group_started_before = nil, financial_event_group_started_after = nil, next_token = nil)
|
6
5
|
@local_var_path = "/finances/v0/financialEventGroups"
|
7
6
|
@query_params = {}
|
8
|
-
@query_params[
|
9
|
-
|
10
|
-
|
11
|
-
|
7
|
+
@query_params["MaxResultsPerPage"] = max_results_per_page unless max_results_per_page.nil?
|
8
|
+
unless financial_event_group_started_before.nil?
|
9
|
+
@query_params["FinancialEventGroupStartedBefore"] =
|
10
|
+
financial_event_group_started_before
|
11
|
+
end
|
12
|
+
unless financial_event_group_started_after.nil?
|
13
|
+
@query_params["FinancialEventGroupStartedAfter"] =
|
14
|
+
financial_event_group_started_after
|
15
|
+
end
|
16
|
+
@query_params["NextToken"] = next_token unless next_token.nil?
|
12
17
|
@request_type = "GET"
|
13
18
|
call_api
|
14
19
|
end
|
@@ -16,10 +21,10 @@ module MuffinMan
|
|
16
21
|
def list_financial_events_by_group_id(event_group_id, max_results_per_page = nil, posted_after = nil, posted_before = nil, next_token = nil)
|
17
22
|
@local_var_path = "/finances/v0/financialEventGroups/#{event_group_id}/financialEvents"
|
18
23
|
@query_params = {}
|
19
|
-
@query_params[
|
20
|
-
@query_params[
|
21
|
-
@query_params[
|
22
|
-
@query_params[
|
24
|
+
@query_params["MaxResultsPerPage"] = max_results_per_page unless max_results_per_page.nil?
|
25
|
+
@query_params["PostedAfter"] = posted_after unless posted_after.nil?
|
26
|
+
@query_params["PostedBefore"] = posted_before unless posted_before.nil?
|
27
|
+
@query_params["NextToken"] = next_token unless next_token.nil?
|
23
28
|
@request_type = "GET"
|
24
29
|
call_api
|
25
30
|
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module MuffinMan::Lwa
|
2
|
+
class AuthHelper
|
3
|
+
ACCESS_TOKEN_URL = "https://api.amazon.com/auth/o2/token".freeze
|
4
|
+
|
5
|
+
def self.get_refresh_token(client_id, client_secret, auth_code)
|
6
|
+
body = {
|
7
|
+
grant_type: "authorization_code",
|
8
|
+
code: auth_code,
|
9
|
+
client_id: client_id,
|
10
|
+
client_secret: client_secret
|
11
|
+
}
|
12
|
+
response = Typhoeus.post(
|
13
|
+
ACCESS_TOKEN_URL,
|
14
|
+
body: URI.encode_www_form(body),
|
15
|
+
headers: {
|
16
|
+
"Content-Type" => "application/x-www-form-urlencoded;charset=UTF-8"
|
17
|
+
}
|
18
|
+
)
|
19
|
+
if response.code != 200
|
20
|
+
error_body = JSON.parse(response.body)
|
21
|
+
error = "#{error_body["error"]}: #{error_body["error_description"]}"
|
22
|
+
raise MuffinMan::Error, error
|
23
|
+
end
|
24
|
+
JSON.parse(response.body)["refresh_token"]
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -44,7 +44,7 @@ module MuffinMan
|
|
44
44
|
@local_var_path = "/reports/2021-06-30/reports"
|
45
45
|
@request_body = {
|
46
46
|
"reportType" => report_type,
|
47
|
-
"marketplaceIds" => marketplace_ids
|
47
|
+
"marketplaceIds" => marketplace_ids
|
48
48
|
}
|
49
49
|
@request_body["dataStartTime"] = start_time unless start_time.nil?
|
50
50
|
@request_body["dataEndTime"] = end_time unless end_time.nil?
|
@@ -11,9 +11,11 @@ module MuffinMan
|
|
11
11
|
def create_product_review_and_seller_feedback_solicitation(amazon_order_id, marketplace_ids)
|
12
12
|
@amazon_order_id = sandbox ? SANDBOX_AMAZON_ORDER_ID : amazon_order_id
|
13
13
|
@marketplace_ids = sandbox ? SANDBOX_MARKETPLACE_IDS : marketplace_ids
|
14
|
-
@local_var_path =
|
14
|
+
@local_var_path = "/solicitations/v1/orders/{amazonOrderId}/solicitations/productReviewAndSellerFeedback".sub(
|
15
|
+
"{" + "amazonOrderId" + "}", @amazon_order_id
|
16
|
+
)
|
15
17
|
@query_params = { "marketplaceIds" => @marketplace_ids }
|
16
|
-
@request_type =
|
18
|
+
@request_type = "POST"
|
17
19
|
call_api
|
18
20
|
end
|
19
21
|
end
|
@@ -1,20 +1,21 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
1
|
+
require "aws-sigv4"
|
2
|
+
require "uri"
|
3
|
+
require "aws-sdk-core"
|
4
|
+
require "typhoeus"
|
5
|
+
require "securerandom"
|
6
6
|
|
7
7
|
module MuffinMan
|
8
8
|
class SpApiClient
|
9
9
|
attr_reader :refresh_token, :client_id, :client_secret, :aws_access_key_id,
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
10
|
+
:aws_secret_access_key, :sts_iam_role_arn, :sandbox, :config, :region, :request_type,
|
11
|
+
:local_var_path, :query_params, :request_body, :scope
|
12
|
+
|
13
|
+
ACCESS_TOKEN_URL = "https://api.amazon.com/auth/o2/token".freeze
|
14
|
+
SERVICE_NAME = "execute-api".freeze
|
14
15
|
AWS_REGION_MAP = {
|
15
|
-
|
16
|
-
|
17
|
-
|
16
|
+
"na" => "us-east-1",
|
17
|
+
"eu" => "eu-west-1",
|
18
|
+
"fe" => "us-west-2"
|
18
19
|
}.freeze
|
19
20
|
|
20
21
|
def initialize(credentials, sandbox = false)
|
@@ -24,10 +25,10 @@ module MuffinMan
|
|
24
25
|
@aws_access_key_id = credentials[:aws_access_key_id]
|
25
26
|
@aws_secret_access_key = credentials[:aws_secret_access_key]
|
26
27
|
@sts_iam_role_arn = credentials[:sts_iam_role_arn]
|
27
|
-
@region = credentials[:region] ||
|
28
|
+
@region = credentials[:region] || "na"
|
28
29
|
@scope = credentials[:scope]
|
29
30
|
@sandbox = sandbox
|
30
|
-
Typhoeus::Config.user_agent =
|
31
|
+
Typhoeus::Config.user_agent = ""
|
31
32
|
@config = MuffinMan.configuration
|
32
33
|
end
|
33
34
|
|
@@ -39,9 +40,7 @@ module MuffinMan
|
|
39
40
|
|
40
41
|
def request_opts
|
41
42
|
opts = { headers: headers }
|
42
|
-
if request_body
|
43
|
-
opts[:body] = request_body.to_json
|
44
|
-
end
|
43
|
+
opts[:body] = request_body.to_json if request_body
|
45
44
|
opts
|
46
45
|
end
|
47
46
|
|
@@ -64,20 +63,21 @@ module MuffinMan
|
|
64
63
|
end
|
65
64
|
|
66
65
|
def retrieve_lwa_access_token
|
67
|
-
return request_lwa_access_token[
|
66
|
+
return request_lwa_access_token["access_token"] unless defined?(config.get_access_token)
|
67
|
+
|
68
68
|
stored_token = config.get_access_token.call(client_id)
|
69
69
|
if stored_token.nil?
|
70
70
|
new_token = request_lwa_access_token
|
71
71
|
config.save_access_token.call(client_id, new_token) if defined?(config.save_access_token)
|
72
|
-
|
72
|
+
new_token["access_token"]
|
73
73
|
else
|
74
|
-
|
74
|
+
stored_token
|
75
75
|
end
|
76
76
|
end
|
77
77
|
|
78
78
|
def request_lwa_access_token
|
79
79
|
body = {
|
80
|
-
grant_type:
|
80
|
+
grant_type: "refresh_token",
|
81
81
|
refresh_token: refresh_token,
|
82
82
|
client_id: client_id,
|
83
83
|
client_secret: client_secret
|
@@ -86,7 +86,7 @@ module MuffinMan
|
|
86
86
|
ACCESS_TOKEN_URL,
|
87
87
|
body: URI.encode_www_form(body),
|
88
88
|
headers: {
|
89
|
-
|
89
|
+
"Content-Type" => "application/x-www-form-urlencoded;charset=UTF-8"
|
90
90
|
}
|
91
91
|
)
|
92
92
|
JSON.parse(response.body)
|
@@ -142,16 +142,20 @@ module MuffinMan
|
|
142
142
|
def headers
|
143
143
|
access_token = scope ? retrieve_grantless_access_token : retrieve_lwa_access_token
|
144
144
|
headers = {
|
145
|
-
|
146
|
-
|
147
|
-
|
145
|
+
"x-amz-access-token" => access_token,
|
146
|
+
"user-agent" => "MuffinMan/#{VERSION} (Language=Ruby)",
|
147
|
+
"content-type" => "application/json"
|
148
148
|
}
|
149
149
|
signed_request.headers.merge(headers)
|
150
150
|
end
|
151
151
|
|
152
152
|
def derive_aws_region
|
153
153
|
@aws_region ||= AWS_REGION_MAP[region]
|
154
|
-
|
154
|
+
unless @aws_region
|
155
|
+
raise MuffinMan::Error,
|
156
|
+
"#{region} is not supported or does not exist. Region must be one of the following: #{AWS_REGION_MAP.keys.join(", ")}"
|
157
|
+
end
|
158
|
+
|
155
159
|
@aws_region
|
156
160
|
end
|
157
161
|
end
|
data/lib/muffin_man/version.rb
CHANGED
data/lib/muffin_man.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: muffin_man
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gavin
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: exe
|
12
12
|
cert_chain: []
|
13
|
-
date: 2022-
|
13
|
+
date: 2022-05-02 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rspec
|
@@ -126,6 +126,7 @@ files:
|
|
126
126
|
- lib/muffin_man/authorization/v1.rb
|
127
127
|
- lib/muffin_man/catalog_items/v20201201.rb
|
128
128
|
- lib/muffin_man/finances/v0.rb
|
129
|
+
- lib/muffin_man/lwa/auth_helper.rb
|
129
130
|
- lib/muffin_man/reports/v20210630.rb
|
130
131
|
- lib/muffin_man/solicitations/v1.rb
|
131
132
|
- lib/muffin_man/sp_api_client.rb
|