synapse_fi 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.DS_Store +0 -0
- data/.env.sample +9 -0
- data/.gitignore +3 -0
- data/Gemfile +6 -0
- data/Gemfile.lock +43 -0
- data/README.md +39 -0
- data/lib/synapse_api/.DS_Store +0 -0
- data/lib/synapse_api/client.rb +355 -0
- data/lib/synapse_api/error.rb +138 -0
- data/lib/synapse_api/http_request.rb +228 -0
- data/lib/synapse_api/node.rb +19 -0
- data/lib/synapse_api/nodes.rb +19 -0
- data/lib/synapse_api/subnet.rb +13 -0
- data/lib/synapse_api/subnets.rb +16 -0
- data/lib/synapse_api/subscription.rb +15 -0
- data/lib/synapse_api/subscriptions.rb +17 -0
- data/lib/synapse_api/transaction.rb +21 -0
- data/lib/synapse_api/transactions.rb +19 -0
- data/lib/synapse_api/user.rb +734 -0
- data/lib/synapse_api/users.rb +19 -0
- data/lib/synapse_api/version.rb +6 -0
- data/node_modules/.yarn-integrity +16 -0
- data/node_modules/dotenv/CHANGELOG.md +117 -0
- data/node_modules/dotenv/LICENSE +23 -0
- data/node_modules/dotenv/README.md +295 -0
- data/node_modules/dotenv/config.js +11 -0
- data/node_modules/dotenv/lib/cli-options.js +13 -0
- data/node_modules/dotenv/lib/env-options.js +18 -0
- data/node_modules/dotenv/lib/main.js +103 -0
- data/node_modules/dotenv/package.json +45 -0
- data/package.json +5 -0
- data/samples.md +455 -0
- data/synapse_fi-0.0.0.gem +0 -0
- data/synapse_fi.gemspec +89 -0
- data/yarn.lock +8 -0
- metadata +148 -0
@@ -0,0 +1,228 @@
|
|
1
|
+
require 'rest-client'
|
2
|
+
require 'open-uri'
|
3
|
+
require 'json'
|
4
|
+
require_relative './error'
|
5
|
+
|
6
|
+
module Synapse
|
7
|
+
# Wrapper for HTTP requests using RestClient.
|
8
|
+
class HTTPClient
|
9
|
+
|
10
|
+
# @!attribute [rw] base_url
|
11
|
+
# @return [String] the base url of the API (production or sandbox)
|
12
|
+
# @!attribute [rw] config
|
13
|
+
# @return [Hash] various settings related to request headers
|
14
|
+
# @!attribute [rw] raise_for_202
|
15
|
+
# @return [Boolean] relating to how to handle 202 exception
|
16
|
+
attr_accessor :base_url, :config, :raise_for_202
|
17
|
+
|
18
|
+
# @param base_url [String] the base url of the API (production or sandbox)
|
19
|
+
# @param client_id [String]
|
20
|
+
# @param client_secret [String]
|
21
|
+
# @param fingerprint [String]
|
22
|
+
# @param ip_address [String]
|
23
|
+
# @param raise_for_202 [String]
|
24
|
+
# @param logging [Boolean] (optional) logs to stdout when true
|
25
|
+
# @param log_to [String] (optional) file path to log to file (logging must be true)
|
26
|
+
def initialize(base_url:, client_id:, client_secret:, fingerprint:, ip_address:, raise_for_202:false, **options)
|
27
|
+
@raise_for_202 = raise_for_202
|
28
|
+
log_to = options[:log_to] || 'stdout'
|
29
|
+
RestClient.log = log_to if options[:logging]
|
30
|
+
@logging = options[:logging]
|
31
|
+
|
32
|
+
@config = {
|
33
|
+
client_id: client_id,
|
34
|
+
client_secret: client_secret,
|
35
|
+
fingerprint: fingerprint,
|
36
|
+
ip_address: ip_address,
|
37
|
+
oauth_key: '',
|
38
|
+
}
|
39
|
+
@base_url = base_url
|
40
|
+
end
|
41
|
+
|
42
|
+
# Returns headers for HTTP requests.
|
43
|
+
# @return [Hash]
|
44
|
+
def headers
|
45
|
+
user = "#{config[:oauth_key]}|#{config[:fingerprint]}"
|
46
|
+
gateway = "#{config[:client_id]}|#{config[:client_secret]}"
|
47
|
+
headers = {
|
48
|
+
content_type: :json,
|
49
|
+
accept: :json,
|
50
|
+
'X-SP-GATEWAY' => gateway,
|
51
|
+
'X-SP-USER' => user,
|
52
|
+
'X-SP-USER-IP' => config[:ip_address],
|
53
|
+
}
|
54
|
+
if config[:idemopotency_key]
|
55
|
+
headers['X-SP-IDEMPOTENCY-KEY'] = config[:idemopotency_key]
|
56
|
+
end
|
57
|
+
headers
|
58
|
+
end
|
59
|
+
|
60
|
+
# Alias for headers (copy of current headers)
|
61
|
+
alias_method :get_headers, :headers
|
62
|
+
|
63
|
+
# Updates current HTPP headers
|
64
|
+
# @param fingerprint [String]
|
65
|
+
# @param oauth_key [String]
|
66
|
+
# @param fingerprint [String]
|
67
|
+
# @param client_id [String]
|
68
|
+
# @param client_secret [String]
|
69
|
+
# @param ip_address [String]
|
70
|
+
# @param idemopotency_key [String]
|
71
|
+
def update_headers(oauth_key: nil, fingerprint: nil, client_id: nil, client_secret: nil, ip_address: nil, idemopotency_key: nil)
|
72
|
+
config[:fingerprint] = fingerprint if fingerprint
|
73
|
+
config[:oauth_key] = oauth_key if oauth_key
|
74
|
+
config[:client_id] = client_id if client_id
|
75
|
+
config[:client_secret] = client_secret if client_secret
|
76
|
+
config[:ip_address] = ip_address if ip_address
|
77
|
+
config[:idemopotency_key] = idemopotency_key if idemopotency_key
|
78
|
+
nil
|
79
|
+
end
|
80
|
+
|
81
|
+
# Send a POST request to the given path with the given payload
|
82
|
+
# @param path [String]
|
83
|
+
# @param payload [HASH]
|
84
|
+
# @param **options payload = idempotency_key [String] (optional) avoid accidentally performing the same operation twice
|
85
|
+
# @return [Hash] API response
|
86
|
+
# @raise [Synapse::Error] subclass depends on HTTP response
|
87
|
+
def post(path, payload, **options)
|
88
|
+
#copy of current headers
|
89
|
+
headers = get_headers
|
90
|
+
|
91
|
+
# update the headers with idempotency_key
|
92
|
+
if options[:idempotency_key]
|
93
|
+
headers = headers.merge({'X-SP-IDEMPOTENCY-KEY' => options[:idempotency_key]})
|
94
|
+
end
|
95
|
+
|
96
|
+
response = with_error_handling { RestClient::Request.execute(:method => :post, :url => full_url(path), :payload => payload.to_json, :headers => headers, :timeout => 300) }
|
97
|
+
puts 'RESPONSE:', JSON.parse(response) if @logging
|
98
|
+
response = JSON.parse(response)
|
99
|
+
|
100
|
+
if raise_for_202 && response["http_code"] == "202"
|
101
|
+
raise Error.from_response(response)
|
102
|
+
elsif response["error"]
|
103
|
+
raise Error.from_response(response)
|
104
|
+
else
|
105
|
+
response
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
# Sends a GET request to the given path with the given payload.
|
110
|
+
# @param path [String]
|
111
|
+
# @return [Hash] API response
|
112
|
+
# @raise [Synapse::Error] subclass depends on HTTP response
|
113
|
+
def get(path)
|
114
|
+
response = with_error_handling {RestClient.get(full_url(path), headers)}
|
115
|
+
puts 'RESPONSE:', JSON.parse(response) if @logging
|
116
|
+
response = JSON.parse(response)
|
117
|
+
|
118
|
+
if raise_for_202 && response["http_code"] == "202"
|
119
|
+
raise Error.from_response(response)
|
120
|
+
elsif response["error"]
|
121
|
+
raise Error.from_response(response)
|
122
|
+
else
|
123
|
+
response
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
# Sends a DELETE request to the given path
|
128
|
+
# @param path [String]
|
129
|
+
# @return [Hash] API response
|
130
|
+
# @raise [Synapse::Error] subclass depends on HTTP response
|
131
|
+
def delete(path)
|
132
|
+
response = with_error_handling {RestClient.delete(full_url(path), headers)}
|
133
|
+
puts 'RESPONSE:', JSON.parse(response) if @logging
|
134
|
+
response = JSON.parse(response)
|
135
|
+
|
136
|
+
if raise_for_202 && response["http_code"] == "202"
|
137
|
+
raise Error.from_response(response)
|
138
|
+
elsif response["error"]
|
139
|
+
raise Error.from_response(response)
|
140
|
+
else
|
141
|
+
response
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
# Sends a PATCH request to the given path with the given payload.
|
146
|
+
# @param path [String]
|
147
|
+
# @param payload [Hash]
|
148
|
+
# @return [Hash] API response
|
149
|
+
# @raise [Synapse::Error] subclass depends on HTTP response
|
150
|
+
def patch(path, payload)
|
151
|
+
response = with_error_handling {RestClient::Request.execute(:method => :patch, :url => full_url(path), :payload => payload.to_json, :headers => headers, :timeout => 300)}
|
152
|
+
p 'RESPONSE:', JSON.parse(response) if @logging
|
153
|
+
response = JSON.parse(response)
|
154
|
+
|
155
|
+
if raise_for_202 && response["http_code"] == "202"
|
156
|
+
raise Error.from_response(response)
|
157
|
+
elsif response["error"]
|
158
|
+
raise Error.from_response(response)
|
159
|
+
else
|
160
|
+
response
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
def oauthenticate(user_id:)
|
165
|
+
refresh_token = refresh_token(user_id: user_id)
|
166
|
+
end
|
167
|
+
|
168
|
+
private
|
169
|
+
|
170
|
+
# get user
|
171
|
+
# get refresh_token
|
172
|
+
# send refresh_token to oauth path
|
173
|
+
# grabs the refresh token and formats a refresh token payload
|
174
|
+
def refresh_token(user_id:)
|
175
|
+
path = "/users/#{user_id}"
|
176
|
+
response = get(path)
|
177
|
+
refresh_token = response["refresh_token"]
|
178
|
+
|
179
|
+
refresh_token = {"refresh_token" => refresh_token}
|
180
|
+
oauth_path = oauth_path(user_id)
|
181
|
+
authenticate(refresh_token, oauth_path)
|
182
|
+
end
|
183
|
+
|
184
|
+
# options payload to change scope of oauth
|
185
|
+
def authenticate(refresh_token, oauth_path)
|
186
|
+
oauth_key = post(oauth_path, refresh_token)
|
187
|
+
oauth_key = oauth_key['oauth_key']
|
188
|
+
update_headers(oauth_key: oauth_key)
|
189
|
+
nil
|
190
|
+
end
|
191
|
+
|
192
|
+
def oauth_path(user_id)
|
193
|
+
path = "/oauth/#{user_id}"
|
194
|
+
end
|
195
|
+
|
196
|
+
def full_url(path)
|
197
|
+
"#{base_url}#{path}"
|
198
|
+
end
|
199
|
+
|
200
|
+
# raising an exception based on http_request
|
201
|
+
# yeilds if http_request raises an exception
|
202
|
+
def with_error_handling
|
203
|
+
yield
|
204
|
+
rescue RestClient::Exceptions::Timeout
|
205
|
+
body = {
|
206
|
+
error: {
|
207
|
+
en: "Request Timeout"
|
208
|
+
},
|
209
|
+
http_code: 504
|
210
|
+
}
|
211
|
+
raise Error.from_response(body)
|
212
|
+
rescue RestClient::Exception => e
|
213
|
+
if e.response.headers[:content_type] == 'application/json'
|
214
|
+
body = JSON.parse(e.response.body)
|
215
|
+
else
|
216
|
+
body = {
|
217
|
+
error: {
|
218
|
+
en: e.response.body
|
219
|
+
},
|
220
|
+
http_code: e.response.code
|
221
|
+
}
|
222
|
+
end
|
223
|
+
raise Error.from_response(body)
|
224
|
+
end
|
225
|
+
end
|
226
|
+
end
|
227
|
+
|
228
|
+
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Synapse
|
2
|
+
|
3
|
+
class Node
|
4
|
+
|
5
|
+
attr_reader :node_id, :user_id, :payload, :full_dehydrate, :type
|
6
|
+
|
7
|
+
attr_accessor
|
8
|
+
|
9
|
+
def initialize(node_id:, user_id:,payload:, full_dehydrate:, type:nil)
|
10
|
+
@node_id = node_id
|
11
|
+
@full_dehydrate = full_dehydrate
|
12
|
+
@user_id = user_id
|
13
|
+
@payload = payload
|
14
|
+
@type = type
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Synapse
|
2
|
+
|
3
|
+
class Nodes
|
4
|
+
|
5
|
+
attr_reader :page, :page_count, :limit, :payload, :nodes_count, :nodes_count
|
6
|
+
|
7
|
+
attr_accessor
|
8
|
+
|
9
|
+
def initialize(page:,limit:, page_count:, nodes_count:, payload:)
|
10
|
+
@page = page
|
11
|
+
@limit = limit
|
12
|
+
@nodes_count = nodes_count
|
13
|
+
@page_count = page_count
|
14
|
+
@payload = payload
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Synapse
|
2
|
+
|
3
|
+
class Subnets
|
4
|
+
|
5
|
+
attr_accessor :page, :page_count, :limit, :payload, :subnets_count, :node_id
|
6
|
+
|
7
|
+
def initialize(limit:, page:, page_count:, subnets_count:, payload:, node_id:)
|
8
|
+
@page = page
|
9
|
+
@limit = limit
|
10
|
+
@subnets_count = subnets_count
|
11
|
+
@payload = payload
|
12
|
+
@page_count = page_count
|
13
|
+
@node_id = node_id
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Synapse
|
2
|
+
|
3
|
+
class Subscription
|
4
|
+
|
5
|
+
attr_reader :subscription_id, :url, :payload
|
6
|
+
|
7
|
+
attr_accessor
|
8
|
+
|
9
|
+
def initialize(subscription_id:, url:, payload:)
|
10
|
+
@subscription_id = subscription_id
|
11
|
+
@url = url
|
12
|
+
@payload = payload
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Synapse
|
2
|
+
|
3
|
+
class Subscriptions
|
4
|
+
|
5
|
+
attr_reader :subscriptions_count, :page, :limit, :payload, :page_count
|
6
|
+
|
7
|
+
attr_accessor
|
8
|
+
|
9
|
+
def initialize(page:,limit:, subscriptions_count:, payload:, page_count:)
|
10
|
+
@subscriptions_count = subscriptions_count
|
11
|
+
@page = page
|
12
|
+
@limit = limit
|
13
|
+
@payload = payload
|
14
|
+
@page_count = page_count
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Synapse
|
2
|
+
|
3
|
+
class Transaction
|
4
|
+
|
5
|
+
|
6
|
+
attr_accessor :trans_id, :payload, :node_id, :user
|
7
|
+
|
8
|
+
def initialize(trans_id:, payload:, node_id:nil, user:nil)
|
9
|
+
@trans_id = trans_id
|
10
|
+
@payload = payload
|
11
|
+
@node_id = node_id
|
12
|
+
@user = user
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
|
18
|
+
|
19
|
+
|
20
|
+
|
21
|
+
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Synapse
|
2
|
+
|
3
|
+
class Transactions
|
4
|
+
|
5
|
+
attr_reader :page, :page_count, :limit, :payload, :trans_count
|
6
|
+
|
7
|
+
attr_accessor
|
8
|
+
|
9
|
+
def initialize(page:,limit:, trans_count:, payload:, page_count:)
|
10
|
+
@page = page
|
11
|
+
@limit = limit
|
12
|
+
@trans_count = trans_count
|
13
|
+
@payload = payload
|
14
|
+
@page_count = page_count
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
|