voiceml 0.9.2 → 0.9.3

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 (61) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +17 -13
  3. data/lib/voiceml/client.rb +53 -13
  4. data/lib/voiceml/errors.rb +15 -2
  5. data/lib/voiceml/models/accounts.rb +47 -3
  6. data/lib/voiceml/models/applications.rb +6 -0
  7. data/lib/voiceml/models/assistants_v1.rb +40 -0
  8. data/lib/voiceml/models/calls.rb +4 -0
  9. data/lib/voiceml/models/common.rb +35 -4
  10. data/lib/voiceml/models/conferences.rb +8 -0
  11. data/lib/voiceml/models/conversations_v1.rb +131 -29
  12. data/lib/voiceml/models/diagnostics.rb +33 -12
  13. data/lib/voiceml/models/exports.rb +58 -0
  14. data/lib/voiceml/models/incoming_phone_numbers.rb +4 -0
  15. data/lib/voiceml/models/media.rb +4 -0
  16. data/lib/voiceml/models/messages.rb +29 -0
  17. data/lib/voiceml/models/messaging_v1.rb +35 -2
  18. data/lib/voiceml/models/monitor_v1.rb +54 -0
  19. data/lib/voiceml/models/notifications.rb +2 -0
  20. data/lib/voiceml/models/outgoing_caller_ids.rb +6 -0
  21. data/lib/voiceml/models/payments.rb +2 -0
  22. data/lib/voiceml/models/pricing.rb +38 -4
  23. data/lib/voiceml/models/queues.rb +8 -0
  24. data/lib/voiceml/models/recordings.rb +5 -1
  25. data/lib/voiceml/models/routes_v2.rb +6 -2
  26. data/lib/voiceml/models/sip.rb +34 -6
  27. data/lib/voiceml/models/sip_registrations.rb +49 -0
  28. data/lib/voiceml/models/siprec.rb +5 -17
  29. data/lib/voiceml/models/streams.rb +4 -16
  30. data/lib/voiceml/models/transcriptions.rb +35 -4
  31. data/lib/voiceml/models/usage_records.rb +48 -0
  32. data/lib/voiceml/models/user_defined_messages.rb +2 -0
  33. data/lib/voiceml/models/voice_v1.rb +29 -19
  34. data/lib/voiceml/request_validator.rb +125 -0
  35. data/lib/voiceml/resources/accounts.rb +75 -0
  36. data/lib/voiceml/resources/applications.rb +3 -1
  37. data/lib/voiceml/resources/assistants_v1.rb +53 -77
  38. data/lib/voiceml/resources/base.rb +138 -16
  39. data/lib/voiceml/resources/calls.rb +34 -49
  40. data/lib/voiceml/resources/conferences.rb +26 -5
  41. data/lib/voiceml/resources/conversations_v1.rb +147 -172
  42. data/lib/voiceml/resources/diagnostics.rb +20 -35
  43. data/lib/voiceml/resources/exports.rb +36 -0
  44. data/lib/voiceml/resources/incoming_phone_numbers.rb +53 -32
  45. data/lib/voiceml/resources/messages.rb +79 -15
  46. data/lib/voiceml/resources/messaging_v1.rb +47 -13
  47. data/lib/voiceml/resources/monitor_v1.rb +68 -0
  48. data/lib/voiceml/resources/notifications.rb +1 -1
  49. data/lib/voiceml/resources/outgoing_caller_ids.rb +77 -0
  50. data/lib/voiceml/resources/pricing.rb +13 -5
  51. data/lib/voiceml/resources/queues.rb +6 -5
  52. data/lib/voiceml/resources/recordings.rb +39 -5
  53. data/lib/voiceml/resources/routes_v2.rb +10 -4
  54. data/lib/voiceml/resources/sip.rb +30 -11
  55. data/lib/voiceml/resources/transcriptions.rb +40 -0
  56. data/lib/voiceml/resources/usage_records.rb +51 -0
  57. data/lib/voiceml/resources/voice_v1.rb +31 -38
  58. data/lib/voiceml/transport.rb +277 -230
  59. data/lib/voiceml/version.rb +1 -1
  60. data/lib/voiceml.rb +14 -15
  61. metadata +18 -6
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative 'base'
4
+
3
5
  require_relative '../models/conversations_v1'
4
6
 
5
7
  module VoiceML
@@ -27,6 +29,8 @@ module VoiceML
27
29
  # webhooks, message receipts).
28
30
  # ============================================================================
29
31
  class ConversationsV1ConversationsResource
32
+ include V1Pages
33
+ include FieldMapping
30
34
  CONVERSATION_FIELDS = {
31
35
  'FriendlyName' => :friendly_name,
32
36
  'UniqueName' => :unique_name,
@@ -106,22 +110,22 @@ module VoiceML
106
110
 
107
111
  def create(**kwargs)
108
112
  ConversationsV1Conversation.from_hash(
109
- @transport.request(:post, '/v1/Conversations', form: build_form(CONVERSATION_FIELDS, kwargs))
113
+ @transport.request(:post, '/v1/Conversations', form: form_params(CONVERSATION_FIELDS, kwargs))
110
114
  )
111
115
  end
112
116
 
113
117
  def fetch(sid)
114
- ConversationsV1Conversation.from_hash(@transport.request(:get, "/v1/Conversations/#{sid}"))
118
+ ConversationsV1Conversation.from_hash(@transport.request(:get, "/v1/Conversations/#{encode_path_segment(sid)}"))
115
119
  end
116
120
 
117
121
  def update(sid, **kwargs)
118
122
  ConversationsV1Conversation.from_hash(
119
- @transport.request(:post, "/v1/Conversations/#{sid}", form: build_form(UPDATE_FIELDS, kwargs))
123
+ @transport.request(:post, "/v1/Conversations/#{encode_path_segment(sid)}", form: form_params(UPDATE_FIELDS, kwargs))
120
124
  )
121
125
  end
122
126
 
123
127
  def delete(sid)
124
- @transport.request(:delete, "/v1/Conversations/#{sid}")
128
+ @transport.request(:delete, "/v1/Conversations/#{encode_path_segment(sid)}")
125
129
  nil
126
130
  end
127
131
 
@@ -130,32 +134,32 @@ module VoiceML
130
134
  params = {}
131
135
  params['PageSize'] = page_size unless page_size.nil?
132
136
  ConversationsV1ConversationMessageList.new(
133
- @transport.request(:get, "/v1/Conversations/#{conversation_sid}/Messages", params: params)
137
+ @transport.request(:get, "/v1/Conversations/#{encode_path_segment(conversation_sid)}/Messages", params: params)
134
138
  )
135
139
  end
136
140
 
137
141
  def create_message(conversation_sid, **kwargs)
138
142
  ConversationsV1ConversationMessage.from_hash(
139
- @transport.request(:post, "/v1/Conversations/#{conversation_sid}/Messages",
140
- form: build_form(MESSAGE_FIELDS, kwargs))
143
+ @transport.request(:post, "/v1/Conversations/#{encode_path_segment(conversation_sid)}/Messages",
144
+ form: form_params(MESSAGE_FIELDS, kwargs))
141
145
  )
142
146
  end
143
147
 
144
148
  def fetch_message(conversation_sid, message_sid)
145
149
  ConversationsV1ConversationMessage.from_hash(
146
- @transport.request(:get, "/v1/Conversations/#{conversation_sid}/Messages/#{message_sid}")
150
+ @transport.request(:get, "/v1/Conversations/#{encode_path_segment(conversation_sid)}/Messages/#{encode_path_segment(message_sid)}")
147
151
  )
148
152
  end
149
153
 
150
154
  def update_message(conversation_sid, message_sid, **kwargs)
151
155
  ConversationsV1ConversationMessage.from_hash(
152
- @transport.request(:post, "/v1/Conversations/#{conversation_sid}/Messages/#{message_sid}",
153
- form: build_form(MESSAGE_UPDATE_FIELDS, kwargs))
156
+ @transport.request(:post, "/v1/Conversations/#{encode_path_segment(conversation_sid)}/Messages/#{encode_path_segment(message_sid)}",
157
+ form: form_params(MESSAGE_UPDATE_FIELDS, kwargs))
154
158
  )
155
159
  end
156
160
 
157
161
  def delete_message(conversation_sid, message_sid)
158
- @transport.request(:delete, "/v1/Conversations/#{conversation_sid}/Messages/#{message_sid}")
162
+ @transport.request(:delete, "/v1/Conversations/#{encode_path_segment(conversation_sid)}/Messages/#{encode_path_segment(message_sid)}")
159
163
  nil
160
164
  end
161
165
 
@@ -164,14 +168,14 @@ module VoiceML
164
168
  params = {}
165
169
  params['PageSize'] = page_size unless page_size.nil?
166
170
  ConversationsV1ConversationMessageReceiptList.new(
167
- @transport.request(:get, "/v1/Conversations/#{conversation_sid}/Messages/#{message_sid}/Receipts",
171
+ @transport.request(:get, "/v1/Conversations/#{encode_path_segment(conversation_sid)}/Messages/#{encode_path_segment(message_sid)}/Receipts",
168
172
  params: params)
169
173
  )
170
174
  end
171
175
 
172
176
  def fetch_message_receipt(conversation_sid, message_sid, sid)
173
177
  ConversationsV1ConversationMessageReceipt.from_hash(
174
- @transport.request(:get, "/v1/Conversations/#{conversation_sid}/Messages/#{message_sid}/Receipts/#{sid}")
178
+ @transport.request(:get, "/v1/Conversations/#{encode_path_segment(conversation_sid)}/Messages/#{encode_path_segment(message_sid)}/Receipts/#{encode_path_segment(sid)}")
175
179
  )
176
180
  end
177
181
 
@@ -180,32 +184,32 @@ module VoiceML
180
184
  params = {}
181
185
  params['PageSize'] = page_size unless page_size.nil?
182
186
  ConversationsV1ConversationParticipantList.new(
183
- @transport.request(:get, "/v1/Conversations/#{conversation_sid}/Participants", params: params)
187
+ @transport.request(:get, "/v1/Conversations/#{encode_path_segment(conversation_sid)}/Participants", params: params)
184
188
  )
185
189
  end
186
190
 
187
191
  def create_participant(conversation_sid, **kwargs)
188
192
  ConversationsV1ConversationParticipant.from_hash(
189
- @transport.request(:post, "/v1/Conversations/#{conversation_sid}/Participants",
190
- form: build_form(PARTICIPANT_FIELDS, kwargs))
193
+ @transport.request(:post, "/v1/Conversations/#{encode_path_segment(conversation_sid)}/Participants",
194
+ form: form_params(PARTICIPANT_FIELDS, kwargs))
191
195
  )
192
196
  end
193
197
 
194
198
  def fetch_participant(conversation_sid, participant_sid)
195
199
  ConversationsV1ConversationParticipant.from_hash(
196
- @transport.request(:get, "/v1/Conversations/#{conversation_sid}/Participants/#{participant_sid}")
200
+ @transport.request(:get, "/v1/Conversations/#{encode_path_segment(conversation_sid)}/Participants/#{encode_path_segment(participant_sid)}")
197
201
  )
198
202
  end
199
203
 
200
204
  def update_participant(conversation_sid, participant_sid, **kwargs)
201
205
  ConversationsV1ConversationParticipant.from_hash(
202
- @transport.request(:post, "/v1/Conversations/#{conversation_sid}/Participants/#{participant_sid}",
203
- form: build_form(PARTICIPANT_UPDATE_FIELDS, kwargs))
206
+ @transport.request(:post, "/v1/Conversations/#{encode_path_segment(conversation_sid)}/Participants/#{encode_path_segment(participant_sid)}",
207
+ form: form_params(PARTICIPANT_UPDATE_FIELDS, kwargs))
204
208
  )
205
209
  end
206
210
 
207
211
  def delete_participant(conversation_sid, participant_sid)
208
- @transport.request(:delete, "/v1/Conversations/#{conversation_sid}/Participants/#{participant_sid}")
212
+ @transport.request(:delete, "/v1/Conversations/#{encode_path_segment(conversation_sid)}/Participants/#{encode_path_segment(participant_sid)}")
209
213
  nil
210
214
  end
211
215
 
@@ -214,54 +218,44 @@ module VoiceML
214
218
  params = {}
215
219
  params['PageSize'] = page_size unless page_size.nil?
216
220
  ConversationsV1ConversationScopedWebhookList.new(
217
- @transport.request(:get, "/v1/Conversations/#{conversation_sid}/Webhooks", params: params)
221
+ @transport.request(:get, "/v1/Conversations/#{encode_path_segment(conversation_sid)}/Webhooks", params: params)
218
222
  )
219
223
  end
220
224
 
221
225
  def create_webhook(conversation_sid, target:, **kwargs)
222
226
  kwargs[:target] = target
223
227
  ConversationsV1ConversationScopedWebhook.from_hash(
224
- @transport.request(:post, "/v1/Conversations/#{conversation_sid}/Webhooks",
225
- form: build_form(WEBHOOK_FIELDS, kwargs))
228
+ @transport.request(:post, "/v1/Conversations/#{encode_path_segment(conversation_sid)}/Webhooks",
229
+ form: form_params(WEBHOOK_FIELDS, kwargs))
226
230
  )
227
231
  end
228
232
 
229
233
  def fetch_webhook(conversation_sid, webhook_sid)
230
234
  ConversationsV1ConversationScopedWebhook.from_hash(
231
- @transport.request(:get, "/v1/Conversations/#{conversation_sid}/Webhooks/#{webhook_sid}")
235
+ @transport.request(:get, "/v1/Conversations/#{encode_path_segment(conversation_sid)}/Webhooks/#{encode_path_segment(webhook_sid)}")
232
236
  )
233
237
  end
234
238
 
235
239
  def update_webhook(conversation_sid, webhook_sid, **kwargs)
236
240
  ConversationsV1ConversationScopedWebhook.from_hash(
237
- @transport.request(:post, "/v1/Conversations/#{conversation_sid}/Webhooks/#{webhook_sid}",
238
- form: build_form(WEBHOOK_UPDATE_FIELDS, kwargs))
241
+ @transport.request(:post, "/v1/Conversations/#{encode_path_segment(conversation_sid)}/Webhooks/#{encode_path_segment(webhook_sid)}",
242
+ form: form_params(WEBHOOK_UPDATE_FIELDS, kwargs))
239
243
  )
240
244
  end
241
245
 
242
246
  def delete_webhook(conversation_sid, webhook_sid)
243
- @transport.request(:delete, "/v1/Conversations/#{conversation_sid}/Webhooks/#{webhook_sid}")
247
+ @transport.request(:delete, "/v1/Conversations/#{encode_path_segment(conversation_sid)}/Webhooks/#{encode_path_segment(webhook_sid)}")
244
248
  nil
245
249
  end
246
250
 
247
- private
248
-
249
- def build_form(map, kwargs)
250
- out = {}
251
- map.each do |wire, k|
252
- value = kwargs[k]
253
- next if value.nil?
254
-
255
- out[wire] = value
256
- end
257
- out
258
- end
259
251
  end
260
252
 
261
253
  # ============================================================================
262
254
  # /v1/Roles
263
255
  # ============================================================================
264
256
  class ConversationsV1RolesResource
257
+ include V1Pages
258
+ include FieldMapping
265
259
  def initialize(transport)
266
260
  @transport = transport
267
261
  end
@@ -278,16 +272,16 @@ module VoiceML
278
272
  end
279
273
 
280
274
  def fetch(sid)
281
- ConversationsV1Role.from_hash(@transport.request(:get, "/v1/Roles/#{sid}"))
275
+ ConversationsV1Role.from_hash(@transport.request(:get, "/v1/Roles/#{encode_path_segment(sid)}"))
282
276
  end
283
277
 
284
278
  def update(sid, permission:)
285
279
  form = { 'Permission' => Array(permission) }
286
- ConversationsV1Role.from_hash(@transport.request(:post, "/v1/Roles/#{sid}", form: form))
280
+ ConversationsV1Role.from_hash(@transport.request(:post, "/v1/Roles/#{encode_path_segment(sid)}", form: form))
287
281
  end
288
282
 
289
283
  def delete(sid)
290
- @transport.request(:delete, "/v1/Roles/#{sid}")
284
+ @transport.request(:delete, "/v1/Roles/#{encode_path_segment(sid)}")
291
285
  nil
292
286
  end
293
287
  end
@@ -296,6 +290,8 @@ module VoiceML
296
290
  # /v1/Users + nested /v1/Users/{Sid}/Conversations (UserConversation)
297
291
  # ============================================================================
298
292
  class ConversationsV1UsersResource
293
+ include V1Pages
294
+ include FieldMapping
299
295
  USER_FIELDS = {
300
296
  'Identity' => :identity,
301
297
  'FriendlyName' => :friendly_name,
@@ -327,21 +323,21 @@ module VoiceML
327
323
 
328
324
  def create(identity:, friendly_name: nil, attributes: nil, role_sid: nil)
329
325
  kwargs = { identity: identity, friendly_name: friendly_name, attributes: attributes, role_sid: role_sid }
330
- ConversationsV1User.from_hash(@transport.request(:post, '/v1/Users', form: build_form(USER_FIELDS, kwargs)))
326
+ ConversationsV1User.from_hash(@transport.request(:post, '/v1/Users', form: form_params(USER_FIELDS, kwargs)))
331
327
  end
332
328
 
333
329
  def fetch(sid)
334
- ConversationsV1User.from_hash(@transport.request(:get, "/v1/Users/#{sid}"))
330
+ ConversationsV1User.from_hash(@transport.request(:get, "/v1/Users/#{encode_path_segment(sid)}"))
335
331
  end
336
332
 
337
333
  def update(sid, **kwargs)
338
334
  ConversationsV1User.from_hash(
339
- @transport.request(:post, "/v1/Users/#{sid}", form: build_form(USER_UPDATE_FIELDS, kwargs))
335
+ @transport.request(:post, "/v1/Users/#{encode_path_segment(sid)}", form: form_params(USER_UPDATE_FIELDS, kwargs))
340
336
  )
341
337
  end
342
338
 
343
339
  def delete(sid)
344
- @transport.request(:delete, "/v1/Users/#{sid}")
340
+ @transport.request(:delete, "/v1/Users/#{encode_path_segment(sid)}")
345
341
  nil
346
342
  end
347
343
 
@@ -350,46 +346,36 @@ module VoiceML
350
346
  params = {}
351
347
  params['PageSize'] = page_size unless page_size.nil?
352
348
  ConversationsV1UserConversationList.new(
353
- @transport.request(:get, "/v1/Users/#{user_sid}/Conversations", params: params)
349
+ @transport.request(:get, "/v1/Users/#{encode_path_segment(user_sid)}/Conversations", params: params)
354
350
  )
355
351
  end
356
352
 
357
353
  def fetch_user_conversation(user_sid, conversation_sid)
358
354
  ConversationsV1UserConversation.from_hash(
359
- @transport.request(:get, "/v1/Users/#{user_sid}/Conversations/#{conversation_sid}")
355
+ @transport.request(:get, "/v1/Users/#{encode_path_segment(user_sid)}/Conversations/#{encode_path_segment(conversation_sid)}")
360
356
  )
361
357
  end
362
358
 
363
359
  def update_user_conversation(user_sid, conversation_sid, **kwargs)
364
360
  ConversationsV1UserConversation.from_hash(
365
- @transport.request(:post, "/v1/Users/#{user_sid}/Conversations/#{conversation_sid}",
366
- form: build_form(USER_CONVERSATION_UPDATE_FIELDS, kwargs))
361
+ @transport.request(:post, "/v1/Users/#{encode_path_segment(user_sid)}/Conversations/#{encode_path_segment(conversation_sid)}",
362
+ form: form_params(USER_CONVERSATION_UPDATE_FIELDS, kwargs))
367
363
  )
368
364
  end
369
365
 
370
366
  def delete_user_conversation(user_sid, conversation_sid)
371
- @transport.request(:delete, "/v1/Users/#{user_sid}/Conversations/#{conversation_sid}")
367
+ @transport.request(:delete, "/v1/Users/#{encode_path_segment(user_sid)}/Conversations/#{encode_path_segment(conversation_sid)}")
372
368
  nil
373
369
  end
374
370
 
375
- private
376
-
377
- def build_form(map, kwargs)
378
- out = {}
379
- map.each do |wire, k|
380
- value = kwargs[k]
381
- next if value.nil?
382
-
383
- out[wire] = value
384
- end
385
- out
386
- end
387
371
  end
388
372
 
389
373
  # ============================================================================
390
374
  # /v1/Credentials (push credentials — distinct from /SIP/Credentials)
391
375
  # ============================================================================
392
376
  class ConversationsV1CredentialsResource
377
+ include V1Pages
378
+ include FieldMapping
393
379
  CREDENTIAL_FIELDS = {
394
380
  'Type' => :type,
395
381
  'FriendlyName' => :friendly_name,
@@ -413,43 +399,33 @@ module VoiceML
413
399
  def create(type:, **kwargs)
414
400
  kwargs[:type] = type
415
401
  ConversationsV1Credential.from_hash(
416
- @transport.request(:post, '/v1/Credentials', form: build_form(kwargs))
402
+ @transport.request(:post, '/v1/Credentials', form: form_params(CREDENTIAL_FIELDS, kwargs))
417
403
  )
418
404
  end
419
405
 
420
406
  def fetch(sid)
421
- ConversationsV1Credential.from_hash(@transport.request(:get, "/v1/Credentials/#{sid}"))
407
+ ConversationsV1Credential.from_hash(@transport.request(:get, "/v1/Credentials/#{encode_path_segment(sid)}"))
422
408
  end
423
409
 
424
410
  def update(sid, **kwargs)
425
411
  ConversationsV1Credential.from_hash(
426
- @transport.request(:post, "/v1/Credentials/#{sid}", form: build_form(kwargs))
412
+ @transport.request(:post, "/v1/Credentials/#{encode_path_segment(sid)}", form: form_params(CREDENTIAL_FIELDS, kwargs))
427
413
  )
428
414
  end
429
415
 
430
416
  def delete(sid)
431
- @transport.request(:delete, "/v1/Credentials/#{sid}")
417
+ @transport.request(:delete, "/v1/Credentials/#{encode_path_segment(sid)}")
432
418
  nil
433
419
  end
434
420
 
435
- private
436
-
437
- def build_form(kwargs)
438
- out = {}
439
- CREDENTIAL_FIELDS.each do |wire, k|
440
- value = kwargs[k]
441
- next if value.nil?
442
-
443
- out[wire] = value
444
- end
445
- out
446
- end
447
421
  end
448
422
 
449
423
  # ============================================================================
450
424
  # /v1/Configuration (singleton) + nested /Webhooks (singleton) + /Addresses (CRUD)
451
425
  # ============================================================================
452
426
  class ConversationsV1ConfigurationResource
427
+ include V1Pages
428
+ include FieldMapping
453
429
  CONFIG_FIELDS = {
454
430
  'DefaultChatServiceSid' => :default_chat_service_sid,
455
431
  'DefaultMessagingServiceSid' => :default_messaging_service_sid,
@@ -493,7 +469,7 @@ module VoiceML
493
469
 
494
470
  def update(**kwargs)
495
471
  ConversationsV1Configuration.from_hash(
496
- @transport.request(:post, '/v1/Configuration', form: build_form(CONFIG_FIELDS, kwargs))
472
+ @transport.request(:post, '/v1/Configuration', form: form_params(CONFIG_FIELDS, kwargs))
497
473
  )
498
474
  end
499
475
 
@@ -504,7 +480,7 @@ module VoiceML
504
480
 
505
481
  def update_webhooks(**kwargs)
506
482
  ConversationsV1ConfigurationWebhook.from_hash(
507
- @transport.request(:post, '/v1/Configuration/Webhooks', form: build_form(WEBHOOK_FIELDS, kwargs))
483
+ @transport.request(:post, '/v1/Configuration/Webhooks', form: form_params(WEBHOOK_FIELDS, kwargs))
508
484
  )
509
485
  end
510
486
 
@@ -521,43 +497,33 @@ module VoiceML
521
497
  kwargs[:type] = type
522
498
  kwargs[:address] = address
523
499
  ConversationsV1ConfigAddress.from_hash(
524
- @transport.request(:post, '/v1/Configuration/Addresses', form: build_form(ADDRESS_FIELDS, kwargs))
500
+ @transport.request(:post, '/v1/Configuration/Addresses', form: form_params(ADDRESS_FIELDS, kwargs))
525
501
  )
526
502
  end
527
503
 
528
504
  def fetch_address(sid)
529
- ConversationsV1ConfigAddress.from_hash(@transport.request(:get, "/v1/Configuration/Addresses/#{sid}"))
505
+ ConversationsV1ConfigAddress.from_hash(@transport.request(:get, "/v1/Configuration/Addresses/#{encode_path_segment(sid)}"))
530
506
  end
531
507
 
532
508
  def update_address(sid, **kwargs)
533
509
  ConversationsV1ConfigAddress.from_hash(
534
- @transport.request(:post, "/v1/Configuration/Addresses/#{sid}", form: build_form(ADDRESS_UPDATE_FIELDS, kwargs))
510
+ @transport.request(:post, "/v1/Configuration/Addresses/#{encode_path_segment(sid)}", form: form_params(ADDRESS_UPDATE_FIELDS, kwargs))
535
511
  )
536
512
  end
537
513
 
538
514
  def delete_address(sid)
539
- @transport.request(:delete, "/v1/Configuration/Addresses/#{sid}")
515
+ @transport.request(:delete, "/v1/Configuration/Addresses/#{encode_path_segment(sid)}")
540
516
  nil
541
517
  end
542
518
 
543
- private
544
-
545
- def build_form(map, kwargs)
546
- out = {}
547
- map.each do |wire, k|
548
- value = kwargs[k]
549
- next if value.nil?
550
-
551
- out[wire] = value
552
- end
553
- out
554
- end
555
519
  end
556
520
 
557
521
  # ============================================================================
558
522
  # /v1/ParticipantConversations (read-only list)
559
523
  # ============================================================================
560
524
  class ConversationsV1ParticipantConversationsResource
525
+ include V1Pages
526
+ include FieldMapping
561
527
  def initialize(transport)
562
528
  @transport = transport
563
529
  end
@@ -577,6 +543,8 @@ module VoiceML
577
543
  # /v1/ConversationWithParticipants (single-call conv + participants)
578
544
  # ============================================================================
579
545
  class ConversationsV1ConversationWithParticipantsResource
546
+ include V1Pages
547
+ include FieldMapping
580
548
  FIELDS = {
581
549
  'FriendlyName' => :friendly_name,
582
550
  'UniqueName' => :unique_name,
@@ -594,13 +562,7 @@ module VoiceML
594
562
 
595
563
  def create(participant: nil, **kwargs)
596
564
  kwargs[:participant] = participant unless participant.nil?
597
- form = {}
598
- FIELDS.each do |wire, k|
599
- value = kwargs[k]
600
- next if value.nil?
601
-
602
- form[wire] = value
603
- end
565
+ form = form_params(FIELDS, kwargs)
604
566
  ConversationsV1ConversationWithParticipants.from_hash(
605
567
  @transport.request(:post, '/v1/ConversationWithParticipants', form: form)
606
568
  )
@@ -611,6 +573,8 @@ module VoiceML
611
573
  # /v1/Services + nested /Conversations
612
574
  # ============================================================================
613
575
  class ConversationsV1ServicesResource
576
+ include V1Pages
577
+ include FieldMapping
614
578
  SERVICE_CONVERSATION_FIELDS = {
615
579
  'FriendlyName' => :friendly_name,
616
580
  'UniqueName' => :unique_name,
@@ -640,18 +604,39 @@ module VoiceML
640
604
  ConversationsV1ServiceList.new(@transport.request(:get, '/v1/Services', params: params))
641
605
  end
642
606
 
643
- def create(friendly_name:)
607
+ # Shared wire body with Messaging Service (`POST /v1/Services` dispatches
608
+ # by product host); the Conversations surface sets FriendlyName in practice.
609
+ SERVICE_FIELDS = {
610
+ 'FriendlyName' => :friendly_name,
611
+ 'InboundRequestUrl' => :inbound_request_url,
612
+ 'InboundMethod' => :inbound_method,
613
+ 'FallbackUrl' => :fallback_url,
614
+ 'FallbackMethod' => :fallback_method,
615
+ 'StatusCallback' => :status_callback,
616
+ 'StickySender' => :sticky_sender,
617
+ 'MmsConverter' => :mms_converter,
618
+ 'SmartEncoding' => :smart_encoding,
619
+ 'ScanMessageContent' => :scan_message_content,
620
+ 'FallbackToLongCode' => :fallback_to_long_code,
621
+ 'AreaCodeGeomatch' => :area_code_geomatch,
622
+ 'SynchronousValidation' => :synchronous_validation,
623
+ 'ValidityPeriod' => :validity_period,
624
+ 'Usecase' => :usecase,
625
+ 'UseInboundWebhookOnNumber' => :use_inbound_webhook_on_number
626
+ }.freeze
627
+
628
+ def create(**kwargs)
644
629
  ConversationsV1Service.from_hash(
645
- @transport.request(:post, '/v1/Services', form: { 'FriendlyName' => friendly_name })
630
+ @transport.request(:post, '/v1/Services', form: form_params(SERVICE_FIELDS, kwargs))
646
631
  )
647
632
  end
648
633
 
649
634
  def fetch(chat_service_sid)
650
- ConversationsV1Service.from_hash(@transport.request(:get, "/v1/Services/#{chat_service_sid}"))
635
+ ConversationsV1Service.from_hash(@transport.request(:get, "/v1/Services/#{encode_path_segment(chat_service_sid)}"))
651
636
  end
652
637
 
653
638
  def delete(chat_service_sid)
654
- @transport.request(:delete, "/v1/Services/#{chat_service_sid}")
639
+ @transport.request(:delete, "/v1/Services/#{encode_path_segment(chat_service_sid)}")
655
640
  nil
656
641
  end
657
642
 
@@ -660,32 +645,32 @@ module VoiceML
660
645
  params = {}
661
646
  params['PageSize'] = page_size unless page_size.nil?
662
647
  ConversationsV1ServiceConversationList.new(
663
- @transport.request(:get, "/v1/Services/#{chat_service_sid}/Conversations", params: params)
648
+ @transport.request(:get, "/v1/Services/#{encode_path_segment(chat_service_sid)}/Conversations", params: params)
664
649
  )
665
650
  end
666
651
 
667
652
  def create_conversation(chat_service_sid, **kwargs)
668
653
  ConversationsV1ServiceConversation.from_hash(
669
- @transport.request(:post, "/v1/Services/#{chat_service_sid}/Conversations",
670
- form: build_form(SERVICE_CONVERSATION_FIELDS, kwargs))
654
+ @transport.request(:post, "/v1/Services/#{encode_path_segment(chat_service_sid)}/Conversations",
655
+ form: form_params(SERVICE_CONVERSATION_FIELDS, kwargs))
671
656
  )
672
657
  end
673
658
 
674
659
  def fetch_conversation(chat_service_sid, conversation_sid)
675
660
  ConversationsV1ServiceConversation.from_hash(
676
- @transport.request(:get, "/v1/Services/#{chat_service_sid}/Conversations/#{conversation_sid}")
661
+ @transport.request(:get, "/v1/Services/#{encode_path_segment(chat_service_sid)}/Conversations/#{encode_path_segment(conversation_sid)}")
677
662
  )
678
663
  end
679
664
 
680
665
  def update_conversation(chat_service_sid, conversation_sid, **kwargs)
681
666
  ConversationsV1ServiceConversation.from_hash(
682
- @transport.request(:post, "/v1/Services/#{chat_service_sid}/Conversations/#{conversation_sid}",
683
- form: build_form(SERVICE_CONVERSATION_UPDATE_FIELDS, kwargs))
667
+ @transport.request(:post, "/v1/Services/#{encode_path_segment(chat_service_sid)}/Conversations/#{encode_path_segment(conversation_sid)}",
668
+ form: form_params(SERVICE_CONVERSATION_UPDATE_FIELDS, kwargs))
684
669
  )
685
670
  end
686
671
 
687
672
  def delete_conversation(chat_service_sid, conversation_sid)
688
- @transport.request(:delete, "/v1/Services/#{chat_service_sid}/Conversations/#{conversation_sid}")
673
+ @transport.request(:delete, "/v1/Services/#{encode_path_segment(chat_service_sid)}/Conversations/#{encode_path_segment(conversation_sid)}")
689
674
  nil
690
675
  end
691
676
 
@@ -696,18 +681,6 @@ module VoiceML
696
681
  ConversationsV1ServiceScopeResource.new(@transport, chat_service_sid)
697
682
  end
698
683
 
699
- private
700
-
701
- def build_form(map, kwargs)
702
- out = {}
703
- map.each do |wire, k|
704
- value = kwargs[k]
705
- next if value.nil?
706
-
707
- out[wire] = value
708
- end
709
- out
710
- end
711
684
  end
712
685
 
713
686
  # ============================================================================
@@ -716,6 +689,8 @@ module VoiceML
716
689
  # Flat method style matches the rest of conversations_v1.
717
690
  # ============================================================================
718
691
  class ConversationsV1ServiceScopeResource
692
+ include V1Pages
693
+ include FieldMapping
719
694
  CONVERSATION_FIELDS = {
720
695
  'FriendlyName' => :friendly_name,
721
696
  'UniqueName' => :unique_name,
@@ -847,25 +822,25 @@ module VoiceML
847
822
 
848
823
  def create_conversation(**kwargs)
849
824
  ConversationsV1ServiceConversation.from_hash(
850
- @transport.request(:post, conv_root, form: build_form(CONVERSATION_FIELDS, kwargs))
825
+ @transport.request(:post, conv_root, form: form_params(CONVERSATION_FIELDS, kwargs))
851
826
  )
852
827
  end
853
828
 
854
829
  def fetch_conversation(conversation_sid)
855
830
  ConversationsV1ServiceConversation.from_hash(
856
- @transport.request(:get, "#{conv_root}/#{conversation_sid}")
831
+ @transport.request(:get, "#{conv_root}/#{encode_path_segment(conversation_sid)}")
857
832
  )
858
833
  end
859
834
 
860
835
  def update_conversation(conversation_sid, **kwargs)
861
836
  ConversationsV1ServiceConversation.from_hash(
862
- @transport.request(:post, "#{conv_root}/#{conversation_sid}",
863
- form: build_form(CONVERSATION_UPDATE_FIELDS, kwargs))
837
+ @transport.request(:post, "#{conv_root}/#{encode_path_segment(conversation_sid)}",
838
+ form: form_params(CONVERSATION_UPDATE_FIELDS, kwargs))
864
839
  )
865
840
  end
866
841
 
867
842
  def delete_conversation(conversation_sid)
868
- @transport.request(:delete, "#{conv_root}/#{conversation_sid}")
843
+ @transport.request(:delete, "#{conv_root}/#{encode_path_segment(conversation_sid)}")
869
844
  nil
870
845
  end
871
846
 
@@ -874,32 +849,32 @@ module VoiceML
874
849
  params = {}
875
850
  params['PageSize'] = page_size unless page_size.nil?
876
851
  ConversationsV1ServiceConversationMessageList.new(
877
- @transport.request(:get, "#{conv_root}/#{conversation_sid}/Messages", params: params)
852
+ @transport.request(:get, "#{conv_root}/#{encode_path_segment(conversation_sid)}/Messages", params: params)
878
853
  )
879
854
  end
880
855
 
881
856
  def create_message(conversation_sid, **kwargs)
882
857
  ConversationsV1ServiceConversationMessage.from_hash(
883
- @transport.request(:post, "#{conv_root}/#{conversation_sid}/Messages",
884
- form: build_form(MESSAGE_FIELDS, kwargs))
858
+ @transport.request(:post, "#{conv_root}/#{encode_path_segment(conversation_sid)}/Messages",
859
+ form: form_params(MESSAGE_FIELDS, kwargs))
885
860
  )
886
861
  end
887
862
 
888
863
  def fetch_message(conversation_sid, message_sid)
889
864
  ConversationsV1ServiceConversationMessage.from_hash(
890
- @transport.request(:get, "#{conv_root}/#{conversation_sid}/Messages/#{message_sid}")
865
+ @transport.request(:get, "#{conv_root}/#{encode_path_segment(conversation_sid)}/Messages/#{encode_path_segment(message_sid)}")
891
866
  )
892
867
  end
893
868
 
894
869
  def update_message(conversation_sid, message_sid, **kwargs)
895
870
  ConversationsV1ServiceConversationMessage.from_hash(
896
- @transport.request(:post, "#{conv_root}/#{conversation_sid}/Messages/#{message_sid}",
897
- form: build_form(MESSAGE_UPDATE_FIELDS, kwargs))
871
+ @transport.request(:post, "#{conv_root}/#{encode_path_segment(conversation_sid)}/Messages/#{encode_path_segment(message_sid)}",
872
+ form: form_params(MESSAGE_UPDATE_FIELDS, kwargs))
898
873
  )
899
874
  end
900
875
 
901
876
  def delete_message(conversation_sid, message_sid)
902
- @transport.request(:delete, "#{conv_root}/#{conversation_sid}/Messages/#{message_sid}")
877
+ @transport.request(:delete, "#{conv_root}/#{encode_path_segment(conversation_sid)}/Messages/#{encode_path_segment(message_sid)}")
903
878
  nil
904
879
  end
905
880
 
@@ -909,7 +884,7 @@ module VoiceML
909
884
  params['PageSize'] = page_size unless page_size.nil?
910
885
  ConversationsV1ServiceConversationMessageReceiptList.new(
911
886
  @transport.request(:get,
912
- "#{conv_root}/#{conversation_sid}/Messages/#{message_sid}/Receipts",
887
+ "#{conv_root}/#{encode_path_segment(conversation_sid)}/Messages/#{encode_path_segment(message_sid)}/Receipts",
913
888
  params: params)
914
889
  )
915
890
  end
@@ -917,7 +892,7 @@ module VoiceML
917
892
  def fetch_message_receipt(conversation_sid, message_sid, sid)
918
893
  ConversationsV1ServiceConversationMessageReceipt.from_hash(
919
894
  @transport.request(:get,
920
- "#{conv_root}/#{conversation_sid}/Messages/#{message_sid}/Receipts/#{sid}")
895
+ "#{conv_root}/#{encode_path_segment(conversation_sid)}/Messages/#{encode_path_segment(message_sid)}/Receipts/#{encode_path_segment(sid)}")
921
896
  )
922
897
  end
923
898
 
@@ -926,32 +901,32 @@ module VoiceML
926
901
  params = {}
927
902
  params['PageSize'] = page_size unless page_size.nil?
928
903
  ConversationsV1ServiceConversationParticipantList.new(
929
- @transport.request(:get, "#{conv_root}/#{conversation_sid}/Participants", params: params)
904
+ @transport.request(:get, "#{conv_root}/#{encode_path_segment(conversation_sid)}/Participants", params: params)
930
905
  )
931
906
  end
932
907
 
933
908
  def create_participant(conversation_sid, **kwargs)
934
909
  ConversationsV1ServiceConversationParticipant.from_hash(
935
- @transport.request(:post, "#{conv_root}/#{conversation_sid}/Participants",
936
- form: build_form(PARTICIPANT_FIELDS, kwargs))
910
+ @transport.request(:post, "#{conv_root}/#{encode_path_segment(conversation_sid)}/Participants",
911
+ form: form_params(PARTICIPANT_FIELDS, kwargs))
937
912
  )
938
913
  end
939
914
 
940
915
  def fetch_participant(conversation_sid, participant_sid)
941
916
  ConversationsV1ServiceConversationParticipant.from_hash(
942
- @transport.request(:get, "#{conv_root}/#{conversation_sid}/Participants/#{participant_sid}")
917
+ @transport.request(:get, "#{conv_root}/#{encode_path_segment(conversation_sid)}/Participants/#{encode_path_segment(participant_sid)}")
943
918
  )
944
919
  end
945
920
 
946
921
  def update_participant(conversation_sid, participant_sid, **kwargs)
947
922
  ConversationsV1ServiceConversationParticipant.from_hash(
948
- @transport.request(:post, "#{conv_root}/#{conversation_sid}/Participants/#{participant_sid}",
949
- form: build_form(PARTICIPANT_UPDATE_FIELDS, kwargs))
923
+ @transport.request(:post, "#{conv_root}/#{encode_path_segment(conversation_sid)}/Participants/#{encode_path_segment(participant_sid)}",
924
+ form: form_params(PARTICIPANT_UPDATE_FIELDS, kwargs))
950
925
  )
951
926
  end
952
927
 
953
928
  def delete_participant(conversation_sid, participant_sid)
954
- @transport.request(:delete, "#{conv_root}/#{conversation_sid}/Participants/#{participant_sid}")
929
+ @transport.request(:delete, "#{conv_root}/#{encode_path_segment(conversation_sid)}/Participants/#{encode_path_segment(participant_sid)}")
955
930
  nil
956
931
  end
957
932
 
@@ -960,33 +935,33 @@ module VoiceML
960
935
  params = {}
961
936
  params['PageSize'] = page_size unless page_size.nil?
962
937
  ConversationsV1ServiceConversationScopedWebhookList.new(
963
- @transport.request(:get, "#{conv_root}/#{conversation_sid}/Webhooks", params: params)
938
+ @transport.request(:get, "#{conv_root}/#{encode_path_segment(conversation_sid)}/Webhooks", params: params)
964
939
  )
965
940
  end
966
941
 
967
942
  def create_webhook(conversation_sid, target:, **kwargs)
968
943
  kwargs[:target] = target
969
944
  ConversationsV1ServiceConversationScopedWebhook.from_hash(
970
- @transport.request(:post, "#{conv_root}/#{conversation_sid}/Webhooks",
971
- form: build_form(WEBHOOK_FIELDS, kwargs))
945
+ @transport.request(:post, "#{conv_root}/#{encode_path_segment(conversation_sid)}/Webhooks",
946
+ form: form_params(WEBHOOK_FIELDS, kwargs))
972
947
  )
973
948
  end
974
949
 
975
950
  def fetch_webhook(conversation_sid, webhook_sid)
976
951
  ConversationsV1ServiceConversationScopedWebhook.from_hash(
977
- @transport.request(:get, "#{conv_root}/#{conversation_sid}/Webhooks/#{webhook_sid}")
952
+ @transport.request(:get, "#{conv_root}/#{encode_path_segment(conversation_sid)}/Webhooks/#{encode_path_segment(webhook_sid)}")
978
953
  )
979
954
  end
980
955
 
981
956
  def update_webhook(conversation_sid, webhook_sid, **kwargs)
982
957
  ConversationsV1ServiceConversationScopedWebhook.from_hash(
983
- @transport.request(:post, "#{conv_root}/#{conversation_sid}/Webhooks/#{webhook_sid}",
984
- form: build_form(WEBHOOK_UPDATE_FIELDS, kwargs))
958
+ @transport.request(:post, "#{conv_root}/#{encode_path_segment(conversation_sid)}/Webhooks/#{encode_path_segment(webhook_sid)}",
959
+ form: form_params(WEBHOOK_UPDATE_FIELDS, kwargs))
985
960
  )
986
961
  end
987
962
 
988
963
  def delete_webhook(conversation_sid, webhook_sid)
989
- @transport.request(:delete, "#{conv_root}/#{conversation_sid}/Webhooks/#{webhook_sid}")
964
+ @transport.request(:delete, "#{conv_root}/#{encode_path_segment(conversation_sid)}/Webhooks/#{encode_path_segment(webhook_sid)}")
990
965
  nil
991
966
  end
992
967
 
@@ -994,7 +969,7 @@ module VoiceML
994
969
  def create_conversation_with_participants(**kwargs)
995
970
  ConversationsV1ServiceConversationWithParticipants.from_hash(
996
971
  @transport.request(:post, "#{svc_root}/ConversationWithParticipants",
997
- form: build_form(CONV_WITH_PARTICIPANTS_FIELDS, kwargs))
972
+ form: form_params(CONV_WITH_PARTICIPANTS_FIELDS, kwargs))
998
973
  )
999
974
  end
1000
975
 
@@ -1014,7 +989,7 @@ module VoiceML
1014
989
  params = {}
1015
990
  params['PageSize'] = page_size unless page_size.nil?
1016
991
  ConversationsV1ServiceUserConversationList.new(
1017
- @transport.request(:get, "#{svc_root}/Users/#{user_sid}/Conversations", params: params)
992
+ @transport.request(:get, "#{svc_root}/Users/#{encode_path_segment(user_sid)}/Conversations", params: params)
1018
993
  )
1019
994
  end
1020
995
 
@@ -1036,19 +1011,19 @@ module VoiceML
1036
1011
 
1037
1012
  def fetch_role(role_sid)
1038
1013
  ConversationsV1ServiceRole.from_hash(
1039
- @transport.request(:get, "#{svc_root}/Roles/#{role_sid}")
1014
+ @transport.request(:get, "#{svc_root}/Roles/#{encode_path_segment(role_sid)}")
1040
1015
  )
1041
1016
  end
1042
1017
 
1043
1018
  def update_role(role_sid, permission:)
1044
1019
  form = { 'Permission' => Array(permission) }
1045
1020
  ConversationsV1ServiceRole.from_hash(
1046
- @transport.request(:post, "#{svc_root}/Roles/#{role_sid}", form: form)
1021
+ @transport.request(:post, "#{svc_root}/Roles/#{encode_path_segment(role_sid)}", form: form)
1047
1022
  )
1048
1023
  end
1049
1024
 
1050
1025
  def delete_role(role_sid)
1051
- @transport.request(:delete, "#{svc_root}/Roles/#{role_sid}")
1026
+ @transport.request(:delete, "#{svc_root}/Roles/#{encode_path_segment(role_sid)}")
1052
1027
  nil
1053
1028
  end
1054
1029
 
@@ -1065,25 +1040,25 @@ module VoiceML
1065
1040
  kwargs = { identity: identity, friendly_name: friendly_name,
1066
1041
  attributes: attributes, role_sid: role_sid }
1067
1042
  ConversationsV1ServiceUser.from_hash(
1068
- @transport.request(:post, "#{svc_root}/Users", form: build_form(USER_FIELDS, kwargs))
1043
+ @transport.request(:post, "#{svc_root}/Users", form: form_params(USER_FIELDS, kwargs))
1069
1044
  )
1070
1045
  end
1071
1046
 
1072
1047
  def fetch_user(user_sid)
1073
1048
  ConversationsV1ServiceUser.from_hash(
1074
- @transport.request(:get, "#{svc_root}/Users/#{user_sid}")
1049
+ @transport.request(:get, "#{svc_root}/Users/#{encode_path_segment(user_sid)}")
1075
1050
  )
1076
1051
  end
1077
1052
 
1078
1053
  def update_user(user_sid, **kwargs)
1079
1054
  ConversationsV1ServiceUser.from_hash(
1080
- @transport.request(:post, "#{svc_root}/Users/#{user_sid}",
1081
- form: build_form(USER_UPDATE_FIELDS, kwargs))
1055
+ @transport.request(:post, "#{svc_root}/Users/#{encode_path_segment(user_sid)}",
1056
+ form: form_params(USER_UPDATE_FIELDS, kwargs))
1082
1057
  )
1083
1058
  end
1084
1059
 
1085
1060
  def delete_user(user_sid)
1086
- @transport.request(:delete, "#{svc_root}/Users/#{user_sid}")
1061
+ @transport.request(:delete, "#{svc_root}/Users/#{encode_path_segment(user_sid)}")
1087
1062
  nil
1088
1063
  end
1089
1064
 
@@ -1100,12 +1075,12 @@ module VoiceML
1100
1075
 
1101
1076
  def fetch_binding(sid)
1102
1077
  ConversationsV1ServiceBinding.from_hash(
1103
- @transport.request(:get, "#{svc_root}/Bindings/#{sid}")
1078
+ @transport.request(:get, "#{svc_root}/Bindings/#{encode_path_segment(sid)}")
1104
1079
  )
1105
1080
  end
1106
1081
 
1107
1082
  def delete_binding(sid)
1108
- @transport.request(:delete, "#{svc_root}/Bindings/#{sid}")
1083
+ @transport.request(:delete, "#{svc_root}/Bindings/#{encode_path_segment(sid)}")
1109
1084
  nil
1110
1085
  end
1111
1086
 
@@ -1119,7 +1094,7 @@ module VoiceML
1119
1094
  def update_configuration(**kwargs)
1120
1095
  ConversationsV1ServiceConfiguration.from_hash(
1121
1096
  @transport.request(:post, "#{svc_root}/Configuration",
1122
- form: build_form(CONFIG_UPDATE_FIELDS, kwargs))
1097
+ form: form_params(CONFIG_UPDATE_FIELDS, kwargs))
1123
1098
  )
1124
1099
  end
1125
1100
 
@@ -1133,7 +1108,7 @@ module VoiceML
1133
1108
  def update_notifications(**kwargs)
1134
1109
  ConversationsV1ServiceNotification.from_hash(
1135
1110
  @transport.request(:post, "#{svc_root}/Configuration/Notifications",
1136
- form: build_form(NOTIFICATION_UPDATE_FIELDS, kwargs))
1111
+ form: form_params(NOTIFICATION_UPDATE_FIELDS, kwargs))
1137
1112
  )
1138
1113
  end
1139
1114
 
@@ -1147,21 +1122,21 @@ module VoiceML
1147
1122
  def update_webhook_configuration(**kwargs)
1148
1123
  ConversationsV1ServiceWebhookConfiguration.from_hash(
1149
1124
  @transport.request(:post, "#{svc_root}/Configuration/Webhooks",
1150
- form: build_form(WEBHOOK_CONFIG_UPDATE_FIELDS, kwargs))
1125
+ form: form_params(WEBHOOK_CONFIG_UPDATE_FIELDS, kwargs))
1151
1126
  )
1152
1127
  end
1153
1128
 
1154
1129
  private
1155
1130
 
1156
1131
  def svc_root
1157
- "/v1/Services/#{@chat_service_sid}"
1132
+ "/v1/Services/#{encode_path_segment(@chat_service_sid)}"
1158
1133
  end
1159
1134
 
1160
1135
  def conv_root
1161
1136
  "#{svc_root}/Conversations"
1162
1137
  end
1163
1138
 
1164
- def build_form(map, kwargs)
1139
+ def form_params(map, kwargs)
1165
1140
  out = {}
1166
1141
  map.each do |wire, k|
1167
1142
  value = kwargs[k]