messagebird-rest 1.4.0 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +56 -8
  3. data/lib/messagebird.rb +11 -6
  4. data/lib/messagebird/balance.rb +2 -0
  5. data/lib/messagebird/base.rb +12 -7
  6. data/lib/messagebird/call_flow.rb +22 -0
  7. data/lib/messagebird/call_flow/step.rb +9 -0
  8. data/lib/messagebird/callflow.rb +60 -0
  9. data/lib/messagebird/client.rb +342 -52
  10. data/lib/messagebird/contact.rb +11 -9
  11. data/lib/messagebird/contact_reference.rb +3 -1
  12. data/lib/messagebird/conversation.rb +44 -0
  13. data/lib/messagebird/conversation_channel.rb +18 -0
  14. data/lib/messagebird/conversation_client.rb +22 -0
  15. data/lib/messagebird/conversation_message.rb +10 -0
  16. data/lib/messagebird/conversation_webhook.rb +9 -0
  17. data/lib/messagebird/custom_details.rb +2 -0
  18. data/lib/messagebird/error.rb +2 -0
  19. data/lib/messagebird/group.rb +9 -7
  20. data/lib/messagebird/group_reference.rb +3 -1
  21. data/lib/messagebird/hlr.rb +8 -6
  22. data/lib/messagebird/http_client.rb +46 -29
  23. data/lib/messagebird/list.rb +5 -4
  24. data/lib/messagebird/lookup.rb +7 -5
  25. data/lib/messagebird/message.rb +9 -7
  26. data/lib/messagebird/message_reference.rb +3 -1
  27. data/lib/messagebird/number.rb +18 -0
  28. data/lib/messagebird/number_client.rb +22 -0
  29. data/lib/messagebird/recipient.rb +6 -3
  30. data/lib/messagebird/signed_request.rb +50 -0
  31. data/lib/messagebird/verify.rb +14 -7
  32. data/lib/messagebird/verify_email_message.rb +9 -0
  33. data/lib/messagebird/version.rb +7 -0
  34. data/lib/messagebird/voice/base.rb +16 -0
  35. data/lib/messagebird/voice/call.rb +22 -0
  36. data/lib/messagebird/voice/call_leg.rb +11 -0
  37. data/lib/messagebird/voice/call_leg_recording.rb +20 -0
  38. data/lib/messagebird/voice/client.rb +22 -0
  39. data/lib/messagebird/voice/list.rb +24 -0
  40. data/lib/messagebird/voice/transcription.rb +15 -0
  41. data/lib/messagebird/voice/webhook.rb +11 -0
  42. data/lib/messagebird/voice_client.rb +25 -0
  43. data/lib/messagebird/voicemessage.rb +8 -7
  44. metadata +59 -10
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: ed916adf077ac2e3a03631e2d97fad4a6c9e9c97
4
- data.tar.gz: 01aab619642825c19ef2b939a284c138e28542b2
2
+ SHA256:
3
+ metadata.gz: 9dc78fcfe4e496c197244a6e62ad347bc439c52334d69a453f25977f7981c23b
4
+ data.tar.gz: 6cef4d63e95ddd4455dd4a003b60bdfc3dfb1b10cfc1049cee9aecc7d8d5fb41
5
5
  SHA512:
6
- metadata.gz: bfc589631d306c6cdfa0464ed2da03f88c4a7c88846ed0038e48dd20ab8e5e4ddae03a2bdd34c7371e4ce21f3b72b4c0798d43dfcd43f3d359e8e22ec5c85ac8
7
- data.tar.gz: 799b7b82c6f6f8839986bdedba3abd47984f6a809b388f6713744b2e2c102a6503ff9cdd02e3baca98832117eaf116fbffa32fddaeea57de02d75c26a2b8a471
6
+ metadata.gz: f235d92c2c49b14c7529c3aa2ad5e8fb6e03adf66a74f4d55229b1b262c66d8beca1a9137ff1d24da439a8d9051915765c7371e17fc1eae63bc0e56e8b96f715
7
+ data.tar.gz: 4b264d192ab011f784aedd9f336e750a1d20b9413d6cb9fd2e67d37cef6b36f7ceed25b80d6dbb74e90b4ffb452f90939b3343a732d2043138071a2b15f6260e
data/README.md CHANGED
@@ -58,7 +58,7 @@ pp client.message_create('FromMe', '31612345678', 'Hello World', :reference => '
58
58
 
59
59
  #<MessageBird::Message:0x007f8d5b883520
60
60
  @body="Hello World",
61
- @createdDatetime=2014-07-07 12:20:30 +0200,
61
+ @created_datetime=2014-07-07 12:20:30 +0200,
62
62
  @datacoding="plain",
63
63
  @direction="mt",
64
64
  @gateway=239,
@@ -68,7 +68,7 @@ pp client.message_create('FromMe', '31612345678', 'Hello World', :reference => '
68
68
  @mclass=1,
69
69
  @originator="FromMe",
70
70
  @recipient=
71
- {"totalCount"=>1,
71
+ {"total_count"=>1,
72
72
  "totalSentCount"=>1,
73
73
  "totalDeliveredCount"=>0,
74
74
  "totalDeliveryFailedCount"=>0,
@@ -78,9 +78,9 @@ pp client.message_create('FromMe', '31612345678', 'Hello World', :reference => '
78
78
  @status="sent",
79
79
  @statusDatetime=2014-07-07 12:20:30 +0200>]},
80
80
  @reference="MyReference",
81
- @scheduledDatetime=nil,
81
+ @scheduled_datetime=nil,
82
82
  @type="sms",
83
- @typeDetails={},
83
+ @type_details={},
84
84
  @validity=nil>
85
85
  ```
86
86
 
@@ -97,7 +97,7 @@ To perform HLR lookups we have created the **hlr_create** method, which takes a
97
97
  pp client.hlr_create('31612345678', 'MyReference')
98
98
 
99
99
  #<MessageBird::HLR:0x007f8d5b8dafc8
100
- @createdDatetime=2014-07-07 12:20:05 +0200,
100
+ @created_datetime=2014-07-07 12:20:05 +0200,
101
101
  @href="https://rest.messagebird.com/hlr/4933bed0453ba7455031712h16830892",
102
102
  @id="4933bed0453ba7455031712h16830892",
103
103
  @msisdn=31612345678,
@@ -126,7 +126,7 @@ client.verify_create(31612345678, {:reference => "YourReference"})
126
126
  @reference="YourReference",
127
127
  @status="sent",
128
128
  @href={"message"=>"https://rest.messagebird.com/messages/67d42f004555213679416f0b13254392"},
129
- @createdDatetime=2015-05-12 16:51:19 +0200,
129
+ @created_datetime=2015-05-12 16:51:19 +0200,
130
130
  @validUntilDatetime=2015-05-12 16:51:49 +0200>
131
131
  ```
132
132
 
@@ -147,14 +147,14 @@ pp client.voice_message_create('31612345678', 'Hello World', :reference => 'MyRe
147
147
 
148
148
  #<MessageBird::VoiceMessage:0x000001030101b8
149
149
  @body="Hello World",
150
- @createdDatetime=2014-07-09 12:17:50 +0200,
150
+ @created_datetime=2014-07-09 12:17:50 +0200,
151
151
  @href=
152
152
  "https://rest.messagebird.com/voicemessages/a08e51a0353bd16cea7f298a37405850",
153
153
  @id="a08e51a0353bd16cea7f298a37405850",
154
154
  @ifMachine="continue",
155
155
  @language="en-gb",
156
156
  @recipients=
157
- {"totalCount"=>1,
157
+ {"total_count"=>1,
158
158
  "totalSentCount"=>1,
159
159
  "totalDeliveredCount"=>0,
160
160
  "totalDeliveryFailedCount"=>0,
@@ -175,6 +175,54 @@ Similar to regular messaging and HLR lookups, there is a method available to fet
175
175
  client.voice_message('a08e51a0353bd16cea7f298a37405850')
176
176
  ```
177
177
 
178
+ ##### Numbers
179
+ There is also a Numbers API that allow you to search for and purchase number subscriptions to use as originator in other services.
180
+
181
+ ```ruby
182
+ pp client.number_search("NL", {:limit=>5})
183
+
184
+ #<List:0x00007fa405130618
185
+ @count=5,
186
+ @items=
187
+ [#<MessageBird::Number:0x00007fa405130528
188
+ @country="NL",
189
+ @features=["voice"],
190
+ @locality="Rotterdam",
191
+ @number="31102005108",
192
+ @region="",
193
+ @type="unknown">,
194
+ #<MessageBird::Number:0x00007fa4051303c0
195
+ @country="NL",
196
+ @features=["voice"],
197
+ @locality="Rotterdam",
198
+ @number="31102005143",
199
+ @region="",
200
+ @type="unknown">,
201
+ #<MessageBird::Number:0x00007fa405130208
202
+ @country="NL",
203
+ @features=["voice"],
204
+ @locality="Rotterdam",
205
+ @number="31102005145",
206
+ @region="",
207
+ @type="unknown">,
208
+ #<MessageBird::Number:0x00007fa4051300c8
209
+ @country="NL",
210
+ @features=["voice"],
211
+ @locality="Rotterdam",
212
+ @number="31102005147",
213
+ @region="",
214
+ @type="unknown">,
215
+ #<MessageBird::Number:0x00007fa405131c48
216
+ @country="NL",
217
+ @features=["voice"],
218
+ @locality="Rotterdam",
219
+ @number="31102005148",
220
+ @region="",
221
+ @type="unknown">],
222
+ @limit=5,
223
+ @type=MessageBird::Number>
224
+ ````
225
+
178
226
  Documentation
179
227
  -------------
180
228
  Complete documentation, instructions, and examples are available at:
data/lib/messagebird.rb CHANGED
@@ -1,11 +1,9 @@
1
- libdir = File.dirname(__FILE__)
2
- $:.unshift(libdir) unless $:.include?(libdir)
1
+ # frozen_string_literal: true
3
2
 
4
- module MessageBird
5
- CLIENT_VERSION = '1.4.0'
6
- ENDPOINT = 'https://rest.messagebird.com'
7
- end
3
+ libdir = File.dirname(__FILE__)
4
+ $LOAD_PATH.unshift(libdir) unless $LOAD_PATH.include?(libdir)
8
5
 
6
+ require 'messagebird/version'
9
7
  require 'messagebird/balance'
10
8
  require 'messagebird/client'
11
9
  require 'messagebird/contact'
@@ -14,6 +12,13 @@ require 'messagebird/group_reference'
14
12
  require 'messagebird/hlr'
15
13
  require 'messagebird/http_client'
16
14
  require 'messagebird/message_reference'
15
+ require 'messagebird/signed_request'
17
16
  require 'messagebird/verify'
18
17
  require 'messagebird/message'
19
18
  require 'messagebird/voicemessage'
19
+ require 'messagebird/callflow'
20
+ require 'messagebird/voice/call'
21
+ require 'messagebird/voice/call_leg'
22
+ require 'messagebird/voice/call_leg_recording'
23
+ require 'messagebird/voice/transcription'
24
+ require 'messagebird/voice/webhook'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'messagebird/base'
2
4
 
3
5
  module MessageBird
@@ -1,18 +1,23 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'json'
2
4
  require 'time'
3
5
 
4
6
  module MessageBird
5
7
  class Base
6
- def initialize(json)
7
- json.each do |k,v|
8
- begin
9
- send("#{k}=", v)
10
- rescue NoMethodError
11
- # Silently ignore parameters that are not supported.
12
- end
8
+ # takes each element from the given hash and apply it to ourselves through an assignment method
9
+ def map_hash_elements_to_self(hash)
10
+ hash.each do |key, value|
11
+ method_name = key.gsub(/([a-z\d])([A-Z])/, '\1_\2').downcase # convert came case to snake case
12
+ method_name += '='
13
+ send(method_name, value) if respond_to?(method_name)
13
14
  end
14
15
  end
15
16
 
17
+ def initialize(json)
18
+ map_hash_elements_to_self(json)
19
+ end
20
+
16
21
  def value_to_time(value)
17
22
  value ? Time.parse(value) : nil
18
23
  end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'messagebird/base'
4
+
5
+ module MessageBird
6
+ class CallFlow < MessageBird::Base
7
+ attr_accessor :id, :title, :record, :default
8
+ attr_reader :steps, :created_at, :updated_at
9
+
10
+ def steps=(json)
11
+ @steps = json.map { |s| MessageBird::CallFlowStep.new(s) }
12
+ end
13
+
14
+ def created_at=(value)
15
+ @created_at = value_to_time(value)
16
+ end
17
+
18
+ def updated_at=(value)
19
+ @updated_at = value_to_time(value)
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'messagebird/base'
4
+
5
+ module MessageBird
6
+ class CallFlowStep < MessageBird::Base
7
+ attr_accessor :id, :action, :options
8
+ end
9
+ end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'messagebird/base'
4
+
5
+ module MessageBird
6
+ class CallFlow < MessageBird::Base
7
+ attr_accessor :id, :title, :record, :default
8
+ attr_reader :steps, :created_at, :updated_at
9
+
10
+ def initialize(json)
11
+ params = json.include?('data') ? json['data'].first : json
12
+ super(params)
13
+ end
14
+
15
+ def steps=(json)
16
+ @steps = json.map { |c| MessageBird::CallFlowStep.new(c) }
17
+ end
18
+
19
+ def created_at=(value)
20
+ @created_at = value_to_time(value)
21
+ end
22
+
23
+ def updated_at=(value)
24
+ @updated_at = value_to_time(value)
25
+ end
26
+ end
27
+
28
+ class CallFlowList < List
29
+ attr_accessor :perPage, :currentPage, :pageCount, :totalCount
30
+ PER_PAGE = 20
31
+ CURRENT_PAGE = 1
32
+
33
+ def data=(value)
34
+ self.items = value
35
+ end
36
+
37
+ def pagination=(value)
38
+ value.each do |k, v|
39
+ send("#{k}=", v)
40
+ rescue NoMethodError
41
+ puts 'An error occurred while listing callflows'
42
+ end
43
+ end
44
+ end
45
+
46
+ class CallFlowStep < MessageBird::Base
47
+ attr_accessor :id, :action
48
+
49
+ def options=(json)
50
+ @options = CallFlowStepOption.new(json)
51
+ end
52
+ end
53
+
54
+ class CallFlowStepOption < MessageBird::Base
55
+ attr_accessor :destination, :payload, :language, :voice, :repeat,
56
+ :media, :length, :maxLength, :timeout, :finishOnKey, :transcribe,
57
+ :transcribeLanguage, :record, :url, :ifMachine, :machineTimeout,
58
+ :onFinish, :mask
59
+ end
60
+ end
@@ -1,9 +1,15 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'json'
2
4
  require 'net/https'
3
5
  require 'uri'
4
6
 
5
7
  require 'messagebird/balance'
6
8
  require 'messagebird/contact'
9
+ require 'messagebird/conversation'
10
+ require 'messagebird/conversation_client'
11
+ require 'messagebird/conversation_message'
12
+ require 'messagebird/conversation_webhook'
7
13
  require 'messagebird/error'
8
14
  require 'messagebird/group'
9
15
  require 'messagebird/hlr'
@@ -11,8 +17,20 @@ require 'messagebird/http_client'
11
17
  require 'messagebird/list'
12
18
  require 'messagebird/lookup'
13
19
  require 'messagebird/message'
20
+ require 'messagebird/number'
21
+ require 'messagebird/number_client'
14
22
  require 'messagebird/verify'
23
+ require 'messagebird/verify_email_message'
24
+ require 'messagebird/voice/client'
25
+ require 'messagebird/voice/list'
26
+ require 'messagebird/voice/webhook'
15
27
  require 'messagebird/voicemessage'
28
+ require 'messagebird/voice_client'
29
+ require 'messagebird/voice/call'
30
+ require 'messagebird/voice/call_leg'
31
+ require 'messagebird/voice/call_leg_recording'
32
+ require 'messagebird/voice/transcription'
33
+ require 'messagebird/voice/list'
16
34
 
17
35
  module MessageBird
18
36
  class ErrorException < StandardError
@@ -23,30 +41,148 @@ module MessageBird
23
41
  end
24
42
  end
25
43
 
26
- class Client
44
+ class InvalidFeatureException < StandardError
45
+ end
27
46
 
28
- attr_reader :access_key
29
- attr_reader :http_client
47
+ class Client
48
+ attr_reader :access_key, :http_client, :conversation_client, :voice_client
30
49
 
31
- def initialize(access_key = nil, http_client = nil)
50
+ def initialize(access_key = nil, http_client = nil, conversation_client = nil, voice_client = nil)
32
51
  @access_key = access_key || ENV['MESSAGEBIRD_ACCESS_KEY']
33
52
  @http_client = http_client || HttpClient.new(@access_key)
53
+ @conversation_client = conversation_client || ConversationClient.new(@access_key)
54
+ @number_client = http_client || NumberClient.new(@access_key)
55
+ @voice_client = voice_client || VoiceClient.new(@access_key)
34
56
  end
35
57
 
36
- def request(method, path, params={})
58
+ def conversation_request(method, path, params = {})
59
+ response_body = @conversation_client.request(method, path, params)
60
+ return if response_body.nil? || response_body.empty?
61
+
62
+ parse_body(response_body)
63
+ end
64
+
65
+ def number_request(method, path, params = {})
66
+ response_body = @number_client.request(method, path, params)
67
+ return if response_body.nil? || response_body.empty?
68
+
69
+ parse_body(response_body)
70
+ end
71
+
72
+ def voice_request(method, path, params = {})
73
+ response_body = @voice_client.request(method, path, params)
74
+ return if response_body.nil? || response_body.empty?
75
+
76
+ parse_body(response_body)
77
+ end
78
+
79
+ def request(method, path, params = {})
37
80
  response_body = @http_client.request(method, path, params)
38
- return if response_body.empty?
81
+ return if response_body.nil? || response_body.empty?
82
+
83
+ parse_body(response_body)
84
+ end
39
85
 
40
- json = JSON.parse(response_body)
86
+ def parse_body(body)
87
+ json = JSON.parse(body)
41
88
 
42
89
  # If the request returned errors, create Error objects and raise.
43
- if json.has_key?('errors')
44
- raise ErrorException, json['errors'].map { |e| Error.new(e) }
90
+ if json.key?('errors')
91
+ raise(ErrorException, json['errors'].map { |e| Error.new(e) })
45
92
  end
46
93
 
47
94
  json
48
95
  end
49
96
 
97
+ ## Conversations
98
+ # Send a conversation message
99
+ def send_conversation_message(from, to, params = {})
100
+ ConversationMessage.new(conversation_request(
101
+ :post,
102
+ 'send',
103
+ params.merge(from: from,
104
+ to: to)
105
+ ))
106
+ end
107
+
108
+ # Start a conversation
109
+ def start_conversation(to, channel_id, params = {})
110
+ Conversation.new(conversation_request(
111
+ :post,
112
+ 'conversations/start',
113
+ params.merge(to: to,
114
+ channel_id: channel_id)
115
+ ))
116
+ end
117
+
118
+ def conversation_list(limit = -1, offset = -1)
119
+ query = '?'
120
+ if limit != -1
121
+ query += "limit=#{limit}&"
122
+ end
123
+
124
+ if offset != -1
125
+ query += "offset=#{offset}"
126
+ end
127
+
128
+ List.new(Conversation, conversation_request(:get, "conversations#{query}"))
129
+ end
130
+
131
+ def conversation(id)
132
+ Conversation.new(conversation_request(:get, "conversations/#{id}"))
133
+ end
134
+
135
+ def conversation_update(id, status)
136
+ Conversation.new(conversation_request(:patch, "conversations/#{id}", status: status))
137
+ end
138
+
139
+ def conversation_reply(id, params = {})
140
+ ConversationMessage.new(conversation_request(:post, "conversations/#{id}/messages", params))
141
+ end
142
+
143
+ def conversation_messages_list(id, limit = -1, offset = -1)
144
+ query = '?'
145
+ if limit != -1
146
+ query += "limit=#{limit}&"
147
+ end
148
+
149
+ if offset != -1
150
+ query += "offset=#{offset}"
151
+ end
152
+
153
+ List.new(ConversationMessage, conversation_request(:get, "conversations/#{id}/messages#{query}"))
154
+ end
155
+
156
+ def conversation_message(id)
157
+ ConversationMessage.new(conversation_request(:get, "messages/#{id}"))
158
+ end
159
+
160
+ def conversation_webhook_create(channel_id, url, events = [])
161
+ ConversationWebhook.new(conversation_request(
162
+ :post,
163
+ 'webhooks',
164
+ channel_id: channel_id,
165
+ url: url,
166
+ events: events
167
+ ))
168
+ end
169
+
170
+ def conversation_webhooks_list(limit = 0, offset = 0)
171
+ List.new(ConversationWebhook, conversation_request(:get, "webhooks?limit=#{limit}&offset=#{offset}"))
172
+ end
173
+
174
+ def conversation_webhook_update(id, params = {})
175
+ ConversationWebhook.new(conversation_request(:patch, "webhooks/#{id}", params))
176
+ end
177
+
178
+ def conversation_webhook(id)
179
+ ConversationWebhook.new(conversation_request(:get, "webhooks/#{id}"))
180
+ end
181
+
182
+ def conversation_webhook_delete(id)
183
+ conversation_request(:delete, "webhooks/#{id}")
184
+ end
185
+
50
186
  # Retrieve your balance.
51
187
  def balance
52
188
  Balance.new(request(:get, 'balance'))
@@ -54,96 +190,185 @@ module MessageBird
54
190
 
55
191
  # Retrieve the information of specific HLR.
56
192
  def hlr(id)
57
- HLR.new(request(:get, "hlr/#{id.to_s}"))
193
+ HLR.new(request(:get, "hlr/#{id}"))
58
194
  end
59
195
 
60
196
  # Create a new HLR.
61
197
  def hlr_create(msisdn, reference)
62
198
  HLR.new(request(
63
- :post,
64
- 'hlr',
65
- :msisdn => msisdn,
66
- :reference => reference))
199
+ :post,
200
+ 'hlr',
201
+ msisdn: msisdn,
202
+ reference: reference
203
+ ))
67
204
  end
68
205
 
69
206
  # Retrieve the information of specific Verify.
70
207
  def verify(id)
71
- Verify.new(request(:get, "verify/#{id.to_s}"))
208
+ Verify.new(request(:get, "verify/#{id}"))
209
+ end
210
+
211
+ # Retrieve the information of specific Verify email message
212
+ def verify_email_message(id)
213
+ VerifyEmailMessage.new(request(:get, "verify/messages/email/#{id}"))
72
214
  end
73
215
 
74
216
  # Generate a new One-Time-Password message.
75
- def verify_create(recipient, params={})
217
+ def verify_create(recipient, params = {})
76
218
  Verify.new(request(
77
- :post,
78
- 'verify',
79
- params.merge({
80
- :recipient => recipient
81
- })
219
+ :post,
220
+ 'verify',
221
+ params.merge(recipient: recipient)
82
222
  ))
83
223
  end
84
224
 
85
225
  # Verify the One-Time-Password.
86
226
  def verify_token(id, token)
87
- Verify.new(request(:get, "verify/#{id.to_s}?token=#{token}"))
227
+ Verify.new(request(:get, "verify/#{id}?token=#{token}"))
88
228
  end
89
229
 
90
- # Delete a Verify
230
+ # Delete a Verify, response is empty
91
231
  def verify_delete(id)
92
- Verify.new(request(:delete, "verify/#{id.to_s}"))
232
+ request(:delete, "verify/#{id}")
93
233
  end
94
234
 
95
235
  # Retrieve the information of specific message.
96
236
  def message(id)
97
- Message.new(request(:get, "messages/#{id.to_s}"))
237
+ Message.new(request(:get, "messages/#{id}"))
238
+ end
239
+
240
+ # Retrieve messages with optional paging and status filter.
241
+ def message_list(filters = {})
242
+ params = { limit: 10, offset: 0 }.merge(filters).compact
243
+ query = "messages?#{URI.encode_www_form(params)}"
244
+
245
+ List.new(Message, request(:get, query))
98
246
  end
99
247
 
100
248
  # Create a new message.
101
- def message_create(originator, recipients, body, params={})
249
+ def message_create(originator, recipients, body, params = {})
102
250
  # Convert an array of recipients to a comma-separated string.
103
- recipients = recipients.join(',') if recipients.kind_of?(Array)
251
+ recipients = recipients.join(',') if recipients.is_a?(Array)
104
252
 
105
253
  Message.new(request(
106
- :post,
107
- 'messages',
108
- params.merge({
109
- :originator => originator.to_s,
110
- :body => body.to_s,
111
- :recipients => recipients })))
254
+ :post,
255
+ 'messages',
256
+ params.merge(originator: originator.to_s,
257
+ body: body.to_s,
258
+ recipients: recipients)
259
+ ))
112
260
  end
113
261
 
114
262
  # Retrieve the information of a specific voice message.
115
263
  def voice_message(id)
116
- VoiceMessage.new(request(:get, "voicemessages/#{id.to_s}"))
264
+ VoiceMessage.new(request(:get, "voicemessages/#{id}"))
117
265
  end
118
266
 
119
267
  # Create a new voice message.
120
- def voice_message_create(recipients, body, params={})
268
+ def voice_message_create(recipients, body, params = {})
121
269
  # Convert an array of recipients to a comma-separated string.
122
- recipients = recipients.join(',') if recipients.kind_of?(Array)
270
+ recipients = recipients.join(',') if recipients.is_a?(Array)
123
271
 
124
272
  VoiceMessage.new(request(
125
- :post,
126
- 'voicemessages',
127
- params.merge({ :recipients => recipients, :body => body.to_s })))
273
+ :post,
274
+ 'voicemessages',
275
+ params.merge(recipients: recipients, body: body.to_s)
276
+ ))
128
277
  end
129
278
 
130
- def lookup(phoneNumber, params={})
131
- Lookup.new(request(:get, "lookup/#{phoneNumber}", params))
279
+ def voice_webhook_create(url, params = {})
280
+ Voice::Webhook.new(voice_request(:post, 'webhooks', params.merge(url: url)))
132
281
  end
133
282
 
134
- def lookup_hlr_create(phoneNumber, params={})
135
- HLR.new(request(:post, "lookup/#{phoneNumber}/hlr", params))
283
+ def voice_webhooks_list(per_page = VoiceList::PER_PAGE, page = VoiceList::CURRENT_PAGE)
284
+ Voice::List.new(Voice::Webhook, voice_request(:get, "webhooks?perPage=#{per_page}&page=#{page}"))
136
285
  end
137
286
 
138
- def lookup_hlr(phoneNumber, params={})
139
- HLR.new(request(:get, "lookup/#{phoneNumber}/hlr", params))
287
+ def voice_webhook_update(id, params = {})
288
+ Voice::Webhook.new(voice_request(:put, "webhooks/#{id}", params))
140
289
  end
141
290
 
142
- def contact_create(phoneNumber, params={})
291
+ def voice_webhook(id)
292
+ Voice::Webhook.new(voice_request(:get, "webhooks/#{id}"))
293
+ end
294
+
295
+ def voice_webhook_delete(id)
296
+ voice_request(:delete, "webhooks/#{id}")
297
+ end
298
+
299
+ def call_create(source, destination, call_flow = {}, webhook = {}, params = {})
300
+ params = params.merge(callFlow: call_flow.to_json) unless call_flow.empty?
301
+ params = params.merge(webhook: webhook.to_json) unless webhook.empty?
302
+
303
+ Voice::Call.new(voice_request(:post, 'calls', params.merge(source: source, destination: destination)))
304
+ end
305
+
306
+ def call_list(per_page = Voice::List::PER_PAGE, page = Voice::List::CURRENT_PAGE)
307
+ Voice::List.new(Voice::Call, voice_request(:get, "calls?perPage=#{per_page}&currentPage=#{page}"))
308
+ end
309
+
310
+ def call_view(id)
311
+ Voice::Call.new(voice_request(:get, "calls/#{id}"))
312
+ end
313
+
314
+ def call_delete(id)
315
+ voice_request(:delete, "calls/#{id}")
316
+ end
317
+
318
+ def call_leg_list(call_id, per_page = Voice::List::PER_PAGE, current_page = Voice::List::CURRENT_PAGE)
319
+ Voice::List.new(Voice::CallLeg, voice_request(:get, "calls/#{call_id}/legs?perPage=#{per_page}&currentPage=#{current_page}"))
320
+ end
321
+
322
+ def call_leg_recording_view(call_id, leg_id, recording_id)
323
+ Voice::CallLegRecording.new(voice_request(:get, "calls/#{call_id}/legs/#{leg_id}/recordings/#{recording_id}"))
324
+ end
325
+
326
+ def call_leg_recording_list(call_id, leg_id)
327
+ Voice::List.new(Voice::CallLegRecording, voice_request(:get, "calls/#{call_id}/legs/#{leg_id}/recordings"))
328
+ end
329
+
330
+ def call_leg_recording_delete(call_id, leg_id, recording_id)
331
+ voice_request(:delete, "calls/#{call_id}/legs/#{leg_id}/recordings/#{recording_id}")
332
+ end
333
+
334
+ def call_leg_recording_download(recording_uri, &block)
335
+ @voice_client.request_block(:get, recording_uri, {}, &block)
336
+ end
337
+
338
+ def voice_transcription_create(call_id, leg_id, recording_id, params = {})
339
+ Voice::Transcription.new(voice_request(:post, "calls/#{call_id}/legs/#{leg_id}/recordings/#{recording_id}/transcriptions", params))
340
+ end
341
+
342
+ def voice_transcriptions_list(call_id, leg_id, recording_id)
343
+ Voice::List.new(Voice::Transcription, voice_request(:get, "calls/#{call_id}/legs/#{leg_id}/recordings/#{recording_id}/transcriptions"))
344
+ end
345
+
346
+ def voice_transcription_download(call_id, leg_id, recording_id, transcription_id, &block)
347
+ @voice_client.request_block(:get, "calls/#{call_id}/legs/#{leg_id}/recordings/#{recording_id}/transcriptions/#{transcription_id}.txt", {}, &block)
348
+ end
349
+
350
+ def voice_transcription_view(call_id, leg_id, recording_id, transcription_id)
351
+ Voice::Transcription.new(voice_request(:get, "calls/#{call_id}/legs/#{leg_id}/recordings/#{recording_id}/transcriptions/#{transcription_id}"))
352
+ end
353
+
354
+ def lookup(phone_number, params = {})
355
+ Lookup.new(request(:get, "lookup/#{phone_number}", params))
356
+ end
357
+
358
+ def lookup_hlr_create(phone_number, params = {})
359
+ HLR.new(request(:post, "lookup/#{phone_number}/hlr", params))
360
+ end
361
+
362
+ def lookup_hlr(phone_number, params = {})
363
+ HLR.new(request(:get, "lookup/#{phone_number}/hlr", params))
364
+ end
365
+
366
+ def contact_create(phone_number, params = {})
143
367
  Contact.new(request(
144
- :post,
145
- 'contacts',
146
- params.merge({ :msisdn => phoneNumber.to_s })))
368
+ :post,
369
+ 'contacts',
370
+ params.merge(msisdn: phone_number.to_s)
371
+ ))
147
372
  end
148
373
 
149
374
  def contact(id)
@@ -154,7 +379,7 @@ module MessageBird
154
379
  request(:delete, "contacts/#{id}")
155
380
  end
156
381
 
157
- def contact_update(id, params={})
382
+ def contact_update(id, params = {})
158
383
  request(:patch, "contacts/#{id}", params)
159
384
  end
160
385
 
@@ -167,7 +392,7 @@ module MessageBird
167
392
  end
168
393
 
169
394
  def group_create(name)
170
- Group.new(request(:post, 'groups', { :name => name }))
395
+ Group.new(request(:post, 'groups', name: name))
171
396
  end
172
397
 
173
398
  def group_delete(id)
@@ -179,7 +404,7 @@ module MessageBird
179
404
  end
180
405
 
181
406
  def group_update(id, name)
182
- request(:patch, "groups/#{id}", { :name => name })
407
+ request(:patch, "groups/#{id}", name: name)
183
408
  end
184
409
 
185
410
  def group_add_contacts(group_id, contact_ids)
@@ -195,8 +420,68 @@ module MessageBird
195
420
  request(:delete, "groups/#{group_id}/contacts/#{contact_id}")
196
421
  end
197
422
 
423
+ ## Numbers API
424
+ # Search for available numbers
425
+ def number_search(country_code, params = {})
426
+ List.new(Number, number_request(:get, add_querystring("available-phone-numbers/#{country_code}", params), params))
427
+ end
428
+
429
+ # Purchase an avaiable number
430
+ def number_purchase(number, country_code, billing_interval_months)
431
+ params = {
432
+ number: number,
433
+ countryCode: country_code,
434
+ billingIntervalMonths: billing_interval_months
435
+ }
436
+ Number.new(number_request(:post, 'phone-numbers', params))
437
+ end
438
+
439
+ # Fetch all purchaed numbers' details
440
+ def number_fetch_all(params = {})
441
+ List.new(Number, number_request(:get, add_querystring('phone-numbers', params), params))
442
+ end
443
+
444
+ # Fetch specific purchased number's details
445
+ def number_fetch(number)
446
+ Number.new(number_request(:get, "phone-numbers/#{number}"))
447
+ end
448
+
449
+ # Update a number
450
+ def number_update(number, tags)
451
+ tags = [tags] if tags.is_a? String
452
+ Number.new(number_request(:patch, "phone-numbers/#{number}", tags: tags))
453
+ end
454
+
455
+ # Cancel a number
456
+ def number_cancel(number)
457
+ number_request(:delete, "phone-numbers/#{number}")
458
+ end
459
+
460
+ def call_flow_create(title, steps, default, record, params = {})
461
+ params = params.merge(
462
+ title: title,
463
+ steps: steps,
464
+ default: default,
465
+ record: record
466
+ )
467
+ CallFlow.new(voice_request(:post, 'call-flows', params))
468
+ end
469
+
470
+ def call_flow_view(id)
471
+ CallFlow.new(voice_request(:get, "call-flows/#{id}"))
472
+ end
473
+
474
+ def call_flow_list(per_page = CallFlowList::PER_PAGE, page = CallFlowList::CURRENT_PAGE)
475
+ CallFlowList.new(CallFlow, voice_request(:get, "call-flows?perPage=#{per_page}&page=#{page}"))
476
+ end
477
+
478
+ def call_flow_delete(id)
479
+ voice_request(:delete, "call-flows/#{id}")
480
+ end
481
+
198
482
  private # Applies to every method below this line
199
483
 
484
+ # Applies to every method below this line
200
485
  def add_contacts_query(contact_ids)
201
486
  # add_contacts_query gets a query string to add contacts to a group.
202
487
  # We're using the alternative "/foo?_method=PUT&key=value" format to send
@@ -208,5 +493,10 @@ module MessageBird
208
493
  '_method=PUT&' + contact_ids.map { |id| "ids[]=#{id}" }.join('&')
209
494
  end
210
495
 
496
+ def add_querystring(path, params)
497
+ return path if params.empty?
498
+
499
+ "#{path}?" + params.collect { |k, v| v.is_a?(Array) ? v.collect { |sv| "#{k}=#{sv}" }.join('&') : "#{k}=#{v}" }.join('&')
500
+ end
211
501
  end
212
502
  end