bandwidth-sdk 2.1.1 → 6.1.0

Sign up to get free protection for your applications and to get access to all the features.
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