oneapi-ruby 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +22 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +202 -0
- data/README.md +102 -0
- data/Rakefile +8 -0
- data/examples/example_customer_profile.rb +29 -0
- data/examples/example_get_hlr.rb +34 -0
- data/examples/example_get_inbound_messages.rb +26 -0
- data/examples/example_on_inbound_message.rb +13 -0
- data/examples/example_send_hlr_and_wait_for_delivery_push.rb +50 -0
- data/examples/example_send_message_and_check_delivery_status.rb +53 -0
- data/examples/example_send_message_and_wait_for_delivery_push.rb +56 -0
- data/lib/oneapi-ruby.rb +8 -0
- data/lib/oneapi-ruby/client.rb +309 -0
- data/lib/oneapi-ruby/models.rb +205 -0
- data/lib/oneapi-ruby/objects.rb +174 -0
- data/lib/oneapi-ruby/utils.rb +164 -0
- data/lib/oneapi-ruby/version.rb +3 -0
- data/oneapi-ruby.gemspec +23 -0
- data/test/test.rb +69 -0
- metadata +93 -0
@@ -0,0 +1,13 @@
|
|
1
|
+
lib = File.expand_path('../../lib', __FILE__)
|
2
|
+
if File.exists?(lib)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
end
|
5
|
+
require 'oneapi-ruby'
|
6
|
+
|
7
|
+
# In your script an HTTP POST request will be received, you should extract the body of this request...
|
8
|
+
http_body = '...'
|
9
|
+
|
10
|
+
#...and process it with:
|
11
|
+
# example:on-mo
|
12
|
+
inbound_messages = OneApi::SmsClient.unserialize_inbound_messages(http_body)
|
13
|
+
# ----------------------------------------------------------------------------------------------------
|
@@ -0,0 +1,50 @@
|
|
1
|
+
lib = File.expand_path('../../lib', __FILE__)
|
2
|
+
if File.exists?(lib)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
end
|
5
|
+
require 'oneapi-ruby'
|
6
|
+
|
7
|
+
username = ARGV[0]
|
8
|
+
password = ARGV[1]
|
9
|
+
local_ip_address = ARGV[2]
|
10
|
+
destination_address = ARGV[3]
|
11
|
+
|
12
|
+
if OneApi::Utils.empty(username)
|
13
|
+
print "Username: "
|
14
|
+
username = gets.strip!
|
15
|
+
end
|
16
|
+
|
17
|
+
if OneApi::Utils.empty(password)
|
18
|
+
print "Password: "
|
19
|
+
password = gets.strip!
|
20
|
+
end
|
21
|
+
|
22
|
+
if OneApi::Utils.empty(local_ip_address)
|
23
|
+
print "Local IP address: "
|
24
|
+
local_ip_address = gets.strip!
|
25
|
+
end
|
26
|
+
|
27
|
+
if OneApi::Utils.empty(destination_address)
|
28
|
+
print "Destination (MSISDN): "
|
29
|
+
destination_address = gets.strip!
|
30
|
+
end
|
31
|
+
|
32
|
+
port = 9090
|
33
|
+
|
34
|
+
data_connection_client = OneApi::DataConnectionProfileClient.new(username, password)
|
35
|
+
|
36
|
+
notify_url = "http://#{local_ip_address}:#{port}"
|
37
|
+
|
38
|
+
# example:retrieve-roaming-status-with-notify-url
|
39
|
+
data_connection_client.retrieve_roaming_status(destination_address, notify_url)
|
40
|
+
# ----------------------------------------------------------------------------------------------------
|
41
|
+
|
42
|
+
dummy_web_server = OneApi::DummyWebServer.new(local_ip_address, port)
|
43
|
+
dummy_web_server.start 30
|
44
|
+
|
45
|
+
for method, url, headers, body in dummy_web_server.requests
|
46
|
+
# example:on-roaming-status
|
47
|
+
delivery_info = OneApi::DataConnectionProfileClient.unserialize_roaming_status(body)
|
48
|
+
# ----------------------------------------------------------------------------------------------------
|
49
|
+
puts delivery_info.inspect
|
50
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
lib = File.expand_path('../../lib', __FILE__)
|
2
|
+
if File.exists?(lib)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
end
|
5
|
+
require 'oneapi-ruby'
|
6
|
+
|
7
|
+
username = ARGV[0]
|
8
|
+
password = ARGV[1]
|
9
|
+
destination_address = ARGV[2]
|
10
|
+
|
11
|
+
if OneApi::Utils.empty(username)
|
12
|
+
print "Username: "
|
13
|
+
username = gets.strip!
|
14
|
+
end
|
15
|
+
|
16
|
+
if OneApi::Utils.empty(password)
|
17
|
+
print "Password: "
|
18
|
+
password = gets.strip!
|
19
|
+
end
|
20
|
+
|
21
|
+
if OneApi::Utils.empty(destination_address)
|
22
|
+
print "Destination (MSISDN): "
|
23
|
+
destination_address = gets.strip!
|
24
|
+
end
|
25
|
+
|
26
|
+
# example:initialize-sms-client
|
27
|
+
sms_client = OneApi::SmsClient.new(username, password)
|
28
|
+
# ----------------------------------------------------------------------------------------------------
|
29
|
+
|
30
|
+
# example:prepare-message-without-notify-url
|
31
|
+
sms = OneApi::SMSRequest.new
|
32
|
+
sms.sender_address = '38598123456'
|
33
|
+
sms.address = destination_address
|
34
|
+
sms.message = 'Test message'
|
35
|
+
sms.callback_data = 'Any string'
|
36
|
+
# ----------------------------------------------------------------------------------------------------
|
37
|
+
|
38
|
+
# example:send-message
|
39
|
+
result = sms_client.send_sms(sms)
|
40
|
+
|
41
|
+
# Store the client correlator to be able to query for the delivery status later:
|
42
|
+
client_correlator = result.client_correlator
|
43
|
+
# ----------------------------------------------------------------------------------------------------
|
44
|
+
|
45
|
+
# example:query-for-delivery-status
|
46
|
+
delivery_status = sms_client.query_delivery_status(client_correlator)
|
47
|
+
# ----------------------------------------------------------------------------------------------------
|
48
|
+
|
49
|
+
sleep(10)
|
50
|
+
|
51
|
+
for delivery_info in delivery_status.delivery_info
|
52
|
+
puts "Delivery status id #{delivery_info.delivery_status}"
|
53
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
lib = File.expand_path('../../lib', __FILE__)
|
2
|
+
if File.exists?(lib)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
end
|
5
|
+
require 'oneapi-ruby'
|
6
|
+
|
7
|
+
username = ARGV[0]
|
8
|
+
password = ARGV[1]
|
9
|
+
local_ip_address = ARGV[2]
|
10
|
+
destination_address = ARGV[3]
|
11
|
+
|
12
|
+
if OneApi::Utils.empty(username)
|
13
|
+
print "Username: "
|
14
|
+
username = gets.strip!
|
15
|
+
end
|
16
|
+
|
17
|
+
if OneApi::Utils.empty(password)
|
18
|
+
print "Password: "
|
19
|
+
password = gets.strip!
|
20
|
+
end
|
21
|
+
|
22
|
+
if OneApi::Utils.empty(local_ip_address)
|
23
|
+
print "Local IP address: "
|
24
|
+
local_ip_address = gets.strip!
|
25
|
+
end
|
26
|
+
|
27
|
+
if OneApi::Utils.empty(destination_address)
|
28
|
+
print "Destination (MSISDN): "
|
29
|
+
destination_address = gets.strip!
|
30
|
+
end
|
31
|
+
|
32
|
+
port = 9090
|
33
|
+
|
34
|
+
sms_client = OneApi::SmsClient.new(username, password)
|
35
|
+
|
36
|
+
# example:prepare-message-with-notify-url
|
37
|
+
sms = OneApi::SMSRequest.new
|
38
|
+
sms.sender_address = 'INFOSMS'
|
39
|
+
sms.address = destination_address
|
40
|
+
sms.message = 'Test message'
|
41
|
+
sms.callback_data = 'Any string'
|
42
|
+
sms.notify_url = "http://#{local_ip_address}:#{port}"
|
43
|
+
# ----------------------------------------------------------------------------------------------------
|
44
|
+
|
45
|
+
puts sms.inspect
|
46
|
+
|
47
|
+
result = sms_client.send_sms(sms)
|
48
|
+
|
49
|
+
dummy_web_server = OneApi::DummyWebServer.new(local_ip_address, port)
|
50
|
+
dummy_web_server.start 30
|
51
|
+
|
52
|
+
for method, url, headers, body in dummy_web_server.requests
|
53
|
+
# example:on-delivery-notification
|
54
|
+
delivery_info = OneApi::SmsClient.unserialize_delivery_status(body)
|
55
|
+
# ----------------------------------------------------------------------------------------------------
|
56
|
+
end
|
data/lib/oneapi-ruby.rb
ADDED
@@ -0,0 +1,309 @@
|
|
1
|
+
#require 'pry'
|
2
|
+
require 'net/http'
|
3
|
+
require 'net/https'
|
4
|
+
require "base64"
|
5
|
+
|
6
|
+
require_relative 'objects'
|
7
|
+
require_relative 'models'
|
8
|
+
|
9
|
+
module OneApi
|
10
|
+
|
11
|
+
class OneApiClient
|
12
|
+
|
13
|
+
# If true -- an exception will be thrown on error, otherwise, you have
|
14
|
+
# to check the is_success and exception methods on resulting objects.
|
15
|
+
attr_accessor :raise_exceptions
|
16
|
+
|
17
|
+
def initialize(username, password, base_url=nil)
|
18
|
+
@username = username
|
19
|
+
@password = password
|
20
|
+
if base_url
|
21
|
+
@base_url = base_url
|
22
|
+
else
|
23
|
+
@base_url = 'https://oneapi.infobip.com'
|
24
|
+
end
|
25
|
+
|
26
|
+
if @base_url[-1, 1] != '/'
|
27
|
+
@base_url += '/'
|
28
|
+
end
|
29
|
+
|
30
|
+
@oneapi_authentication = nil
|
31
|
+
@raise_exceptions = true
|
32
|
+
end
|
33
|
+
|
34
|
+
|
35
|
+
def login()
|
36
|
+
params = {
|
37
|
+
'username' => @username,
|
38
|
+
'password' => @password,
|
39
|
+
}
|
40
|
+
|
41
|
+
is_success, result = execute_POST('/1/customerProfile/login', params)
|
42
|
+
|
43
|
+
return fill_oneapi_authentication(result, is_success)
|
44
|
+
end
|
45
|
+
|
46
|
+
def get_or_create_client_correlator(client_correlator=nil)
|
47
|
+
if client_correlator
|
48
|
+
return client_correlator
|
49
|
+
end
|
50
|
+
|
51
|
+
return Utils.get_random_alphanumeric_string()
|
52
|
+
end
|
53
|
+
|
54
|
+
def prepare_headers(request)
|
55
|
+
request["User-Agent"] = "OneApi-ruby-#{OneApi::VERSION}"
|
56
|
+
if @oneapi_authentication and @oneapi_authentication.ibsso_token
|
57
|
+
request['Authorization'] = "IBSSO #{@oneapi_authentication.ibsso_token}"
|
58
|
+
else
|
59
|
+
auth_string = Base64.encode64("#{@username}:#{@password}").strip
|
60
|
+
request['Authorization'] = "Basic #{auth_string}"
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def is_success(response)
|
65
|
+
http_code = response.code.to_i
|
66
|
+
is_success = 200 <= http_code && http_code < 300
|
67
|
+
|
68
|
+
is_success
|
69
|
+
end
|
70
|
+
|
71
|
+
def urlencode(params)
|
72
|
+
if Utils.empty(params)
|
73
|
+
return ''
|
74
|
+
end
|
75
|
+
if params.instance_of? String
|
76
|
+
return URI.encode(params)
|
77
|
+
end
|
78
|
+
result = ''
|
79
|
+
params.each_key do |key|
|
80
|
+
if ! Utils.empty(result)
|
81
|
+
result += '&'
|
82
|
+
end
|
83
|
+
result += URI.encode(key.to_s) + '=' + URI.encode(params[key].to_s)
|
84
|
+
end
|
85
|
+
|
86
|
+
return result
|
87
|
+
end
|
88
|
+
|
89
|
+
def execute_GET(url, params=nil)
|
90
|
+
execute_request('GET', url, params)
|
91
|
+
end
|
92
|
+
|
93
|
+
def execute_POST(url, params=nil)
|
94
|
+
execute_request('POST', url, params)
|
95
|
+
end
|
96
|
+
|
97
|
+
def execute_request(http_method, url, params)
|
98
|
+
rest_url = get_rest_url(url)
|
99
|
+
uri = URI(rest_url)
|
100
|
+
|
101
|
+
if Utils.empty(params)
|
102
|
+
params = {}
|
103
|
+
end
|
104
|
+
|
105
|
+
if http_method == 'GET'
|
106
|
+
request = Net::HTTP::Get.new("#{uri.request_uri}?#{urlencode(params)}")
|
107
|
+
elsif http_method == 'POST'
|
108
|
+
request = Net::HTTP::Post.new(uri.request_uri)
|
109
|
+
request.set_form_data(params)
|
110
|
+
end
|
111
|
+
|
112
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
113
|
+
|
114
|
+
use_ssl = rest_url.start_with? "https"
|
115
|
+
if use_ssl
|
116
|
+
http.use_ssl = true
|
117
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
118
|
+
end
|
119
|
+
|
120
|
+
prepare_headers(request)
|
121
|
+
response = http.request(request)
|
122
|
+
|
123
|
+
puts "response = #{response.body}"
|
124
|
+
|
125
|
+
return is_success(response), response.body
|
126
|
+
end
|
127
|
+
|
128
|
+
def get_rest_url(rest_path)
|
129
|
+
if not rest_path
|
130
|
+
return @base_url
|
131
|
+
end
|
132
|
+
|
133
|
+
if rest_path[0, 1] == '/'
|
134
|
+
return @base_url + rest_path[1, rest_path.length]
|
135
|
+
end
|
136
|
+
|
137
|
+
@base_url + rest_path
|
138
|
+
end
|
139
|
+
|
140
|
+
def fill_oneapi_authentication(json, is_success)
|
141
|
+
@oneapi_authentication = convert_from_json(OneApiAuthentication, json, !is_success)
|
142
|
+
|
143
|
+
@oneapi_authentication.username = @username
|
144
|
+
@oneapi_authentication.password = @password
|
145
|
+
|
146
|
+
@oneapi_authentication.authenticated = @oneapi_authentication.ibsso_token ? @oneapi_authentication.ibsso_token.length > 0 : false
|
147
|
+
|
148
|
+
@oneapi_authentication
|
149
|
+
end
|
150
|
+
|
151
|
+
def convert_from_json(classs, json, is_error)
|
152
|
+
result = Conversions.from_json(classs, json, is_error)
|
153
|
+
|
154
|
+
if @raise_exceptions and !result.is_success
|
155
|
+
raise "#{result.exception.message_id}: #{result.exception.text} [#{result.exception.variables}]"
|
156
|
+
end
|
157
|
+
|
158
|
+
result
|
159
|
+
end
|
160
|
+
|
161
|
+
end
|
162
|
+
|
163
|
+
class SmsClient < OneApiClient
|
164
|
+
|
165
|
+
def initialize(username, password, base_url=nil)
|
166
|
+
super(username, password, base_url)
|
167
|
+
end
|
168
|
+
|
169
|
+
def send_sms(sms)
|
170
|
+
client_correlator = sms.client_correlator
|
171
|
+
if not client_correlator
|
172
|
+
client_correlator = Utils.get_random_alphanumeric_string()
|
173
|
+
end
|
174
|
+
|
175
|
+
params = {
|
176
|
+
'senderAddress' => sms.sender_address,
|
177
|
+
'address' => sms.address,
|
178
|
+
'message' => sms.message,
|
179
|
+
'clientCorrelator' => client_correlator,
|
180
|
+
'senderName' => "tel:#{sms.sender_address}"
|
181
|
+
}
|
182
|
+
|
183
|
+
if sms.notify_url
|
184
|
+
params['notifyURL'] = sms.notify_url
|
185
|
+
end
|
186
|
+
if sms.callback_data
|
187
|
+
params['callbackData'] = sms.callback_data
|
188
|
+
end
|
189
|
+
|
190
|
+
is_success, result = execute_POST(
|
191
|
+
"/1/smsmessaging/outbound/#{sms.sender_address}/requests",
|
192
|
+
params
|
193
|
+
)
|
194
|
+
|
195
|
+
convert_from_json(ResourceReference, result, !is_success)
|
196
|
+
end
|
197
|
+
|
198
|
+
def query_delivery_status(client_correlator_or_resource_reference)
|
199
|
+
if defined? client_correlator_or_resource_reference.client_correlator
|
200
|
+
client_correlator = client_correlator_or_resource_reference.client_correlator
|
201
|
+
else
|
202
|
+
client_correlator = client_correlator_or_resource_reference
|
203
|
+
end
|
204
|
+
|
205
|
+
client_correlator = get_or_create_client_correlator(client_correlator)
|
206
|
+
|
207
|
+
params = {
|
208
|
+
'clientCorrelator' => client_correlator,
|
209
|
+
}
|
210
|
+
|
211
|
+
is_success, result = execute_GET(
|
212
|
+
"/1/smsmessaging/outbound/TODO/requests/#{client_correlator}/deliveryInfos",
|
213
|
+
params
|
214
|
+
)
|
215
|
+
|
216
|
+
return convert_from_json(DeliveryInfoList, result, !is_success)
|
217
|
+
end
|
218
|
+
|
219
|
+
def retrieve_inbound_messages(max_number=nil)
|
220
|
+
if Utils.empty(max_number)
|
221
|
+
max_number = 100
|
222
|
+
end
|
223
|
+
|
224
|
+
params = {
|
225
|
+
'maxBatchSize' => max_number
|
226
|
+
}
|
227
|
+
|
228
|
+
is_success, result = execute_GET(
|
229
|
+
'/1/smsmessaging/inbound/registrations/INBOUND/messages',
|
230
|
+
params
|
231
|
+
)
|
232
|
+
|
233
|
+
return convert_from_json(InboundSmsMessages, result, ! is_success)
|
234
|
+
end
|
235
|
+
|
236
|
+
# To be used when http push with a delivery notification comes.
|
237
|
+
def self.unserialize_delivery_status(http_body)
|
238
|
+
json = JSONUtils.get_json(http_body)
|
239
|
+
return Conversions::from_json(DeliveryInfoNotification, json, false)
|
240
|
+
end
|
241
|
+
|
242
|
+
|
243
|
+
@staticmethod
|
244
|
+
def self.unserialize_inbound_messages(http_body)
|
245
|
+
json = JSONUtils.get_json(http_body)
|
246
|
+
return Conversions::from_json(InboundSmsMessages, json, false)
|
247
|
+
end
|
248
|
+
end
|
249
|
+
|
250
|
+
class DataConnectionProfileClient < OneApiClient
|
251
|
+
|
252
|
+
def initialize(username, password, base_url=nil)
|
253
|
+
super(username, password, base_url)
|
254
|
+
end
|
255
|
+
|
256
|
+
def retrieve_roaming_status(destination_address, notify_url=nil)
|
257
|
+
# Retrieve asynchronously the customer’s roaming status for a single network-connected mobile device (HLR)
|
258
|
+
|
259
|
+
params = {
|
260
|
+
'address' => destination_address
|
261
|
+
}
|
262
|
+
if notify_url
|
263
|
+
params['notifyURL'] = notify_url
|
264
|
+
end
|
265
|
+
|
266
|
+
is_success, result = execute_GET('/1/terminalstatus/queries/roamingStatus', params)
|
267
|
+
|
268
|
+
puts "params = #{params.inspect}"
|
269
|
+
puts "is_success = #{is_success}"
|
270
|
+
puts "result = #{result}"
|
271
|
+
|
272
|
+
if Utils.empty(notify_url)
|
273
|
+
json = JSONUtils.get_json(result)
|
274
|
+
return convert_from_json(TerminalRoamingStatus, json['roaming'], ! is_success);
|
275
|
+
else
|
276
|
+
return convert_from_json(GenericObject, {}, ! is_success);
|
277
|
+
end
|
278
|
+
end
|
279
|
+
|
280
|
+
# To be used when http push with a delivery notification comes.
|
281
|
+
def self.unserialize_roaming_status(http_body)
|
282
|
+
json = JSONUtils.get_json(http_body)
|
283
|
+
return Conversions::from_json(TerminalRoamingStatusNotification, json, false)
|
284
|
+
end
|
285
|
+
|
286
|
+
end
|
287
|
+
|
288
|
+
class CustomerProfileClient < OneApiClient
|
289
|
+
|
290
|
+
def initialize(username, password, base_url=nil)
|
291
|
+
super(username, password, base_url)
|
292
|
+
end
|
293
|
+
|
294
|
+
def get_account_balance()
|
295
|
+
is_success, result = execute_GET('/1/customerProfile/balance')
|
296
|
+
|
297
|
+
return convert_from_json(AccountBalance, result, ! is_success)
|
298
|
+
end
|
299
|
+
|
300
|
+
def get_customer_profile()
|
301
|
+
is_success, result = execute_GET('/1/customerProfile')
|
302
|
+
|
303
|
+
return convert_from_json(CustomerProfile, result, ! is_success)
|
304
|
+
end
|
305
|
+
|
306
|
+
end
|
307
|
+
|
308
|
+
end
|
309
|
+
|