synapse_pay_rest 2.0.2 → 2.1.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.
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