bandwidth-sdk 2.1.1 → 6.1.0

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 (98) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +1 -1
  3. data/README.md +85 -70
  4. data/lib/bandwidth.rb +31 -2
  5. data/lib/bandwidth/api_helper.rb +14 -9
  6. data/lib/bandwidth/client.rb +22 -2
  7. data/lib/bandwidth/configuration.rb +67 -12
  8. data/lib/bandwidth/http/api_response.rb +2 -0
  9. data/lib/bandwidth/http/auth/two_factor_auth_basic_auth.rb +22 -0
  10. data/lib/bandwidth/http/auth/web_rtc_basic_auth.rb +22 -0
  11. data/lib/bandwidth/http/faraday_client.rb +5 -2
  12. data/lib/bandwidth/messaging_lib/messaging.rb +5 -3
  13. data/lib/bandwidth/messaging_lib/messaging/client.rb +13 -2
  14. data/lib/bandwidth/messaging_lib/messaging/controllers/api_controller.rb +191 -113
  15. data/lib/bandwidth/messaging_lib/messaging/controllers/base_controller.rb +1 -1
  16. data/lib/bandwidth/messaging_lib/messaging/exceptions/{generic_client_exception.rb → messaging_exception.rb} +2 -14
  17. data/lib/bandwidth/messaging_lib/messaging/models/bandwidth_message.rb +23 -13
  18. data/lib/bandwidth/messaging_lib/messaging/models/bandwidth_message_item.rb +125 -0
  19. data/lib/bandwidth/messaging_lib/messaging/models/bandwidth_messages_list.rb +60 -0
  20. data/lib/bandwidth/messaging_lib/messaging/models/media.rb +4 -4
  21. data/lib/bandwidth/messaging_lib/messaging/models/message_request.rb +21 -8
  22. data/lib/bandwidth/messaging_lib/messaging/models/page_info.rb +62 -0
  23. data/lib/bandwidth/messaging_lib/messaging/models/priority_enum.rb +19 -0
  24. data/lib/bandwidth/two_factor_auth_lib/two_factor_auth.rb +22 -0
  25. data/lib/bandwidth/two_factor_auth_lib/two_factor_auth/client.rb +51 -0
  26. data/lib/bandwidth/two_factor_auth_lib/two_factor_auth/controllers/base_controller.rb +49 -0
  27. data/lib/bandwidth/two_factor_auth_lib/two_factor_auth/controllers/mfa_controller.rb +209 -0
  28. data/lib/bandwidth/two_factor_auth_lib/two_factor_auth/exceptions/error_with_request_exception.rb +34 -0
  29. data/lib/bandwidth/two_factor_auth_lib/two_factor_auth/exceptions/forbidden_request_exception.rb +29 -0
  30. data/lib/bandwidth/two_factor_auth_lib/two_factor_auth/exceptions/unauthorized_request_exception.rb +29 -0
  31. data/lib/bandwidth/two_factor_auth_lib/two_factor_auth/models/two_factor_code_request_schema.rb +88 -0
  32. data/lib/bandwidth/two_factor_auth_lib/two_factor_auth/models/two_factor_messaging_response.rb +35 -0
  33. data/lib/bandwidth/two_factor_auth_lib/two_factor_auth/models/two_factor_verify_code_response.rb +35 -0
  34. data/lib/bandwidth/two_factor_auth_lib/two_factor_auth/models/two_factor_verify_request_schema.rb +75 -0
  35. data/lib/bandwidth/two_factor_auth_lib/two_factor_auth/models/two_factor_voice_response.rb +35 -0
  36. data/lib/bandwidth/utilities/file_wrapper.rb +17 -0
  37. data/lib/bandwidth/voice_lib/bxml/verbs/bridge.rb +28 -0
  38. data/lib/bandwidth/voice_lib/bxml/verbs/conference.rb +32 -0
  39. data/lib/bandwidth/voice_lib/bxml/verbs/gather.rb +13 -1
  40. data/lib/bandwidth/voice_lib/bxml/verbs/phone_number.rb +7 -1
  41. data/lib/bandwidth/voice_lib/bxml/verbs/record.rb +9 -1
  42. data/lib/bandwidth/voice_lib/bxml/verbs/redirect.rb +5 -1
  43. data/lib/bandwidth/voice_lib/bxml/verbs/ring.rb +15 -0
  44. data/lib/bandwidth/voice_lib/bxml/verbs/send_dtmf.rb +4 -1
  45. data/lib/bandwidth/voice_lib/bxml/verbs/sip_uri.rb +25 -0
  46. data/lib/bandwidth/voice_lib/bxml/verbs/start_gather.rb +20 -0
  47. data/lib/bandwidth/voice_lib/bxml/verbs/start_recording.rb +4 -1
  48. data/lib/bandwidth/voice_lib/bxml/verbs/stop_gather.rb +14 -0
  49. data/lib/bandwidth/voice_lib/bxml/verbs/tag.rb +13 -0
  50. data/lib/bandwidth/voice_lib/bxml/verbs/transfer.rb +14 -3
  51. data/lib/bandwidth/voice_lib/voice.rb +19 -4
  52. data/lib/bandwidth/voice_lib/voice/client.rb +13 -2
  53. data/lib/bandwidth/voice_lib/voice/controllers/api_controller.rb +1219 -133
  54. data/lib/bandwidth/voice_lib/voice/controllers/base_controller.rb +1 -1
  55. data/lib/bandwidth/voice_lib/voice/exceptions/{error_response_exception.rb → api_error_response_exception.rb} +3 -3
  56. data/lib/bandwidth/voice_lib/voice/models/answer_fallback_method_enum.rb +17 -0
  57. data/lib/bandwidth/voice_lib/voice/models/api_call_response.rb +56 -2
  58. data/lib/bandwidth/voice_lib/voice/models/api_call_state_response.rb +164 -0
  59. data/lib/bandwidth/voice_lib/voice/models/api_create_call_request.rb +135 -12
  60. data/lib/bandwidth/voice_lib/voice/models/api_modify_call_request.rb +37 -1
  61. data/lib/bandwidth/voice_lib/voice/models/api_modify_conference_request.rb +107 -0
  62. data/lib/bandwidth/voice_lib/voice/models/api_transcribe_recording_request.rb +80 -0
  63. data/lib/bandwidth/voice_lib/voice/models/callback_method_enum.rb +35 -0
  64. data/lib/bandwidth/voice_lib/voice/models/conference_detail.rb +108 -0
  65. data/lib/bandwidth/voice_lib/voice/models/conference_event_method_enum.rb +35 -0
  66. data/lib/bandwidth/voice_lib/voice/models/conference_member_detail.rb +80 -0
  67. data/lib/bandwidth/voice_lib/voice/models/conference_recording_metadata_response.rb +126 -0
  68. data/lib/bandwidth/voice_lib/voice/models/disconnect_cause_enum.rb +47 -0
  69. data/lib/bandwidth/voice_lib/voice/models/modify_call_recording_state.rb +1 -1
  70. data/lib/bandwidth/voice_lib/voice/models/recording_metadata_response.rb +66 -28
  71. data/lib/bandwidth/voice_lib/voice/models/redirect_fallback_method_enum.rb +17 -0
  72. data/lib/bandwidth/voice_lib/voice/models/state1_enum.rb +4 -7
  73. data/lib/bandwidth/voice_lib/voice/models/state2_enum.rb +20 -0
  74. data/lib/bandwidth/voice_lib/voice/models/state_enum.rb +7 -4
  75. data/lib/bandwidth/voice_lib/voice/models/status1_enum.rb +29 -0
  76. data/lib/bandwidth/voice_lib/voice/models/status3_enum.rb +32 -0
  77. data/lib/bandwidth/voice_lib/voice/models/status_enum.rb +17 -0
  78. data/lib/bandwidth/{messaging_lib/messaging/models/field_error.rb → voice_lib/voice/models/transcript.rb} +15 -15
  79. data/lib/bandwidth/voice_lib/voice/models/transcription.rb +62 -0
  80. data/lib/bandwidth/voice_lib/voice/models/transcription_response.rb +42 -0
  81. data/lib/bandwidth/web_rtc_lib/utils/web_rtc_transfer.rb +13 -0
  82. data/lib/bandwidth/web_rtc_lib/web_rtc.rb +22 -0
  83. data/lib/bandwidth/web_rtc_lib/web_rtc/client.rb +51 -0
  84. data/lib/bandwidth/web_rtc_lib/web_rtc/controllers/api_controller.rb +692 -0
  85. data/lib/bandwidth/web_rtc_lib/web_rtc/controllers/base_controller.rb +49 -0
  86. data/lib/bandwidth/{messaging_lib/messaging/exceptions/path_client_exception.rb → web_rtc_lib/web_rtc/exceptions/error_exception.rb} +4 -19
  87. data/lib/bandwidth/web_rtc_lib/web_rtc/models/accounts_participants_response.rb +47 -0
  88. data/lib/bandwidth/web_rtc_lib/web_rtc/models/device_api_version_enum.rb +17 -0
  89. data/lib/bandwidth/web_rtc_lib/web_rtc/models/participant.rb +92 -0
  90. data/lib/bandwidth/web_rtc_lib/web_rtc/models/participant_subscription.rb +35 -0
  91. data/lib/bandwidth/web_rtc_lib/web_rtc/models/publish_permission_enum.rb +17 -0
  92. data/lib/bandwidth/web_rtc_lib/web_rtc/models/session.rb +44 -0
  93. data/lib/bandwidth/web_rtc_lib/web_rtc/models/subscriptions.rb +54 -0
  94. data/test/integration/test_integration.rb +570 -0
  95. metadata +132 -19
  96. data/lib/bandwidth/voice_lib/voice/models/api_get_account_recordings_metadata_request.rb +0 -65
  97. data/lib/bandwidth/voice_lib/voice/models/transcription_status_enum.rb +0 -20
  98. data/lib/bandwidth/voice_lib/voice/models/type_enum.rb +0 -32
@@ -25,10 +25,12 @@ module Bandwidth
25
25
  @errors = errors
26
26
  end
27
27
 
28
+ # returns true if status_code is between 200-300
28
29
  def success?
29
30
  status_code >= 200 && status_code < 300
30
31
  end
31
32
 
33
+ # returns true if status_code is between 400-600
32
34
  def error?
33
35
  status_code >= 400 && status_code < 600
34
36
  end
@@ -0,0 +1,22 @@
1
+ # bandwidth
2
+ #
3
+ # This file was automatically generated by APIMATIC v2.0
4
+ # ( https://apimatic.io ).
5
+
6
+ require 'base64'
7
+
8
+ module Bandwidth
9
+ # Utility class for basic authorization.
10
+ class TwoFactorAuthBasicAuth
11
+ # Add basic authentication to the request.
12
+ # @param [HttpRequest] The HttpRequest object to which authentication will
13
+ # be added.
14
+ def self.apply(config, http_request)
15
+ username = config.two_factor_auth_basic_auth_user_name
16
+ password = config.two_factor_auth_basic_auth_password
17
+ value = Base64.strict_encode64("#{username}:#{password}")
18
+ header_value = "Basic #{value}"
19
+ http_request.headers['Authorization'] = header_value
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,22 @@
1
+ # bandwidth
2
+ #
3
+ # This file was automatically generated by APIMATIC v2.0
4
+ # ( https://apimatic.io ).
5
+
6
+ require 'base64'
7
+
8
+ module Bandwidth
9
+ # Utility class for basic authorization.
10
+ class WebRtcBasicAuth
11
+ # Add basic authentication to the request.
12
+ # @param [HttpRequest] The HttpRequest object to which authentication will
13
+ # be added.
14
+ def self.apply(config, http_request)
15
+ username = config.web_rtc_basic_auth_user_name
16
+ password = config.web_rtc_basic_auth_password
17
+ value = Base64.strict_encode64("#{username}:#{password}")
18
+ header_value = "Basic #{value}"
19
+ http_request.headers['Authorization'] = header_value
20
+ end
21
+ end
22
+ end
@@ -15,6 +15,7 @@ module Bandwidth
15
15
  @connection = Faraday.new do |faraday|
16
16
  faraday.use Faraday::HttpCache, serializer: Marshal if cache
17
17
  faraday.use FaradayMiddleware::FollowRedirects
18
+ faraday.use :gzip
18
19
  faraday.request :multipart
19
20
  faraday.request :url_encoded
20
21
  faraday.ssl[:ca_file] = Certifi.where
@@ -34,7 +35,8 @@ module Bandwidth
34
35
  http_request.query_url
35
36
  ) do |request|
36
37
  request.headers = http_request.headers
37
- unless http_request.parameters.empty?
38
+ unless http_request.http_method == HttpMethodEnum::GET &&
39
+ http_request.parameters.empty?
38
40
  request.body = http_request.parameters
39
41
  end
40
42
  end
@@ -48,7 +50,8 @@ module Bandwidth
48
50
  http_request.query_url
49
51
  ) do |request|
50
52
  request.headers = http_request.headers
51
- unless http_request.parameters.empty?
53
+ unless http_request.http_method == HttpMethodEnum::GET &&
54
+ http_request.parameters.empty?
52
55
  request.body = http_request.parameters
53
56
  end
54
57
  end
@@ -7,17 +7,19 @@
7
7
  require_relative 'messaging/client.rb'
8
8
 
9
9
  # Models
10
- require_relative 'messaging/models/field_error.rb'
10
+ require_relative 'messaging/models/bandwidth_messages_list.rb'
11
+ require_relative 'messaging/models/bandwidth_message_item.rb'
12
+ require_relative 'messaging/models/page_info.rb'
11
13
  require_relative 'messaging/models/media.rb'
12
14
  require_relative 'messaging/models/tag.rb'
13
15
  require_relative 'messaging/models/deferred_result.rb'
14
16
  require_relative 'messaging/models/bandwidth_callback_message.rb'
15
17
  require_relative 'messaging/models/bandwidth_message.rb'
16
18
  require_relative 'messaging/models/message_request.rb'
19
+ require_relative 'messaging/models/priority_enum.rb'
17
20
 
18
21
  # Exceptions
19
- require_relative 'messaging/exceptions/generic_client_exception.rb'
20
- require_relative 'messaging/exceptions/path_client_exception.rb'
22
+ require_relative 'messaging/exceptions/messaging_exception.rb'
21
23
  # Controllers
22
24
  require_relative 'messaging/controllers/base_controller.rb'
23
25
  require_relative 'messaging/controllers/api_controller.rb'
@@ -17,20 +17,31 @@ module Bandwidth
17
17
 
18
18
  def initialize(timeout: 60, max_retries: 0, retry_interval: 1,
19
19
  backoff_factor: 1, environment: Environment::PRODUCTION,
20
+ base_url: 'https://www.example.com',
20
21
  messaging_basic_auth_user_name: 'TODO: Replace',
21
22
  messaging_basic_auth_password: 'TODO: Replace',
23
+ two_factor_auth_basic_auth_user_name: 'TODO: Replace',
24
+ two_factor_auth_basic_auth_password: 'TODO: Replace',
22
25
  voice_basic_auth_user_name: 'TODO: Replace',
23
- voice_basic_auth_password: 'TODO: Replace', config: nil)
26
+ voice_basic_auth_password: 'TODO: Replace',
27
+ web_rtc_basic_auth_user_name: 'TODO: Replace',
28
+ web_rtc_basic_auth_password: 'TODO: Replace',
29
+ config: nil)
24
30
  @config = if config.nil?
25
31
  Configuration.new(timeout: timeout,
26
32
  max_retries: max_retries,
27
33
  retry_interval: retry_interval,
28
34
  backoff_factor: backoff_factor,
29
35
  environment: environment,
36
+ base_url: base_url,
30
37
  messaging_basic_auth_user_name: messaging_basic_auth_user_name,
31
38
  messaging_basic_auth_password: messaging_basic_auth_password,
39
+ two_factor_auth_basic_auth_user_name: two_factor_auth_basic_auth_user_name,
40
+ two_factor_auth_basic_auth_password: two_factor_auth_basic_auth_password,
32
41
  voice_basic_auth_user_name: voice_basic_auth_user_name,
33
- voice_basic_auth_password: voice_basic_auth_password)
42
+ voice_basic_auth_password: voice_basic_auth_password,
43
+ web_rtc_basic_auth_user_name: web_rtc_basic_auth_user_name,
44
+ web_rtc_basic_auth_password: web_rtc_basic_auth_password)
34
45
  else
35
46
  config
36
47
  end
@@ -11,62 +11,10 @@ module Messaging
11
11
  super(config, http_call_back: http_call_back)
12
12
  end
13
13
 
14
- # getMessage
15
- # @return [void] response from the API call
16
- def get_message
17
- # Prepare query url.
18
- _query_builder = config.get_base_uri(Server::MESSAGINGDEFAULT)
19
- _query_builder << '/ping'
20
- _query_url = APIHelper.clean_url _query_builder
21
-
22
- # Prepare and execute HttpRequest.
23
- _request = config.http_client.get(
24
- _query_url
25
- )
26
- MessagingBasicAuth.apply(config, _request)
27
- _response = execute_request(_request)
28
-
29
- # Validate response against endpoint and global error codes.
30
- if _response.status_code == 400
31
- raise GenericClientException.new(
32
- '400 Request is malformed or invalid',
33
- _response
34
- )
35
- elsif _response.status_code == 401
36
- raise PathClientException.new(
37
- '401 The specified user does not have access to the account',
38
- _response
39
- )
40
- elsif _response.status_code == 403
41
- raise PathClientException.new(
42
- '403 The user does not have access to this API',
43
- _response
44
- )
45
- elsif _response.status_code == 404
46
- raise PathClientException.new(
47
- '404 Path not found',
48
- _response
49
- )
50
- elsif _response.status_code == 415
51
- raise GenericClientException.new(
52
- '415 The content-type of the request is incorrect',
53
- _response
54
- )
55
- elsif _response.status_code == 429
56
- raise GenericClientException.new(
57
- '429 The rate limit has been reached',
58
- _response
59
- )
60
- end
61
- validate_response(_response)
62
-
63
- # Return appropriate response type.
64
- ApiResponse.new(_response)
65
- end
66
-
67
14
  # listMedia
68
- # @param [String] user_id Required parameter: Example:
69
- # @param [String] continuation_token Optional parameter: Example:
15
+ # @param [String] user_id Required parameter: User's account ID
16
+ # @param [String] continuation_token Optional parameter: Continuation token
17
+ # used to retrieve subsequent media.
70
18
  # @return [List of Media] response from the API call
71
19
  def list_media(user_id,
72
20
  continuation_token: nil)
@@ -75,7 +23,7 @@ module Messaging
75
23
  _query_builder << '/users/{userId}/media'
76
24
  _query_builder = APIHelper.append_url_with_template_parameters(
77
25
  _query_builder,
78
- 'userId' => user_id
26
+ 'userId' => { 'value' => user_id, 'encode' => false }
79
27
  )
80
28
  _query_url = APIHelper.clean_url _query_builder
81
29
 
@@ -95,32 +43,32 @@ module Messaging
95
43
 
96
44
  # Validate response against endpoint and global error codes.
97
45
  if _response.status_code == 400
98
- raise GenericClientException.new(
46
+ raise MessagingException.new(
99
47
  '400 Request is malformed or invalid',
100
48
  _response
101
49
  )
102
50
  elsif _response.status_code == 401
103
- raise PathClientException.new(
51
+ raise MessagingException.new(
104
52
  '401 The specified user does not have access to the account',
105
53
  _response
106
54
  )
107
55
  elsif _response.status_code == 403
108
- raise PathClientException.new(
56
+ raise MessagingException.new(
109
57
  '403 The user does not have access to this API',
110
58
  _response
111
59
  )
112
60
  elsif _response.status_code == 404
113
- raise PathClientException.new(
61
+ raise MessagingException.new(
114
62
  '404 Path not found',
115
63
  _response
116
64
  )
117
65
  elsif _response.status_code == 415
118
- raise GenericClientException.new(
66
+ raise MessagingException.new(
119
67
  '415 The content-type of the request is incorrect',
120
68
  _response
121
69
  )
122
70
  elsif _response.status_code == 429
123
- raise GenericClientException.new(
71
+ raise MessagingException.new(
124
72
  '429 The rate limit has been reached',
125
73
  _response
126
74
  )
@@ -129,13 +77,15 @@ module Messaging
129
77
 
130
78
  # Return appropriate response type.
131
79
  decoded = APIHelper.json_deserialize(_response.raw_body)
132
- ApiResponse.new(_response,
133
- data: decoded.map { |element| Media.from_hash(element) })
80
+ ApiResponse.new(
81
+ _response,
82
+ data: decoded.map { |element| Media.from_hash(element) }
83
+ )
134
84
  end
135
85
 
136
86
  # getMedia
137
- # @param [String] user_id Required parameter: Example:
138
- # @param [String] media_id Required parameter: Example:
87
+ # @param [String] user_id Required parameter: User's account ID
88
+ # @param [String] media_id Required parameter: Media ID to retrieve
139
89
  # @return [Binary] response from the API call
140
90
  def get_media(user_id,
141
91
  media_id)
@@ -144,8 +94,8 @@ module Messaging
144
94
  _query_builder << '/users/{userId}/media/{mediaId}'
145
95
  _query_builder = APIHelper.append_url_with_template_parameters(
146
96
  _query_builder,
147
- 'userId' => user_id,
148
- 'mediaId' => media_id
97
+ 'userId' => { 'value' => user_id, 'encode' => false },
98
+ 'mediaId' => { 'value' => media_id, 'encode' => false }
149
99
  )
150
100
  _query_url = APIHelper.clean_url _query_builder
151
101
 
@@ -158,32 +108,32 @@ module Messaging
158
108
 
159
109
  # Validate response against endpoint and global error codes.
160
110
  if _response.status_code == 400
161
- raise GenericClientException.new(
111
+ raise MessagingException.new(
162
112
  '400 Request is malformed or invalid',
163
113
  _response
164
114
  )
165
115
  elsif _response.status_code == 401
166
- raise PathClientException.new(
116
+ raise MessagingException.new(
167
117
  '401 The specified user does not have access to the account',
168
118
  _response
169
119
  )
170
120
  elsif _response.status_code == 403
171
- raise PathClientException.new(
121
+ raise MessagingException.new(
172
122
  '403 The user does not have access to this API',
173
123
  _response
174
124
  )
175
125
  elsif _response.status_code == 404
176
- raise PathClientException.new(
126
+ raise MessagingException.new(
177
127
  '404 Path not found',
178
128
  _response
179
129
  )
180
130
  elsif _response.status_code == 415
181
- raise GenericClientException.new(
131
+ raise MessagingException.new(
182
132
  '415 The content-type of the request is incorrect',
183
133
  _response
184
134
  )
185
135
  elsif _response.status_code == 429
186
- raise GenericClientException.new(
136
+ raise MessagingException.new(
187
137
  '429 The rate limit has been reached',
188
138
  _response
189
139
  )
@@ -191,37 +141,53 @@ module Messaging
191
141
  validate_response(_response)
192
142
 
193
143
  # Return appropriate response type.
194
- ApiResponse.new(_response, data: _response.raw_body)
144
+ ApiResponse.new(
145
+ _response, data: _response.raw_body
146
+ )
195
147
  end
196
148
 
197
149
  # uploadMedia
198
- # @param [String] user_id Required parameter: Example:
199
- # @param [String] media_id Required parameter: Example:
200
- # @param [Long] content_length Required parameter: Example:
201
- # @param [String] body Required parameter: Example:
202
- # @param [String] content_type Optional parameter: Example:
203
- # @param [String] cache_control Optional parameter: Example:
150
+ # @param [String] user_id Required parameter: User's account ID
151
+ # @param [String] media_id Required parameter: The user supplied custom
152
+ # media ID
153
+ # @param [Long] content_length Required parameter: The size of the
154
+ # entity-body
155
+ # @param [File | UploadIO] body Required parameter: Example:
156
+ # @param [String] content_type Optional parameter: The media type of the
157
+ # entity-body
158
+ # @param [String] cache_control Optional parameter: General-header field is
159
+ # used to specify directives that MUST be obeyed by all caching mechanisms
160
+ # along the request/response chain.
204
161
  # @return [void] response from the API call
205
162
  def upload_media(user_id,
206
163
  media_id,
207
164
  content_length,
208
165
  body,
209
- content_type: nil,
166
+ content_type: 'application/octet-stream',
210
167
  cache_control: nil)
211
168
  # Prepare query url.
212
169
  _query_builder = config.get_base_uri(Server::MESSAGINGDEFAULT)
213
170
  _query_builder << '/users/{userId}/media/{mediaId}'
214
171
  _query_builder = APIHelper.append_url_with_template_parameters(
215
172
  _query_builder,
216
- 'userId' => user_id,
217
- 'mediaId' => media_id
173
+ 'userId' => { 'value' => user_id, 'encode' => false },
174
+ 'mediaId' => { 'value' => media_id, 'encode' => false }
218
175
  )
219
176
  _query_url = APIHelper.clean_url _query_builder
220
177
 
178
+ if body.is_a? FileWrapper
179
+ body_wrapper = body.file
180
+ body_content_type = body.content_type
181
+ else
182
+ body_wrapper = body
183
+ body_content_type = content_type
184
+ end
185
+
221
186
  # Prepare headers.
222
187
  _headers = {
188
+ 'content-type' => body_content_type,
189
+ 'content-length' => body_wrapper.size.to_s,
223
190
  'Content-Length' => content_length,
224
- 'Content-Type' => content_type,
225
191
  'Cache-Control' => cache_control
226
192
  }
227
193
 
@@ -229,39 +195,39 @@ module Messaging
229
195
  _request = config.http_client.put(
230
196
  _query_url,
231
197
  headers: _headers,
232
- parameters: body
198
+ parameters: body_wrapper
233
199
  )
234
200
  MessagingBasicAuth.apply(config, _request)
235
201
  _response = execute_request(_request)
236
202
 
237
203
  # Validate response against endpoint and global error codes.
238
204
  if _response.status_code == 400
239
- raise GenericClientException.new(
205
+ raise MessagingException.new(
240
206
  '400 Request is malformed or invalid',
241
207
  _response
242
208
  )
243
209
  elsif _response.status_code == 401
244
- raise PathClientException.new(
210
+ raise MessagingException.new(
245
211
  '401 The specified user does not have access to the account',
246
212
  _response
247
213
  )
248
214
  elsif _response.status_code == 403
249
- raise PathClientException.new(
215
+ raise MessagingException.new(
250
216
  '403 The user does not have access to this API',
251
217
  _response
252
218
  )
253
219
  elsif _response.status_code == 404
254
- raise PathClientException.new(
220
+ raise MessagingException.new(
255
221
  '404 Path not found',
256
222
  _response
257
223
  )
258
224
  elsif _response.status_code == 415
259
- raise GenericClientException.new(
225
+ raise MessagingException.new(
260
226
  '415 The content-type of the request is incorrect',
261
227
  _response
262
228
  )
263
229
  elsif _response.status_code == 429
264
- raise GenericClientException.new(
230
+ raise MessagingException.new(
265
231
  '429 The rate limit has been reached',
266
232
  _response
267
233
  )
@@ -273,8 +239,8 @@ module Messaging
273
239
  end
274
240
 
275
241
  # deleteMedia
276
- # @param [String] user_id Required parameter: Example:
277
- # @param [String] media_id Required parameter: Example:
242
+ # @param [String] user_id Required parameter: User's account ID
243
+ # @param [String] media_id Required parameter: The media ID to delete
278
244
  # @return [void] response from the API call
279
245
  def delete_media(user_id,
280
246
  media_id)
@@ -283,8 +249,8 @@ module Messaging
283
249
  _query_builder << '/users/{userId}/media/{mediaId}'
284
250
  _query_builder = APIHelper.append_url_with_template_parameters(
285
251
  _query_builder,
286
- 'userId' => user_id,
287
- 'mediaId' => media_id
252
+ 'userId' => { 'value' => user_id, 'encode' => false },
253
+ 'mediaId' => { 'value' => media_id, 'encode' => false }
288
254
  )
289
255
  _query_url = APIHelper.clean_url _query_builder
290
256
 
@@ -297,32 +263,32 @@ module Messaging
297
263
 
298
264
  # Validate response against endpoint and global error codes.
299
265
  if _response.status_code == 400
300
- raise GenericClientException.new(
266
+ raise MessagingException.new(
301
267
  '400 Request is malformed or invalid',
302
268
  _response
303
269
  )
304
270
  elsif _response.status_code == 401
305
- raise PathClientException.new(
271
+ raise MessagingException.new(
306
272
  '401 The specified user does not have access to the account',
307
273
  _response
308
274
  )
309
275
  elsif _response.status_code == 403
310
- raise PathClientException.new(
276
+ raise MessagingException.new(
311
277
  '403 The user does not have access to this API',
312
278
  _response
313
279
  )
314
280
  elsif _response.status_code == 404
315
- raise PathClientException.new(
281
+ raise MessagingException.new(
316
282
  '404 Path not found',
317
283
  _response
318
284
  )
319
285
  elsif _response.status_code == 415
320
- raise GenericClientException.new(
286
+ raise MessagingException.new(
321
287
  '415 The content-type of the request is incorrect',
322
288
  _response
323
289
  )
324
290
  elsif _response.status_code == 429
325
- raise GenericClientException.new(
291
+ raise MessagingException.new(
326
292
  '429 The rate limit has been reached',
327
293
  _response
328
294
  )
@@ -333,18 +299,128 @@ module Messaging
333
299
  ApiResponse.new(_response)
334
300
  end
335
301
 
302
+ # getMessages
303
+ # @param [String] user_id Required parameter: User's account ID
304
+ # @param [String] message_id Optional parameter: The ID of the message to
305
+ # search for. Special characters need to be encoded using URL encoding
306
+ # @param [String] source_tn Optional parameter: The phone number that sent
307
+ # the message
308
+ # @param [String] destination_tn Optional parameter: The phone number that
309
+ # received the message
310
+ # @param [String] message_status Optional parameter: The status of the
311
+ # message. One of RECEIVED, QUEUED, SENDING, SENT, FAILED, DELIVERED,
312
+ # DLR_EXPIRED
313
+ # @param [Integer] error_code Optional parameter: The error code of the
314
+ # message
315
+ # @param [String] from_date_time Optional parameter: The start of the date
316
+ # range to search in ISO 8601 format. Uses the message receive time. The
317
+ # date range to search in is currently 14 days.
318
+ # @param [String] to_date_time Optional parameter: The end of the date range
319
+ # to search in ISO 8601 format. Uses the message receive time. The date
320
+ # range to search in is currently 14 days.
321
+ # @param [String] page_token Optional parameter: A base64 encoded value used
322
+ # for pagination of results
323
+ # @param [Integer] limit Optional parameter: The maximum records requested
324
+ # in search result. Default 100. The sum of limit and after cannot be more
325
+ # than 10000
326
+ # @return [BandwidthMessagesList] response from the API call
327
+ def get_messages(user_id,
328
+ message_id: nil,
329
+ source_tn: nil,
330
+ destination_tn: nil,
331
+ message_status: nil,
332
+ error_code: nil,
333
+ from_date_time: nil,
334
+ to_date_time: nil,
335
+ page_token: nil,
336
+ limit: nil)
337
+ # Prepare query url.
338
+ _query_builder = config.get_base_uri(Server::MESSAGINGDEFAULT)
339
+ _query_builder << '/users/{userId}/messages'
340
+ _query_builder = APIHelper.append_url_with_template_parameters(
341
+ _query_builder,
342
+ 'userId' => { 'value' => user_id, 'encode' => false }
343
+ )
344
+ _query_builder = APIHelper.append_url_with_query_parameters(
345
+ _query_builder,
346
+ 'messageId' => message_id,
347
+ 'sourceTn' => source_tn,
348
+ 'destinationTn' => destination_tn,
349
+ 'messageStatus' => message_status,
350
+ 'errorCode' => error_code,
351
+ 'fromDateTime' => from_date_time,
352
+ 'toDateTime' => to_date_time,
353
+ 'pageToken' => page_token,
354
+ 'limit' => limit
355
+ )
356
+ _query_url = APIHelper.clean_url _query_builder
357
+
358
+ # Prepare headers.
359
+ _headers = {
360
+ 'accept' => 'application/json'
361
+ }
362
+
363
+ # Prepare and execute HttpRequest.
364
+ _request = config.http_client.get(
365
+ _query_url,
366
+ headers: _headers
367
+ )
368
+ MessagingBasicAuth.apply(config, _request)
369
+ _response = execute_request(_request)
370
+
371
+ # Validate response against endpoint and global error codes.
372
+ if _response.status_code == 400
373
+ raise MessagingException.new(
374
+ '400 Request is malformed or invalid',
375
+ _response
376
+ )
377
+ elsif _response.status_code == 401
378
+ raise MessagingException.new(
379
+ '401 The specified user does not have access to the account',
380
+ _response
381
+ )
382
+ elsif _response.status_code == 403
383
+ raise MessagingException.new(
384
+ '403 The user does not have access to this API',
385
+ _response
386
+ )
387
+ elsif _response.status_code == 404
388
+ raise MessagingException.new(
389
+ '404 Path not found',
390
+ _response
391
+ )
392
+ elsif _response.status_code == 415
393
+ raise MessagingException.new(
394
+ '415 The content-type of the request is incorrect',
395
+ _response
396
+ )
397
+ elsif _response.status_code == 429
398
+ raise MessagingException.new(
399
+ '429 The rate limit has been reached',
400
+ _response
401
+ )
402
+ end
403
+ validate_response(_response)
404
+
405
+ # Return appropriate response type.
406
+ decoded = APIHelper.json_deserialize(_response.raw_body)
407
+ ApiResponse.new(
408
+ _response, data: BandwidthMessagesList.from_hash(decoded)
409
+ )
410
+ end
411
+
336
412
  # createMessage
337
- # @param [String] user_id Required parameter: Example:
338
- # @param [MessageRequest] body Optional parameter: Example:
413
+ # @param [String] user_id Required parameter: User's account ID
414
+ # @param [MessageRequest] body Required parameter: Example:
339
415
  # @return [BandwidthMessage] response from the API call
340
416
  def create_message(user_id,
341
- body: nil)
417
+ body)
342
418
  # Prepare query url.
343
419
  _query_builder = config.get_base_uri(Server::MESSAGINGDEFAULT)
344
420
  _query_builder << '/users/{userId}/messages'
345
421
  _query_builder = APIHelper.append_url_with_template_parameters(
346
422
  _query_builder,
347
- 'userId' => user_id
423
+ 'userId' => { 'value' => user_id, 'encode' => false }
348
424
  )
349
425
  _query_url = APIHelper.clean_url _query_builder
350
426
 
@@ -365,32 +441,32 @@ module Messaging
365
441
 
366
442
  # Validate response against endpoint and global error codes.
367
443
  if _response.status_code == 400
368
- raise GenericClientException.new(
444
+ raise MessagingException.new(
369
445
  '400 Request is malformed or invalid',
370
446
  _response
371
447
  )
372
448
  elsif _response.status_code == 401
373
- raise PathClientException.new(
449
+ raise MessagingException.new(
374
450
  '401 The specified user does not have access to the account',
375
451
  _response
376
452
  )
377
453
  elsif _response.status_code == 403
378
- raise PathClientException.new(
454
+ raise MessagingException.new(
379
455
  '403 The user does not have access to this API',
380
456
  _response
381
457
  )
382
458
  elsif _response.status_code == 404
383
- raise PathClientException.new(
459
+ raise MessagingException.new(
384
460
  '404 Path not found',
385
461
  _response
386
462
  )
387
463
  elsif _response.status_code == 415
388
- raise GenericClientException.new(
464
+ raise MessagingException.new(
389
465
  '415 The content-type of the request is incorrect',
390
466
  _response
391
467
  )
392
468
  elsif _response.status_code == 429
393
- raise GenericClientException.new(
469
+ raise MessagingException.new(
394
470
  '429 The rate limit has been reached',
395
471
  _response
396
472
  )
@@ -399,7 +475,9 @@ module Messaging
399
475
 
400
476
  # Return appropriate response type.
401
477
  decoded = APIHelper.json_deserialize(_response.raw_body)
402
- ApiResponse.new(_response, data: BandwidthMessage.from_hash(decoded))
478
+ ApiResponse.new(
479
+ _response, data: BandwidthMessage.from_hash(decoded)
480
+ )
403
481
  end
404
482
  end
405
483
  end