shoptet 0.0.6 → 0.0.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/lib/shoptet.rb +111 -37
  3. data/lib/shoptet/request.rb +13 -4
  4. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6d9c548dd730e3b59fb8ae843dab0fdae19b4779c27042c0aa5f01bed576cc88
4
- data.tar.gz: 610aee2527b42a799c771b172a1fa54b942b5d0823080f2f2761271ce8efd6dc
3
+ metadata.gz: 0c25e08acd0126a8756438b17836f64f13268628e32a9fc9f8a1375f75096626
4
+ data.tar.gz: 2b998f5dd0df5d74a6c56be2b1fabfa4651d56efcbb276194f56b7aa8f62f10a
5
5
  SHA512:
6
- metadata.gz: 334fc975ad12a81db120372b3478369db2ed4c67df97e7bbc6cd62f2fe875e1f39f2366ee8f82330edd80e517eb592cf3962491d5328aeaf9cb67a72b3d41352
7
- data.tar.gz: c627078af8708d7ad6beec828d1e19ff22e6e088042e1fd09d67c4ae86307e4e76093499e7041ac096d0326400157681121ffb5c8e5618f9de9299e824701ff1
6
+ metadata.gz: 13ba8bead9e42327929dd0bd25f64cc838ecbc52f4a26c506c379301da92d89053ec7189cd5dabee353c9220ae5a1941652690fdbcafcebe2e4c91c63a1d0cb9
7
+ data.tar.gz: 8f34a681340f8ad9db35c242ae808b00e8b8062c84698dc46e735037a9b9c696d203402b1e77d0e4b5a116e2bb34507b4062a697ce2b1d36608ce43917f03bba
@@ -1,6 +1,9 @@
1
+ require 'delegate'
1
2
  require_relative 'shoptet/request'
2
3
 
3
4
  class Shoptet
5
+ include Shoptet::UrlHelpers
6
+
4
7
  class Error < StandardError; end
5
8
  class AddonSuspended < StandardError; end
6
9
  class AddonNotInstalled < StandardError; end
@@ -10,8 +13,60 @@ class Shoptet
10
13
  api.api_token = api.new_api_token
11
14
  end
12
15
 
16
+ class ApiEnumerator < SimpleDelegator
17
+ def initialize base_url, filters, data_key, api
18
+ @base_url = base_url
19
+ @filters = filters
20
+ @data_key = data_key || URI(base_url).path.split('/').last
21
+ @api = api
22
+
23
+ @enum = Enumerator.new do |y|
24
+ first_page.dig('data', @data_key).each { y.yield _1 }
25
+
26
+ if total_pages > 1
27
+ other_pages = 2..(total_pages - 1)
28
+ other_pages.each do |page|
29
+ uri = @api.assemble_uri base_url, filters.merge(page: page)
30
+ result = @api.request uri
31
+ result.dig('data', @data_key).each { y.yield _1 }
32
+ end
33
+
34
+ last_page.dig('data', @data_key).each { y.yield _1 }
35
+ end
36
+ end
37
+
38
+ super @enum
39
+ end
40
+
41
+ def first_page
42
+ @first_page ||=
43
+ begin
44
+ uri = @api.assemble_uri @base_url, @filters
45
+ @api.request uri
46
+ end
47
+ end
48
+
49
+ def total_pages
50
+ first_page.dig('data', 'paginator', 'pageCount') || 0
51
+ end
52
+
53
+ def last_page
54
+ return first_page if total_pages < 2
55
+
56
+ @last_page ||=
57
+ begin
58
+ uri = @api.assemble_uri @base_url, @filters.merge(page: total_pages)
59
+ @api.request uri
60
+ end
61
+ end
62
+
63
+ def size
64
+ first_page['data']['paginator']['totalCount']
65
+ end
66
+ end
67
+
13
68
  def self.version
14
- '0.0.6'
69
+ '0.0.11'
15
70
  end
16
71
 
17
72
  def self.ar_on_token_error(model)
@@ -31,9 +86,9 @@ class Shoptet
31
86
  end
32
87
  end
33
88
 
34
- def self.install uri, redirect_uri, client_id, client_secret, code
89
+ def self.install url, redirect_url, client_id, client_secret, code
35
90
  data = {
36
- 'redirect_uri' => redirect_uri,
91
+ 'redirect_uri' => redirect_url,
37
92
  'client_id' => client_id,
38
93
  'client_secret' => client_secret,
39
94
  'code' => code,
@@ -41,26 +96,68 @@ class Shoptet
41
96
  'scope' => 'api'
42
97
  }
43
98
 
44
- Shoptet::Request.post uri, data
99
+ Shoptet::Request.post url, data
100
+ end
101
+
102
+ def self.login_token url, code, client_id, client_secret, redirect_url
103
+ data = {
104
+ code: code,
105
+ grant_type: 'authorization_code',
106
+ client_id: client_id,
107
+ client_secret: client_secret,
108
+ redirect_uri: redirect_url,
109
+ scope: 'basic_eshop'
110
+ }
111
+
112
+ Shoptet::Request.post url, data
113
+ end
114
+
115
+ def self.basic_eshop url, access_token
116
+ Shoptet::Request.get url, { 'Authorization' => "Bearer #{access_token}" }
45
117
  end
46
118
 
47
119
  attr_accessor :api_token
48
120
 
49
- def initialize(oauth_url, oauth_token, api_token = nil, on_token_error = nil)
121
+ def initialize oauth_url:, oauth_token:, shop_url:, client_id:, api_token: nil, on_token_error: nil
50
122
  @oauth_url = oauth_url
51
123
  @oauth_token = oauth_token
124
+ @shop_url = shop_url
125
+ @client_id = client_id
52
126
  @api_token = api_token
53
127
  @on_token_error = on_token_error || DEFAULT_ON_TOKEN_ERROR
54
128
  end
55
129
 
56
- #TODO: return ['data'] already
130
+ def endpoints api_params = {}
131
+ enumerize 'https://api.myshoptet.com/api/system/endpoints', api_params
132
+ end
133
+
134
+ def endpoint_approved? endpoint
135
+ @approved_endpoints ||= endpoints
136
+
137
+ @approved_endpoints.any? { _1['endpoint'] == endpoint }
138
+ end
139
+
140
+ def authorize_url redirect_url, state
141
+ query = {
142
+ client_id: @client_id,
143
+ state: state,
144
+ scope: 'basic_eshop',
145
+ response_type: 'code',
146
+ redirect_uri: redirect_url
147
+ }.to_query
148
+
149
+ URI("#{@shop_url}action/OAuthServer/authorize?#{query}").to_s
150
+ end
151
+
57
152
  def shop_info api_params = {}
58
- result = request 'https://api.myshoptet.com/api/eshop'
153
+ url = assemble_uri 'https://api.myshoptet.com/api/eshop', api_params
154
+ result = request url
59
155
  result['data']
60
156
  end
61
157
 
62
158
  def design_info api_params = {}
63
- result = request 'https://api.myshoptet.com/api/eshop/design'
159
+ url = assemble_uri 'https://api.myshoptet.com/api/eshop/design', api_params
160
+ result = request url
64
161
 
65
162
  result['data']
66
163
  end
@@ -131,35 +228,6 @@ class Shoptet
131
228
  result.fetch 'access_token'
132
229
  end
133
230
 
134
- private
135
-
136
- def assemble_uri base, params = {}
137
- u = URI(base)
138
- u.query = URI.encode_www_form(params) if params.any?
139
-
140
- u.to_s
141
- end
142
-
143
- def enumerize base_uri, filters = {}, data_key = nil
144
- data_key ||= URI(base_uri).path.split('/').last
145
- uri = assemble_uri base_uri, filters
146
- size_proc = -> () { request(uri)['data']['paginator']['totalCount'] }
147
-
148
- Enumerator.new(size_proc) do |y|
149
- first_page = request uri
150
- total_pages = first_page.dig('data', 'paginator', 'pageCount') || 0
151
- other_pages = 2..total_pages
152
-
153
- first_page.dig('data', data_key).each { y.yield _1 }
154
-
155
- other_pages.each do |page|
156
- uri = assemble_uri base_uri, filters.merge(page: page)
157
- result = request uri
158
- result.dig('data', data_key).each { y.yield _1 }
159
- end
160
- end
161
- end
162
-
163
231
  def request uri, retry_on_token_error = true
164
232
  headers = { 'Shoptet-Access-Token' => @api_token,
165
233
  'Content-Type' => 'application/vnd.shoptet.v1.0' }
@@ -179,6 +247,12 @@ class Shoptet
179
247
  end
180
248
  end
181
249
 
250
+ private
251
+
252
+ def enumerize base_url, filters = {}, data_key = nil
253
+ ApiEnumerator.new base_url, filters, data_key, self
254
+ end
255
+
182
256
  def handle_errors result, uri, headers
183
257
  error = result['error']
184
258
  errors = result['errors'] || []
@@ -3,6 +3,15 @@ require 'net/http'
3
3
  #TODO: keep_alive_timeout ?
4
4
 
5
5
  class Shoptet
6
+ module UrlHelpers
7
+ def assemble_uri base, params = {}
8
+ u = URI(base)
9
+ u.query = URI.encode_www_form(params) if params.any?
10
+
11
+ u.to_s
12
+ end
13
+ end
14
+
6
15
  class Request
7
16
  def self.get uri, headers
8
17
  attempt ||= 0
@@ -12,10 +21,10 @@ class Shoptet
12
21
 
13
22
  http = Net::HTTP.new parsed_uri.host, parsed_uri.port
14
23
  http.use_ssl = true
15
- http.open_timeout = 10
16
- http.read_timeout = 10
17
- http.write_timeout = 10
18
- http.ssl_timeout = 10
24
+ http.open_timeout = 60
25
+ http.read_timeout = 60
26
+ http.write_timeout = 60
27
+ http.ssl_timeout = 60
19
28
 
20
29
  request = Net::HTTP::Get.new parsed_uri
21
30
  headers.each do |key, value|
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.6
4
+ version: 0.0.11
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-11 00:00:00.000000000 Z
11
+ date: 2020-11-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: irb