smartpay 0.4.0 → 0.6.0

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: 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.