shopify_api_bruv 0.2.5 → 0.2.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: a2eafeb4b6b73eb2c88b47e98df7b2f3c5add8f8a3f020f07dc36401b4925172
4
- data.tar.gz: 8fb5b3856c077beacbac51681e8d4087439b1e733b239e05de32d57089f1d667
3
+ metadata.gz: 62561cc5b575e25d08e4fdbab3bb413f0f7d6b1c092ae617021d363fe39949e7
4
+ data.tar.gz: ede66f0903bca3c0c05cd77baec2049a7a254519815d2bbfd00afb546609e0ac
5
5
  SHA512:
6
- metadata.gz: 4aecd84a37c5ecba70d4ad704319e1fc918673994d6bfb64a756f68fab6ccd0a7f3e94c6d7fe0c28cad24f4cf86bbf2ccfb2cc1c4c9e8df2a5c9b48ff2682cd2
7
- data.tar.gz: 653bbe844a17b8e879ed704d8428767a033d036a711c29a6f8acbfc4314f7bea0930599f7edb5035f32b26f67e42641792128fc159d1e3bf8c1ca5030d07b2b6
6
+ metadata.gz: c30df045b71ae5b922a2faec703eb85c40c3b71e7365c41ba5312def42c9b5f5067484a2ee0c7538212d275fa86fed0de8d016d9e4b8472ebc54c59ed44f6476
7
+ data.tar.gz: fc3d0fa99d9b63d69c47d0a971c72cf10d0a865b1d3e1807eae1922e5e498d429f764d3780404cf38eafa7d7a07d2bd620ee40c88796fce6aded445a9c07ab2d
data/CHANGELOG.md CHANGED
@@ -1,5 +1,10 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [0.2.6] - 2023-12-09
4
+
5
+ - Adds pagination resource to rest resource
6
+ - Fixes query not being forwarded
7
+
3
8
  ## [0.2.5] - 2023-12-09
4
9
 
5
10
  - Updates http request for better log message
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- shopify_api_bruv (0.2.5)
4
+ shopify_api_bruv (0.2.6)
5
5
  httparty
6
6
  logger
7
7
 
@@ -14,6 +14,7 @@ module ShopifyApiBruv
14
14
  def request(query:, variables: nil, headers: nil)
15
15
  http_client.request(
16
16
  http_request: HttpRequest.new(
17
+ api: :graphql,
17
18
  method: :post,
18
19
  path: '/graphql.json',
19
20
  body: { query:, variables: },
@@ -31,7 +31,11 @@ module ShopifyApiBruv
31
31
  body: http_request.body
32
32
  )
33
33
 
34
- HttpResponse.new(code: response.code, headers: response.headers, body: response.parsed_response)
34
+ if http_request.api == :rest
35
+ Rest::HttpResponse.new(code: response.code, headers: response.headers, body: response.parsed_response)
36
+ else
37
+ HttpResponse.new(code: response.code, headers: response.headers, body: response.parsed_response)
38
+ end
35
39
  end
36
40
  end
37
41
  end
@@ -3,9 +3,10 @@
3
3
  module ShopifyApiBruv
4
4
  module Clients
5
5
  class HttpRequest
6
- attr_reader :method, :path, :body, :content_type, :query, :headers
6
+ attr_reader :api, :method, :path, :body, :content_type, :query, :headers
7
7
 
8
- def initialize(method:, path:, body:, content_type:, query: nil, headers:)
8
+ def initialize(api:, method:, path:, body:, content_type:, query: nil, headers:)
9
+ @api = api
9
10
  @method = method
10
11
  @path = path
11
12
  @body = body.is_a?(Hash) ? body.to_json : body
@@ -3,49 +3,28 @@
3
3
  module ShopifyApiBruv
4
4
  module Clients
5
5
  class HttpResponse
6
- attr_reader :code, :headers, :body, :page_info
6
+ attr_reader :code, :headers, :body
7
7
 
8
8
  def initialize(code:, headers:, body:)
9
9
  @code = code
10
10
  @headers = headers
11
11
  @body = body
12
- @page_info = parse_page_info
13
12
 
14
13
  ShopifyApiBruv.logger(
15
14
  method: :info,
16
15
  message: "Shopify API Response (Code: #{code}):\nHeaders:\n#{headers}\n\nBody:\n#{body}"
17
16
  )
18
17
 
19
- validate!
18
+ validate
20
19
  end
21
20
 
22
21
  private
23
22
 
24
- def parse_page_info
25
- return { previous: nil, next: nil } if headers['link'].nil?
26
-
27
- page_info = {}
28
-
29
- headers['link'].split(',').each do |link|
30
- rel = link.match(/rel="(.*?)"/).captures.first
31
- url = link.match(/<(.*?)>/).captures.first
32
-
33
- URI.parse(url).query.split('&').each do |param|
34
- if param.split('=').first == 'page_info'
35
- page_info[rel] = param.split('=').last
36
- break
37
- end
38
- end
39
- end
40
-
41
- { previous: page_info['previous'], next: page_info['next'] }
42
- end
43
-
44
23
  def ok?
45
24
  (200..299).cover?(code)
46
25
  end
47
26
 
48
- def validate!
27
+ def validate
49
28
  return if ok?
50
29
 
51
30
  errors = body['errors'] || ''
@@ -32,9 +32,11 @@ module ShopifyApiBruv
32
32
  def request(method:, path:, body:, query:, headers:)
33
33
  http_client.request(
34
34
  http_request: HttpRequest.new(
35
+ api: :rest,
35
36
  method:,
36
37
  path:,
37
38
  body:,
39
+ query:,
38
40
  content_type: body.nil? ? nil : 'application/json',
39
41
  headers:
40
42
  )
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ShopifyApiBruv
4
+ module Clients
5
+ module Rest
6
+ class HttpResponse < HttpResponse
7
+ attr_reader :page_info
8
+
9
+ def initialize(code:, headers:, body:)
10
+ super(code:, headers:, body:)
11
+
12
+ @page_info = parse_page_info
13
+ end
14
+
15
+ private
16
+
17
+ def parse_page_info
18
+ return { previous: nil, next: nil } if headers['link'].nil?
19
+
20
+ page_info = {}
21
+
22
+ headers['link'].split(',').each do |link|
23
+ rel = link.match(/rel="(.*?)"/).captures.first
24
+ url = link.match(/<(.*?)>/).captures.first
25
+
26
+ URI.parse(url).query.split('&').each do |param|
27
+ if param.split('=').first == 'page_info'
28
+ page_info[rel] = param.split('=').last
29
+ break
30
+ end
31
+ end
32
+ end
33
+
34
+ { previous: page_info['previous'], next: page_info['next'] }
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -19,13 +19,6 @@ module ShopifyApiBruv
19
19
  raise NotImplementedError, 'Please set a query in the derived class' if query.nil?
20
20
 
21
21
  response = client.request(query:, variables:)
22
-
23
- handle_response(response:, query:, variables:, tries:)
24
- end
25
-
26
- private
27
-
28
- def handle_response(response:, query:, variables:, tries:)
29
22
  body = response.body
30
23
 
31
24
  handle_response_errors(body:, query:, variables:, tries:)
@@ -34,6 +27,8 @@ module ShopifyApiBruv
34
27
  mutation_object_name.nil? ? body['data'] : body.dig('data', mutation_object_name)
35
28
  end
36
29
 
30
+ private
31
+
37
32
  def handle_response_errors(body:, query:, variables:, tries:)
38
33
  errors = body['errors'] || body.dig('data', 'errors')
39
34
 
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ShopifyApiBruv
4
+ module Resources
5
+ module Rest
6
+ class PaginationResource
7
+ attr_reader :resource, :page_info
8
+
9
+ def initialize(resource:, page_info:)
10
+ @resource = resource
11
+ @page_info = page_info
12
+ end
13
+
14
+ def next_page?
15
+ !page_info[:next].nil?
16
+ end
17
+
18
+ def previous_page?
19
+ !page_info[:previous].nil?
20
+ end
21
+
22
+ def purpose?
23
+ next_page? || previous_page?
24
+ end
25
+
26
+ def fetch_next_page
27
+ raise Errors::ResourceError, 'Next page cursor not found' unless next_page?
28
+
29
+ resource.query[:page_info] = page_info[:next]
30
+ resource.request
31
+ end
32
+
33
+ def fetch_previous_page
34
+ raise Errors::ResourceError, 'Previous page cursor not found' unless previous_page?
35
+
36
+ resource.query[:page_info] = page_info[:previous]
37
+ resource.request
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -4,7 +4,8 @@ module ShopifyApiBruv
4
4
  module Resources
5
5
  module Rest
6
6
  class Resource < Base
7
- attr_reader :client, :method, :path, :body, :query
7
+ attr_reader :client, :method, :path, :body
8
+ attr_accessor :query, :pagination_resource
8
9
 
9
10
  SLEEP_TIMER = ENV.fetch('SHOPIFY_API_BRUV_REQUEST_SLEEP_TIMER', 4).to_i
10
11
  MINIMUM_CREDIT_LEFT = ENV.fetch('SHOPIFY_API_BRUV_REQUEST_MINIMUM_CREDIT_LEFT', 4).to_i
@@ -16,31 +17,28 @@ module ShopifyApiBruv
16
17
  @body = body
17
18
  @query = query
18
19
 
19
- validate_arguments!
20
+ validate_arguments
20
21
  end
21
22
 
22
23
  def request
23
24
  response = client.public_send(method, path:, body:, query:)
24
25
 
25
- handle_response(response:)
26
+ handle_response_api_limits(headers: response.headers)
27
+
28
+ pagination_resource = PaginationResource.new(resource: self, page_info: response.page_info)
29
+ @pagination_resource = pagination_resource if pagination_resource.purpose?
30
+
31
+ response.body
26
32
  end
27
33
 
28
34
  private
29
35
 
30
- def validate_arguments!
36
+ def validate_arguments
31
37
  if [:put, :post].include?(method)
32
38
  raise Errors::ResourceError, "Argument 'body' is required for method: #{method}" if body.nil?
33
39
  end
34
40
  end
35
41
 
36
- def handle_response(response:)
37
- handle_response_api_limits(headers: response.headers)
38
-
39
- body = response.body
40
- body['page_info'] = response.page_info if body.is_a?(Hash)
41
- body
42
- end
43
-
44
42
  def handle_response_api_limits(headers:)
45
43
  api_call_limit_header = headers['x-shopify-shop-api-call-limit'].split('/')
46
44
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ShopifyApiBruv
4
- VERSION = '0.2.5'
4
+ VERSION = '0.2.6'
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: shopify_api_bruv
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.5
4
+ version: 0.2.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Idjent
@@ -118,12 +118,14 @@ files:
118
118
  - lib/shopify_api_bruv/clients/http_request.rb
119
119
  - lib/shopify_api_bruv/clients/http_response.rb
120
120
  - lib/shopify_api_bruv/clients/rest/client.rb
121
+ - lib/shopify_api_bruv/clients/rest/http_response.rb
121
122
  - lib/shopify_api_bruv/errors/http_client_error.rb
122
123
  - lib/shopify_api_bruv/errors/http_response_error.rb
123
124
  - lib/shopify_api_bruv/errors/resource_error.rb
124
125
  - lib/shopify_api_bruv/logger.rb
125
126
  - lib/shopify_api_bruv/resources/base.rb
126
127
  - lib/shopify_api_bruv/resources/graphql/resource.rb
128
+ - lib/shopify_api_bruv/resources/rest/pagination_resource.rb
127
129
  - lib/shopify_api_bruv/resources/rest/resource.rb
128
130
  - lib/shopify_api_bruv/version.rb
129
131
  - sig/shopify_api_bruv.rbs