ost-sdk-ruby 1.1.0 → 2.0.0.beta.1

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 (48) hide show
  1. checksums.yaml +4 -4
  2. data/lib/config.rb +18 -0
  3. data/lib/ost-sdk-ruby/saas.rb +12 -17
  4. data/lib/ost-sdk-ruby/saas/balance.rb +35 -0
  5. data/lib/ost-sdk-ruby/saas/base.rb +94 -12
  6. data/lib/ost-sdk-ruby/saas/{v1.1/ledger.rb → chains.rb} +6 -9
  7. data/lib/ost-sdk-ruby/saas/{v1.1/balances.rb → device_managers.rb} +7 -9
  8. data/lib/ost-sdk-ruby/saas/devices.rb +55 -0
  9. data/lib/ost-sdk-ruby/saas/manifest.rb +40 -0
  10. data/lib/ost-sdk-ruby/saas/price_points.rb +35 -0
  11. data/lib/ost-sdk-ruby/saas/recovery_owners.rb +35 -0
  12. data/lib/ost-sdk-ruby/saas/{v1/token.rb → rules.rb} +6 -9
  13. data/lib/ost-sdk-ruby/saas/services.rb +3 -17
  14. data/lib/ost-sdk-ruby/saas/sessions.rb +44 -0
  15. data/lib/ost-sdk-ruby/saas/tokens.rb +35 -0
  16. data/lib/ost-sdk-ruby/saas/transactions.rb +53 -0
  17. data/lib/ost-sdk-ruby/saas/users.rb +52 -0
  18. data/lib/ost-sdk-ruby/test/balance_test.rb +18 -0
  19. data/lib/ost-sdk-ruby/test/chains_test.rb +18 -0
  20. data/lib/ost-sdk-ruby/test/device_managers_test.rb +18 -0
  21. data/lib/ost-sdk-ruby/test/devices_test.rb +41 -0
  22. data/lib/ost-sdk-ruby/test/price_points_test.rb +18 -0
  23. data/lib/ost-sdk-ruby/test/recovery_owners_test.rb +21 -0
  24. data/lib/ost-sdk-ruby/test/rules_test.rb +18 -0
  25. data/lib/ost-sdk-ruby/test/sessions_test.rb +28 -0
  26. data/lib/ost-sdk-ruby/test/signature_generation_test.rb +33 -0
  27. data/lib/ost-sdk-ruby/test/tokens_test.rb +18 -0
  28. data/lib/ost-sdk-ruby/test/transactions_test.rb +43 -0
  29. data/lib/ost-sdk-ruby/test/users_test.rb +32 -0
  30. data/lib/ost-sdk-ruby/util.rb +1 -1
  31. data/lib/ost-sdk-ruby/util/common_validator.rb +14 -0
  32. data/lib/ost-sdk-ruby/util/custom_error_response.rb +56 -0
  33. data/lib/ost-sdk-ruby/util/http_helper.rb +105 -97
  34. data/lib/ost-sdk-ruby/util/services_helper.rb +3 -75
  35. data/lib/ost-sdk-ruby/version.rb +1 -1
  36. metadata +42 -32
  37. data/Rakefile +0 -8
  38. data/lib/ost-sdk-ruby/saas/v0/services.rb +0 -32
  39. data/lib/ost-sdk-ruby/saas/v0/transaction_kind.rb +0 -85
  40. data/lib/ost-sdk-ruby/saas/v0/users.rb +0 -73
  41. data/lib/ost-sdk-ruby/saas/v1.1/services.rb +0 -41
  42. data/lib/ost-sdk-ruby/saas/v1/actions.rb +0 -64
  43. data/lib/ost-sdk-ruby/saas/v1/airdrops.rb +0 -55
  44. data/lib/ost-sdk-ruby/saas/v1/services.rb +0 -36
  45. data/lib/ost-sdk-ruby/saas/v1/transactions.rb +0 -55
  46. data/lib/ost-sdk-ruby/saas/v1/transfers.rb +0 -55
  47. data/lib/ost-sdk-ruby/saas/v1/users.rb +0 -64
  48. data/lib/ost-sdk-ruby/util/result.rb +0 -240
@@ -0,0 +1,33 @@
1
+ require_relative "../../../lib/ost-sdk-ruby/util"
2
+ require_relative "../../../lib/ost-sdk-ruby/saas"
3
+ require "test/unit"
4
+ require_relative "../../../lib/config"
5
+
6
+ class SignatureGenerationTest < Test::Unit::TestCase
7
+
8
+ def signature_test_obj
9
+ params = {
10
+ api_secret: "a0431203671f42c079b2154066fd04ba"
11
+ }
12
+ @signature_test_obj ||= OSTSdk::Util::HTTPHelper.new(params)
13
+ end
14
+
15
+ def test_signature
16
+ test_obj_for_signature = {
17
+ a: nil,
18
+ b: [],
19
+ c: '',
20
+ d: ["", nil],
21
+ e: {},
22
+ k1: 125.45,
23
+ k2: 'Tejas',
24
+ aaaaa: {a: {a: "L21A", b: "L21B"}, b: {a: "L22A", b: "L22B"}, c: {a: "L23A", b: "L23B"}},
25
+ arrayValues: ["Hello", "There", "12345"],
26
+ garbage_str: "~!@#$%^&*()_+-= {}[]:\";'?/<>,. this is garbage"
27
+ }
28
+ test_endpoint = "/api/v2/users"
29
+ signature = signature_test_obj.get_signature_for_test(test_endpoint, test_obj_for_signature)
30
+ assert_equal(signature, "28664cdbc613b66835d7bcf825dce719fb8e0621992c291ba9bd1767c1c5560d")
31
+ end
32
+
33
+ end
@@ -0,0 +1,18 @@
1
+ require_relative "../../../lib/ost-sdk-ruby/util"
2
+ require_relative "../../../lib/ost-sdk-ruby/saas"
3
+ require "test/unit"
4
+ require_relative "../../../lib/config"
5
+
6
+ class TokensTest < Test::Unit::TestCase
7
+
8
+ def tokens_service
9
+ @tokens_service ||= Config::OST_SDK.services.tokens
10
+ end
11
+
12
+ def test_tokens_get
13
+ result = tokens_service.get()
14
+ puts "result=>#{result}" unless result["success"]
15
+ assert_equal(result["success"], true )
16
+ end
17
+
18
+ end
@@ -0,0 +1,43 @@
1
+ require_relative "../../../lib/ost-sdk-ruby/util"
2
+ require_relative "../../../lib/ost-sdk-ruby/saas"
3
+ require "test/unit"
4
+ require_relative "../../../lib/config"
5
+
6
+ class TransactionsTest < Test::Unit::TestCase
7
+
8
+ def transactions_service
9
+ @transactions_service ||= Config::OST_SDK.services.transactions
10
+ end
11
+
12
+ def test_transactions_execute
13
+ result = transactions_service.execute({
14
+ user_id: Config::OST_KIT_COMPANY_USER_ID,
15
+ to: Config::OST_KIT_RULE_ADDRESS,
16
+ raw_calldata: {
17
+ method: "directTransfers",
18
+ parameters: [[Config::OST_KIT_USER2_TOKEN_HOLDER_ADDRESS],["1"]]
19
+ }.to_json
20
+ })
21
+ puts "result=>#{result}" unless result["success"]
22
+
23
+ assert_equal(result["success"], true)
24
+ end
25
+
26
+ def test_transactions_get
27
+ result = transactions_service.get({
28
+ user_id: Config::OST_KIT_USER_ID,
29
+ transaction_id: Config::OST_KIT_TRANSACTION_ID
30
+ })
31
+ puts "result=>#{result}" unless result["success"]
32
+ assert_equal(result["success"], true)
33
+ end
34
+
35
+ def test_transactions_get_list
36
+ result = transactions_service.get_list({
37
+ user_id: Config::OST_KIT_USER_ID
38
+ })
39
+ puts "result=>#{result}" unless result["success"]
40
+ assert_equal(result["success"], true)
41
+ end
42
+
43
+ end
@@ -0,0 +1,32 @@
1
+ require_relative "../../../lib/ost-sdk-ruby/util"
2
+ require_relative "../../../lib/ost-sdk-ruby/saas"
3
+ require "test/unit"
4
+ require_relative "../../../lib/config"
5
+
6
+ class UsersTest < Test::Unit::TestCase
7
+
8
+ def users_service
9
+ @users_service ||= Config::OST_SDK.services.users
10
+ end
11
+
12
+ def test_users_create
13
+ result = users_service.create()
14
+ puts "result=>#{result}" unless result["success"]
15
+ assert_equal(result["success"], true)
16
+ end
17
+
18
+ def test_users_get
19
+ result = users_service.get({
20
+ user_id: Config::OST_KIT_USER_ID
21
+ })
22
+ puts "result=>#{result}" unless result["success"]
23
+ assert_equal(result["success"], true)
24
+ end
25
+
26
+ def test_users_get_list
27
+ result = users_service.get_list()
28
+ puts "result=>#{result}" unless result["success"]
29
+ assert_equal(result["success"], true)
30
+ end
31
+
32
+ end
@@ -1,6 +1,6 @@
1
1
  require_relative 'util/common_validator'
2
- require_relative 'util/result'
3
2
  require_relative 'util/api_credentials'
3
+ require_relative 'util/custom_error_response'
4
4
  require_relative 'util/http_helper'
5
5
  require_relative 'util/services_helper'
6
6
 
@@ -4,6 +4,8 @@ module OSTSdk
4
4
 
5
5
  class CommonValidator
6
6
 
7
+ REGEX_FOR_UUID = /\A[0-9a-z\.\-]+\z/i
8
+
7
9
  # Check for numeric-ness of an input
8
10
  #
9
11
  # Arguments:
@@ -43,6 +45,18 @@ module OSTSdk
43
45
  obj.is_a?(Hash) || obj.is_a?(ActionController::Parameters)
44
46
  end
45
47
 
48
+ # Is the value is valid for given key
49
+ #
50
+ # Arguments:
51
+ # object: (String)
52
+ #
53
+ # Returns:
54
+ # Boolean
55
+ #
56
+ def self.is_valid_uuid_format?(value)
57
+ value =~ REGEX_FOR_UUID
58
+ end
59
+
46
60
  end
47
61
 
48
62
  end
@@ -0,0 +1,56 @@
1
+ module OSTSdk
2
+
3
+ module Util
4
+
5
+ class CustomErrorResponse
6
+
7
+
8
+ def initialize(params)
9
+ @code = params[:code]
10
+ @internal_id = params[:internal_id]
11
+ @msg = params[:msg]
12
+ @error_data = params[:error_data]
13
+ end
14
+
15
+
16
+ def external_error_response
17
+ error_response({
18
+ :code => @code,
19
+ :internal_id => @internal_id,
20
+ :msg => @msg,
21
+ :error_data => @error_data
22
+ })
23
+ end
24
+
25
+ def default_error_response
26
+ error_response({
27
+ :code => 'SOMETHING_WENT_WRONG',
28
+ :internal_id => "SDK(#{@internal_id})",
29
+ :msg => @msg,
30
+ :error_data => []
31
+ })
32
+ end
33
+
34
+ def timeout_error_response
35
+ error_response({
36
+ :code => 'REQUEST_TIMEOUT',
37
+ :internal_id => "SDK(REQUEST_TIMEOUT)",
38
+ :msg => '',
39
+ :error_data => []
40
+ })
41
+ end
42
+
43
+ private
44
+
45
+ def error_response(err)
46
+ {
47
+ success: false,
48
+ err: err
49
+ }
50
+ end
51
+
52
+ end
53
+
54
+ end
55
+
56
+ end
@@ -9,7 +9,6 @@ module OSTSdk
9
9
  require "openssl"
10
10
  require "net/http"
11
11
  require "json"
12
- require 'rack'
13
12
 
14
13
  # Initialize
15
14
  #
@@ -24,6 +23,13 @@ module OSTSdk
24
23
  @api_key = params[:api_key]
25
24
  @api_secret = params[:api_secret]
26
25
  @api_spec = params[:api_spec]
26
+ @timeout = 10
27
+ if (params.key?(:config))
28
+ config = params[:config]
29
+ if (config.key?(:timeout))
30
+ @timeout = config[:timeout]
31
+ end
32
+ end
27
33
  end
28
34
 
29
35
  # Send POST requests
@@ -33,18 +39,15 @@ module OSTSdk
33
39
  # request_params: (Hash)
34
40
  #
35
41
  # Returns:
36
- # OSTSdk::Util::Result
42
+ # response: (Hash)
37
43
  #
38
44
  def send_post_request(endpoint, request_params)
39
45
  perform_and_handle_exceptions('u_hh_1', 'POST request failed') do
40
- base_params = get_base_params(endpoint, request_params)
41
- uri = post_api_uri(endpoint)
46
+ escaped_query_string = get_query_string(endpoint, request_params)
47
+ uri = URI(get_api_url(endpoint))
42
48
  http = setup_request(uri)
43
- r_params = base_params.merge(request_params)
44
- query_string = Rack::Utils.build_nested_query(r_params)
45
- escaped_query_string = URI.escape(query_string, '*')
46
49
  if @api_spec
47
- return OSTSdk::Util::Result.success({data: {request_uri: uri.to_s, request_type: 'POST', request_params: escaped_query_string}})
50
+ return {request_uri: uri.to_s, request_type: 'POST', request_params: escaped_query_string}
48
51
  else
49
52
  result = http.post(uri.path, escaped_query_string)
50
53
  return format_response(result)
@@ -59,21 +62,18 @@ module OSTSdk
59
62
  # request_params: (Hash)
60
63
  #
61
64
  # Returns:
62
- # OSTSdk::Util::Result
65
+ # response: (Hash)
63
66
  #
64
67
  def send_get_request(endpoint, request_params)
65
68
  perform_and_handle_exceptions('u_hh_2', 'GET request Failed') do
66
- base_params = get_base_params(endpoint, request_params)
67
- r_params = base_params.merge(request_params)
68
- query_string = Rack::Utils.build_nested_query(r_params)
69
- escaped_query_string = URI.escape(query_string, '*')
70
- raw_url = get_api_url(endpoint) + "?" + escaped_query_string
69
+ escaped_query_string = get_query_string(endpoint, request_params)
70
+ raw_url = get_api_url(endpoint) + "?#{escaped_query_string}"
71
71
  uri = URI(raw_url)
72
72
  if @api_spec
73
- return OSTSdk::Util::Result.success({data: {request_uri: uri.to_s.split("?")[0], request_type: 'GET', request_params: escaped_query_string}})
73
+ return {request_uri: uri.to_s.split("?")[0], request_type: 'GET', request_params: escaped_query_string}
74
74
  else
75
75
  result = {}
76
- Timeout.timeout(5) do
76
+ Timeout.timeout(@timeout) do
77
77
  result = Net::HTTP.get_response(uri)
78
78
  end
79
79
  return format_response(result)
@@ -81,12 +81,27 @@ module OSTSdk
81
81
  end
82
82
  end
83
83
 
84
+ # Generate a signature for test case. It only creates a signature for a given Hash
85
+ #
86
+ # Arguments:
87
+ # end_point: (String)
88
+ # request_params: (Hash)
89
+ #
90
+ # Returns:
91
+ # response: (String)
92
+ #
93
+ def get_signature_for_test(endpoint, request_params)
94
+ escaped_query_string = get_escaped_query_string(request_params)
95
+ string_to_sign = "#{endpoint}?#{escaped_query_string}"
96
+ generate_signature(string_to_sign)
97
+ end
98
+
84
99
  private
85
100
 
86
101
  def setup_request(uri)
87
102
  http = Net::HTTP.new(uri.host, uri.port)
88
- http.read_timeout = 5
89
- http.open_timeout = 5
103
+ http.read_timeout = @timeout
104
+ http.open_timeout = @timeout
90
105
  if uri.scheme == "https"
91
106
  http.use_ssl = true
92
107
  http.verify_mode = OpenSSL::SSL::VERIFY_NONE
@@ -94,82 +109,98 @@ module OSTSdk
94
109
  http
95
110
  end
96
111
 
97
- def get_base_params(endpoint, request_params)
98
- request_timestamp = Time.now.to_i.to_s
99
- request_params = request_params.merge("request_timestamp" => request_timestamp, "api_key" => @api_key)
112
+ def get_query_string(endpoint, request_params)
113
+ request_timestamp = Time.now.to_i
114
+ request_params = request_params.merge("api_request_timestamp" => request_timestamp,
115
+ "api_key" => @api_key,
116
+ "api_signature_kind" => "OST1-HMAC-SHA256")
117
+ escaped_query_string = get_escaped_query_string(request_params)
118
+ string_to_sign = endpoint + "?" + escaped_query_string
119
+ signature = generate_signature(string_to_sign)
120
+ "#{escaped_query_string}&api_signature=#{escape(signature)}"
121
+ end
100
122
 
123
+ def get_escaped_query_string(request_params)
101
124
  sorted_request_params = sort_param(request_params)
102
- request_params_str = Rack::Utils.build_nested_query(sorted_request_params)
103
- request_params_escaped_str = URI.escape(request_params_str, "*")
104
-
105
- str = endpoint + '?' + request_params_escaped_str
106
- signature = generate_signature(str)
107
- {"request_timestamp" => request_timestamp, "signature" => signature, "api_key" => @api_key}
125
+ build_nested_query(sorted_request_params)
108
126
  end
109
127
 
110
128
  def generate_signature(string_to_sign)
111
129
  digest = OpenSSL::Digest.new('sha256')
112
- signature = OpenSSL::HMAC.hexdigest(digest, @api_secret, string_to_sign)
113
- signature
114
- end
115
-
116
- def post_api_uri(endpoint)
117
- URI(@api_base_url + endpoint)
130
+ OpenSSL::HMAC.hexdigest(digest, @api_secret, string_to_sign)
118
131
  end
119
132
 
120
133
  def get_api_url(endpoint)
121
134
  @api_base_url + endpoint
122
135
  end
123
136
 
137
+ def build_nested_query(value, prefix = nil)
138
+ case value
139
+ when Array
140
+ value.map {|v|
141
+ build_nested_query(v, "#{prefix}[]")
142
+ }.reject(&:empty?).join("&")
143
+ when Hash
144
+ value.map {|k, v|
145
+ build_nested_query(v, prefix ? "#{prefix}[#{k}]" : k)
146
+ }.reject(&:empty?).join('&')
147
+ # when nil
148
+ # "#{escape(prefix)}="
149
+ else
150
+ raise ArgumentError, "value must be a Hash" if prefix.nil?
151
+ "#{escape(prefix)}=#{escape(value)}"
152
+ end
153
+ end
154
+
155
+ def escape(s)
156
+ s = URI.encode_www_form_component(s)
157
+
158
+ # escape [*] if not escaped by ruby
159
+ s = URI.escape(s, "*")
160
+
161
+ # unescape [~] if escaped by ruby
162
+ s = URI.unescape(s, "%7E")
163
+ s
164
+ end
165
+
124
166
  # Method which is called in service perform and handle exceptions
125
167
  #
126
- def perform_and_handle_exceptions(err_code = 'swt', err_message = 'Something Went Wrong', &block)
168
+ def perform_and_handle_exceptions(internal_id = 'swr', msg = 'Something Went Wrong', &block)
127
169
  begin
128
170
  yield if block_given?
171
+ rescue Timeout::Error => ex
172
+ OSTSdk::Util::CustomErrorResponse.new({internal_id: internal_id, msg: msg}).timeout_error_response
129
173
  rescue StandardError => se
130
- OSTSdk::Util::Result.exception(se, {error: err_code, error_message: err_message})
174
+ OSTSdk::Util::CustomErrorResponse.new({internal_id: internal_id, msg: msg}).default_error_response
131
175
  end
132
176
  end
133
177
 
134
178
  def sort_param(params)
135
179
 
136
- if [Hash, Array].include?(params.class)
180
+ if params.is_a?(Hash)
137
181
  params = JSON.parse(params.to_json)
138
- else
139
- params = params.to_s
140
- end
182
+ data = {}
183
+ params.sort.each do |ele|
184
+ key = ele[0]
185
+ val = ele[1]
186
+ data[key] = sort_param(val)
187
+ end
141
188
 
142
- res = {}
143
- if params.class == Array
189
+ elsif params.is_a?(Array)
190
+ params = JSON.parse(params.to_json)
144
191
  data = []
145
192
  params.each do |ele|
146
- if [Hash, Array].include?(ele.class)
147
- data << sort_param(ele)
148
- else
149
- data << ele.to_s
150
- end
193
+ data << sort_param(ele)
151
194
  end
152
- return data
195
+ else
196
+ data = params.to_s
153
197
  end
154
198
 
155
- params.sort.each do |ele|
156
- key = ele[0]
157
- val = ele[1]
158
- sorted_val = val
159
-
160
- if [Hash, Array].include?(val.class)
161
- sorted_val = sort_param(val)
162
- else
163
- sorted_val = sorted_val.to_s
164
- end
165
-
166
- res[key] = sorted_val
167
- end
168
- return res
199
+ return data
169
200
  end
170
201
 
171
202
  def format_response(response)
172
- json_raw_response = JSON.parse(response.body)
203
+ json_raw_response = JSON.parse(response.body) rescue {}
173
204
  # If internal response
174
205
  if json_raw_response.has_key?('success') || json_raw_response.has_key?('err')
175
206
  format_internal_response(response)
@@ -180,58 +211,35 @@ module OSTSdk
180
211
 
181
212
  def format_internal_response(response)
182
213
  json_raw_response = JSON.parse(response.body)
183
- if json_raw_response['success']
184
- OSTSdk::Util::Result.success(
185
- {
186
- data: json_raw_response['data'],
187
- http_code: response.code
188
- }
189
- )
190
- else
191
- err_data = json_raw_response['err']
192
- OSTSdk::Util::Result.error(
193
- {
194
- error: err_data['code'],
195
- internal_id: err_data['internal_id'],
196
- error_message: err_data['msg'],
197
- error_data: err_data['error_data'],
198
- http_code: response.code
199
- }
200
- )
201
- end
214
+ json_raw_response
202
215
  end
203
216
 
204
217
  def format_external_response(response_code)
205
218
  case response_code.to_i
206
- when 429
207
- code = 'TOO_MANY_REQUESTS'
208
- internal_id = 'SDK(TOO_MANY_REQUESTS)'
209
- message = 'Too many requests have been received in a minute.'
210
219
  when 502
211
220
  code = 'BAD_GATEWAY'
212
221
  internal_id = 'SDK(BAD_GATEWAY)'
213
- message = 'Something went wrong.'
222
+ msg = 'Something went wrong.'
214
223
  when 503
215
224
  code = 'SERVICE_UNAVAILABLE'
216
225
  internal_id = 'SDK(SERVICE_UNAVAILABLE)'
217
- message = 'API under maintenance.'
226
+ msg = 'API under maintenance.'
218
227
  when 504
219
228
  code = 'GATEWAY_TIMEOUT'
220
229
  internal_id = 'SDK(GATEWAY_TIMEOUT)'
221
- message = 'Request timed out.'
230
+ msg = 'Request timed out.'
222
231
  else
223
232
  code = 'SOMETHING_WENT_WRONG'
224
233
  internal_id = 'SDK(SOMETHING_WENT_WRONG)'
225
- message = 'Something went wrong.'
234
+ msg = 'Something went wrong.'
226
235
  end
227
- OSTSdk::Util::Result.error(
228
- {
229
- error: code,
230
- internal_id: internal_id,
231
- error_message: message,
232
- http_code: response_code
233
- }
234
- )
236
+
237
+ OSTSdk::Util::CustomErrorResponse.new({
238
+ code: code,
239
+ msg: msg,
240
+ internal_id: internal_id,
241
+ error_data: []
242
+ }).external_error_response
235
243
  end
236
244
 
237
245
  end