shoptet 0.0.6 → 0.0.11

Sign up to get free protection for your applications and to get access to all the features.
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