treezor_connect 0.7.0 → 0.9.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/lib/treezor_connect/api_operations/create.rb +3 -3
- data/lib/treezor_connect/api_operations/delete.rb +14 -0
- data/lib/treezor_connect/api_operations/fetch.rb +3 -3
- data/lib/treezor_connect/api_operations/list.rb +3 -3
- data/lib/treezor_connect/api_operations/request.rb +13 -2
- data/lib/treezor_connect/api_operations/update.rb +14 -0
- data/lib/treezor_connect/api_resource.rb +85 -6
- data/lib/treezor_connect/client.rb +30 -27
- data/lib/treezor_connect/resources/beneficiary.rb +18 -0
- data/lib/treezor_connect/resources/oauth/token.rb +30 -0
- data/lib/treezor_connect/resources/sca/external_operation.rb +17 -0
- data/lib/treezor_connect/resources/sca/passcode.rb +13 -0
- data/lib/treezor_connect/resources/sca/wallet.rb +23 -0
- data/lib/treezor_connect/resources.rb +5 -0
- data/lib/treezor_connect/treezor_response.rb +1 -1
- data/lib/treezor_connect.rb +3 -1
- metadata +11 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9514742754e640586396259bf46db4ef3a714a99cc3c55dd0281690f8cd852a8
|
4
|
+
data.tar.gz: d46865ec68613a926a59d7a224ad9d4fa45acb89f8a07073621ea808cbc1be84
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cd946dd81fda3ccf0ba5cd61010c2fe2ccbe1aa6e4d1d38b762676112c31a00a0e9b9c551d389ceec68a425a8e736f1deabadedb9349d0a1792b45cf3969c0be
|
7
|
+
data.tar.gz: 965dcbeceeac83b34f50fa6762fc0c62d406e600ca7a25476a48044782ccefb591925feff9475c95745e31bdcb38ec00533ae7384d0ad22e7d170b2bb0a0c1dc
|
@@ -3,9 +3,9 @@
|
|
3
3
|
module TreezorConnect
|
4
4
|
module ApiOperations
|
5
5
|
module Create
|
6
|
-
def create(params = {})
|
7
|
-
treezor_response = request(:post, resource_url, body: params)
|
8
|
-
data =
|
6
|
+
def create(params = {}, access_token = nil)
|
7
|
+
treezor_response = request(:post, resource_url, params: { body: params }, access_token:)
|
8
|
+
data = extract_response_data(treezor_response, extract_all_objects: false)
|
9
9
|
Util.convert_to_treezor_object(data, { object_class: self::OBJECT_NAME })
|
10
10
|
end
|
11
11
|
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module TreezorConnect
|
4
|
+
module ApiOperations
|
5
|
+
module Delete
|
6
|
+
def delete(id, params = {}, access_token = nil)
|
7
|
+
url = [resource_url, id].join('/')
|
8
|
+
treezor_response = request(:delete, url, params: { body: params }, access_token:)
|
9
|
+
data = extract_response_data(treezor_response, extract_all_objects: false)
|
10
|
+
Util.convert_to_treezor_object(data, { object_class: self::OBJECT_NAME })
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -3,10 +3,10 @@
|
|
3
3
|
module TreezorConnect
|
4
4
|
module ApiOperations
|
5
5
|
module Fetch
|
6
|
-
def fetch(id)
|
6
|
+
def fetch(id, access_token = nil)
|
7
7
|
url = [resource_url, id].join('/')
|
8
|
-
treezor_response = request(:get, url)
|
9
|
-
data = treezor_response
|
8
|
+
treezor_response = request(:get, url, access_token:)
|
9
|
+
data = extract_response_data(treezor_response, extract_all_objects: false)
|
10
10
|
Util.convert_to_treezor_object(data, { object_class: self::OBJECT_NAME })
|
11
11
|
end
|
12
12
|
end
|
@@ -3,9 +3,9 @@
|
|
3
3
|
module TreezorConnect
|
4
4
|
module ApiOperations
|
5
5
|
module List
|
6
|
-
def list(filters = {})
|
7
|
-
treezor_response = request(:get, resource_url, { query: filters })
|
8
|
-
data = treezor_response
|
6
|
+
def list(filters = {}, access_token = nil)
|
7
|
+
treezor_response = request(:get, resource_url, params: { query: filters }, access_token:)
|
8
|
+
data = extract_response_data(treezor_response)
|
9
9
|
Util.convert_to_treezor_object(data, { object_class: self::OBJECT_NAME })
|
10
10
|
end
|
11
11
|
end
|
@@ -4,9 +4,9 @@ module TreezorConnect
|
|
4
4
|
module ApiOperations
|
5
5
|
module Request
|
6
6
|
module ClassMethods
|
7
|
-
def request(method, url, params
|
7
|
+
def request(method, url, params: {}, headers: {}, access_token: nil)
|
8
8
|
params = Util.normalize_params(params)
|
9
|
-
client = TreezorConnect::Client.
|
9
|
+
client = TreezorConnect::Client.new(access_token)
|
10
10
|
response = client.execute_request(
|
11
11
|
method, url,
|
12
12
|
headers:,
|
@@ -14,6 +14,17 @@ module TreezorConnect
|
|
14
14
|
)
|
15
15
|
TreezorResponse.from_http_response(response)
|
16
16
|
end
|
17
|
+
|
18
|
+
def extract_response_data(response, extract_all_objects: true)
|
19
|
+
if defined?(self::OBJECT_KEY) && response.data.key?(self::OBJECT_KEY)
|
20
|
+
objects = response.data.fetch(self::OBJECT_KEY)
|
21
|
+
return objects if extract_all_objects
|
22
|
+
|
23
|
+
return objects[0]
|
24
|
+
end
|
25
|
+
|
26
|
+
response.data
|
27
|
+
end
|
17
28
|
end
|
18
29
|
|
19
30
|
def self.included(base)
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module TreezorConnect
|
4
|
+
module ApiOperations
|
5
|
+
module Update
|
6
|
+
def update(id, params = {}, access_token = nil)
|
7
|
+
url = [resource_url, id].join('/')
|
8
|
+
treezor_response = request(:put, url, params: { body: params }, access_token:)
|
9
|
+
data = extract_response_data(treezor_response, extract_all_objects: false)
|
10
|
+
Util.convert_to_treezor_object(data, { object_class: self::OBJECT_NAME })
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -1,11 +1,90 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
|
3
|
+
module TreezorConnect
|
4
|
+
class ApiResource
|
5
|
+
include TreezorConnect::ApiOperations::Request
|
5
6
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
7
|
+
class << self
|
8
|
+
def resource_url
|
9
|
+
raise NotImplementedError,
|
10
|
+
'APIResource is an abstract class. You should perform actions ' \
|
11
|
+
'on its subclasses (Payin, Payout, Transfer ...)'
|
12
|
+
end
|
13
|
+
|
14
|
+
def custom_action(http_method, *actions, ignores_id: false)
|
15
|
+
actions.each do |action|
|
16
|
+
case http_method
|
17
|
+
when :post
|
18
|
+
define_method_with_params(http_method, action)
|
19
|
+
when :put, :patch
|
20
|
+
define_put_path_methods(http_method, action, ignores_id)
|
21
|
+
else
|
22
|
+
raise ArgumentError, "Unsupported HTTP method: #{http_method}"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def define_method_with_params(http_method, action)
|
30
|
+
define_singleton_method(action) do |params = {}, access_token = nil|
|
31
|
+
url = build_url(action)
|
32
|
+
response = request(http_method, url, params: { body: params }, access_token:)
|
33
|
+
process_response(response)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def define_put_path_methods(http_method, action, ignores_id)
|
38
|
+
if ignores_id
|
39
|
+
define_method_without_id_and_params(http_method, action)
|
40
|
+
else
|
41
|
+
define_method_with_id_and_params(http_method, action)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def define_method_with_id_and_params(http_method, action)
|
46
|
+
define_singleton_method(action) do |id, params = {}, access_token = nil|
|
47
|
+
url = build_url(action, id)
|
48
|
+
response = request(http_method, url, params: { body: params }, access_token:)
|
49
|
+
process_response(response)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def define_method_without_id_and_params(http_method, action)
|
54
|
+
define_singleton_method(action) do |params = {}, access_token = nil|
|
55
|
+
url = build_url(action)
|
56
|
+
response = request(http_method, url, params: { body: params }, access_token:)
|
57
|
+
process_response(response)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def build_url(action, id = nil)
|
62
|
+
parts = [resource_url]
|
63
|
+
parts << id if id
|
64
|
+
parts << camelize(action.to_s)
|
65
|
+
parts.join('/')
|
66
|
+
end
|
67
|
+
|
68
|
+
def process_response(response)
|
69
|
+
return if response.data.nil?
|
70
|
+
|
71
|
+
data = if defined?(self::OBJECT_KEY) && response.data.key?(self::OBJECT_KEY)
|
72
|
+
response.data.fetch(self::OBJECT_KEY)[0]
|
73
|
+
else
|
74
|
+
response.data
|
75
|
+
end
|
76
|
+
Util.convert_to_treezor_object(data, { object_class: self::OBJECT_NAME })
|
77
|
+
end
|
78
|
+
|
79
|
+
def camelize(string, capitalize_first_letter: false)
|
80
|
+
string
|
81
|
+
.to_s
|
82
|
+
.split('_')
|
83
|
+
.map.with_index do |word, index|
|
84
|
+
capitalize_first_letter || index.positive? ? word.capitalize : word
|
85
|
+
end
|
86
|
+
.join
|
87
|
+
end
|
88
|
+
end
|
10
89
|
end
|
11
90
|
end
|
@@ -2,56 +2,59 @@
|
|
2
2
|
|
3
3
|
module TreezorConnect
|
4
4
|
class Client
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
self.conn = conn || self.class.default_conn
|
9
|
-
self.oauth_client ||= OAuth2::Client.new(
|
10
|
-
TreezorConnect.client_id,
|
11
|
-
TreezorConnect.client_secret,
|
12
|
-
site: TreezorConnect.api_base_url
|
13
|
-
)
|
14
|
-
end
|
15
|
-
|
16
|
-
def self.active_client
|
17
|
-
Thread.current[:treezor_connect_client] ||= default_client
|
18
|
-
end
|
19
|
-
|
20
|
-
def self.default_client
|
21
|
-
Thread.current[:treezor_connect_client_default_client] ||=
|
22
|
-
TreezorConnect::Client.new(default_conn)
|
23
|
-
end
|
24
|
-
|
25
|
-
def self.default_conn
|
26
|
-
Thread.current[:treezor_connect_client_default_conn] ||= build_default_conn
|
5
|
+
def initialize(access_token)
|
6
|
+
@conn = build_default_conn
|
7
|
+
@access_token = access_token.nil? ? default_access_token : access_token
|
27
8
|
end
|
28
9
|
|
29
10
|
def execute_request(method, path, headers: {}, params: {})
|
30
11
|
headers['Authorization'] = "Bearer #{access_token}"
|
31
12
|
response = conn.public_send(method, path, params: params[:query], form: params[:form], json: params[:body],
|
32
13
|
headers:)
|
33
|
-
http_body = JSON.parse(response.to_s)
|
34
14
|
http_status = response.status
|
35
|
-
raise_api_error(http_status:, http_body:) unless http_status.success?
|
15
|
+
raise_api_error(http_status:, http_body: JSON.parse(response.to_s)) unless http_status.success?
|
36
16
|
|
37
17
|
response
|
38
18
|
end
|
39
19
|
|
40
|
-
|
20
|
+
private
|
21
|
+
|
22
|
+
attr_reader :conn, :access_token
|
23
|
+
|
24
|
+
def build_default_conn
|
41
25
|
http = HTTP.persistent(TreezorConnect.api_base_url)
|
42
26
|
return http.use(logging: { logger: Logger.new($stdout) }) unless ENV['ENABLE_HTTP_LOGGING'].nil?
|
43
27
|
|
44
28
|
http
|
45
29
|
end
|
46
30
|
|
47
|
-
|
31
|
+
def oauth_client
|
32
|
+
@oauth_client ||= OAuth2::Client.new(
|
33
|
+
TreezorConnect.client_id,
|
34
|
+
TreezorConnect.client_secret,
|
35
|
+
site: TreezorConnect.api_base_url
|
36
|
+
)
|
37
|
+
end
|
48
38
|
|
49
|
-
def
|
39
|
+
def fetch_access_token
|
50
40
|
oauth_client.client_credentials.get_token.token
|
51
41
|
end
|
52
42
|
|
53
43
|
def raise_api_error(http_status:, http_body:)
|
54
44
|
raise ApiError, "API request failed: #{http_body.inspect} (HTTP response code was #{http_status})"
|
55
45
|
end
|
46
|
+
|
47
|
+
def token_expired?(token)
|
48
|
+
OAuth2::AccessToken.new(conn, token).expired?
|
49
|
+
end
|
50
|
+
|
51
|
+
def default_access_token
|
52
|
+
access_token = Thread.current[:treezor_default_access_token]
|
53
|
+
if access_token.nil? || token_expired?(access_token)
|
54
|
+
Thread.current[:treezor_default_access_token] = fetch_access_token
|
55
|
+
else
|
56
|
+
access_token
|
57
|
+
end
|
58
|
+
end
|
56
59
|
end
|
57
60
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module TreezorConnect
|
4
|
+
class Beneficiary < ApiResource
|
5
|
+
extend TreezorConnect::ApiOperations::Fetch
|
6
|
+
extend TreezorConnect::ApiOperations::List
|
7
|
+
extend TreezorConnect::ApiOperations::Create
|
8
|
+
extend TreezorConnect::ApiOperations::Update
|
9
|
+
|
10
|
+
OBJECT_NAME = 'beneficiary'
|
11
|
+
OBJECT_KEY = 'beneficiaries'
|
12
|
+
OBJECT_PRIMARY_KEY = 'id'
|
13
|
+
|
14
|
+
def self.resource_url
|
15
|
+
'/v1/beneficiaries'
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module TreezorConnect
|
4
|
+
module Oauth
|
5
|
+
class Token
|
6
|
+
class << self
|
7
|
+
def create(params = {})
|
8
|
+
oauth_client.client_credentials.get_token({
|
9
|
+
grant_type: 'delegated_end_user',
|
10
|
+
client_id: TreezorConnect.client_id,
|
11
|
+
client_secret: TreezorConnect.client_secret,
|
12
|
+
username: params[:username],
|
13
|
+
password: params[:password],
|
14
|
+
sca: params[:sca]
|
15
|
+
}).token
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def oauth_client
|
21
|
+
OAuth2::Client.new(
|
22
|
+
TreezorConnect.client_id,
|
23
|
+
TreezorConnect.client_secret,
|
24
|
+
site: TreezorConnect.api_base_url
|
25
|
+
)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module TreezorConnect
|
4
|
+
module Sca
|
5
|
+
class ExternalOperation < ApiResource
|
6
|
+
extend TreezorConnect::ApiOperations::Create
|
7
|
+
extend TreezorConnect::ApiOperations::Update
|
8
|
+
|
9
|
+
OBJECT_NAME = 'sca/external_operation'
|
10
|
+
OBJECT_PRIMARY_KEY = 'externalOperationId'
|
11
|
+
|
12
|
+
def self.resource_url
|
13
|
+
'/core-connect/sca/externalOperations'
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module TreezorConnect
|
4
|
+
module Sca
|
5
|
+
class Wallet < ApiResource
|
6
|
+
extend TreezorConnect::ApiOperations::Fetch
|
7
|
+
extend TreezorConnect::ApiOperations::List
|
8
|
+
extend TreezorConnect::ApiOperations::Create
|
9
|
+
extend TreezorConnect::ApiOperations::Delete
|
10
|
+
|
11
|
+
custom_action :put, :lock, :unlock
|
12
|
+
custom_action :post, :swap
|
13
|
+
|
14
|
+
OBJECT_NAME = 'sca/wallet'
|
15
|
+
OBJECT_KEY = 'scaWallets'
|
16
|
+
OBJECT_PRIMARY_KEY = 'id'
|
17
|
+
|
18
|
+
def self.resource_url
|
19
|
+
'/core-connect/sca/scawallets'
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -1,5 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'treezor_connect/resources/beneficiary'
|
3
4
|
require 'treezor_connect/resources/payin'
|
5
|
+
require 'treezor_connect/resources/oauth/token'
|
6
|
+
require 'treezor_connect/resources/sca/external_operation'
|
7
|
+
require 'treezor_connect/resources/sca/passcode'
|
8
|
+
require 'treezor_connect/resources/sca/wallet'
|
4
9
|
require 'treezor_connect/resources/sct_inst/payin'
|
5
10
|
require 'treezor_connect/resources/sct_inst/recall'
|
@@ -6,7 +6,7 @@ module TreezorConnect
|
|
6
6
|
|
7
7
|
def self.from_http_response(http_resp)
|
8
8
|
resp = TreezorResponse.new
|
9
|
-
resp.data = JSON.parse(http_resp.body)
|
9
|
+
resp.data = JSON.parse(http_resp.body) if http_resp.body.to_s != ''
|
10
10
|
resp.http_body = http_resp.body
|
11
11
|
resp.http_headers = http_resp.headers
|
12
12
|
resp.http_status = http_resp.status
|
data/lib/treezor_connect.rb
CHANGED
@@ -20,6 +20,8 @@ require 'treezor_connect/api_operations/fetch'
|
|
20
20
|
require 'treezor_connect/api_operations/list'
|
21
21
|
require 'treezor_connect/api_operations/create'
|
22
22
|
require 'treezor_connect/api_operations/request'
|
23
|
+
require 'treezor_connect/api_operations/update'
|
24
|
+
require 'treezor_connect/api_operations/delete'
|
23
25
|
|
24
26
|
# API resources
|
25
27
|
require 'treezor_connect/api_resource'
|
@@ -27,7 +29,7 @@ require 'treezor_connect/resources'
|
|
27
29
|
|
28
30
|
module TreezorConnect
|
29
31
|
class << self
|
30
|
-
attr_accessor :api_base_url, :
|
32
|
+
attr_accessor :api_base_url, :client_id, :client_secret
|
31
33
|
end
|
32
34
|
|
33
35
|
def self.configure
|
metadata
CHANGED
@@ -1,14 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: treezor_connect
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- stefakins
|
8
|
+
- jbauzone
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
|
-
date:
|
12
|
+
date: 2024-10-24 00:00:00.000000000 Z
|
12
13
|
dependencies: []
|
13
14
|
description: A gem for making HTTP calls to Treezor Connect.
|
14
15
|
email: stefan.atkinson69@gmail.com
|
@@ -18,14 +19,21 @@ extra_rdoc_files: []
|
|
18
19
|
files:
|
19
20
|
- lib/treezor_connect.rb
|
20
21
|
- lib/treezor_connect/api_operations/create.rb
|
22
|
+
- lib/treezor_connect/api_operations/delete.rb
|
21
23
|
- lib/treezor_connect/api_operations/fetch.rb
|
22
24
|
- lib/treezor_connect/api_operations/list.rb
|
23
25
|
- lib/treezor_connect/api_operations/request.rb
|
26
|
+
- lib/treezor_connect/api_operations/update.rb
|
24
27
|
- lib/treezor_connect/api_resource.rb
|
25
28
|
- lib/treezor_connect/client.rb
|
26
29
|
- lib/treezor_connect/errors.rb
|
27
30
|
- lib/treezor_connect/resources.rb
|
31
|
+
- lib/treezor_connect/resources/beneficiary.rb
|
32
|
+
- lib/treezor_connect/resources/oauth/token.rb
|
28
33
|
- lib/treezor_connect/resources/payin.rb
|
34
|
+
- lib/treezor_connect/resources/sca/external_operation.rb
|
35
|
+
- lib/treezor_connect/resources/sca/passcode.rb
|
36
|
+
- lib/treezor_connect/resources/sca/wallet.rb
|
29
37
|
- lib/treezor_connect/resources/sct_inst/payin.rb
|
30
38
|
- lib/treezor_connect/resources/sct_inst/recall.rb
|
31
39
|
- lib/treezor_connect/treezor_object.rb
|
@@ -51,7 +59,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
51
59
|
- !ruby/object:Gem::Version
|
52
60
|
version: '0'
|
53
61
|
requirements: []
|
54
|
-
rubygems_version: 3.4.
|
62
|
+
rubygems_version: 3.4.19
|
55
63
|
signing_key:
|
56
64
|
specification_version: 4
|
57
65
|
summary: A gem for making HTTP calls to Treezor Connect.
|