synapse_pay_rest 2.0.2 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (32) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/lib/synapse_pay_rest.rb +3 -1
  4. data/lib/synapse_pay_rest/error.rb +1 -0
  5. data/lib/synapse_pay_rest/http_client.rb +2 -0
  6. data/lib/synapse_pay_rest/models/node/ach_us_node.rb +11 -19
  7. data/lib/synapse_pay_rest/models/node/base_node.rb +88 -17
  8. data/lib/synapse_pay_rest/models/node/eft_ind_node.rb +7 -6
  9. data/lib/synapse_pay_rest/models/node/eft_np_node.rb +3 -4
  10. data/lib/synapse_pay_rest/models/node/iou_node.rb +6 -15
  11. data/lib/synapse_pay_rest/models/node/node.rb +18 -17
  12. data/lib/synapse_pay_rest/models/node/reserve_us_node.rb +5 -11
  13. data/lib/synapse_pay_rest/models/node/synapse_ind_node.rb +4 -8
  14. data/lib/synapse_pay_rest/models/node/synapse_np_node.rb +2 -8
  15. data/lib/synapse_pay_rest/models/node/synapse_us_node.rb +2 -8
  16. data/lib/synapse_pay_rest/models/node/triumph_subaccount_us_node.rb +17 -0
  17. data/lib/synapse_pay_rest/models/node/unverified_node.rb +1 -1
  18. data/lib/synapse_pay_rest/models/node/wire_int_node.rb +3 -4
  19. data/lib/synapse_pay_rest/models/node/wire_us_node.rb +1 -2
  20. data/lib/synapse_pay_rest/models/transaction/transaction.rb +9 -9
  21. data/lib/synapse_pay_rest/models/user/base_document.rb +12 -16
  22. data/lib/synapse_pay_rest/models/user/document.rb +2 -2
  23. data/lib/synapse_pay_rest/models/user/physical_document.rb +58 -17
  24. data/lib/synapse_pay_rest/models/user/user.rb +27 -10
  25. data/lib/synapse_pay_rest/models/user/virtual_document.rb +7 -8
  26. data/lib/synapse_pay_rest/version.rb +1 -1
  27. data/samples.md +41 -60
  28. data/synapse_pay_rest.gemspec +8 -8
  29. metadata +4 -6
  30. data/lib/synapse_pay_rest/models/node/eft_node.rb +0 -27
  31. data/lib/synapse_pay_rest/models/node/synapse_node.rb +0 -25
  32. data/lib/synapse_pay_rest/models/node/wire_node.rb +0 -38
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2917b1bf6fcbc242ae675356583c24b0e955b322
4
- data.tar.gz: 42c6425c2d7f7db9e2d77634a3a061acb77b84b0
3
+ metadata.gz: bf13c67916c9560ecd7993d03b00691ea15ca16e
4
+ data.tar.gz: 4df8ab520d132d23e4196c63a8ea2fdb9bc5cc46
5
5
  SHA512:
6
- metadata.gz: fee11b10a3b18642ad718684796c2f29ba5d33b453f0e4e1bc5ad22bcc8b443220bf0eabf6edc9bb5c6d9265ad935e82932092af243d6c92e7565751c66da12e
7
- data.tar.gz: f2c6a0267dfae1ff7637a25219fcea5b9b5a6a5260f5dd910987d10563363a89cce0633f5cf4c2d45898548210fa6807fb8ec6e9e5e8fe185af0332d92ae5697
6
+ metadata.gz: eace5ad6f06ecb638f69eaffd0a505e903444d78f0e1324d1a4e19f06d2ef423b40719abbf4b8d23ddf60157a8066428e7abdbfd36f0ce907c4234f3ae98e353
7
+ data.tar.gz: 10fe666bec184de1cd0b72a5d1ae4ae09e4a1a4a238bddab316c93ea1fc5dcb8558f68b766aef529dc5cdcbd0b19f6d9e9b2fd4fb4766739f4c81ca76900c27b
data/README.md CHANGED
@@ -60,7 +60,7 @@ To run all tests, execute:
60
60
  rake
61
61
  ```
62
62
 
63
- To run a specific test or file, install the [m](https://github.com/qrush/m) gem and execute:
63
+ To run a specific file or test, install the [m](https://github.com/qrush/m) gem and execute:
64
64
 
65
65
  ```bash
66
66
  m path/to/file:line_number
@@ -22,7 +22,7 @@ require 'synapse_pay_rest/models/user/question'
22
22
 
23
23
  # node-related classes
24
24
 
25
- # ancestor of all BaseNodes
25
+ # ancestor of all node classes
26
26
  require 'synapse_pay_rest/models/node/base_node'
27
27
 
28
28
  # BaseNode subclasses
@@ -44,6 +44,8 @@ require 'synapse_pay_rest/models/node/wire_us_node.rb'
44
44
  require 'synapse_pay_rest/models/node/wire_int_node.rb'
45
45
  # reserve
46
46
  require 'synapse_pay_rest/models/node/reserve_us_node.rb'
47
+ # triump subaccount
48
+ require 'synapse_pay_rest/models/node/triumph_subaccount_us_node.rb'
47
49
  # iou
48
50
  require 'synapse_pay_rest/models/node/iou_node.rb'
49
51
 
@@ -87,6 +87,7 @@ module SynapsePayRest
87
87
  # @param code [Integer]
88
88
  # @return [SynapsePayRest::Error]
89
89
  def error_from_response(body, code)
90
+ # require 'pry'; binding.pry
90
91
  code = code.to_i
91
92
  klass = ERRORS[code] || SynapsePayRest::Error
92
93
  message, error_code = parse_error(body)
@@ -62,6 +62,8 @@ module SynapsePayRest
62
62
  # @param ip_address [String,void]
63
63
  #
64
64
  # @return [void]
65
+ #
66
+ # @todo logic to update user_id doesn't belong here
65
67
  def update_headers(user_id: nil, oauth_key: nil, fingerprint: nil,
66
68
  client_id: nil, client_secret: nil, ip_address: nil)
67
69
  self.user_id = user_id if user_id
@@ -30,7 +30,7 @@ module SynapsePayRest
30
30
  if response['mfa']
31
31
  create_unverified_node(user, response)
32
32
  else
33
- create_multiple_from_response(user, response['nodes'])
33
+ multiple_from_response(user, response['nodes'])
34
34
  end
35
35
  end
36
36
 
@@ -39,23 +39,15 @@ module SynapsePayRest
39
39
  # Converts args into payload for request JSON.
40
40
  def payload_for_create(nickname:, account_number:, routing_number:,
41
41
  account_type:, account_class:, **options)
42
- payload = {
43
- 'type' => 'ACH-US',
44
- 'info' => {
45
- 'nickname' => nickname,
46
- 'account_num' => account_number,
47
- 'routing_num' => routing_number,
48
- 'type' => account_type,
49
- 'class' => account_class
50
- }
51
- }
52
- # optional payload fields
53
- extra = {}
54
- extra['supp_id'] = options[:supp_id] if options[:supp_id]
55
- extra['gateway_restricted'] = options[:gateway_restricted] if options[:gateway_restricted]
56
- payload['extra'] = extra if extra.any?
57
-
58
- payload
42
+ args = {
43
+ type: 'ACH-US',
44
+ nickname: nickname,
45
+ account_number: account_number,
46
+ routing_number: routing_number,
47
+ account_type: account_type,
48
+ account_class: account_class
49
+ }.merge(options)
50
+ super(args)
59
51
  end
60
52
 
61
53
  def payload_for_create_via_bank_login(bank_name:, username:, password:)
@@ -98,7 +90,7 @@ module SynapsePayRest
98
90
 
99
91
  payload = verify_microdeposits_payload(amount1: amount1, amount2: amount2)
100
92
  response = user.client.nodes.patch(node_id: id, payload: payload)
101
- self.class.create_from_response(user, response)
93
+ self.class.from_response(user, response)
102
94
  end
103
95
 
104
96
  private
@@ -40,7 +40,7 @@ module SynapsePayRest
40
40
  payload = payload_for_create(nickname: nickname, **options)
41
41
  user.authenticate
42
42
  response = user.client.nodes.add(payload: payload)
43
- create_from_response(user, response['nodes'].first)
43
+ from_response(user, response['nodes'].first)
44
44
  end
45
45
 
46
46
  # Queries the API for all nodes belonging to the supplied user (with optional
@@ -66,11 +66,11 @@ module SynapsePayRest
66
66
 
67
67
  user.authenticate
68
68
  response = user.client.nodes.get(page: page, per_page: per_page, type: self.type)
69
- create_multiple_from_response(user, response['nodes'])
69
+ multiple_from_response(user, response['nodes'])
70
70
  end
71
71
 
72
72
  # @note Not meant to be accessed directly on BaseNode but through children.
73
- def create_from_response(user, response)
73
+ def from_response(user, response)
74
74
  args = {
75
75
  user: user,
76
76
  type: response['type'],
@@ -92,35 +92,106 @@ module SynapsePayRest
92
92
  }
93
93
 
94
94
  if response['info']['correspondent_info']
95
- args[:correspondent_swift] = response['info']['correspondent_info']['swift']
96
- args[:correspondent_bank_name] = response['info']['correspondent_info']['bank_name']
97
- args[:correspondent_routing_number] = response['info']['correspondent_info']['routing_num']
98
- args[:correspondent_address] = response['info']['correspondent_info']['address']
99
- args[:correspondent_swift] = response['info']['correspondent_info']['swift']
95
+ correspondent_info = response['info']['correspondent_info']
96
+ args[:correspondent_swift] = correspondent_info['swift']
97
+ args[:correspondent_bank_name] = correspondent_info['bank_name']
98
+ args[:correspondent_routing_number] = correspondent_info['routing_num']
99
+ args[:correspondent_address] = correspondent_info['address']
100
100
  end
101
101
 
102
102
  if response['info']['match_info']
103
- args[:email_match] = response['info']['match_info']['email_match']
104
- args[:name_match] = response['info']['match_info']['name_match']
105
- args[:phonenumber_match] = response['info']['match_info']['phonenumber_match']
103
+ match_info = response['info']['match_info']
104
+ args[:email_match] = match_info['email_match']
105
+ args[:name_match] = match_info['name_match']
106
+ args[:phonenumber_match] = match_info['phonenumber_match']
106
107
  end
107
108
 
108
109
  if response['info']['balance']
109
- args[:balance] = response['info']['balance']['amount']
110
- args[:currency] = response['info']['balance']['currency']
110
+ balance = response['info']['balance']
111
+ args[:balance] = balance['amount']
112
+ args[:currency] = balance['currency']
111
113
  end
112
114
 
113
115
  if response['extra']
114
- args[:supp_id] = response['extra']['supp_id']
115
- args[:gateway_restricted] = response['extra']['gateway_restricted']
116
+ extra = response['extra']
117
+ args[:supp_id] = extra['supp_id']
118
+ args[:gateway_restricted] = extra['gateway_restricted']
116
119
  end
117
120
 
118
121
  self.new(**args)
119
122
  end
120
123
 
121
124
  # @note Not meant to be accessed directly on BaseNode but through children.
122
- def create_multiple_from_response(user, response)
123
- response.map { |node_data| create_from_response(user, node_data)}
125
+ def multiple_from_response(user, response)
126
+ response.map { |node_data| from_response(user, node_data)}
127
+ end
128
+
129
+ def payload_for_create(type:, **options)
130
+ payload = {
131
+ 'type' => type,
132
+ 'info' => {}
133
+ }
134
+
135
+ info_fields = [
136
+ :swift, :name_on_account, :bank_name, :address, :ifsc,:nickname,
137
+ :bank_name
138
+ ]
139
+ info_fields.each do |field|
140
+ payload['info'][field.to_s] = options[field] if options[field]
141
+ end
142
+
143
+ # the rest are done individually since they are custom renamed
144
+ correspondent_info = {}
145
+ if options[:correspondent_routing_number]
146
+ correspondent_info['routing_num'] = options[:correspondent_routing_number]
147
+ end
148
+ if options[:correspondent_bank_name]
149
+ correspondent_info['bank_name'] = options[:correspondent_bank_name]
150
+ end
151
+ if options[:correspondent_address]
152
+ correspondent_info['address'] = options[:correspondent_address]
153
+ end
154
+ if options[:correspondent_swift]
155
+ correspondent_info['swift'] = options[:correspondent_swift]
156
+ end
157
+ payload['info']['correspondent_info'] = correspondent_info if correspondent_info.any?
158
+
159
+ if options[:account_number]
160
+ payload['info']['account_num'] = options[:account_number]
161
+ end
162
+ if options[:routing_number]
163
+ payload['info']['routing_num'] = options[:routing_number]
164
+ end
165
+ if options[:account_type]
166
+ payload['info']['type'] = options[:account_type]
167
+ end
168
+ if options[:account_class]
169
+ payload['info']['class'] = options[:account_class]
170
+ end
171
+ if options[:username]
172
+ payload['info']['bank_id'] = options[:username]
173
+ end
174
+ if options[:password]
175
+ payload['info']['bank_pw'] = options[:password]
176
+ end
177
+
178
+ balance_fields = [:currency]
179
+ balance_fields.each do |field|
180
+ if options[field]
181
+ payload['info']['balance'] ||= {}
182
+ payload['info']['balance'][field.to_s] = options[field] if options[field]
183
+ end
184
+ end
185
+
186
+ extra_fields = [:supp_id, :gateway_restricted]
187
+ extra_fields.each do |field|
188
+ if options[field]
189
+ payload['extra'] ||= {}
190
+ payload['extra'][field.to_s] = options[field]
191
+ end
192
+ end
193
+
194
+ payload
124
195
  end
125
196
  end
126
197
 
@@ -1,18 +1,19 @@
1
1
  module SynapsePayRest
2
2
  # Represents an Indian bank account for EFT credits.
3
- class EftIndNode < EftNode
3
+ #
4
+ # @deprecated
5
+ class EftIndNode < BaseNode
4
6
  class << self
5
7
  private
6
8
 
7
9
  def payload_for_create(nickname:, account_number:, ifsc:, **options)
8
- args = {
10
+ payload = {
9
11
  type: 'EFT-IND',
10
12
  nickname: nickname,
11
- account_number: account_number
13
+ account_number: account_number,
14
+ ifsc: ifsc
12
15
  }.merge(options)
13
- payload = super(args)
14
- payload['info']['ifsc'] = ifsc
15
- payload
16
+ super(payload)
16
17
  end
17
18
  end
18
19
  end
@@ -1,6 +1,6 @@
1
1
  module SynapsePayRest
2
2
  # Represents a Nepali bank account for EFT credits.
3
- class EftNpNode < EftNode
3
+ class EftNpNode < BaseNode
4
4
  class << self
5
5
  private
6
6
 
@@ -8,11 +8,10 @@ module SynapsePayRest
8
8
  args = {
9
9
  type: 'EFT-NP',
10
10
  nickname: nickname,
11
+ bank_name: bank_name,
11
12
  account_number: account_number
12
13
  }.merge(options)
13
- payload = super(args)
14
- payload['info']['bank_name'] = bank_name
15
- payload
14
+ super(args)
16
15
  end
17
16
  end
18
17
  end
@@ -6,21 +6,12 @@ module SynapsePayRest
6
6
  private
7
7
 
8
8
  def payload_for_create(nickname:, currency:, **options)
9
- payload = {
10
- 'type' => 'IOU',
11
- 'info' => {
12
- 'nickname' => nickname,
13
- 'balance' => {
14
- 'currency' => currency
15
- }
16
- }
17
- }
18
- # optional payload fields
19
- extra = {}
20
- extra['supp_id'] = options[:supp_id] if options[:supp_id]
21
- extra['gateway_restricted'] = options[:gateway_restricted] if options[:gateway_restricted]
22
- payload['extra'] = extra if extra.any?
23
- payload
9
+ args = {
10
+ type: 'IOU',
11
+ nickname: nickname,
12
+ currency: currency
13
+ }.merge(options)
14
+ super(args)
24
15
  end
25
16
  end
26
17
  end
@@ -6,16 +6,17 @@ module SynapsePayRest
6
6
 
7
7
  # Node type to node class mappings.
8
8
  NODE_TYPES_TO_CLASSES = {
9
- 'ACH-US' => AchUsNode,
10
- 'EFT-NP' => EftNpNode,
11
- 'EFT-IND' => EftIndNode,
12
- 'IOU' => IouNode,
13
- 'RESERVE-US' => ReserveUsNode,
14
- 'SYNAPSE-IND' => SynapseIndNode,
15
- 'SYNAPSE-NP' => SynapseNpNode,
16
- 'SYNAPSE-US' => SynapseUsNode,
17
- 'WIRE-INT' => WireIntNode,
18
- 'WIRE-US' => WireUsNode
9
+ 'ACH-US' => AchUsNode,
10
+ 'EFT-NP' => EftNpNode,
11
+ 'EFT-IND' => EftIndNode,
12
+ 'IOU' => IouNode,
13
+ 'RESERVE-US' => ReserveUsNode,
14
+ 'SYNAPSE-IND' => SynapseIndNode,
15
+ 'SYNAPSE-NP' => SynapseNpNode,
16
+ 'SYNAPSE-US' => SynapseUsNode,
17
+ 'TRIUMPH-SUBACCOUNT-US' => TriumphSubaccountUsNode,
18
+ 'WIRE-INT' => WireIntNode,
19
+ 'WIRE-US' => WireUsNode
19
20
  }.freeze
20
21
 
21
22
  class << self
@@ -34,7 +35,7 @@ module SynapsePayRest
34
35
 
35
36
  user.authenticate
36
37
  response = user.client.nodes.get(user_id: user.id, node_id: id)
37
- create_from_response(user, response)
38
+ from_response(user, response)
38
39
  end
39
40
 
40
41
  # Queries the API for all nodes belonging to the supplied user (with optional
@@ -62,7 +63,7 @@ module SynapsePayRest
62
63
 
63
64
  user.authenticate
64
65
  response = user.client.nodes.get(page: page, per_page: per_page, type: type)
65
- create_multiple_from_response(user, response['nodes'])
66
+ multiple_from_response(user, response['nodes'])
66
67
  end
67
68
 
68
69
  # Queries the API for all nodes belonging to the supplied user (with optional
@@ -85,14 +86,14 @@ module SynapsePayRest
85
86
 
86
87
  # determines the proper node type to instantiate from the response
87
88
  # implemented differently in each BaseNode subclass
88
- def create_from_response(user, response)
89
- klass = NODE_TYPES_TO_CLASSES.fetch(response['type'])
90
- klass.create_from_response(user, response)
89
+ def from_response(user, response)
90
+ klass = NODE_TYPES_TO_CLASSES.fetch(response['type']) || BaseNode
91
+ klass.from_response(user, response)
91
92
  end
92
93
 
93
- def create_multiple_from_response(user, response)
94
+ def multiple_from_response(user, response)
94
95
  return [] if response.empty?
95
- response.map { |node_data| create_from_response(user, node_data)}
96
+ response.map { |node_data| from_response(user, node_data)}
96
97
  end
97
98
  end
98
99
  end
@@ -6,17 +6,11 @@ module SynapsePayRest
6
6
  private
7
7
 
8
8
  def payload_for_create(nickname:, **options)
9
- payload = {
10
- 'type' => 'RESERVE-US',
11
- 'info' => {
12
- 'nickname' => nickname,
13
- }
14
- }
15
- extra = {}
16
- extra['supp_id'] = options[:supp_id] if options[:supp_id]
17
- extra['gateway_restricted'] = options[:gateway_restricted] if options[:gateway_restricted]
18
- payload['extra'] = extra if extra.any?
19
- payload
9
+ args = {
10
+ type: 'RESERVE-US',
11
+ nickname: nickname
12
+ }.merge(options)
13
+ super(args)
20
14
  end
21
15
  end
22
16
  end
@@ -1,6 +1,8 @@
1
1
  module SynapsePayRest
2
2
  # Represents a Synapse node allowing any user to hold Indian Rupees.
3
- class SynapseIndNode < SynapseNode
3
+ #
4
+ # @deprecated
5
+ class SynapseIndNode < BaseNode
4
6
  class << self
5
7
  private
6
8
 
@@ -9,13 +11,7 @@ module SynapsePayRest
9
11
  type: 'SYNAPSE-IND',
10
12
  nickname: nickname
11
13
  }.merge(options)
12
- payload = super(args)
13
- # optional payload fields
14
- extra = {}
15
- extra['supp_id'] = options[:supp_id] if options[:supp_id]
16
- extra['gateway_restricted'] = options[:gateway_restricted] if options[:gateway_restricted]
17
- payload['extra'] = extra if extra.any?
18
- payload
14
+ super(args)
19
15
  end
20
16
  end
21
17
  end
@@ -1,6 +1,6 @@
1
1
  module SynapsePayRest
2
2
  # Represents a Synapse node allowing any user to hold Nepali Rupees.
3
- class SynapseNpNode < SynapseNode
3
+ class SynapseNpNode < BaseNode
4
4
  class << self
5
5
  private
6
6
 
@@ -9,13 +9,7 @@ module SynapsePayRest
9
9
  type: 'SYNAPSE-NP',
10
10
  nickname: nickname
11
11
  }.merge(options)
12
- payload = super(args)
13
- # optional payload fields
14
- extra = {}
15
- extra['supp_id'] = options[:supp_id] if options[:supp_id]
16
- extra['gateway_restricted'] = options[:gateway_restricted] if options[:gateway_restricted]
17
- payload['extra'] = extra if extra.any?
18
- payload
12
+ super(args)
19
13
  end
20
14
  end
21
15
  end