africastalking-ruby 2.1.8 → 2.1.9

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bc0b95d13726d3cd8857b22f6747a4daba8891932a55432b50fb01e2aad8a6dd
4
- data.tar.gz: 4256f674404dd05b4879019e7d4439b819cb87c1a040a50b387a871269d16b79
3
+ metadata.gz: d1caf1f74d9b3372cbc660fa10382e4fdc5b9c0bf6a56b5bbc3db624efa68fe8
4
+ data.tar.gz: 7225710bdc096661538b16c80ac95c9131d85602f3e7defdc078a9c2104e796d
5
5
  SHA512:
6
- metadata.gz: 33363d9665e5d79586c31ec649f40913babbc549541a775f2c68bf55ce5d7bcbc2df2e4857ad39489eb2adc6740826cc197d785f3d909598d04c9264b6e2d0a8
7
- data.tar.gz: da4e794f0b904002fefecc3983d8334c314058c869c7bb7888961d702e14e4bf011780acd5f8a1fc306f278f66d6a24c06aa27f9519771cd5d97ebd70c0409b3
6
+ metadata.gz: e5b1b59ee256c9d6f10b37ebcb0e1fe903766fc51e879c3c18f51ce7948e30731c8de594206d3de9ef82ebfafec82c60c5c08060dc899a72be16f564cbdcac5e
7
+ data.tar.gz: d6bceffcbede1d93df1872eb84749db148659fe6d6a3f2f91dacd48bc537f633d7fafb30b01e1d9353c8086a748dbb86aba85bebbc4d81d8de5eb334b6b8f97f
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- africastalking-ruby (2.1.8)
4
+ africastalking-ruby (2.1.9)
5
5
  httparty (= 0.16.1)
6
6
 
7
7
  GEM
data/README.md CHANGED
@@ -180,6 +180,41 @@ account = @AT.account
180
180
  account.fetchUserData
181
181
  ```
182
182
 
183
+ ### Mobile Data
184
+
185
+ Send mobile data to phone numbers
186
+
187
+ ```ruby
188
+ mobiledata = @AT.mobiledata
189
+
190
+ mobiledata.send options
191
+ ```
192
+ - `options`
193
+ - `productName`: This is the application's product name. `REQUIRED`
194
+ - `recipients`: An array of objects containing the following keys:
195
+
196
+ - `phoneNumber`: Recipient of the mobile data. `REQUIRED`
197
+ - `quantity`: a numeric value for the amount of mobile data. It is based on the available mobile data package[(see "Bundle Package" column of mobile data pricing)](https://africastalking.com/pricing). `REQUIRED`
198
+ - `unit`: The units for the specified data quantity, the format is: ``MB`` or ``GB``. It is based on the available mobile data package[(see "Bundle Package" column of mobile data pricing)](https://africastalking.com/pricing). `REQUIRED`
199
+ - `validity`: The period of the data bundle’s validity this can be `Day`, `Week`, `BiWeek`, `Month`, or `Quarterly`. It is based on the available mobile data package [(see "Validity" column of mobile data pricing)](https://africastalking.com/pricing). `REQUIRED`
200
+ - `metadata`: A JSON object of any metadata that you would like us to associate with the request. `OPTIONAL`
201
+
202
+ #### Find Transaction
203
+ ```ruby
204
+ mobiledata.findTransaction options
205
+ ```
206
+ - Find a mobile data transaction
207
+ - `options`
208
+ - `transactionId`: ID of trancation to find `REQUIRED`
209
+
210
+ #### Fetch Wallet Balance
211
+ ```ruby
212
+ mobiledata.fetchWalletBalance
213
+ ```
214
+ - Fetch a mobile data product balance
215
+
216
+ For more information, please read the [https://developers.africastalking.com/docs/data/overview](https://developers.africastalking.com/docs/data/overview)
217
+
183
218
  ### Payments
184
219
  ```ruby
185
220
  payments = @AT.payments
@@ -329,19 +364,7 @@ payments.mobileB2B options
329
364
  - `requester`: PhoneNumber through which KPLC will send tokens when using B2B to buy electricity tokens.
330
365
  - `metadata`: Some optional data to associate with transaction.`REQUIRED`
331
366
 
332
- #### Mobile Data
333
- ```ruby
334
- payments.mobileData options
335
- ```
336
- - `options`
337
- - `productName`: Your Payment Product. `REQUIRED`
338
- - `recipients`: A list of recipients. Each recipient has:
339
367
 
340
- - `phoneNumber`: Customer phone number (in international format). `REQUIRED`
341
- - `quantity`: Mobile data amount. `REQUIRED`
342
- - `unit`: Mobile data unit. Can either be `MB` or `GB`. `REQUIRED`
343
- - `validity`: How long the mobile data is valid for. Must be one of `Day`, `Week` and `Month`. `REQUIRED`
344
- - `metadata`: Additional data to associate with the transaction. `REQUIRED`
345
368
 
346
369
  #### Wallet Transfer
347
370
  ```ruby
@@ -394,18 +417,7 @@ payments.fetchWalletTransactions options
394
417
  - `endDate`: End Date to consider when fetching
395
418
  - `categories`: Comma delimited list of categories to consider when fetching
396
419
 
397
- #### Find Transaction
398
- ```ruby
399
- payments.findTransaction options
400
- ```
401
- - `options`
402
- - `transactionId`: ID of trancation to find `REQUIRED`
403
420
 
404
- #### Fetch Wallet Balance
405
- ```ruby
406
- payments.fetchWalletBalance
407
- ```
408
- - Fetch your payment wallet balance
409
421
 
410
422
 
411
423
  ## Development
@@ -0,0 +1,159 @@
1
+ class Mobiledata
2
+ include AfricasTalking
3
+ HTTP_CREATED = 201
4
+ HTTP_OK = 200
5
+
6
+ def initialize username, apikey
7
+ @username = username
8
+ @apikey = apikey
9
+ end
10
+
11
+ def send options
12
+ url = getMobileDataUrl()
13
+
14
+ validateParamsPresence? options, %w(productName)
15
+ recipients = options['recipients'].map do |item|
16
+ required_params = %w(phoneNumber quantity unit validity)
17
+ if item['metadata'].is_a?(Hash)
18
+ required_params << 'metadata'
19
+ end
20
+
21
+ validateParamsPresence?(item, required_params)
22
+ item
23
+ end
24
+
25
+ post_body = {
26
+ 'username' => @username,
27
+ 'productName' => options['productName'],
28
+ 'recipients' => recipients,
29
+ }
30
+
31
+ idempotency_key = options['idempotencyKey'].to_s if options['idempotencyKey']
32
+
33
+ post_body['idempotencyKey'] = idempotency_key if idempotency_key
34
+
35
+ response = sendJSONRequest(url, post_body, idempotency_key)
36
+
37
+ if (@response_code == HTTP_CREATED)
38
+ responses = JSON.parse(response, :quirky_mode =>true)
39
+
40
+ if (responses['entries'].length > 0)
41
+
42
+ results = responses['entries'].collect{ |data|
43
+
44
+ MobileDataResponse.new data['phoneNumber'], data['provider'], data['status'], data['transactionId'], data['value']
45
+ }
46
+
47
+ return results
48
+ else
49
+ raise AfricasTalkingException, responses['errorMessage']
50
+ end
51
+ raise AfricasTalkingException, response
52
+ end
53
+ end
54
+
55
+ def findTransaction options
56
+ validateParamsPresence? options, ['transactionId']
57
+ parameters = {
58
+ 'username' => @username,
59
+ 'transactionId' => options['transactionId']
60
+ }
61
+ url = getFindTransactionUrl()
62
+ response = sendJSONRequest(url, parameters, true, false)
63
+ if (@response_code == HTTP_OK)
64
+ resultObj = JSON.parse(response, :quirky_mode =>true)
65
+ transactionData = nil
66
+ if resultObj['status'] === 'Success'
67
+ transactionData = TransactionData.new resultObj['data']['requestMetadata'], resultObj['data']['sourceType'],resultObj['data']['source'], resultObj['data']['provider'], resultObj['data']['destinationType'],resultObj['data']['description'],
68
+ resultObj['data']['providerChannel'], resultObj['data']['providerRefId'], resultObj['data']['providerMetadata'],resultObj['data']['status'], resultObj['data']['productName'], resultObj['data']['category'],
69
+ resultObj['data']['transactionDate'], resultObj['data']['destination'], resultObj['data']['value'], resultObj['data']['transactionId'], resultObj['data']['creationTime']
70
+ end
71
+ return FindTransactionResponse.new resultObj['status'], transactionData
72
+ end
73
+ raise AfricasTalkingException, response
74
+ end
75
+
76
+ def fetchWalletBalance
77
+ parameters = { 'username' => @username }
78
+ url = getFetchWalletBalanceUrl()
79
+ response = sendJSONRequest(url, parameters, true, false)
80
+ if (@response_code == HTTP_OK)
81
+ resultObj = JSON.parse(response, :quirky_mode =>true)
82
+
83
+ return FetchWalletBalanceResponse.new resultObj['status'], resultObj['balance']
84
+ end
85
+ raise AfricasTalkingException, response
86
+ end
87
+
88
+ private
89
+ def getMobileDataUrl()
90
+ return getApiHost() + "/mobile/data/request"
91
+ end
92
+
93
+ def getFindTransactionUrl()
94
+ return getApiHost() + "/query/transaction/find"
95
+ end
96
+
97
+ def getFetchWalletBalanceUrl()
98
+ return getApiHost() + "/query/wallet/balance"
99
+ end
100
+
101
+ def getApiHost()
102
+ if(@username == "sandbox")
103
+ return "https://bundles.sandbox.africastalking.com"
104
+ else
105
+ return "https://bundles.africastalking.com"
106
+ end
107
+ end
108
+ end
109
+
110
+ class MobileDataResponse
111
+ attr_reader :phoneNumber, :provider, :status, :transactionId, :value
112
+
113
+ def initialize phoneNumber_, provider_, status_, transactionId_, value_
114
+ @phoneNumber = phoneNumber_
115
+ @provider = provider_
116
+ @status = status_
117
+ @transactionId = transactionId_
118
+ @value = value_
119
+ end
120
+ end
121
+
122
+ class FetchWalletBalanceResponse
123
+ attr_reader :status, :balance
124
+ def initialize status_, balance_
125
+ @status = status_
126
+ @balance = balance_
127
+ end
128
+ end
129
+
130
+ class FindTransactionResponse
131
+ attr_reader :status, :transactionData
132
+ def initialize status_, transactionData_
133
+ @status = status_
134
+ @transactionData = transactionData_
135
+ end
136
+ end
137
+
138
+ class TransactionData
139
+ attr_reader :requestMetadata, :sourceType, :source, :provider, :destinationType, :description, :providerChannel, :providerRefId, :providerMetadata, :status, :productName, :category, :transactionDate, :destination, :value, :transactionId, :creationTime
140
+ def initialize requestMetadata_, sourceType_, source_, provider_, destinationType_, description_, providerChannel_, providerRefId_, providerMetadata_, status_, productName_, category_, transactionDate_, destination_, value_, transactionId_, creationTime_
141
+ @requestMetadata =requestMetadata_
142
+ @sourceType = sourceType_
143
+ @source = source_
144
+ @provider = provider_
145
+ @destinationType = destinationType_
146
+ @description = description_
147
+ @providerChannel = providerChannel_
148
+ @providerRefId = providerRefId_
149
+ @providerMetadata = providerMetadata_
150
+ @status = status_
151
+ @productName = productName_
152
+ @category = category_
153
+ @transactionDate = transactionDate_
154
+ @destination = destination_
155
+ @value = value_
156
+ @transactionId = transactionId_
157
+ @creationTime = creationTime_
158
+ end
159
+ end
@@ -1,3 +1,3 @@
1
1
  module AfricasTalking
2
- VERSION = "2.1.8"
2
+ VERSION = "2.1.9"
3
3
  end
@@ -3,6 +3,7 @@ require 'httparty'
3
3
  require "AfricasTalking/Sms"
4
4
  require "AfricasTalking/Airtime"
5
5
  require "AfricasTalking/Payments"
6
+ require "AfricasTalking/Mobiledata"
6
7
  require "AfricasTalking/Voice"
7
8
  require "AfricasTalking/Token"
8
9
  require "AfricasTalking/Application"
@@ -17,29 +18,33 @@ module AfricasTalking
17
18
  attr_accessor :username, :apikey
18
19
  def initialize username, apikey
19
20
  @username = username
20
- @apikey = apikey
21
+ @apikey = apikey
21
22
  end
22
-
23
+
23
24
  def sms
24
- return Sms.new @username, @apikey
25
+ return Sms.new @username, @apikey
25
26
  end
26
-
27
+
27
28
  def payments
28
29
  return Payments.new @username, @apikey
29
30
  end
30
-
31
+
32
+ def mobiledata
33
+ return Mobiledata.new @username, @apikey
34
+ end
35
+
31
36
  def airtime
32
37
  return Airtime.new @username, @apikey
33
38
  end
34
-
39
+
35
40
  def voice
36
41
  return Voice.new @username, @apikey
37
42
  end
38
-
43
+
39
44
  def token
40
45
  return Token.new @username, @apikey
41
46
  end
42
-
47
+
43
48
  def application
44
49
  return Application.new @username, @apikey
45
50
  end
@@ -54,8 +59,8 @@ module AfricasTalking
54
59
  end
55
60
 
56
61
 
57
- private
58
-
62
+ private
63
+
59
64
  def sendNormalRequest url_, data_ = nil
60
65
  uri = URI.parse(url_)
61
66
  http = Net::HTTP.new(uri.host, uri.port)
@@ -78,7 +83,7 @@ module AfricasTalking
78
83
  return response.body
79
84
  end
80
85
 
81
- def sendJSONRequest url_, data_, get_request = false
86
+ def sendJSONRequest url_, data_, get_request = false, idempotency_key
82
87
  uri = URI.parse(url_)
83
88
  http = Net::HTTP.new(uri.host, uri.port)
84
89
  http.use_ssl = true
@@ -88,11 +93,18 @@ module AfricasTalking
88
93
  else
89
94
  req = Net::HTTP::Post.new(uri.request_uri, 'Content-Type'=>"application/json")
90
95
  req.body = data_.to_json
96
+
91
97
  end
92
-
98
+
93
99
  req["apikey"] = @apikey
94
100
  req["Accept"] = "application/json"
101
+
102
+ if idempotency_key
103
+ req['Idempotency-Key'] = idempotency_key
104
+ end
105
+
95
106
  response = http.request(req)
107
+
96
108
  if (DEBUG)
97
109
  puts "Full response #{response.body}"
98
110
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: africastalking-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.8
4
+ version: 2.1.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michael Mwirigi
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-03-12 00:00:00.000000000 Z
11
+ date: 2023-11-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -135,6 +135,7 @@ files:
135
135
  - lib/AfricasTalking.rb
136
136
  - lib/AfricasTalking/Airtime.rb
137
137
  - lib/AfricasTalking/Application.rb
138
+ - lib/AfricasTalking/Mobiledata.rb
138
139
  - lib/AfricasTalking/Payments.rb
139
140
  - lib/AfricasTalking/Sms.rb
140
141
  - lib/AfricasTalking/Token.rb