messagemedia_messages_sdk 1.1.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +1 -1
  3. data/README.md +240 -55
  4. data/lib/message_media_messages.rb +32 -18
  5. data/lib/message_media_messages/api_helper.rb +76 -9
  6. data/lib/message_media_messages/configuration.rb +8 -6
  7. data/lib/message_media_messages/controllers/base_controller.rb +13 -29
  8. data/lib/message_media_messages/controllers/delivery_reports_controller.rb +55 -100
  9. data/lib/message_media_messages/controllers/messages_controller.rb +162 -199
  10. data/lib/message_media_messages/controllers/replies_controller.rb +79 -123
  11. data/lib/message_media_messages/exceptions/api_exception.rb +5 -3
  12. data/lib/message_media_messages/exceptions/send_messages400_response_exception.rb +29 -0
  13. data/lib/message_media_messages/http/auth/auth_manager.rb +90 -0
  14. data/lib/message_media_messages/http/faraday_client.rb +10 -3
  15. data/lib/message_media_messages/http/http_call_back.rb +5 -3
  16. data/lib/message_media_messages/http/http_client.rb +29 -18
  17. data/lib/message_media_messages/http/http_context.rb +5 -3
  18. data/lib/message_media_messages/http/http_method_enum.rb +4 -2
  19. data/lib/message_media_messages/http/http_request.rb +13 -11
  20. data/lib/message_media_messages/http/http_response.rb +6 -4
  21. data/lib/message_media_messages/message_media_messages_client.rb +9 -6
  22. data/lib/message_media_messages/models/base_model.rb +4 -1
  23. data/lib/message_media_messages/models/cancel_scheduled_message_request.rb +7 -7
  24. data/lib/message_media_messages/models/check_delivery_reports_response.rb +15 -8
  25. data/lib/message_media_messages/models/check_replies_response.rb +15 -8
  26. data/lib/message_media_messages/models/confirm_delivery_reports_as_received_request.rb +5 -5
  27. data/lib/message_media_messages/models/{confirm_delivery_reports_as_received_request_11.rb → confirm_delivery_reports_as_received_request1.rb} +8 -8
  28. data/lib/message_media_messages/models/confirm_replies_as_received_request.rb +5 -5
  29. data/lib/message_media_messages/models/{confirm_replies_as_received_request_8.rb → confirm_replies_as_received_request1.rb} +8 -8
  30. data/lib/message_media_messages/models/delivery_report.rb +135 -0
  31. data/lib/message_media_messages/models/format1_enum.rb +20 -0
  32. data/lib/message_media_messages/models/format_enum.rb +20 -0
  33. data/lib/message_media_messages/models/get_message_status_response.rb +145 -0
  34. data/lib/message_media_messages/models/message.rb +166 -0
  35. data/lib/message_media_messages/models/reply.rb +112 -0
  36. data/lib/message_media_messages/models/send_messages_request.rb +14 -7
  37. data/lib/message_media_messages/models/send_messages_response.rb +14 -7
  38. data/lib/message_media_messages/models/source_number_type_enum.rb +21 -0
  39. data/lib/message_media_messages/models/status2_enum.rb +32 -0
  40. data/lib/message_media_messages/models/status_enum.rb +44 -0
  41. data/lib/message_media_messages/models/vendor_account_id.rb +44 -0
  42. metadata +18 -21
  43. data/lib/message_media_messages/http/auth/basic_auth.rb +0 -20
  44. data/lib/message_media_messages/http/auth/hmac_auth.rb +0 -54
  45. data/test/controllers/controller_test_base.rb +0 -33
  46. data/test/controllers/test_delivery_reports_controller.rb +0 -164
  47. data/test/controllers/test_messages_controller.rb +0 -166
  48. data/test/controllers/test_replies_controller.rb +0 -164
  49. data/test/http_response_catcher.rb +0 -16
  50. data/test/test_helper.rb +0 -79
@@ -1,9 +1,10 @@
1
- # This file was automatically generated for MessageMedia by APIMATIC v2.0
1
+ # message_media_messages
2
+ #
3
+ # This file was automatically generated by APIMATIC v2.0
2
4
  # ( https://apimatic.io ).
3
5
 
4
6
  module MessageMediaMessages
5
7
  # RepliesController
6
- # noinspection RubyResolve,RubyInstanceMethodNamingConvention,RubyStringKeysInHashInspection
7
8
  class RepliesController < BaseController
8
9
  @instance = RepliesController.new
9
10
 
@@ -15,87 +16,6 @@ module MessageMediaMessages
15
16
  self.class.instance
16
17
  end
17
18
 
18
- # Mark a reply message as confirmed so it is no longer returned in check
19
- # replies requests.
20
- # The confirm replies endpoint is intended to be used in conjunction with
21
- # the check replies endpoint
22
- # to allow for robust processing of reply messages. Once one or more reply
23
- # messages have been processed
24
- # they can then be confirmed using the confirm replies endpoint so they are
25
- # no longer returned in
26
- # subsequent check replies requests.
27
- # The confirm replies endpoint takes a list of reply IDs as follows:
28
- # ```json
29
- # {
30
- # "reply_ids": [
31
- # "011dcead-6988-4ad6-a1c7-6b6c68ea628d",
32
- # "3487b3fa-6586-4979-a233-2d1b095c7718",
33
- # "ba28e94b-c83d-4759-98e7-ff9c7edb87a1"
34
- # ]
35
- # }
36
- # ```
37
- # Up to 100 replies can be confirmed in a single confirm replies request.
38
- # @param [ConfirmRepliesAsReceivedRequest] body Required parameter:
39
- # Example:
40
- # @param [Object] account_header_value The account id to pass to the API
41
- # @return Mixed response from the API call
42
- def create_confirm_replies_as_received(body, account_header_value=nil)
43
- begin
44
- @logger.info("create_confirm_replies_as_received called.")
45
-
46
- request_url = '/v1/replies/confirmed'
47
-
48
- # Prepare query url.
49
- @logger.info("Preparing query URL for create_confirm_replies_as_received.")
50
- query_builder = Configuration.base_uri.dup
51
- query_builder << request_url
52
- query_url = APIHelper.clean_url query_builder
53
-
54
- # Prepare headers.
55
- @logger.info("Preparing headers for create_confirm_replies_as_received.")
56
- headers = {
57
- 'accept' => 'application/json',
58
- 'content-type' => 'application/json; charset=utf-8'
59
- }
60
-
61
- add_account_header(headers, account_header_value)
62
-
63
- json_body = body.to_json
64
-
65
- # Prepare and execute HttpRequest.
66
- @logger.info('Preparing and executing HttpRequest for create_confirm_replies_as_received.')
67
- request = @http_client.post(
68
- query_url,
69
- headers: headers,
70
- parameters: json_body
71
- )
72
-
73
- apply_authentication(request, request_url, json_body)
74
-
75
- context = execute_request(request, name: 'create_confirm_replies_as_received')
76
-
77
- # Validate response against endpoint and global error codes.
78
- @logger.info("Validating response for create_confirm_replies_as_received.")
79
- if context.response.status_code == 400
80
- raise APIException.new(
81
- '',
82
- context
83
- )
84
- end
85
- validate_response(context)
86
-
87
- # Return appropriate response type.
88
- @logger.info("Returning response for create_confirm_replies_as_received.")
89
- return APIHelper.json_deserialize(context.response.raw_body) unless
90
- context.response.raw_body.nil? ||
91
- context.response.raw_body.to_s.strip.empty?
92
-
93
- rescue Exception => e
94
- @logger.error(e)
95
- raise e
96
- end
97
- end
98
-
99
19
  # Check for any replies that have been received.
100
20
  # Replies are messages that have been sent from a handset in response to a
101
21
  # message sent by an
@@ -178,48 +98,84 @@ module MessageMediaMessages
178
98
  # *Note: It is recommended to use the Webhooks feature to receive reply
179
99
  # messages rather than polling
180
100
  # the check replies endpoint.*
181
- # @param [Object] account_header_value The account id to pass to the API
182
101
  # @return CheckRepliesResponse response from the API call
183
- def get_check_replies(account_header_value=nil)
184
- begin
185
- @logger.info("get_check_replies called.")
186
-
187
- request_url = '/v1/replies'
188
- # Prepare query url.
189
- @logger.info("Preparing query URL for get_check_replies.")
190
- query_builder = Configuration.base_uri.dup
191
- query_builder << request_url
192
- query_url = APIHelper.clean_url query_builder
193
-
194
- # Prepare headers.
195
- @logger.info("Preparing headers for get_check_replies.")
196
- headers = {
197
- 'accept' => 'application/json'
198
- }
199
-
200
- add_account_header(headers, account_header_value)
201
-
202
- # Prepare and execute HttpRequest.
203
- @logger.info('Preparing and executing HttpRequest for get_check_replies.')
204
- request = @http_client.get(
205
- query_url,
206
- headers: headers
207
- )
208
-
209
- apply_authentication(request, request_url)
210
-
211
- context = execute_request(request, name: 'get_check_replies')
212
- validate_response(context)
213
-
214
- # Return appropriate response type.
215
- @logger.info("Returning response for get_check_replies.")
216
- decoded = APIHelper.json_deserialize(context.response.raw_body)
217
- CheckRepliesResponse.from_hash(decoded)
102
+ def check_replies
103
+ # Prepare query url.
104
+ _path_url = '/v1/replies'
105
+ _query_builder = Configuration.base_uri.dup
106
+ _query_builder << _path_url
107
+ _query_url = APIHelper.clean_url _query_builder
108
+
109
+ # Prepare headers.
110
+ _headers = {
111
+ 'accept' => 'application/json'
112
+ }
113
+
114
+ # Prepare and execute HttpRequest.
115
+ _request = @http_client.get(
116
+ _query_url,
117
+ headers: _headers
118
+ )
119
+ AuthManager.apply(_request, _path_url)
120
+ _context = execute_request(_request)
121
+ validate_response(_context)
122
+
123
+ # Return appropriate response type.
124
+ decoded = APIHelper.json_deserialize(_context.response.raw_body)
125
+ CheckRepliesResponse.from_hash(decoded)
126
+ end
218
127
 
219
- rescue Exception => e
220
- @logger.error(e)
221
- raise e
222
- end
128
+ # Mark a reply message as confirmed so it is no longer returned in check
129
+ # replies requests.
130
+ # The confirm replies endpoint is intended to be used in conjunction with
131
+ # the check replies endpoint
132
+ # to allow for robust processing of reply messages. Once one or more reply
133
+ # messages have been processed
134
+ # they can then be confirmed using the confirm replies endpoint so they are
135
+ # no longer returned in
136
+ # subsequent check replies requests.
137
+ # The confirm replies endpoint takes a list of reply IDs as follows:
138
+ # ```json
139
+ # {
140
+ # "reply_ids": [
141
+ # "011dcead-6988-4ad6-a1c7-6b6c68ea628d",
142
+ # "3487b3fa-6586-4979-a233-2d1b095c7718",
143
+ # "ba28e94b-c83d-4759-98e7-ff9c7edb87a1"
144
+ # ]
145
+ # }
146
+ # ```
147
+ # Up to 100 replies can be confirmed in a single confirm replies request.
148
+ # @param [ConfirmRepliesAsReceivedRequest] body Required parameter:
149
+ # Example:
150
+ # @return Mixed response from the API call
151
+ def confirm_replies_as_received(body)
152
+ # Prepare query url.
153
+ _path_url = '/v1/replies/confirmed'
154
+ _query_builder = Configuration.base_uri.dup
155
+ _query_builder << _path_url
156
+ _query_url = APIHelper.clean_url _query_builder
157
+
158
+ # Prepare headers.
159
+ _headers = {
160
+ 'accept' => 'application/json',
161
+ 'content-type' => 'application/json; charset=utf-8'
162
+ }
163
+
164
+ # Prepare and execute HttpRequest.
165
+ _request = @http_client.post(
166
+ _query_url,
167
+ headers: _headers,
168
+ parameters: body.to_json
169
+ )
170
+ AuthManager.apply(_request, _path_url, body.to_json)
171
+ _context = execute_request(_request)
172
+ validate_response(_context)
173
+
174
+ # Return appropriate response type.
175
+ decoded = APIHelper.json_deserialize(_context.response.raw_body) unless
176
+ _context.response.raw_body.nil? ||
177
+ _context.response.raw_body.to_s.strip.empty?
178
+ decoded
223
179
  end
224
180
  end
225
181
  end
@@ -1,4 +1,6 @@
1
- # This file was automatically generated for MessageMedia by APIMATIC v2.0
1
+ # message_media_messages
2
+ #
3
+ # This file was automatically generated by APIMATIC v2.0
2
4
  # ( https://apimatic.io ).
3
5
 
4
6
  module MessageMediaMessages
@@ -7,8 +9,8 @@ module MessageMediaMessages
7
9
  attr_reader :context, :response_code
8
10
 
9
11
  # The constructor.
10
- # @param [String] reason The reason for raising an exception.
11
- # @param [HttpContext] context The HttpContext of the API call.
12
+ # @param [String] The reason for raising an exception.
13
+ # @param [HttpContext] The HttpContext of the API call.
12
14
  def initialize(reason, context)
13
15
  super(reason)
14
16
  @context = context
@@ -0,0 +1,29 @@
1
+ # message_media_messages
2
+ #
3
+ # This file was automatically generated by APIMATIC v2.0
4
+ # ( https://apimatic.io ).
5
+
6
+ module MessageMediaMessages
7
+ # Send messages 400 response class.
8
+ class SendMessages400ResponseException < APIException
9
+ # TODO: Write general description for this method
10
+ # @return [String]
11
+ attr_accessor :message
12
+
13
+ # The constructor.
14
+ # @param [String] The reason for raising an exception.
15
+ # @param [HttpContext] The HttpContext of the API call.
16
+ def initialize(reason, context)
17
+ super(reason, context)
18
+ hash = APIHelper.json_deserialize(@context.response.raw_body)
19
+ unbox(hash)
20
+ end
21
+
22
+ # Populates this object by extracting properties from a hash.
23
+ # @param [Hash] The deserialized response sent by the server in the
24
+ # response body.
25
+ def unbox(hash)
26
+ @message = hash['message']
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,90 @@
1
+ # message_media_messages
2
+ #
3
+ # This file was automatically generated by APIMATIC v2.0
4
+ # ( https://apimatic.io ).
5
+
6
+ require 'base64'
7
+
8
+ module MessageMediaMessages
9
+ # Utility class for basic authorization.
10
+ class AuthManager
11
+ # Add authentication to the request.
12
+ # @param [HttpRequest] The HttpRequest object to which authentication will
13
+ # be added.
14
+ # @param [String] The url of the request.
15
+ # @param [String] The body of the request. None for GET requests.
16
+ def self.apply(http_request, url, body = nil)
17
+ if Configuration.hmac_auth_user_name.nil? ||
18
+ Configuration.hmac_auth_password.nil?
19
+ AuthManager.apply_basic_auth(http_request)
20
+ else
21
+ AuthManager.apply_hmac_auth(http_request, url, body)
22
+ end
23
+ end
24
+
25
+ # Add basic authentication to the request.
26
+ # @param [HttpRequest] The HttpRequest object to which authentication will
27
+ # be added.
28
+ def self.apply_basic_auth(http_request)
29
+ username = Configuration.basic_auth_user_name
30
+ password = Configuration.basic_auth_password
31
+ value = Base64.strict_encode64("#{username}:#{password}")
32
+ header_value = "Basic #{value}"
33
+ http_request.headers['Authorization'] = header_value
34
+ end
35
+
36
+ # Add hmac authentication to the request.
37
+ # @param [HttpRequest] The HttpRequest object to which authentication will
38
+ # be added.
39
+ # @param [String] The url of the request.
40
+ # @param [String] The body of the request. None for GET requests.
41
+ def self.apply_hmac_auth(http_request, url, body)
42
+ username = Configuration.hmac_auth_user_name
43
+
44
+ content_signature = ''
45
+ content_header = ''
46
+
47
+ now = Time.now.utc.strftime('%a, %d %b %Y %H:%M:%S GMT')
48
+
49
+ date_header = now
50
+
51
+ request_type = 'GET'
52
+
53
+ unless body.nil?
54
+ request_type = 'POST'
55
+
56
+ md5 = Digest::MD5.new
57
+ md5.update(body)
58
+
59
+ content_hash = md5.hexdigest
60
+ content_signature = "x-Content-MD5: #{content_hash}\n"
61
+ content_header = 'x-Content-MD5 '
62
+ http_request.headers['x-Content-MD5'] = content_hash
63
+ end
64
+
65
+ http_request.headers['date'] = date_header
66
+
67
+ hmac_signature = AuthManager.create_signature(date_header,
68
+ content_signature, url,
69
+ request_type)
70
+
71
+ joined = "username=\"#{username}\", algorithm=\"hmac-sha1\", " \
72
+ "headers=\"date #{content_header}request-line\", " \
73
+ "signature=\"#{hmac_signature}\""
74
+ header_value = "hmac #{joined}"
75
+ http_request.headers['Authorization'] = header_value
76
+ end
77
+
78
+ def self.create_signature(date, content_signature, url, request_type)
79
+ signing_string = "date: #{date}\n#{content_signature}#{request_type} " \
80
+ "#{url} HTTP/1.1"
81
+ hmac = OpenSSL::HMAC.digest(OpenSSL::Digest.new('sha1'),
82
+ Configuration.hmac_auth_password.encode(
83
+ Encoding::UTF_8
84
+ ),
85
+ signing_string.encode(Encoding::UTF_8))
86
+
87
+ Base64.encode64(hmac).chomp
88
+ end
89
+ end
90
+ end
@@ -1,5 +1,8 @@
1
- # This file was automatically generated for MessageMedia by APIMATIC v2.0
1
+ # message_media_messages
2
+ #
3
+ # This file was automatically generated by APIMATIC v2.0
2
4
  # ( https://apimatic.io ).
5
+
3
6
  require 'faraday/http_cache'
4
7
 
5
8
  module MessageMediaMessages
@@ -30,7 +33,9 @@ module MessageMediaMessages
30
33
  http_request.query_url
31
34
  ) do |request|
32
35
  request.headers = http_request.headers
33
- request.body = http_request.parameters
36
+ unless http_request.parameters.empty?
37
+ request.body = http_request.parameters
38
+ end
34
39
  end
35
40
  convert_response(response)
36
41
  end
@@ -42,7 +47,9 @@ module MessageMediaMessages
42
47
  http_request.query_url
43
48
  ) do |request|
44
49
  request.headers = http_request.headers
45
- request.body = http_request.parameters
50
+ unless http_request.parameters.empty?
51
+ request.body = http_request.parameters
52
+ end
46
53
  end
47
54
  convert_response(response)
48
55
  end
@@ -1,11 +1,13 @@
1
- # This file was automatically generated for MessageMedia by APIMATIC v2.0
1
+ # message_media_messages
2
+ #
3
+ # This file was automatically generated by APIMATIC v2.0
2
4
  # ( https://apimatic.io ).
3
5
 
4
6
  module MessageMediaMessages
5
7
  # HttpCallBack allows defining callables for pre and post API calls.
6
8
  class HttpCallBack
7
9
  # A controller will call this method before making an HTTP Request.
8
- # @param [HttpRequest] _http_request The HttpRequest object which the HttpClient
10
+ # @param [HttpRequest] The HttpRequest object which the HttpClient
9
11
  # will execute.
10
12
  def on_before_request(_http_request)
11
13
  raise NotImplementedError, 'This method needs
@@ -13,7 +15,7 @@ module MessageMediaMessages
13
15
  end
14
16
 
15
17
  # A controller will call this method after making an HTTP Request.
16
- # @param [HttpContext] _http_context The HttpContext of the API call.
18
+ # @param [HttpContext] The HttpContext of the API call.
17
19
  def on_after_response(_http_context)
18
20
  raise NotImplementedError, 'This method needs
19
21
  to be implemented in a child class.'
@@ -1,4 +1,6 @@
1
- # This file was automatically generated for MessageMedia by APIMATIC v2.0
1
+ # message_media_messages
2
+ #
3
+ # This file was automatically generated by APIMATIC v2.0
2
4
  # ( https://apimatic.io ).
3
5
 
4
6
  module MessageMediaMessages
@@ -8,29 +10,29 @@ module MessageMediaMessages
8
10
  # for HTTP Client classes.
9
11
  class HttpClient
10
12
  # Execute an HttpRequest when the response is expected to be a string.
11
- # @param [HttpRequest] _http_request The HttpRequest to be executed.
13
+ # @param [HttpRequest] The HttpRequest to be executed.
12
14
  def execute_as_string(_http_request)
13
15
  raise NotImplementedError, 'This method needs
14
16
  to be implemented in a child class.'
15
17
  end
16
18
 
17
19
  # Execute an HttpRequest when the response is expected to be binary.
18
- # @param [HttpRequest] _http_request The HttpRequest to be executed.
20
+ # @param [HttpRequest] The HttpRequest to be executed.
19
21
  def execute_as_binary(_http_request)
20
22
  raise NotImplementedError, 'This method needs
21
23
  to be implemented in a child class.'
22
24
  end
23
25
 
24
26
  # Converts the HTTP Response from the client to an HttpResponse object.
25
- # @param [Dynamic] _response The response object received from the client.
27
+ # @param [Dynamic] The response object received from the client.
26
28
  def convert_response(_response)
27
29
  raise NotImplementedError, 'This method needs
28
30
  to be implemented in a child class.'
29
31
  end
30
32
 
31
33
  # Get a GET HttpRequest object.
32
- # @param [String] query_url The URL to send the request to.
33
- # @param [Hash, Optional] headers The headers for the HTTP Request.
34
+ # @param [String] The URL to send the request to.
35
+ # @param [Hash, Optional] The headers for the HTTP Request.
34
36
  def get(query_url,
35
37
  headers: {})
36
38
  HttpRequest.new(HttpMethodEnum::GET,
@@ -38,10 +40,20 @@ module MessageMediaMessages
38
40
  headers: headers)
39
41
  end
40
42
 
43
+ # Get a HEAD HttpRequest object.
44
+ # @param [String] The URL to send the request to.
45
+ # @param [Hash, Optional] The headers for the HTTP Request.
46
+ def head(query_url,
47
+ headers: {})
48
+ HttpRequest.new(HttpMethodEnum::HEAD,
49
+ query_url,
50
+ headers: headers)
51
+ end
52
+
41
53
  # Get a POST HttpRequest object.
42
- # @param [String] query_url The URL to send the request to.
43
- # @param [Hash, Optional] headers The headers for the HTTP Request.
44
- # @param [Hash, Optional] parameters The parameters for the HTTP Request.
54
+ # @param [String] The URL to send the request to.
55
+ # @param [Hash, Optional] The headers for the HTTP Request.
56
+ # @param [Hash, Optional] The parameters for the HTTP Request.
45
57
  def post(query_url,
46
58
  headers: {},
47
59
  parameters: {})
@@ -52,9 +64,9 @@ module MessageMediaMessages
52
64
  end
53
65
 
54
66
  # Get a PUT HttpRequest object.
55
- # @param [String] query_url The URL to send the request to.
56
- # @param [Hash, Optional] headers The headers for the HTTP Request.
57
- # @param [Hash, Optional] parameters The parameters for the HTTP Request.
67
+ # @param [String] The URL to send the request to.
68
+ # @param [Hash, Optional] The headers for the HTTP Request.
69
+ # @param [Hash, Optional] The parameters for the HTTP Request.
58
70
  def put(query_url,
59
71
  headers: {},
60
72
  parameters: {})
@@ -65,9 +77,9 @@ module MessageMediaMessages
65
77
  end
66
78
 
67
79
  # Get a PATCH HttpRequest object.
68
- # @param [String] query_url The URL to send the request to.
69
- # @param [Hash, Optional] headers The headers for the HTTP Request.
70
- # @param [Hash, Optional] parameters The parameters for the HTTP Request.
80
+ # @param [String] The URL to send the request to.
81
+ # @param [Hash, Optional] The headers for the HTTP Request.
82
+ # @param [Hash, Optional] The parameters for the HTTP Request.
71
83
  def patch(query_url,
72
84
  headers: {},
73
85
  parameters: {})
@@ -78,9 +90,8 @@ module MessageMediaMessages
78
90
  end
79
91
 
80
92
  # Get a DELETE HttpRequest object.
81
- # @param [String] query_url The URL to send the request to.
82
- # @param [Hash, Optional] headers The headers for the HTTP Request.
83
- # @param [Hash, Optional] parameters The parameters for the HTTP Request.
93
+ # @param [String] The URL to send the request to.
94
+ # @param [Hash, Optional] The headers for the HTTP Request.
84
95
  def delete(query_url,
85
96
  headers: {},
86
97
  parameters: {})