smartpay 0.4.0 → 0.6.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 794e3de526f66e64a6c05638932f2c3c8a3cb7bcea3708f8df266ad9f02e7d4a
4
- data.tar.gz: f04b6f575b3be6e2320336a343fa9db842560654c5c7076d6b7bf07b2fcdab70
3
+ metadata.gz: 446eb4c4c827e38b97a57ecbceee0b43a932d53cdb11a6bd22215250c5897583
4
+ data.tar.gz: a6e513f1be63893df11793c7b74c66cea109e715423c2f0fbbb25c8869ed5089
5
5
  SHA512:
6
- metadata.gz: 54c1bd5ae7e587b67409e4eb9eed4c50d36690f09958e9003f3b9e9aadf927c429a41dc8c7b9fb18581f5594653f15fa0b3271896486f1276b07c1dd022f8910
7
- data.tar.gz: 7cefc78c6463a95317d3f87abfc3e9ccc83cf5aeac7f2efed30194fba42faa2069e8e35ce695720ed9a83cdb523cec27a494b0611d51cee90d92bd62ecefd0a9
6
+ metadata.gz: a274f5a5917cb8bef8bdabe0360f284436be5bc8f8052f7db9b6233eb6f7a18cfd798f4d1a63bd3d0a57e8e8cae1defc8f477e7e7bfe388531f13384e59245ce
7
+ data.tar.gz: 58c21a2d55b9fac38a560ac032d6af7f27f8bc2a61a6477fd1dcd2e884b2791d20f734c79dcd7be8c2b5b49f32eafec8f26604438cc55bf84313a46e5d864a3d
data/Gemfile CHANGED
@@ -5,10 +5,14 @@ source "https://rubygems.org"
5
5
  # Specify your gem's dependencies in smartpay.gemspec
6
6
  gemspec
7
7
 
8
+ gem "rest-client", "~> 2.1.0"
9
+
10
+ gem "securerandom", "~> 0.2.0"
11
+
12
+ gem "retries", "~> 0.0.5"
13
+
8
14
  gem "rake", "~> 13.0"
9
15
 
10
16
  gem "rspec", "~> 3.0"
11
17
 
12
18
  gem "rubocop", "~> 1.7"
13
-
14
- gem "thin"
data/lib/smartpay/api.rb CHANGED
@@ -5,21 +5,27 @@ module Smartpay
5
5
  class << self
6
6
  def create_checkout_session(payload)
7
7
  Responses::CheckoutSession.new(
8
- Client.post("/checkout-sessions", Requests::CheckoutSession.new(payload).as_hash)
8
+ Client.post("/checkout-sessions", params: {}, payload: Requests::CheckoutSession.new(payload).as_hash)
9
9
  )
10
10
  end
11
11
 
12
12
  def get_orders(page_token: nil, max_results: nil, expand: '' )
13
- Responses::Base.new(Client.get("/orders", { pageToken: page_token, maxResults: max_results, expand: expand }))
13
+ Responses::Base.new(Client.get("/orders", params: { pageToken: page_token, maxResults: max_results, expand: expand }))
14
14
  end
15
15
 
16
16
  def get_order(id, expand: '' )
17
- Responses::Base.new(Client.get("/orders/%s" % id, { expand: expand }))
17
+ Responses::Base.new(Client.get("/orders/%s" % id, params: { expand: expand }))
18
+ end
19
+
20
+ def cancel_order(id)
21
+ Responses::Base.new(
22
+ Client.put("/orders/%s/cancellation" % id)
23
+ )
18
24
  end
19
25
 
20
26
  def create_payment(payload)
21
27
  Responses::Base.new(
22
- Client.post("/payments", Requests::Payment.new(payload).as_hash)
28
+ Client.post("/payments", params:{}, payload: Requests::Payment.new(payload).as_hash)
23
29
  )
24
30
  end
25
31
 
@@ -27,9 +33,13 @@ module Smartpay
27
33
  create_payment(payload)
28
34
  end
29
35
 
36
+ def get_payment(id, expand: '' )
37
+ Responses::Base.new(Client.get("/payments/%s" % id, params: { expand: expand }))
38
+ end
39
+
30
40
  def create_refund(payload)
31
41
  Responses::Base.new(
32
- Client.post("/refunds", Requests::Refund.new(payload).as_hash)
42
+ Client.post("/refunds", params:{}, payload: Requests::Refund.new(payload).as_hash)
33
43
  )
34
44
  end
35
45
 
@@ -37,6 +47,10 @@ module Smartpay
37
47
  create_refund(payload)
38
48
  end
39
49
 
50
+ def get_refund(id, expand: '' )
51
+ Responses::Base.new(Client.get("/refunds/%s" % id, params: { expand: expand }))
52
+ end
53
+
40
54
  end
41
55
  end
42
56
  end
@@ -1,27 +1,54 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "rest-client"
4
+ require "retries"
5
+ require "securerandom"
4
6
 
5
7
  module Smartpay
6
8
  class Client
7
9
  class << self
8
- def get(path, payload = {})
9
- request_payload = default_payload.merge(payload)
10
+ def get(path, params: {})
11
+ request_params = default_params.merge(params)
10
12
  response = RestClient::Request.execute(method: :get, url: api_url(path),
11
- headers: headers.merge(params: request_payload),
13
+ headers: headers.merge(params: request_params),
12
14
  timeout: timeout)
13
15
  JSON.parse(response.body, symbolize_names: true)
14
16
  end
15
17
 
16
- def post(path, payload = {})
18
+ def post(path, params: {}, payload: {})
19
+ request_params = default_params.merge(params)
20
+ request_payload = default_payload.merge(payload)
21
+ idempotency_key = nonce
22
+ response = with_retries(:max_tries => 1, :rescue => [RestClient::BadRequest, RestClient::BadGateway, RestClient::ServiceUnavailable, RestClient::GatewayTimeout]) do
23
+ RestClient::Request.execute(method: :post, url: api_url(path),
24
+ params: request_params,
25
+ headers: headers.merge({Idempotency_Key: idempotency_key}).merge(params: request_params),
26
+ timeout: timeout,
27
+ payload: request_payload.to_json)
28
+ end
29
+ JSON.parse(response.body, symbolize_names: true)
30
+ end
31
+
32
+ def put(path, params: {}, payload: {})
33
+ request_params = default_params.merge(params).merge({'Idempotency-Key': nonce})
17
34
  request_payload = default_payload.merge(payload)
18
- response = RestClient::Request.execute(method: :post, url: api_url(path), headers: headers, timeout: timeout,
19
- payload: request_payload.to_json)
35
+ idempotency_key = nonce
36
+ response = with_retries(:max_tries => 1, :rescue => [RestClient::InternalServerError, RestClient::BadGateway, RestClient::ServiceUnavailable, RestClient::GatewayTimeout]) do
37
+ RestClient::Request.execute(method: :put, url: api_url(path),
38
+ params: request_params,
39
+ headers: headers.merge({Idempotency_Key: idempotency_key}).merge(params: request_params),
40
+ timeout: timeout,
41
+ payload: request_payload.to_json)
42
+ end
20
43
  JSON.parse(response.body, symbolize_names: true)
21
44
  end
22
45
 
23
46
  private
24
47
 
48
+ def nonce
49
+ SecureRandom.hex
50
+ end
51
+
25
52
  def api_url(path)
26
53
  "#{Smartpay.configuration.api_url}#{path}"
27
54
  end
@@ -42,12 +69,16 @@ module Smartpay
42
69
  Smartpay.configuration.secret_key
43
70
  end
44
71
 
45
- def default_payload
72
+ def default_params
46
73
  {
47
74
  'dev-lang': :ruby,
48
75
  'sdk-version': Smartpay::VERSION
49
76
  }.freeze
50
77
  end
78
+
79
+ def default_payload
80
+ {}.freeze
81
+ end
51
82
  end
52
83
  end
53
84
  end
@@ -6,6 +6,7 @@ module Smartpay
6
6
  attr_accessor :payload
7
7
 
8
8
  REQUIREMENT_KEY_NAME = [:successUrl, :cancelUrl, :customer, :currency, :items].freeze
9
+ LINE_ITEM_KINDS = %w[product tax discount].freeze
9
10
  CAN_FALLBACK_KEYS = [:customer].freeze
10
11
 
11
12
  def initialize(raw_payload)
@@ -32,11 +33,8 @@ module Smartpay
32
33
  shipping_info[:feeCurrency] = payload.dig(:currency)
33
34
  end
34
35
 
35
- total_amount = get_total_amount
36
-
37
- {
36
+ normalized = {
38
37
  customerInfo: normalize_customer_info(payload.dig(:customerInfo) || payload.dig(:customer) || {}),
39
- amount: total_amount,
40
38
  captureMethod: payload.dig(:captureMethod),
41
39
  currency: payload.dig(:currency),
42
40
  description: payload.dig(:description),
@@ -47,6 +45,10 @@ module Smartpay
47
45
  successUrl: payload.dig(:successUrl),
48
46
  cancelUrl: payload.dig(:cancelUrl),
49
47
  }
48
+
49
+ normalized[:amount] = get_total_amount(normalized)
50
+
51
+ return normalized
50
52
  end
51
53
 
52
54
  def normalize_customer_info(info)
@@ -111,29 +113,32 @@ module Smartpay
111
113
  productDescription: line_item.dig(:productDescription),
112
114
  metadata: line_item.dig(:metadata),
113
115
  productMetadata: line_item.dig(:productMetadata),
114
- priceMetadata: line_item.dig(:priceMetadata)
116
+ priceMetadata: line_item.dig(:priceMetadata),
117
+ kind: LINE_ITEM_KINDS.include?(line_item.dig(:kind)) ? line_item.dig(:kind) : nil
115
118
  }
116
119
  end
117
120
  end
118
121
 
122
+ def get_total_amount(raw_payload = nil)
123
+ total_amount = raw_payload.dig(:amount) || raw_payload.dig("amount")
124
+ return total_amount if total_amount
119
125
 
120
- def get_total_amount
121
- total_amount = payload.dig(:amount) || payload.dig('amount')
126
+ items = raw_payload.dig(:items)
122
127
 
123
- if total_amount.nil?
124
- items = payload.dig(:items)
125
-
126
- if !items.nil? && items.count > 0
127
- total_amount = items.inject(0) { |sum, item| sum + (item[:amount] || item['amount'] || 0) }
128
- end
129
-
130
- shipping_fee = payload.dig(:shippingInfo, :feeAmount) ||
131
- payload.dig(:shippingInfo, 'feeAmount') ||
132
- 0
133
- total_amount = shipping_fee + (total_amount || 0)
128
+ if !items.nil? && items.count.positive?
129
+ total_amount = items.inject(0) { |sum, item|
130
+ amount = item[:amount] || item["amount"] || 0
131
+ amount = -amount if item[:kind] == "discount"
132
+ sum + amount
133
+ }
134
134
  end
135
135
 
136
- total_amount
136
+ shipping_fee = raw_payload.dig(:shippingInfo, :feeAmount) ||
137
+ raw_payload.dig(:shippingInfo, "feeAmount") ||
138
+ 0
139
+ total_amount += shipping_fee
140
+
141
+ return total_amount
137
142
  end
138
143
  end
139
144
  end
@@ -30,6 +30,7 @@ module Smartpay
30
30
  amount: payload.dig(:amount),
31
31
  currency: payload.dig(:currency),
32
32
  reference: payload.dig(:reference),
33
+ cancelRemainder: payload.dig(:cancel_remainder),
33
34
  description: payload.dig(:description),
34
35
  metadata: payload.dig(:metadata) || {},
35
36
  }
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Smartpay
4
- VERSION = "0.4.0"
4
+ VERSION = "0.6.0"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: smartpay
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Smartpay
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-03-10 00:00:00.000000000 Z
11
+ date: 2022-09-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rest-client
@@ -38,7 +38,7 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '3.0'
41
- description:
41
+ description:
42
42
  email:
43
43
  - uxe@smartpay.co
44
44
  executables: []
@@ -78,7 +78,7 @@ metadata:
78
78
  homepage_uri: https://smartpay.co
79
79
  source_code_uri: https://github.com/smartpay-co/sdk-ruby
80
80
  changelog_uri: https://github.com/smartpay-co/sdk-ruby/blob/main/CHANGELOG.md
81
- post_install_message:
81
+ post_install_message:
82
82
  rdoc_options: []
83
83
  require_paths:
84
84
  - lib
@@ -93,8 +93,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
93
93
  - !ruby/object:Gem::Version
94
94
  version: '0'
95
95
  requirements: []
96
- rubygems_version: 3.2.32
97
- signing_key:
96
+ rubygems_version: 3.0.3.1
97
+ signing_key:
98
98
  specification_version: 4
99
99
  summary: The Smartpay Ruby SDK offers easy access to Smartpay API from applications
100
100
  written in Ruby.