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.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/lib/synapse_pay_rest.rb +3 -1
- data/lib/synapse_pay_rest/error.rb +1 -0
- data/lib/synapse_pay_rest/http_client.rb +2 -0
- data/lib/synapse_pay_rest/models/node/ach_us_node.rb +11 -19
- data/lib/synapse_pay_rest/models/node/base_node.rb +88 -17
- data/lib/synapse_pay_rest/models/node/eft_ind_node.rb +7 -6
- data/lib/synapse_pay_rest/models/node/eft_np_node.rb +3 -4
- data/lib/synapse_pay_rest/models/node/iou_node.rb +6 -15
- data/lib/synapse_pay_rest/models/node/node.rb +18 -17
- data/lib/synapse_pay_rest/models/node/reserve_us_node.rb +5 -11
- data/lib/synapse_pay_rest/models/node/synapse_ind_node.rb +4 -8
- data/lib/synapse_pay_rest/models/node/synapse_np_node.rb +2 -8
- data/lib/synapse_pay_rest/models/node/synapse_us_node.rb +2 -8
- data/lib/synapse_pay_rest/models/node/triumph_subaccount_us_node.rb +17 -0
- data/lib/synapse_pay_rest/models/node/unverified_node.rb +1 -1
- data/lib/synapse_pay_rest/models/node/wire_int_node.rb +3 -4
- data/lib/synapse_pay_rest/models/node/wire_us_node.rb +1 -2
- data/lib/synapse_pay_rest/models/transaction/transaction.rb +9 -9
- data/lib/synapse_pay_rest/models/user/base_document.rb +12 -16
- data/lib/synapse_pay_rest/models/user/document.rb +2 -2
- data/lib/synapse_pay_rest/models/user/physical_document.rb +58 -17
- data/lib/synapse_pay_rest/models/user/user.rb +27 -10
- data/lib/synapse_pay_rest/models/user/virtual_document.rb +7 -8
- data/lib/synapse_pay_rest/version.rb +1 -1
- data/samples.md +41 -60
- data/synapse_pay_rest.gemspec +8 -8
- metadata +4 -6
- data/lib/synapse_pay_rest/models/node/eft_node.rb +0 -27
- data/lib/synapse_pay_rest/models/node/synapse_node.rb +0 -25
- data/lib/synapse_pay_rest/models/node/wire_node.rb +0 -38
| @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            module SynapsePayRest
         | 
| 2 2 | 
             
              # Represents a Synapse node allowing any user to hold funds. You can use this
         | 
| 3 3 | 
             
              # node as a wallet, an escrow account or something else along those lines.
         | 
| 4 | 
            -
              class SynapseUsNode <  | 
| 4 | 
            +
              class SynapseUsNode < BaseNode
         | 
| 5 5 | 
             
                class << self
         | 
| 6 6 | 
             
                  private
         | 
| 7 7 |  | 
| @@ -10,13 +10,7 @@ module SynapsePayRest | |
| 10 10 | 
             
                      type: 'SYNAPSE-US',
         | 
| 11 11 | 
             
                      nickname: nickname
         | 
| 12 12 | 
             
                    }.merge(options)
         | 
| 13 | 
            -
                     | 
| 14 | 
            -
                    # optional payload fields
         | 
| 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
         | 
| 13 | 
            +
                    super(args)
         | 
| 20 14 | 
             
                  end
         | 
| 21 15 | 
             
                end
         | 
| 22 16 | 
             
              end
         | 
| @@ -0,0 +1,17 @@ | |
| 1 | 
            +
            module SynapsePayRest
         | 
| 2 | 
            +
              # Represents a Synapse node allowing any user to hold funds. You can use this
         | 
| 3 | 
            +
              # node as a wallet, an escrow account or something else along those lines.
         | 
| 4 | 
            +
              class TriumphSubaccountUsNode < BaseNode
         | 
| 5 | 
            +
                class << self
         | 
| 6 | 
            +
                  private
         | 
| 7 | 
            +
             | 
| 8 | 
            +
                  def payload_for_create(nickname:, **options)
         | 
| 9 | 
            +
                    args = {
         | 
| 10 | 
            +
                      type: 'TRIUMPH-SUBACCOUNT-US',
         | 
| 11 | 
            +
                      nickname: nickname
         | 
| 12 | 
            +
                    }.merge(options)
         | 
| 13 | 
            +
                    super(args)
         | 
| 14 | 
            +
                  end
         | 
| 15 | 
            +
                end
         | 
| 16 | 
            +
              end
         | 
| 17 | 
            +
            end
         | 
| @@ -53,7 +53,7 @@ module SynapsePayRest | |
| 53 53 | 
             
                  if response['error_code'] == '0'
         | 
| 54 54 | 
             
                    # correct answer
         | 
| 55 55 | 
             
                    @mfa_verified = true
         | 
| 56 | 
            -
                    AchUsNode. | 
| 56 | 
            +
                    AchUsNode.multiple_from_response(user, response['nodes'])
         | 
| 57 57 | 
             
                  elsif response['error_code'] == '10' && response['mfa']['message'] == mfa_message
         | 
| 58 58 | 
             
                    # wrong answer (mfa message the same), retry if allowed
         | 
| 59 59 | 
             
                    args = {
         | 
| @@ -1,6 +1,6 @@ | |
| 1 1 | 
             
            module SynapsePayRest
         | 
| 2 2 | 
             
              # Represents a non-US account for wire payments.
         | 
| 3 | 
            -
              class WireIntNode <  | 
| 3 | 
            +
              class WireIntNode < BaseNode
         | 
| 4 4 | 
             
                class << self
         | 
| 5 5 | 
             
                  private 
         | 
| 6 6 |  | 
| @@ -11,12 +11,11 @@ module SynapsePayRest | |
| 11 11 | 
             
                      nickname: nickname,
         | 
| 12 12 | 
             
                      bank_name: bank_name,
         | 
| 13 13 | 
             
                      account_number: account_number,
         | 
| 14 | 
            +
                      swift: swift,
         | 
| 14 15 | 
             
                      name_on_account: name_on_account,
         | 
| 15 16 | 
             
                      address: address
         | 
| 16 17 | 
             
                    }.merge(options)
         | 
| 17 | 
            -
                     | 
| 18 | 
            -
                    payload['info']['swift'] = swift
         | 
| 19 | 
            -
                    payload
         | 
| 18 | 
            +
                    super(args)
         | 
| 20 19 | 
             
                  end
         | 
| 21 20 | 
             
                end
         | 
| 22 21 | 
             
              end
         | 
| @@ -1,6 +1,6 @@ | |
| 1 1 | 
             
            module SynapsePayRest
         | 
| 2 2 | 
             
              # Represents a US bank account for processing wire payments.
         | 
| 3 | 
            -
              class WireUsNode <  | 
| 3 | 
            +
              class WireUsNode < BaseNode
         | 
| 4 4 | 
             
                class << self
         | 
| 5 5 | 
             
                  private
         | 
| 6 6 |  | 
| @@ -15,7 +15,6 @@ module SynapsePayRest | |
| 15 15 | 
             
                      name_on_account: name_on_account,
         | 
| 16 16 | 
             
                      address: address
         | 
| 17 17 | 
             
                    }.merge(options)
         | 
| 18 | 
            -
                    
         | 
| 19 18 | 
             
                    super(args)
         | 
| 20 19 | 
             
                  end
         | 
| 21 20 | 
             
                end
         | 
| @@ -54,7 +54,7 @@ module SynapsePayRest | |
| 54 54 | 
             
                      amount: amount, currency: currency, ip: ip, **options)
         | 
| 55 55 | 
             
                    node.user.authenticate
         | 
| 56 56 | 
             
                    response = node.user.client.trans.create(node_id: node.id, payload: payload)
         | 
| 57 | 
            -
                     | 
| 57 | 
            +
                    from_response(node, response)
         | 
| 58 58 | 
             
                  end
         | 
| 59 59 |  | 
| 60 60 | 
             
                  # Queries the API for a transaction belonging to the supplied node by transaction id
         | 
| @@ -72,7 +72,7 @@ module SynapsePayRest | |
| 72 72 |  | 
| 73 73 | 
             
                    node.user.authenticate
         | 
| 74 74 | 
             
                    response = node.user.client.trans.get(node_id: node.id, trans_id: id)
         | 
| 75 | 
            -
                     | 
| 75 | 
            +
                    from_response(node, response)
         | 
| 76 76 | 
             
                  end
         | 
| 77 77 |  | 
| 78 78 | 
             
                  # Queries the API for all transactions belonging to the supplied node and returns
         | 
| @@ -95,7 +95,7 @@ module SynapsePayRest | |
| 95 95 |  | 
| 96 96 | 
             
                    node.user.authenticate
         | 
| 97 97 | 
             
                    response = node.user.client.trans.get(node_id: node.id, page: page, per_page: per_page)
         | 
| 98 | 
            -
                     | 
| 98 | 
            +
                    multiple_from_response(node, response['trans'])
         | 
| 99 99 | 
             
                  end
         | 
| 100 100 |  | 
| 101 101 | 
             
                  # Creates a Transaction from a response hash.
         | 
| @@ -104,7 +104,7 @@ module SynapsePayRest | |
| 104 104 | 
             
                  # 
         | 
| 105 105 | 
             
                  # @todo convert the nodes and users in response into User/Node objects
         | 
| 106 106 | 
             
                  # @todo rework to handle multiple fees
         | 
| 107 | 
            -
                  def  | 
| 107 | 
            +
                  def from_response(node, response)
         | 
| 108 108 | 
             
                    args = {
         | 
| 109 109 | 
             
                      node:          node,
         | 
| 110 110 | 
             
                      id:            response['_id'],
         | 
| @@ -156,7 +156,7 @@ module SynapsePayRest | |
| 156 156 | 
             
                    payload['extra']['process_on'] = options[:process_in] if options[:process_in]
         | 
| 157 157 | 
             
                    other = {}
         | 
| 158 158 | 
             
                    other['attachments'] = options[:attachments] if options[:attachments]
         | 
| 159 | 
            -
                    payload['other'] = other if other.any?
         | 
| 159 | 
            +
                    payload['extra']['other'] = other if other.any?
         | 
| 160 160 | 
             
                    fees = []
         | 
| 161 161 | 
             
                    fee = {}
         | 
| 162 162 | 
             
                    fee['fee']  = options[:fee_amount] if options[:fee_amount]
         | 
| @@ -169,9 +169,9 @@ module SynapsePayRest | |
| 169 169 | 
             
                    payload
         | 
| 170 170 | 
             
                  end
         | 
| 171 171 |  | 
| 172 | 
            -
                  def  | 
| 172 | 
            +
                  def multiple_from_response(node, response)
         | 
| 173 173 | 
             
                    return [] if response.empty?
         | 
| 174 | 
            -
                    response.map { |trans_data|  | 
| 174 | 
            +
                    response.map { |trans_data| from_response(node, trans_data) }
         | 
| 175 175 | 
             
                  end
         | 
| 176 176 | 
             
                end
         | 
| 177 177 |  | 
| @@ -191,7 +191,7 @@ module SynapsePayRest | |
| 191 191 | 
             
                def add_comment(comment)
         | 
| 192 192 | 
             
                  payload = {'comment': comment}
         | 
| 193 193 | 
             
                  response = node.user.client.trans.update(node_id: node.id, trans_id: id, payload: payload)
         | 
| 194 | 
            -
                  self.class. | 
| 194 | 
            +
                  self.class.from_response(node, response['trans'])
         | 
| 195 195 | 
             
                end
         | 
| 196 196 |  | 
| 197 197 | 
             
                # Cancels this transaction if it has not already settled.
         | 
| @@ -201,7 +201,7 @@ module SynapsePayRest | |
| 201 201 | 
             
                # @return [Array<SynapsePayRest::Transaction>] (self)
         | 
| 202 202 | 
             
                def cancel
         | 
| 203 203 | 
             
                  response = node.user.client.trans.delete(node_id: node.id, trans_id: id)
         | 
| 204 | 
            -
                  self.class. | 
| 204 | 
            +
                  self.class.from_response(node, response)
         | 
| 205 205 | 
             
                end
         | 
| 206 206 |  | 
| 207 207 | 
             
                # Checks if two Transaction instances have same id (different instances of same record).
         | 
| @@ -93,21 +93,21 @@ module SynapsePayRest | |
| 93 93 |  | 
| 94 94 | 
             
                  # Parses multiple base_documents from response
         | 
| 95 95 | 
             
                  # @note Do not call directly (it's automatic).
         | 
| 96 | 
            -
                  def  | 
| 96 | 
            +
                  def from_response(user, response)
         | 
| 97 97 | 
             
                    base_documents_data = response['documents']
         | 
| 98 98 | 
             
                    base_documents_data.map do |base_document_data|
         | 
| 99 99 | 
             
                      physical_docs = base_document_data['physical_docs'].map do |data|
         | 
| 100 | 
            -
                        doc = PhysicalDocument. | 
| 100 | 
            +
                        doc = PhysicalDocument.from_response(data)
         | 
| 101 101 | 
             
                        doc.base_document = self
         | 
| 102 102 | 
             
                        doc
         | 
| 103 103 | 
             
                      end
         | 
| 104 104 | 
             
                      social_docs = base_document_data['social_docs'].map do |data|
         | 
| 105 | 
            -
                        doc = SocialDocument. | 
| 105 | 
            +
                        doc = SocialDocument.from_response(data)
         | 
| 106 106 | 
             
                        doc.base_document = self
         | 
| 107 107 | 
             
                        doc
         | 
| 108 108 | 
             
                      end
         | 
| 109 109 | 
             
                      virtual_docs = base_document_data['virtual_docs'].map do |data|
         | 
| 110 | 
            -
                        doc = VirtualDocument. | 
| 110 | 
            +
                        doc = VirtualDocument.from_response(data)
         | 
| 111 111 | 
             
                        doc.base_document = self
         | 
| 112 112 | 
             
                        doc
         | 
| 113 113 | 
             
                      end
         | 
| @@ -166,14 +166,13 @@ module SynapsePayRest | |
| 166 166 | 
             
                def submit
         | 
| 167 167 | 
             
                  user.authenticate
         | 
| 168 168 | 
             
                  response = user.client.users.update(payload: payload_for_submit)
         | 
| 169 | 
            -
                  @user    = User. | 
| 169 | 
            +
                  @user    = User.from_response(user.client, response)
         | 
| 170 170 |  | 
| 171 171 | 
             
                  if id
         | 
| 172 172 | 
             
                    # return updated version of self
         | 
| 173 173 | 
             
                    user.base_documents.find { |doc| doc.id == id }
         | 
| 174 174 | 
             
                  else
         | 
| 175 175 | 
             
                    # first time submission, assume last doc is updated version of self
         | 
| 176 | 
            -
                    require 'pry'; 
         | 
| 177 176 | 
             
                    user.base_documents.last
         | 
| 178 177 | 
             
                  end
         | 
| 179 178 | 
             
                end
         | 
| @@ -214,7 +213,7 @@ module SynapsePayRest | |
| 214 213 | 
             
                  user.authenticate
         | 
| 215 214 | 
             
                  payload  = payload_for_update(changes)
         | 
| 216 215 | 
             
                  response = user.client.users.update(payload: payload)
         | 
| 217 | 
            -
                  @user    = User. | 
| 216 | 
            +
                  @user    = User.from_response(user.client, response)
         | 
| 218 217 |  | 
| 219 218 | 
             
                  if id
         | 
| 220 219 | 
             
                    # return updated version of self
         | 
| @@ -228,13 +227,12 @@ module SynapsePayRest | |
| 228 227 | 
             
                # Adds one or more physical documents to the base document and submits
         | 
| 229 228 | 
             
                # them to the API using KYC 2.0 endpoints.
         | 
| 230 229 | 
             
                # 
         | 
| 231 | 
            -
                # @param documents [Array<SynapsePayRest::PhysicalDocument>]
         | 
| 230 | 
            +
                # @param documents [Array<SynapsePayRest::PhysicalDocument>] (one or more documents)
         | 
| 232 231 | 
             
                # 
         | 
| 233 232 | 
             
                # @raise [SynapsePayRest::Error]
         | 
| 234 233 | 
             
                # 
         | 
| 235 234 | 
             
                # @return [SynapsePayRest::BaseDocument] new instance with updated info
         | 
| 236 | 
            -
                def add_physical_documents(documents)
         | 
| 237 | 
            -
                  raise ArgumentError, 'must be an Array' unless documents.is_a?(Array)
         | 
| 235 | 
            +
                def add_physical_documents(*documents)
         | 
| 238 236 | 
             
                  unless documents.first.is_a?(PhysicalDocument)
         | 
| 239 237 | 
             
                    raise ArgumentError, 'must contain a PhysicalDocument'
         | 
| 240 238 | 
             
                  end
         | 
| @@ -245,13 +243,12 @@ module SynapsePayRest | |
| 245 243 | 
             
                # Adds one or more social documents to the base document and submits
         | 
| 246 244 | 
             
                # them to the API using KYC 2.0 endpoints.
         | 
| 247 245 | 
             
                # 
         | 
| 248 | 
            -
                # @param documents [Array<SynapsePayRest::SocialDocument>]
         | 
| 246 | 
            +
                # @param documents [Array<SynapsePayRest::SocialDocument>] (one or more documents)
         | 
| 249 247 | 
             
                # 
         | 
| 250 248 | 
             
                # @raise [SynapsePayRest::Error]
         | 
| 251 249 | 
             
                # 
         | 
| 252 250 | 
             
                # @return [SynapsePayRest::BaseDocument] new instance with updated info
         | 
| 253 | 
            -
                def add_social_documents(documents)
         | 
| 254 | 
            -
                  raise ArgumentError, 'must be an Array' unless documents.is_a?(Array)
         | 
| 251 | 
            +
                def add_social_documents(*documents)
         | 
| 255 252 | 
             
                  unless documents.first.is_a?(SocialDocument)
         | 
| 256 253 | 
             
                    raise ArgumentError, 'must contain a SocialDocument'
         | 
| 257 254 | 
             
                  end
         | 
| @@ -262,13 +259,12 @@ module SynapsePayRest | |
| 262 259 | 
             
                # Adds one or more virtual documents to the base document and submits
         | 
| 263 260 | 
             
                # them to the API using KYC 2.0 endpoints.
         | 
| 264 261 | 
             
                # 
         | 
| 265 | 
            -
                # @param documents [Array<SynapsePayRest::VirtualDocument>]
         | 
| 262 | 
            +
                # @param documents [Array<SynapsePayRest::VirtualDocument>] (one or more documents)
         | 
| 266 263 | 
             
                # 
         | 
| 267 264 | 
             
                # @raise [SynapsePayRest::Error]
         | 
| 268 265 | 
             
                # 
         | 
| 269 266 | 
             
                # @return [SynapsePayRest::BaseDocument] new instance with updated info
         | 
| 270 | 
            -
                def add_virtual_documents(documents)
         | 
| 271 | 
            -
                  raise ArgumentError, 'must be an Array' unless documents.is_a?(Array)
         | 
| 267 | 
            +
                def add_virtual_documents(*documents)
         | 
| 272 268 | 
             
                  unless documents.first.is_a?(VirtualDocument)
         | 
| 273 269 | 
             
                    raise ArgumentError, 'must contain a VirtualDocument'
         | 
| 274 270 | 
             
                  end
         | 
| @@ -11,7 +11,7 @@ module SynapsePayRest | |
| 11 11 | 
             
                attr_accessor :base_document, :status, :id, :type, :value, :last_updated
         | 
| 12 12 |  | 
| 13 13 | 
             
                class << self
         | 
| 14 | 
            -
                  # Creates a document  | 
| 14 | 
            +
                  # Creates a document instance but does not submit it to the API. Use
         | 
| 15 15 | 
             
                  # BaseDocument#create/#update/#add_physical_documents or related methods
         | 
| 16 16 | 
             
                  # to submit the document to the API.
         | 
| 17 17 | 
             
                  # 
         | 
| @@ -34,7 +34,7 @@ module SynapsePayRest | |
| 34 34 | 
             
                  end
         | 
| 35 35 |  | 
| 36 36 | 
             
                  # @note Do not call this method. It is used by child classes only.
         | 
| 37 | 
            -
                  def  | 
| 37 | 
            +
                  def from_response(data)
         | 
| 38 38 | 
             
                    self.new(
         | 
| 39 39 | 
             
                      type:         data['document_type'],
         | 
| 40 40 | 
             
                      id:           data['id'],
         | 
| @@ -1,29 +1,70 @@ | |
| 1 | 
            +
            require 'open-uri'
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            module SynapsePayRest
         | 
| 2 4 | 
             
              # Represents physical documents that can be added to a base document.
         | 
| 3 5 | 
             
              #
         | 
| 4 6 | 
             
              # @see https://docs.synapsepay.com/docs/user-resources#section-physical-document-types
         | 
| 5 7 | 
             
              #   physical document types
         | 
| 6 8 | 
             
              class PhysicalDocument < Document
         | 
| 7 | 
            -
                # Converts the document into hash format for use in request JSON.
         | 
| 8 | 
            -
                # @note You shouldn't need to call this directly.
         | 
| 9 | 
            -
                #
         | 
| 10 | 
            -
                # @return [Hash]
         | 
| 11 | 
            -
                def to_hash
         | 
| 12 | 
            -
                  {'document_value' => to_base64(value), 'document_type' => type}
         | 
| 13 | 
            -
                end
         | 
| 14 9 |  | 
| 15 | 
            -
                 | 
| 10 | 
            +
                class << self
         | 
| 11 | 
            +
                  # Creates a document instance but does not submit it to the API. Use
         | 
| 12 | 
            +
                  # BaseDocument#create/#update/#add_physical_documents or related methods
         | 
| 13 | 
            +
                  # to submit the document to the API.
         | 
| 14 | 
            +
                  # 
         | 
| 15 | 
            +
                  # @note This should only be called on subclasses of Document, not on 
         | 
| 16 | 
            +
                  #   Document itself.
         | 
| 17 | 
            +
                  # 
         | 
| 18 | 
            +
                  # @param type [String]
         | 
| 19 | 
            +
                  # @param value [String] (optional) padded base64-encoded image ("data:#{mime_type};base64,#{base64}")
         | 
| 20 | 
            +
                  # @param file_path [String] (optional) path to image file
         | 
| 21 | 
            +
                  # @param url [String] (optional) image file url
         | 
| 22 | 
            +
                  # @param byte_stream [String] (optional) byte representation of image
         | 
| 23 | 
            +
                  # @param mime_type [String] (optional) mime type of byte_stream (e.g. 'image/png')
         | 
| 24 | 
            +
                  # 
         | 
| 25 | 
            +
                  # @return [SynapsePayRest::Document]
         | 
| 26 | 
            +
                  # 
         | 
| 27 | 
            +
                  # @see https://docs.synapsepay.com/docs/user-resources#section-physical-document-types physical document types
         | 
| 28 | 
            +
                  # @see https://docs.synapsepay.com/docs/user-resources#section-social-document-types social document types
         | 
| 29 | 
            +
                  # @see https://docs.synapsepay.com/docs/user-resources#section-virtual-document-types virtual document types
         | 
| 30 | 
            +
                  def create(type:, **options)
         | 
| 31 | 
            +
                    if options[:file_path]
         | 
| 32 | 
            +
                      value = self.file_to_base64(options[:file_path])
         | 
| 33 | 
            +
                    elsif options[:url]
         | 
| 34 | 
            +
                      value = self.url_to_base64(options[:url])
         | 
| 35 | 
            +
                    elsif options[:byte_stream]
         | 
| 36 | 
            +
                      value = self.byte_stream_to_base64(options[:byte_stream], options[:mime_type])
         | 
| 37 | 
            +
                    elsif options[:value]
         | 
| 38 | 
            +
                      value = options[:value]
         | 
| 39 | 
            +
                    end
         | 
| 40 | 
            +
                      
         | 
| 41 | 
            +
                    super(type: type, value: value)
         | 
| 42 | 
            +
                  end
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                  # Converts the supplied image url to padded base64
         | 
| 45 | 
            +
                  def url_to_base64(url)
         | 
| 46 | 
            +
                    raise ArgumentError, 'url must be a String' unless url.is_a?(String)
         | 
| 47 | 
            +
                    byte_stream = open(url).read
         | 
| 48 | 
            +
                    begin
         | 
| 49 | 
            +
                      mime_type = MIME::Types.type_for(url).first.content_type
         | 
| 50 | 
            +
                    rescue
         | 
| 51 | 
            +
                      mime_type = nil
         | 
| 52 | 
            +
                    end
         | 
| 53 | 
            +
                    byte_stream_to_base64(byte_stream, mime_type)
         | 
| 54 | 
            +
                  end
         | 
| 16 55 |  | 
| 17 | 
            -
             | 
| 18 | 
            -
             | 
| 19 | 
            -
             | 
| 56 | 
            +
                  # Converts the supplied image file to padded base64
         | 
| 57 | 
            +
                  def file_to_base64(file_path)
         | 
| 58 | 
            +
                    raise ArgumentError, 'file_path must be a String' unless file_path.is_a?(String)
         | 
| 59 | 
            +
                    url_to_base64(file_path)
         | 
| 60 | 
            +
                  end
         | 
| 20 61 |  | 
| 21 | 
            -
                   | 
| 22 | 
            -
                   | 
| 23 | 
            -
             | 
| 24 | 
            -
             | 
| 25 | 
            -
             | 
| 26 | 
            -
                   | 
| 62 | 
            +
                  # Converts the supplied image byte stream to padded base64
         | 
| 63 | 
            +
                  def byte_stream_to_base64(byte_stream, mime_type)
         | 
| 64 | 
            +
                    base64 = Base64.encode64(byte_stream)
         | 
| 65 | 
            +
                    padding = "data:#{mime_type};base64,#{base64}"
         | 
| 66 | 
            +
                    padding + base64
         | 
| 67 | 
            +
                  end
         | 
| 27 68 | 
             
                end
         | 
| 28 69 | 
             
              end
         | 
| 29 70 | 
             
            end
         | 
| @@ -58,7 +58,7 @@ module SynapsePayRest | |
| 58 58 |  | 
| 59 59 | 
             
                    payload = payload_for_create(logins: logins, phone_numbers: phone_numbers, legal_names: legal_names, **options)
         | 
| 60 60 | 
             
                    response = client.users.create(payload: payload)
         | 
| 61 | 
            -
                     | 
| 61 | 
            +
                    from_response(client, response)
         | 
| 62 62 | 
             
                  end
         | 
| 63 63 |  | 
| 64 64 | 
             
                  # Queries the API for a user by id and returns a User instances if found.
         | 
| @@ -74,7 +74,7 @@ module SynapsePayRest | |
| 74 74 | 
             
                    raise ArgumentError, 'id must be a String' unless id.is_a?(String)
         | 
| 75 75 |  | 
| 76 76 | 
             
                    response = client.users.get(user_id: id)
         | 
| 77 | 
            -
                     | 
| 77 | 
            +
                    from_response(client, response)
         | 
| 78 78 | 
             
                  end
         | 
| 79 79 |  | 
| 80 80 | 
             
                  # Queries the API for all users (with optional filters) and returns them
         | 
| @@ -101,7 +101,7 @@ module SynapsePayRest | |
| 101 101 | 
             
                    end
         | 
| 102 102 |  | 
| 103 103 | 
             
                    response = client.users.get(page: page, per_page: per_page, query: query)
         | 
| 104 | 
            -
                     | 
| 104 | 
            +
                    multiple_from_response(client, response['users'])
         | 
| 105 105 | 
             
                  end
         | 
| 106 106 |  | 
| 107 107 | 
             
                  # Queries the API for all users with name/email matching the given query
         | 
| @@ -141,7 +141,7 @@ module SynapsePayRest | |
| 141 141 |  | 
| 142 142 | 
             
                  # Constructs a user instance from a user response.
         | 
| 143 143 | 
             
                  # @note Do not call directly.
         | 
| 144 | 
            -
                  def  | 
| 144 | 
            +
                  def from_response(client, response)
         | 
| 145 145 | 
             
                    user = self.new(
         | 
| 146 146 | 
             
                      client:            client,
         | 
| 147 147 | 
             
                      id:                response['_id'],
         | 
| @@ -157,16 +157,16 @@ module SynapsePayRest | |
| 157 157 | 
             
                    )
         | 
| 158 158 |  | 
| 159 159 | 
             
                    unless response['documents'].empty?
         | 
| 160 | 
            -
                      base_documents = BaseDocument. | 
| 160 | 
            +
                      base_documents = BaseDocument.from_response(user, response)
         | 
| 161 161 | 
             
                      user.base_documents = base_documents
         | 
| 162 162 | 
             
                    end
         | 
| 163 163 | 
             
                    user
         | 
| 164 164 | 
             
                  end
         | 
| 165 165 |  | 
| 166 | 
            -
                  # Calls  | 
| 167 | 
            -
                  def  | 
| 166 | 
            +
                  # Calls from_response on each member of a response collection.
         | 
| 167 | 
            +
                  def multiple_from_response(client, response)
         | 
| 168 168 | 
             
                    return [] if response.empty?
         | 
| 169 | 
            -
                    response.map { |user_data|  | 
| 169 | 
            +
                    response.map { |user_data| from_response(client, user_data)}
         | 
| 170 170 | 
             
                  end
         | 
| 171 171 | 
             
                end
         | 
| 172 172 |  | 
| @@ -202,10 +202,10 @@ module SynapsePayRest | |
| 202 202 | 
             
                    raise ArgumentError, 'must provide a key-value pair to update. keys: login,
         | 
| 203 203 | 
             
                      read_only, phone_number, legal_name, remove_phone_number, remove_login'
         | 
| 204 204 | 
             
                  end
         | 
| 205 | 
            -
             | 
| 205 | 
            +
                  authenticate
         | 
| 206 206 | 
             
                  response = client.users.update(payload: payload_for_update(options))
         | 
| 207 207 | 
             
                  # return an updated user instance
         | 
| 208 | 
            -
                  self.class. | 
| 208 | 
            +
                  self.class.from_response(client, response)
         | 
| 209 209 | 
             
                end
         | 
| 210 210 |  | 
| 211 211 | 
             
                # Creates a new base document for the user. To update an existing base
         | 
| @@ -435,6 +435,8 @@ module SynapsePayRest | |
| 435 435 | 
             
                # @raise [SynapsePayRest::Error]
         | 
| 436 436 | 
             
                # 
         | 
| 437 437 | 
             
                # @return [SynapsePayRest::EftIndNode]
         | 
| 438 | 
            +
                # 
         | 
| 439 | 
            +
                # @deprecated
         | 
| 438 440 | 
             
                def create_eft_ind_node(**options)
         | 
| 439 441 | 
             
                  EftIndNode.create(user: self, **options)
         | 
| 440 442 | 
             
                end
         | 
| @@ -490,6 +492,8 @@ module SynapsePayRest | |
| 490 492 | 
             
                # @raise [SynapsePayRest::Error]
         | 
| 491 493 | 
             
                # 
         | 
| 492 494 | 
             
                # @return [SynapsePayRest::SynapseIndNode]
         | 
| 495 | 
            +
                # 
         | 
| 496 | 
            +
                # @deprecated
         | 
| 493 497 | 
             
                def create_synapse_ind_node(**options)
         | 
| 494 498 | 
             
                  SynapseIndNode.create(user: self, **options)
         | 
| 495 499 | 
             
                end
         | 
| @@ -520,6 +524,19 @@ module SynapsePayRest | |
| 520 524 | 
             
                  SynapseUsNode.create(user: self, **options)
         | 
| 521 525 | 
             
                end
         | 
| 522 526 |  | 
| 527 | 
            +
                # Creates a TRIUMPH-SUBACCOUNT-US node.
         | 
| 528 | 
            +
                # 
         | 
| 529 | 
            +
                # @param nickname [String] nickname for the node
         | 
| 530 | 
            +
                # @param supp_id [String] (optional)
         | 
| 531 | 
            +
                # @param gateway_restricted [Boolean] (optional)
         | 
| 532 | 
            +
                # 
         | 
| 533 | 
            +
                # @raise [SynapsePayRest::Error]
         | 
| 534 | 
            +
                # 
         | 
| 535 | 
            +
                # @return [SynapsePayRest::TriumphSubaccountUsNode]
         | 
| 536 | 
            +
                def create_triumph_subaccount_us_node(**options)
         | 
| 537 | 
            +
                  TriumphSubaccountUsNode.create(user: self, **options)
         | 
| 538 | 
            +
                end
         | 
| 539 | 
            +
             | 
| 523 540 | 
             
                # Creates a WIRE-INT node.
         | 
| 524 541 | 
             
                # 
         | 
| 525 542 | 
             
                # @param nickname [String] nickname for the node
         |