shoptet 0.0.1 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5707a03aee00c4da7081d5240e584e722e3acd3223a4e0a58c224c98b9a7dc77
4
- data.tar.gz: d58ec4a17e917631a70bc2e662f5f16edeaf321b2a3f77df8a63450c17995380
3
+ metadata.gz: 6d9c548dd730e3b59fb8ae843dab0fdae19b4779c27042c0aa5f01bed576cc88
4
+ data.tar.gz: 610aee2527b42a799c771b172a1fa54b942b5d0823080f2f2761271ce8efd6dc
5
5
  SHA512:
6
- metadata.gz: 4b0e431494bcbc05f7c75c8cf50e298cfece53d8421c74f63fcd424dd7efdaa6e4ed44d7bfc8c2a5846d2819eab620933bfa85700613bf83673fc00f4381da93
7
- data.tar.gz: 372d9d14962d9aefc387678197c7db28b95ccf9717a41a6517bd5043c1fe0a86b462f1935d2bf6c6fd261ffd637a8ef025500f1c6f2da9ee6d5ce2ba6a2c45a8
6
+ metadata.gz: 334fc975ad12a81db120372b3478369db2ed4c67df97e7bbc6cd62f2fe875e1f39f2366ee8f82330edd80e517eb592cf3962491d5328aeaf9cb67a72b3d41352
7
+ data.tar.gz: c627078af8708d7ad6beec828d1e19ff22e6e088042e1fd09d67c4ae86307e4e76093499e7041ac096d0326400157681121ffb5c8e5618f9de9299e824701ff1
data/.gitignore CHANGED
@@ -6,3 +6,4 @@
6
6
  /pkg/
7
7
  /spec/reports/
8
8
  /tmp/
9
+ /*.gem
data/README.md CHANGED
@@ -1,8 +1,6 @@
1
1
  # Shoptet
2
2
 
3
- This is Ruby API wrapper for [Shoptet API](https://developers.shoptet.com/) which provides access to e-shop data for addon developers.
4
-
5
- This is currently under development and hasn't been released to Rubygems yet.
3
+ This is Ruby API wrapper for [Shoptet API](https://shoptet.docs.apiary.io) which provides access to e-shop data for addon developers.
6
4
 
7
5
  # How to install
8
6
 
@@ -82,6 +80,7 @@ Also they accept hash with params which will be passed to Shoptet api. Through t
82
80
  ## Other
83
81
 
84
82
  * `Shoptet#new_api_token` - this returns new api token created with oauth token
83
+ * `Shoptet::install` - TODO
85
84
 
86
85
  ## License
87
86
 
@@ -1,23 +1,17 @@
1
1
  require_relative 'shoptet/request'
2
2
 
3
3
  class Shoptet
4
- class Error < StandardError
5
- #TODO: check that this works
6
- attr_reader :additional_data
7
-
8
- def initialize message, additional_data = {}
9
- super(message)
10
- @additional_data = additional_data
11
- end
12
- end
4
+ class Error < StandardError; end
13
5
  class AddonSuspended < StandardError; end
6
+ class AddonNotInstalled < StandardError; end
7
+ class InvalidTokenNoRights < StandardError; end
14
8
 
15
9
  DEFAULT_ON_TOKEN_ERROR = -> (api) do
16
10
  api.api_token = api.new_api_token
17
11
  end
18
12
 
19
13
  def self.version
20
- '0.0.1'
14
+ '0.0.6'
21
15
  end
22
16
 
23
17
  def self.ar_on_token_error(model)
@@ -37,6 +31,19 @@ class Shoptet
37
31
  end
38
32
  end
39
33
 
34
+ def self.install uri, redirect_uri, client_id, client_secret, code
35
+ data = {
36
+ 'redirect_uri' => redirect_uri,
37
+ 'client_id' => client_id,
38
+ 'client_secret' => client_secret,
39
+ 'code' => code,
40
+ 'grant_type' => 'authorization_code',
41
+ 'scope' => 'api'
42
+ }
43
+
44
+ Shoptet::Request.post uri, data
45
+ end
46
+
40
47
  attr_accessor :api_token
41
48
 
42
49
  def initialize(oauth_url, oauth_token, api_token = nil, on_token_error = nil)
@@ -46,11 +53,19 @@ class Shoptet
46
53
  @on_token_error = on_token_error || DEFAULT_ON_TOKEN_ERROR
47
54
  end
48
55
 
56
+ #TODO: return ['data'] already
49
57
  def shop_info api_params = {}
50
- request 'https://api.myshoptet.com/api/eshop'
58
+ result = request 'https://api.myshoptet.com/api/eshop'
59
+ result['data']
51
60
  end
52
61
 
53
- def warehouses api_params = {}
62
+ def design_info api_params = {}
63
+ result = request 'https://api.myshoptet.com/api/eshop/design'
64
+
65
+ result['data']
66
+ end
67
+
68
+ def stocks api_params = {}
54
69
  enumerize 'https://api.myshoptet.com/api/stocks', api_params
55
70
  end
56
71
 
@@ -63,6 +78,11 @@ class Shoptet
63
78
  enumerize uri, api_params
64
79
  end
65
80
 
81
+ def stocks_movements warehouse_id, api_params = {}
82
+ uri = "https://api.myshoptet.com/api/stocks/#{warehouse_id}/movements"
83
+ enumerize uri, api_params
84
+ end
85
+
66
86
  def product_categories api_params = {}
67
87
  enumerize 'https://api.myshoptet.com/api/categories', api_params
68
88
  end
@@ -93,35 +113,20 @@ class Shoptet
93
113
  def order code, api_params = {}
94
114
  uri = "https://api.myshoptet.com/api/orders/#{code}"
95
115
  result = request assemble_uri(uri, api_params)
96
- result.dig('data', 'order').merge(detail_url: uri)
116
+ result.dig 'data', 'order'
97
117
  end
98
118
 
99
119
  def product guid, api_params = {}
100
120
  uri = "https://api.myshoptet.com/api/products/#{guid}"
101
121
  result = request assemble_uri(uri, api_params)
102
- result.dig('data')
122
+ result['data']
103
123
  end
104
124
 
105
125
  def new_api_token
106
126
  headers = { 'Authorization' => "Bearer #{@oauth_token}" }
107
127
 
108
128
  result = Shoptet::Request.get @oauth_url, headers
109
- handle_errors result
110
-
111
- # error = result['error']
112
- # errors = result['errors'] || []
113
- #
114
- # #TODO: unite error handling with #request
115
- # if error || errors.any?
116
- # additional_data = {
117
- # uri: @oauth_url,
118
- # headers: scrub_sensitive_headers(headers)
119
- # }
120
- #
121
- # raise Error.new result, additional_data
122
- # else
123
- # result.fetch 'access_token'
124
- # end
129
+ handle_errors result, @oauth_url, headers
125
130
 
126
131
  result.fetch 'access_token'
127
132
  end
@@ -145,32 +150,36 @@ class Shoptet
145
150
  total_pages = first_page.dig('data', 'paginator', 'pageCount') || 0
146
151
  other_pages = 2..total_pages
147
152
 
148
- first_page.dig('data', data_key).each { y.yield _1.merge(page_url: uri) }
153
+ first_page.dig('data', data_key).each { y.yield _1 }
149
154
 
150
155
  other_pages.each do |page|
151
156
  uri = assemble_uri base_uri, filters.merge(page: page)
152
157
  result = request uri
153
- result.dig('data', data_key).each { y.yield _1.merge(page_url: uri) }
158
+ result.dig('data', data_key).each { y.yield _1 }
154
159
  end
155
160
  end
156
161
  end
157
162
 
158
- def request uri
163
+ def request uri, retry_on_token_error = true
159
164
  headers = { 'Shoptet-Access-Token' => @api_token,
160
165
  'Content-Type' => 'application/vnd.shoptet.v1.0' }
161
166
 
162
167
  result = Shoptet::Request.get uri, headers
163
- token_errors = handle_errors result
168
+ token_errors = handle_errors result, uri, headers
164
169
 
165
170
  if token_errors.any?
166
- @on_token_error.call self
167
- request uri
171
+ if retry_on_token_error
172
+ @on_token_error.call self
173
+ request uri, false
174
+ else
175
+ raise Error.new result
176
+ end
168
177
  else
169
178
  result
170
179
  end
171
180
  end
172
181
 
173
- def handle_errors result
182
+ def handle_errors result, uri, headers
174
183
  error = result['error']
175
184
  errors = result['errors'] || []
176
185
  token_errors, non_token_errors = errors.partition { |err| ['invalid-token', 'expired-token'].include? err['errorCode'] }
@@ -178,29 +187,15 @@ class Shoptet
178
187
  if error || non_token_errors.any?
179
188
  if error == 'addon_suspended'
180
189
  raise AddonSuspended
190
+ elsif error == 'addon_not_installed'
191
+ raise AddonNotInstalled
192
+ elsif errors.any? { |err| err["errorCode"] == 'invalid-token-no-rights' }
193
+ raise InvalidTokenNoRights
181
194
  else
182
- additional_data = {
183
- uri: uri,
184
- headers: scrub_sensitive_headers(headers)
185
- }
186
-
187
- raise Error.new result, additional_data
195
+ raise Error.new result
188
196
  end
189
197
  end
190
198
 
191
199
  token_errors
192
200
  end
193
-
194
- def scrub_sensitive_headers headers
195
- scrubbed = {}
196
-
197
- to_scrub = ['Shoptet-Access-Token', 'Authorization']
198
- to_scrub.each do |header|
199
- if headers[header]
200
- scrubbed[header] = "#{headers[header][0..20]}..."
201
- end
202
- end
203
-
204
- headers.merge scrubbed
205
- end
206
201
  end
@@ -28,5 +28,16 @@ class Shoptet
28
28
  rescue Net::OpenTimeout
29
29
  retry if attempt < 4
30
30
  end
31
+
32
+ def self.post uri, body
33
+ req = Net::HTTP::Post.new uri
34
+ req.set_form_data body
35
+
36
+ res = Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
37
+ http.request req
38
+ end
39
+
40
+ JSON.parse res.body
41
+ end
31
42
  end
32
43
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: shoptet
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Premysl Donat
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-11-07 00:00:00.000000000 Z
11
+ date: 2020-11-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: irb