fawry 0.2.0 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'digest'
4
+
5
+ module Fawry
6
+ module Requests
7
+ module CreateCardTokenRequest
8
+ def fire_create_card_token_request
9
+ fawry_api_response = Connection.post(request[:path], request[:params], request[:body], request[:options])
10
+ response_body = JSON.parse(fawry_api_response.body)
11
+
12
+ FawryResponse.new(response_body)
13
+ end
14
+
15
+ private
16
+
17
+ def build_create_card_token_request
18
+ {
19
+ path: 'cards/cardToken',
20
+ params: {},
21
+ body: create_card_token_request_transformed_params,
22
+ options: options
23
+ }
24
+ end
25
+
26
+ def create_card_token_request
27
+ @create_card_token_request ||= params
28
+ end
29
+
30
+ def create_card_token_request_transformed_params
31
+ {
32
+ merchantCode: fawry_merchant_code,
33
+ customerProfileId: create_card_token_request[:customer_profile_id],
34
+ customerMobile: create_card_token_request[:customer_mobile],
35
+ customerEmail: create_card_token_request[:customer_email],
36
+ cardNumber: create_card_token_request[:card_number],
37
+ expiryYear: create_card_token_request[:expiry_year],
38
+ expiryMonth: create_card_token_request[:expiry_month],
39
+ cvv: create_card_token_request[:cvv]
40
+ }.compact
41
+ end
42
+
43
+ def fawry_merchant_code
44
+ Fawry.configuration.fawry_merchant_code || ENV.fetch('FAWRY_MERCHANT_CODE') { request_params[:merchant_code] }
45
+ end
46
+
47
+ def fawry_secure_key
48
+ Fawry.configuration.fawry_secure_key || ENV.fetch('FAWRY_SECURE_KEY') { request_params[:fawry_secure_key] }
49
+ end
50
+
51
+ def validate_card_token_params!
52
+ contract = Contracts::CreateCardTokenRequestContract.new.call(create_card_token_request)
53
+ raise InvalidFawryRequestError, contract.errors.to_h if contract.failure?
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'digest'
4
+
5
+ module Fawry
6
+ module Requests
7
+ module DeleteTokenRequest
8
+ def fire_delete_token_request
9
+ fawry_api_response = Connection.delete(request[:path], request[:params], request[:body], request[:options])
10
+ response_body = JSON.parse(fawry_api_response.body)
11
+
12
+ FawryResponse.new(response_body)
13
+ end
14
+
15
+ private
16
+
17
+ def build_delete_token_request
18
+ {
19
+ path: 'cards/cardToken',
20
+ params: {},
21
+ body: delete_token_request_transformed_params,
22
+ options: options
23
+ }
24
+ end
25
+
26
+ def request_params
27
+ @request_params = params
28
+ end
29
+
30
+ def delete_token_request_transformed_params
31
+ {
32
+ merchantCode: fawry_merchant_code,
33
+ customerProfileId: request_params[:customer_profile_id],
34
+ signature: delete_token_request_signature,
35
+ cardToken: request_params[:card_token]
36
+ }.compact
37
+ end
38
+
39
+ def fawry_merchant_code
40
+ Fawry.configuration.fawry_merchant_code || ENV.fetch('FAWRY_MERCHANT_CODE') { request_params[:merchant_code] }
41
+ end
42
+
43
+ def fawry_secure_key
44
+ Fawry.configuration.fawry_secure_key || ENV.fetch('FAWRY_SECURE_KEY') { request_params[:fawry_secure_key] }
45
+ end
46
+
47
+ def card_token
48
+ request_params[:card_token]
49
+ end
50
+
51
+ def validate_delete_token_params!
52
+ contract = Contracts::ListTokensRequestContract.new.call(request_params)
53
+ raise InvalidFawryRequestError, contract.errors.to_h if contract.failure?
54
+ end
55
+
56
+ def delete_token_request_signature
57
+ Digest::SHA256.hexdigest("#{fawry_merchant_code}#{request_params[:customer_profile_id]}"\
58
+ "#{card_token}#{fawry_secure_key}")
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'digest'
4
+
5
+ module Fawry
6
+ module Requests
7
+ module ListTokensRequest
8
+ def fire_list_tokens_request
9
+ fawry_api_response = Connection.get(request[:path], request[:params], request[:body], request[:options])
10
+ response_body = JSON.parse(fawry_api_response.body)
11
+
12
+ FawryResponse.new(response_body)
13
+ end
14
+
15
+ private
16
+
17
+ def build_list_tokens_request
18
+ {
19
+ path: 'cards/cardToken',
20
+ params: list_tokens_request_transformed_params,
21
+ body: {},
22
+ options: options
23
+ }
24
+ end
25
+
26
+ def request_params
27
+ @request_params = params
28
+ end
29
+
30
+ def list_tokens_request_transformed_params
31
+ {
32
+ merchantCode: fawry_merchant_code,
33
+ customerProfileId: request_params[:customer_profile_id],
34
+ signature: list_tokens_request_signature
35
+ }.compact
36
+ end
37
+
38
+ def fawry_merchant_code
39
+ Fawry.configuration.fawry_merchant_code || ENV.fetch('FAWRY_MERCHANT_CODE') { request_params[:merchant_code] }
40
+ end
41
+
42
+ def fawry_secure_key
43
+ Fawry.configuration.fawry_secure_key || ENV.fetch('FAWRY_SECURE_KEY') { request_params[:fawry_secure_key] }
44
+ end
45
+
46
+ def validate_list_tokens_params!
47
+ contract = Contracts::ListTokensRequestContract.new.call(request_params)
48
+ raise InvalidFawryRequestError, contract.errors.to_h if contract.failure?
49
+ end
50
+
51
+ def list_tokens_request_signature
52
+ Digest::SHA256.hexdigest("#{fawry_merchant_code}#{request_params[:customer_profile_id]}"\
53
+ "#{fawry_secure_key}")
54
+ end
55
+ end
56
+ end
57
+ end
@@ -16,7 +16,7 @@ module Fawry
16
16
 
17
17
  def build_payment_status_request
18
18
  {
19
- path: 'status',
19
+ path: 'payments/status',
20
20
  params: payment_status_request_transformed_params,
21
21
  body: {},
22
22
  options: options
@@ -29,20 +29,28 @@ module Fawry
29
29
 
30
30
  def payment_status_request_transformed_params
31
31
  {
32
- merchantCode: request_params[:merchant_code],
32
+ merchantCode: fawry_merchant_code,
33
33
  merchantRefNumber: request_params[:merchant_ref_number],
34
34
  signature: payment_status_request_signature
35
35
  }.compact
36
36
  end
37
37
 
38
+ def fawry_merchant_code
39
+ Fawry.configuration.fawry_merchant_code || ENV.fetch('FAWRY_MERCHANT_CODE') { request_params[:merchant_code] }
40
+ end
41
+
42
+ def fawry_secure_key
43
+ Fawry.configuration.fawry_secure_key || ENV.fetch('FAWRY_SECURE_KEY') { request_params[:fawry_secure_key] }
44
+ end
45
+
38
46
  def validate_payment_status_params!
39
47
  contract = Contracts::PaymentStatusRequestContract.new.call(request_params)
40
- raise InvalidFawryRequest, contract.errors.to_h if contract.failure?
48
+ raise InvalidFawryRequestError, contract.errors.to_h if contract.failure?
41
49
  end
42
50
 
43
51
  def payment_status_request_signature
44
- Digest::SHA256.hexdigest("#{request_params[:merchant_code]}#{request_params[:merchant_ref_number]}"\
45
- "#{request_params[:fawry_secure_key]}")
52
+ Digest::SHA256.hexdigest("#{fawry_merchant_code}#{request_params[:merchant_ref_number]}"\
53
+ "#{fawry_secure_key}")
46
54
  end
47
55
  end
48
56
  end
@@ -16,7 +16,7 @@ module Fawry
16
16
 
17
17
  def build_refund_request
18
18
  {
19
- path: 'refund',
19
+ path: 'payments/refund',
20
20
  params: {},
21
21
  body: refund_request_transformed_params,
22
22
  options: options
@@ -29,7 +29,7 @@ module Fawry
29
29
 
30
30
  def refund_request_transformed_params
31
31
  {
32
- merchantCode: request_params[:merchant_code],
32
+ merchantCode: fawry_merchant_code,
33
33
  referenceNumber: request_params[:reference_number],
34
34
  refundAmount: request_params[:refund_amount],
35
35
  reason: request_params[:reason],
@@ -37,15 +37,23 @@ module Fawry
37
37
  }.compact
38
38
  end
39
39
 
40
+ def fawry_merchant_code
41
+ Fawry.configuration.fawry_merchant_code || ENV.fetch('FAWRY_MERCHANT_CODE') { request_params[:merchant_code] }
42
+ end
43
+
44
+ def fawry_secure_key
45
+ Fawry.configuration.fawry_secure_key || ENV.fetch('FAWRY_SECURE_KEY') { request_params[:fawry_secure_key] }
46
+ end
47
+
40
48
  def validate_refund_params!
41
49
  contract = Contracts::RefundRequestContract.new.call(request_params)
42
- raise InvalidFawryRequest, contract.errors.to_h if contract.failure?
50
+ raise InvalidFawryRequestError, contract.errors.to_h if contract.failure?
43
51
  end
44
52
 
45
53
  def refund_request_signature
46
- Digest::SHA256.hexdigest("#{request_params[:merchant_code]}#{request_params[:reference_number]}"\
54
+ Digest::SHA256.hexdigest("#{fawry_merchant_code}#{request_params[:reference_number]}"\
47
55
  "#{format('%<refund_amount>.2f', refund_amount: request_params[:refund_amount])}"\
48
- "#{request_params[:reason]}#{request_params[:fawry_secure_key]}")
56
+ "#{request_params[:reason]}#{fawry_secure_key}")
49
57
  end
50
58
  end
51
59
  end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Fawry
4
+ module Utils
5
+ TRUTH_VALUES = [true, 'true', '1', 't'].freeze
6
+
7
+ # Adds keys from fawry API response as methods
8
+ # on object instance that return the value
9
+ # of each key
10
+ #
11
+ # type => type
12
+ # referenceNumber => reference_number
13
+ # merchantRefNumber => merchant_ref_number
14
+ # expirationTime => expiration_time
15
+ # statusCode => status_code
16
+ # statusDescription => status_description
17
+ #
18
+ # fawry_res = FawryResponse.new(response)
19
+ # fawry_res.status_code => 200
20
+ # fawry_res.reference_number => 1234567
21
+ def enrich_object(fawry_params)
22
+ fawry_params.each_key do |key|
23
+ method_name = key.to_s.split(/(?=[A-Z])/).map(&:downcase).join('_') # statusCode => status_code
24
+ instance_variable_set("@#{method_name}", fawry_params[key])
25
+ method_body = proc { instance_variable_get("@#{method_name}") }
26
+
27
+ self.class.public_send(:define_method, method_name, method_body)
28
+ end
29
+ end
30
+ end
31
+ end
data/lib/fawry/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Fawry
4
- VERSION = '0.2.0'
4
+ VERSION = '1.3.0'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fawry
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
- - Amr Bakry
8
- autorequire:
7
+ - Amr El Bakry
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-11-07 00:00:00.000000000 Z
11
+ date: 2021-05-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dry-validation
@@ -65,9 +65,6 @@ dependencies:
65
65
  - - "~>"
66
66
  - !ruby/object:Gem::Version
67
67
  version: '11.0'
68
- - - ">="
69
- - !ruby/object:Gem::Version
70
- version: 11.0.1
71
68
  type: :development
72
69
  prerelease: false
73
70
  version_requirements: !ruby/object:Gem::Requirement
@@ -75,23 +72,20 @@ dependencies:
75
72
  - - "~>"
76
73
  - !ruby/object:Gem::Version
77
74
  version: '11.0'
78
- - - ">="
79
- - !ruby/object:Gem::Version
80
- version: 11.0.1
81
75
  - !ruby/object:Gem::Dependency
82
76
  name: rake
83
77
  requirement: !ruby/object:Gem::Requirement
84
78
  requirements:
85
79
  - - "~>"
86
80
  - !ruby/object:Gem::Version
87
- version: '10.0'
81
+ version: '13.0'
88
82
  type: :development
89
83
  prerelease: false
90
84
  version_requirements: !ruby/object:Gem::Requirement
91
85
  requirements:
92
86
  - - "~>"
93
87
  - !ruby/object:Gem::Version
94
- version: '10.0'
88
+ version: '13.0'
95
89
  - !ruby/object:Gem::Dependency
96
90
  name: rspec
97
91
  requirement: !ruby/object:Gem::Requirement
@@ -107,56 +101,90 @@ dependencies:
107
101
  - !ruby/object:Gem::Version
108
102
  version: '3.0'
109
103
  - !ruby/object:Gem::Dependency
110
- name: webmock
104
+ name: rspec_junit_formatter
111
105
  requirement: !ruby/object:Gem::Requirement
112
106
  requirements:
113
- - - "~>"
107
+ - - ">="
114
108
  - !ruby/object:Gem::Version
115
- version: '3.7'
109
+ version: '0'
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
116
114
  - - ">="
117
115
  - !ruby/object:Gem::Version
118
- version: 3.7.6
116
+ version: '0'
117
+ - !ruby/object:Gem::Dependency
118
+ name: rubocop
119
+ requirement: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
123
+ version: '1.11'
119
124
  type: :development
120
125
  prerelease: false
121
126
  version_requirements: !ruby/object:Gem::Requirement
122
127
  requirements:
123
128
  - - "~>"
124
129
  - !ruby/object:Gem::Version
125
- version: '3.7'
126
- - - ">="
130
+ version: '1.11'
131
+ - !ruby/object:Gem::Dependency
132
+ name: webmock
133
+ requirement: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - "~>"
127
136
  - !ruby/object:Gem::Version
128
- version: 3.7.6
129
- description:
137
+ version: '3.12'
138
+ type: :development
139
+ prerelease: false
140
+ version_requirements: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - "~>"
143
+ - !ruby/object:Gem::Version
144
+ version: '3.12'
145
+ description:
130
146
  email:
131
- - amrrbakry17@gmail.com
147
+ - amrr@hey.com
132
148
  executables: []
133
149
  extensions: []
134
150
  extra_rdoc_files: []
135
151
  files:
152
+ - ".circleci/config.yml"
153
+ - ".github/workflows/ruby.yml"
136
154
  - ".gitignore"
137
155
  - ".rspec"
138
156
  - ".rubocop.yml"
139
- - ".travis.yml"
157
+ - CHANGELOG.md
140
158
  - CODE_OF_CONDUCT.md
141
159
  - Gemfile
142
160
  - Gemfile.lock
143
161
  - LICENSE.txt
162
+ - README-ar.md
144
163
  - README.md
145
164
  - Rakefile
146
165
  - bin/console
147
166
  - bin/setup
148
167
  - fawry.gemspec
149
168
  - lib/fawry.rb
169
+ - lib/fawry/config.rb
150
170
  - lib/fawry/connection.rb
151
171
  - lib/fawry/contracts/charge_request_contract.rb
172
+ - lib/fawry/contracts/create_card_token_request_contract.rb
173
+ - lib/fawry/contracts/delete_token_request_contract.rb
174
+ - lib/fawry/contracts/list_tokens_request_contract.rb
152
175
  - lib/fawry/contracts/payment_status_request_contract.rb
153
176
  - lib/fawry/contracts/refund_request_contract.rb
154
177
  - lib/fawry/errors.rb
178
+ - lib/fawry/fawry_callback.rb
155
179
  - lib/fawry/fawry_request.rb
156
180
  - lib/fawry/fawry_response.rb
157
181
  - lib/fawry/requests/charge_request.rb
182
+ - lib/fawry/requests/create_card_token_request.rb
183
+ - lib/fawry/requests/delete_token_request.rb
184
+ - lib/fawry/requests/list_tokens_request.rb
158
185
  - lib/fawry/requests/payment_status_request.rb
159
186
  - lib/fawry/requests/refund_request.rb
187
+ - lib/fawry/utils.rb
160
188
  - lib/fawry/version.rb
161
189
  homepage: https://github.com/amrrbakry/fawry
162
190
  licenses:
@@ -164,13 +192,13 @@ licenses:
164
192
  metadata:
165
193
  homepage_uri: https://github.com/amrrbakry/fawry
166
194
  source_code_uri: https://github.com/amrrbakry/fawry
167
- post_install_message:
195
+ post_install_message:
168
196
  rdoc_options: []
169
197
  require_paths:
170
198
  - lib
171
199
  required_ruby_version: !ruby/object:Gem::Requirement
172
200
  requirements:
173
- - - "~>"
201
+ - - ">="
174
202
  - !ruby/object:Gem::Version
175
203
  version: '2.6'
176
204
  required_rubygems_version: !ruby/object:Gem::Requirement
@@ -179,8 +207,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
179
207
  - !ruby/object:Gem::Version
180
208
  version: '0'
181
209
  requirements: []
182
- rubygems_version: 3.0.1
183
- signing_key:
210
+ rubygems_version: 3.1.4
211
+ signing_key:
184
212
  specification_version: 4
185
213
  summary: A library to interface with Fawry's payment gateway API (charge, refund,
186
214
  payment status, service callback).