amz_sp_api 0.2.0 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +37 -26
- data/amz_sp_api-0.2.0.gem +0 -0
- data/lib/amz_sp_api.rb +33 -0
- data/lib/amz_sp_api_version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 129a4bc559aca17253362d03710e1fb6b5dcc55c
|
4
|
+
data.tar.gz: 7e0dbcb797f06e10deaebb2532add432cb58ac1f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 16ea2e4a0c8843c7f4a034d2bbfd5dff049079a1391a44da6d4aa864f48c351233ebcab67ca7b219850ca4a601f4ec4a8c7b79534bc3b268634e55497523b91b
|
7
|
+
data.tar.gz: 5c4154fd81e34f66f0c1ad31960cf338762097a705b147c44a496769f555520f0ea5250955cd707f8364d78b018288e02043e445d45efa596b79ea06ba6910ac
|
data/README.md
CHANGED
@@ -8,32 +8,7 @@ Auto-generated documentation is nested here, but the references in https://githu
|
|
8
8
|
|
9
9
|
## Installation
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
To build the Ruby code into a gem:
|
14
|
-
|
15
|
-
```shell
|
16
|
-
gem build amz_sp_api.gemspec
|
17
|
-
```
|
18
|
-
|
19
|
-
Then either install the gem locally:
|
20
|
-
|
21
|
-
```shell
|
22
|
-
gem install ./amz_sp_api-0.1.0.gem
|
23
|
-
```
|
24
|
-
(for development, run `gem install --dev ./amz_sp_api-0.1.0.gem` to install the development dependencies)
|
25
|
-
|
26
|
-
or publish the gem to a gem hosting service, e.g. [RubyGems](https://rubygems.org/).
|
27
|
-
|
28
|
-
Finally add this to the Gemfile:
|
29
|
-
|
30
|
-
gem 'amz_sp_api', '~> 0.1'
|
31
|
-
|
32
|
-
### Install from Git
|
33
|
-
|
34
|
-
If the Ruby gem is hosted at a git repository: https://github.com/ericcj/amz_sp_api, then add the following in the Gemfile:
|
35
|
-
|
36
|
-
gem 'amz_sp_api', :git => 'https://github.com/ericcj/amz_sp_api.git', branch: 'main'
|
11
|
+
Add the gem to your Gemfile as per https://rubygems.org/gems/amz_sp_api
|
37
12
|
|
38
13
|
## Getting Started
|
39
14
|
|
@@ -48,8 +23,19 @@ require 'fulfillment-outbound-api-model'
|
|
48
23
|
config.refresh_token =
|
49
24
|
config.client_id =
|
50
25
|
config.client_secret =
|
26
|
+
|
27
|
+
# either use these:
|
51
28
|
config.aws_access_key_id =
|
52
29
|
config.aws_secret_access_key =
|
30
|
+
|
31
|
+
# OR config.credentials_provider which is passed along to https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/Sigv4/Signer.html, e.g.
|
32
|
+
# require 'aws-sdk-core'
|
33
|
+
# config.credentials_provider = Aws::STS::Client.new(
|
34
|
+
# region: AmzSpApi::SpConfiguration::AWS_REGION_MAP['eu'],
|
35
|
+
# access_key_id: ,
|
36
|
+
# secret_access_key:
|
37
|
+
# ).assume_role(role_arn: , role_session_name: SecureRandom.uuid)
|
38
|
+
|
53
39
|
config.region = 'eu'
|
54
40
|
config.timeout = 20 # seconds
|
55
41
|
# config.debugging = true
|
@@ -69,6 +55,31 @@ require 'fulfillment-outbound-api-model'
|
|
69
55
|
end
|
70
56
|
```
|
71
57
|
|
58
|
+
## Documentation
|
59
|
+
|
60
|
+
This is a handy way to see all the API model class names and corresponding files you need to require for them, e.g. require 'finances-api-model' to use https://www.rubydoc.info/gems/amz_sp_api/AmzSpApi/FinancesApiModel/DefaultApi
|
61
|
+
|
62
|
+
## Feeds
|
63
|
+
|
64
|
+
This gem also offers encrypt/decrypt helper methods for feeds, but actually using that API as per https://github.com/amzn/selling-partner-api-docs/blob/main/guides/en-US/use-case-guides/feeds-api-use-case-guide requires the following calls:
|
65
|
+
|
66
|
+
```ruby
|
67
|
+
feeds = AmzSpApi::FeedsApiModel::FeedsApi.new(AmzSpApi::SpApiClient.new)
|
68
|
+
response = feeds.create_feed_document({"contentType" => content_type})
|
69
|
+
feed_document_id = response&.payload&.dig(:feedDocumentId)
|
70
|
+
url = response.payload[:url]
|
71
|
+
encrypted = AmzSpApi.encrypt_feed(feed_content, response.payload)
|
72
|
+
# PUT to url with lowercase "content-type" header, it's already pre-signed
|
73
|
+
response = feeds.create_feed({"feedType" => feed_type, "marketplaceIds" => marketplace_ids, "inputFeedDocumentId" => feed_document_id})
|
74
|
+
feed_id = response&.payload&.dig(:feedId)
|
75
|
+
response = feeds.get_feed(feed_id)
|
76
|
+
result_feed_document_id = response&.payload&.dig(:resultFeedDocumentId) # present once it is successful
|
77
|
+
response = feeds.get_feed_document(result_feed_document_id)
|
78
|
+
url = response&.payload&.dig(:url)
|
79
|
+
# GET response&.payload&.dig(:url) into ciphertext, again it's pre-signed so no authorization needed
|
80
|
+
AmzSpApi.decrypt_and_inflate_feed(ciphertext, response.payload)
|
81
|
+
```
|
82
|
+
|
72
83
|
## Thanks
|
73
84
|
|
74
85
|
to https://github.com/patterninc/muffin_man as the basis for [sp_api_client.rb](lib/sp_api_client.rb)
|
Binary file
|
data/lib/amz_sp_api.rb
CHANGED
@@ -15,5 +15,38 @@ module AmzSpApi
|
|
15
15
|
SpConfiguration.default
|
16
16
|
end
|
17
17
|
end
|
18
|
+
|
19
|
+
def encrypt_feed(feed_content, feed_document_response_payload)
|
20
|
+
cipher = feed_cipher(feed_document_response_payload, encrypt: true)
|
21
|
+
cipher.update(feed_content) + cipher.final
|
22
|
+
end
|
23
|
+
|
24
|
+
def decrypt_and_inflate_feed(ciphertext, feed_document_response_payload)
|
25
|
+
cipher = feed_cipher(feed_document_response_payload, encrypt: false)
|
26
|
+
|
27
|
+
compression = feed_document_response_payload[:compressionAlgorithm]
|
28
|
+
raise "unknown compressionAlgorithm #{compression}" if compression && compression != "GZIP"
|
29
|
+
|
30
|
+
result = cipher.update(ciphertext) + cipher.final
|
31
|
+
result = Zlib::Inflate.inflate(result) if compression
|
32
|
+
result
|
33
|
+
end
|
34
|
+
|
35
|
+
# from https://github.com/amzn/selling-partner-api-models/blob/main/clients/sellingpartner-api-documents-helper-java/src/main/java/com/amazon/spapi/documents/impl/AESCryptoStreamFactory.java
|
36
|
+
def feed_cipher(response, encrypt:)
|
37
|
+
key = Base64.decode64(response.dig(:encryptionDetails, :key))
|
38
|
+
|
39
|
+
cipher = case response.dig(:encryptionDetails, :standard)
|
40
|
+
when "AES"
|
41
|
+
OpenSSL::Cipher.new("AES-#{key.size * 8}-CBC")
|
42
|
+
else
|
43
|
+
raise "unknown encryption standard #{response.inspect}"
|
44
|
+
end
|
45
|
+
|
46
|
+
encrypt ? cipher.encrypt : cipher.decrypt
|
47
|
+
cipher.key = key
|
48
|
+
cipher.iv = Base64.decode64(response.dig(:encryptionDetails, :initializationVector))
|
49
|
+
cipher
|
50
|
+
end
|
18
51
|
end
|
19
52
|
end
|
data/lib/amz_sp_api_version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: amz_sp_api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eric Jensen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-04-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: typhoeus
|
@@ -96,6 +96,7 @@ files:
|
|
96
96
|
- LICENSE
|
97
97
|
- README.md
|
98
98
|
- Rakefile
|
99
|
+
- amz_sp_api-0.2.0.gem
|
99
100
|
- amz_sp_api.gemspec
|
100
101
|
- codegen.sh
|
101
102
|
- config.json
|