getstream-ruby 8.0.2 → 10.0.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 (62) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +36 -0
  3. data/lib/getstream_ruby/client.rb +92 -31
  4. data/lib/getstream_ruby/configuration.rb +26 -29
  5. data/lib/getstream_ruby/generated/chat_client.rb +29 -0
  6. data/lib/getstream_ruby/generated/feed.rb +16 -4
  7. data/lib/getstream_ruby/generated/feeds_client.rb +160 -10
  8. data/lib/getstream_ruby/generated/models/activity_response.rb +10 -0
  9. data/lib/getstream_ruby/generated/models/add_comment_reaction_request.rb +5 -0
  10. data/lib/getstream_ruby/generated/models/add_comment_reaction_response.rb +18 -2
  11. data/lib/getstream_ruby/generated/models/add_reaction_request.rb +5 -0
  12. data/lib/getstream_ruby/generated/models/add_reaction_response.rb +18 -2
  13. data/lib/getstream_ruby/generated/models/ai_audio_config_request.rb +36 -0
  14. data/lib/getstream_ruby/generated/models/ai_audio_config_response.rb +41 -0
  15. data/lib/getstream_ruby/generated/models/async_export_error_event.rb +1 -1
  16. data/lib/getstream_ruby/generated/models/async_export_review_queue_event.rb +66 -0
  17. data/lib/getstream_ruby/generated/models/batch_query_activity_reactions_request.rb +66 -0
  18. data/lib/getstream_ruby/generated/models/batch_query_activity_reactions_response.rb +46 -0
  19. data/lib/getstream_ruby/generated/models/batch_query_comment_reactions_request.rb +66 -0
  20. data/lib/getstream_ruby/generated/models/batch_query_comment_reactions_response.rb +46 -0
  21. data/lib/getstream_ruby/generated/models/check_response.rb +5 -0
  22. data/lib/getstream_ruby/generated/models/closed_caption_rule_parameters.rb +5 -0
  23. data/lib/getstream_ruby/generated/models/comment_response.rb +5 -0
  24. data/lib/getstream_ruby/generated/models/config_response.rb +5 -0
  25. data/lib/getstream_ruby/generated/models/create_queue_request.rb +61 -0
  26. data/lib/getstream_ruby/generated/models/delete_queue_request.rb +36 -0
  27. data/lib/getstream_ruby/generated/models/feeds_share_response.rb +41 -0
  28. data/lib/getstream_ruby/generated/models/feeds_v3_activity_response.rb +10 -0
  29. data/lib/getstream_ruby/generated/models/feeds_v3_comment_response.rb +5 -0
  30. data/lib/getstream_ruby/generated/models/filter_config_response.rb +5 -0
  31. data/lib/getstream_ruby/generated/models/list_queues_response.rb +36 -0
  32. data/lib/getstream_ruby/generated/models/moderation_call_response.rb +126 -0
  33. data/lib/getstream_ruby/generated/models/moderation_dashboard_preferences.rb +10 -10
  34. data/lib/getstream_ruby/generated/models/moderation_payload.rb +26 -1
  35. data/lib/getstream_ruby/generated/models/moderation_payload_request.rb +5 -0
  36. data/lib/getstream_ruby/generated/models/moderation_payload_response.rb +26 -1
  37. data/lib/getstream_ruby/generated/models/moderation_queue_response.rb +76 -0
  38. data/lib/getstream_ruby/generated/models/ocr_content_parameters.rb +41 -0
  39. data/lib/getstream_ruby/generated/models/permission.rb +5 -0
  40. data/lib/getstream_ruby/generated/models/query_activity_shares_response.rb +46 -0
  41. data/lib/getstream_ruby/generated/models/query_moderation_rules_response.rb +1 -1
  42. data/lib/getstream_ruby/generated/models/queue_response.rb +36 -0
  43. data/lib/getstream_ruby/generated/models/review_queue_item_response.rb +1 -1
  44. data/lib/getstream_ruby/generated/models/rule_builder_condition.rb +5 -0
  45. data/lib/getstream_ruby/generated/models/share_response.rb +41 -0
  46. data/lib/getstream_ruby/generated/models/threaded_comment_response.rb +5 -0
  47. data/lib/getstream_ruby/generated/models/translate_activity_request.rb +31 -0
  48. data/lib/getstream_ruby/generated/models/translate_activity_response.rb +36 -0
  49. data/lib/getstream_ruby/generated/models/translate_comment_request.rb +31 -0
  50. data/lib/getstream_ruby/generated/models/translate_comment_response.rb +36 -0
  51. data/lib/getstream_ruby/generated/models/triggered_rule_response.rb +5 -0
  52. data/lib/getstream_ruby/generated/models/update_app_request.rb +10 -0
  53. data/lib/getstream_ruby/generated/models/update_queue_request.rb +56 -0
  54. data/lib/getstream_ruby/generated/models/upsert_config_request.rb +5 -0
  55. data/lib/getstream_ruby/generated/moderation_client.rb +91 -0
  56. data/lib/getstream_ruby/generated/webhook.rb +7 -0
  57. data/lib/getstream_ruby/log_redaction.rb +58 -0
  58. data/lib/getstream_ruby/request_logging.rb +97 -0
  59. data/lib/getstream_ruby/retry_config.rb +27 -0
  60. data/lib/getstream_ruby/version.rb +1 -1
  61. data/lib/getstream_ruby.rb +2 -0
  62. metadata +27 -16
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9147f9cf1a12d531292d5b4e226e6e7c249a618e2b00f1a60e82148878d80524
4
- data.tar.gz: 47ba7a4df6a3720660c2485877255010a553ae02b1b807294dcc73582d837263
3
+ metadata.gz: f7c2582f037fa1be220f8b72647c0a87254d0eeb42af2b5046cdb410852f25d7
4
+ data.tar.gz: a880f9c77e414fe74ee4dd7d82631c927b5af8b4c8b0dca6fca5d00386ff08cf
5
5
  SHA512:
6
- metadata.gz: 54a465d565efc229cec95322f5975b3aa212198f9e75ce6de338f0dbd01930f79aac2f5fa3b412af57d8b24583e68c4dc7477a8fcf949800349b95dced779d0a
7
- data.tar.gz: 48344c6287f4a46e94262b7d2ef51a96a9265fac15f4733f502e5dcd345cfcfff00c9e923b6ce69db949c5992575df3a6f95542d083e05d685af60aaf0e27767
6
+ metadata.gz: 10ad2c2ba0fb122b5a0048136d605eba7de662c86c7cd62123b8e84ad17f96a88750e0dc416764208e42106dab904d5127f711b36aab9083d637e8684582dd26
7
+ data.tar.gz: b1bffe4b14da26fb2761eb596c78b3337f8bd7f4600869e1be0792b4c581bea79108990bd7ab5898c083826b66a8b68a054eda8c2e4d93c94d75a9007735af67
data/README.md CHANGED
@@ -163,6 +163,42 @@ rescue GetStreamRuby::APIError => e
163
163
  end
164
164
  ```
165
165
 
166
+ ## Retries
167
+
168
+ Retries are opt-in via `retry_config:` and disabled by default (the client makes exactly one attempt; errors surface unchanged). When enabled, only `GET`/`HEAD` requests are retried, and only when they fail with HTTP 429 (unless the error is marked `unrecoverable`) or a transport-level error (connection reset, timeout, DNS failure, TLS handshake failure). Writes, 5xx responses, and other 4xx responses are never retried.
169
+
170
+ ```ruby
171
+ client = GetStreamRuby::Client.new(
172
+ api_key: '...', api_secret: '...',
173
+ retry_config: GetStreamRuby::RetryConfig.new(enabled: true, max_attempts: 3, max_backoff: 30.0)
174
+ )
175
+ ```
176
+
177
+ `max_attempts` caps the total number of attempts (default 3). `max_backoff` caps the wait between attempts (default 30.0 seconds). A 429 with a `Retry-After` header waits exactly that long, clamped to `max_backoff`, with no jitter. Otherwise the wait is full jitter: a random delay between 0 and `min(max_backoff, 2**attempt)` seconds.
178
+
179
+ ## Logging
180
+
181
+ Pass a stdlib `Logger` via `logger:` to get structured, single-line log events. With no `logger:`, the SDK produces zero output; the SDK never sets the logger's level either, that's the caller's call.
182
+
183
+ ```ruby
184
+ require 'logger'
185
+
186
+ client = GetStreamRuby.manual(
187
+ api_key: "your_api_key",
188
+ api_secret: "your_api_secret",
189
+ logger: Logger.new($stdout)
190
+ )
191
+ ```
192
+
193
+ Four events are emitted:
194
+
195
+ - `client.initialized` (INFO, once at construction): SDK version and the effective client config (pool size, timeouts, gzip, whether a custom `http_client`/`log_bodies` is set).
196
+ - `http.request.sent` (DEBUG, before each request).
197
+ - `http.response.received` (DEBUG, after any response including 4xx/5xx — those are just data, not a failure).
198
+ - `http.request.failed` (ERROR, transport failure only: no HTTP response was received at all, e.g. connection reset, timeout, DNS failure, TLS handshake failure). When [retries](#retries) are enabled, each retried attempt also emits `http.request.failed` at DEBUG with a `retry.attempt` field (1-indexed) before its backoff sleep; a 429 retry omits `error.type` (the paired `http.response.received` already recorded the status), a transport-error retry includes it.
199
+
200
+ Query values for `api_key`/`api_secret`/`token` are always redacted to `<redacted>`, and the same keys are redacted (shallowly, top-level only) in JSON body logging. No headers are ever logged. Request/response bodies are not logged by default; pass `log_bodies: true` to opt in (values for the keys above are still redacted). Enabling it emits one WARN at construction as a reminder that your logs will now contain body content.
201
+
166
202
  ## Development
167
203
 
168
204
  ### Quick Start
@@ -2,7 +2,6 @@
2
2
 
3
3
  require 'faraday'
4
4
  require 'faraday/gzip'
5
- require 'faraday/retry'
6
5
  require 'faraday/multipart'
7
6
  require 'faraday/net_http_persistent'
8
7
  require 'logger'
@@ -20,11 +19,15 @@ require_relative 'generated/webhook'
20
19
  require_relative 'generated/models/api_error'
21
20
  require_relative 'stream_response'
22
21
  require_relative 'error_mapping'
22
+ require_relative 'log_redaction'
23
+ require_relative 'request_logging'
23
24
 
24
25
  module GetStreamRuby
25
26
 
26
27
  class Client
27
28
 
29
+ include RequestLogging
30
+
28
31
  # Backdate the JWT `iat` claim by this many seconds.
29
32
  #
30
33
  # JWT timestamps are whole-second (RFC 7519 NumericDate), so `Time.now.to_i`
@@ -38,20 +41,23 @@ module GetStreamRuby
38
41
  attr_reader :configuration
39
42
 
40
43
  def initialize(config = nil, api_key: nil, api_secret: nil, **options)
41
- @configuration = config || GetStreamRuby.configuration
42
-
43
- # Create new configuration with overrides if any parameters provided
44
- if api_key || api_secret || !options.empty?
45
- @configuration = Configuration.with_overrides(
46
- api_key: api_key,
47
- api_secret: api_secret,
48
- **options,
49
- )
50
- end
44
+ # Overrides win over an explicit config, matching prior behavior. Only
45
+ # fall back to GetStreamRuby.configuration when neither is given, so
46
+ # that path (currently unimplemented) isn't evaluated needlessly.
47
+ @configuration = if api_key || api_secret || !options.empty?
48
+ Configuration.with_overrides(
49
+ api_key: api_key,
50
+ api_secret: api_secret,
51
+ **options,
52
+ )
53
+ else
54
+ config || GetStreamRuby.configuration
55
+ end
51
56
 
52
57
  @configuration.validate!
53
58
  @connection = build_connection
54
59
  @configuration.log_pool_config_to(@configuration.logger)
60
+ warn_log_bodies_enabled
55
61
  end
56
62
 
57
63
  def feed_resource
@@ -209,21 +215,76 @@ module GetStreamRuby
209
215
  # Check if this is a file upload request that needs multipart
210
216
  return make_multipart_request(method, path, query_params, data) if multipart_request?(data)
211
217
 
212
- response = @connection.send(method) do |req|
218
+ body_json = data.to_json
219
+ attempt = 0
213
220
 
214
- req.url path, query_params
215
- req.headers['Authorization'] = generate_auth_header
216
- req.headers['Content-Type'] = 'application/json'
217
- req.headers['stream-auth-type'] = 'jwt'
218
- req.headers['X-Stream-Client'] = user_agent
219
- req.body = data.to_json
220
- req.options.timeout = request_timeout if request_timeout
221
+ begin
222
+ started = monotonic_now
223
+ log_request_sent(method, path, query_params, body_json)
224
+
225
+ response = @connection.send(method) do |req|
226
+
227
+ req.url path, query_params
228
+ req.headers['Authorization'] = generate_auth_header
229
+ req.headers['Content-Type'] = 'application/json'
230
+ req.headers['stream-auth-type'] = 'jwt'
231
+ req.headers['X-Stream-Client'] = user_agent
232
+ req.body = body_json
233
+ req.options.timeout = request_timeout if request_timeout
234
+
235
+ end
221
236
 
237
+ log_response_received(response, started)
238
+ handle_response(response)
239
+ rescue Faraday::Error => e
240
+ error = TransportError.new("Request failed: #{e.message}", error_type: ErrorMapping.classify_faraday_error(e))
241
+ if retry_eligible?(method, error, attempt)
242
+ wait_before_retry(method, path, error, attempt, started)
243
+ attempt += 1
244
+ retry
245
+ end
246
+ log_request_failed(method, path, e, started)
247
+ raise error
248
+ rescue RateLimitError => e
249
+ if retry_eligible?(method, e, attempt)
250
+ wait_before_retry(method, path, e, attempt, started)
251
+ attempt += 1
252
+ retry
253
+ end
254
+ raise
222
255
  end
256
+ end
223
257
 
224
- handle_response(response)
225
- rescue Faraday::Error => e
226
- raise TransportError.new("Request failed: #{e.message}", error_type: ErrorMapping.classify_faraday_error(e))
258
+ # True when the opt-in retry policy (GetStreamRuby::RetryConfig) allows
259
+ # another attempt for this failure: disabled by default (single attempt,
260
+ # errors surface unchanged); enabled only retries idempotent GET/HEAD
261
+ # requests that failed with a recoverable RateLimitError or a
262
+ # TransportError, and only while attempts remain.
263
+ def retry_eligible?(method, error, attempt)
264
+ config = @configuration.retry_config
265
+ return false unless config&.enabled?
266
+ return false unless %i[get head].include?(method)
267
+ return false if error.is_a?(RateLimitError) && error.unrecoverable
268
+ return false unless attempt + 1 < config.max_attempts
269
+
270
+ true
271
+ end
272
+
273
+ # Emits the retry-attempt log, then blocks for the backoff delay:
274
+ # RateLimitError#retry_after (if positive) capped at max_backoff, no
275
+ # jitter; otherwise full jitter over 2**attempt capped at max_backoff.
276
+ # `sleep` is called on self so specs can stub it.
277
+ def wait_before_retry(method, path, error, attempt, started)
278
+ log_retry_attempt(method, path, error, attempt, started)
279
+ config = @configuration.retry_config
280
+ delay =
281
+ if error.is_a?(RateLimitError) && error.retry_after&.positive?
282
+ [error.retry_after, config.max_backoff].min
283
+ else
284
+ ceiling = [config.max_backoff, 2.0**attempt].min
285
+ ceiling <= 0 ? 0.0 : rand * ceiling
286
+ end
287
+ sleep(delay)
227
288
  end
228
289
 
229
290
  def build_connection
@@ -234,13 +295,10 @@ module GetStreamRuby
234
295
  Faraday.new(url: @configuration.base_url) do |conn|
235
296
 
236
297
  conn.request :multipart
237
- conn.request :retry, {
238
- max: 3,
239
- interval: 0.05,
240
- interval_randomness: 0.5,
241
- backoff_factor: 2,
242
- }
243
- conn.response :json, content_type: /\bjson$/
298
+ # preserve_raw: true keeps the wire string in env[:raw_body] alongside
299
+ # the parsed body, so response logging can report size/content
300
+ # without re-serializing an already-parsed Hash.
301
+ conn.response :json, content_type: /\bjson$/, preserve_raw: true
244
302
  # :gzip must come after :json (Faraday runs response middleware in reverse).
245
303
  conn.request :gzip
246
304
  configure_adapter(conn)
@@ -277,8 +335,6 @@ module GetStreamRuby
277
335
  # A fallback silently disables pooling, so always WARN (never swallow).
278
336
  @configuration.warn_pool_fallback(Faraday.default_adapter, e)
279
337
  connection.adapter Faraday.default_adapter
280
- # Record the adapter actually built so the INFO log reports it accurately.
281
- @configuration.effective_adapter = Faraday.default_adapter.to_s
282
338
  end
283
339
 
284
340
  def generate_auth_header
@@ -346,6 +402,9 @@ module GetStreamRuby
346
402
  payload[:upload_sizes] = upload_sizes_json
347
403
  end
348
404
 
405
+ started = monotonic_now
406
+ log_request_sent(method, path, query_params)
407
+
349
408
  response = @connection.send(method) do |req|
350
409
 
351
410
  req.url path, query_params
@@ -356,8 +415,10 @@ module GetStreamRuby
356
415
 
357
416
  end
358
417
 
418
+ log_response_received(response, started)
359
419
  handle_response(response)
360
420
  rescue Faraday::Error => e
421
+ log_request_failed(method, path, e, started)
361
422
  raise TransportError.new("Request failed: #{e.message}", error_type: ErrorMapping.classify_faraday_error(e))
362
423
  end
363
424
 
@@ -8,7 +8,7 @@ module GetStreamRuby
8
8
 
9
9
  attr_accessor :api_key, :api_secret, :base_url, :timeout, :logger, :faraday_adapter, :faraday_adapter_options,
10
10
  :connection_keep_alive, :max_conns_per_host, :idle_timeout, :connect_timeout,
11
- :request_timeout, :http_client, :effective_adapter
11
+ :request_timeout, :http_client, :log_bodies, :retry_config
12
12
 
13
13
  def initialize(api_key: nil, api_secret: nil, use_env: true, **options)
14
14
  http_options = options[:http_options] || {}
@@ -22,6 +22,8 @@ module GetStreamRuby
22
22
  @timeout = @request_timeout
23
23
  @http_client = options[:http_client]
24
24
  @logger = options[:logger]
25
+ @log_bodies = options[:log_bodies] || false
26
+ @retry_config = options[:retry_config] || RetryConfig.new
25
27
  end
26
28
 
27
29
  def valid?
@@ -48,41 +50,36 @@ module GetStreamRuby
48
50
  faraday_adapter_options: @faraday_adapter_options.dup,
49
51
  connection_keep_alive: @connection_keep_alive,
50
52
  logger: @logger,
53
+ log_bodies: @log_bodies,
54
+ retry_config: @retry_config,
51
55
  )
52
56
  end
53
57
 
54
- # Emit a single INFO line listing the 5 effective pool knobs plus the active escape hatch (CHA-2956).
55
- # If no logger is supplied, a default $stdout INFO logger is used.
56
- # The faraday_adapter label reflects the adapter actually built
57
- # (effective_adapter, set by Client#configure_adapter) so a silent fallback
58
- # to the default adapter is never misreported as the requested adapter.
58
+ # Emit the `client.initialized` INFO event once at construction (structured
59
+ # logging spec §6.1). A no-op when no logger is configured: unlike
60
+ # `warn_pool_fallback` below, a quiet start-up here is expected, not a
61
+ # silently-swallowed problem, so there is no $stdout fallback.
59
62
  def log_pool_config_to(logger)
60
- logger ||= Logger.new($stdout).tap { |l| l.level = Logger::INFO }
61
- flag = @http_client ? 'user_http_client=true' : 'user_http_client=false'
62
- adapter_label = if @http_client
63
- 'user-supplied'
64
- elsif @effective_adapter
65
- @effective_adapter
66
- elsif @faraday_adapter
67
- @faraday_adapter.to_s
68
- else
69
- 'default'
70
- end
71
- fmt = 'connection pool: max_conns_per_host=%<m>d idle_timeout=%<i>d ' \
72
- 'connect_timeout=%<c>d request_timeout=%<r>d %<flag>s faraday_adapter=%<a>s'
73
- logger.info(
74
- format(
75
- fmt,
76
- m: @max_conns_per_host, i: @idle_timeout, c: @connect_timeout,
77
- r: @request_timeout, flag: flag, a: adapter_label
78
- ),
79
- )
63
+ return if logger.nil?
64
+
65
+ fields = {
66
+ 'stream.sdk.name' => 'getstream-ruby',
67
+ 'stream.sdk.version' => VERSION,
68
+ 'stream.client.max_conns_per_host' => @max_conns_per_host,
69
+ 'stream.client.idle_timeout_seconds' => @idle_timeout,
70
+ 'stream.client.connect_timeout_seconds' => @connect_timeout,
71
+ 'stream.client.request_timeout_seconds' => @request_timeout,
72
+ 'stream.client.gzip_enabled' => true,
73
+ 'stream.client.user_http_client' => !@http_client.nil?,
74
+ 'stream.client.log_bodies' => @log_bodies,
75
+ }
76
+ logger.info { "client.initialized #{fields.map { |k, v| "#{k}=#{v}" }.join(' ')}" }
80
77
  end
81
78
 
82
79
  # Emit a WARNING that the requested adapter could not be built and pooling
83
- # is disabled (CHA-2956). A fallback must never be silent, so when no logger
84
- # is configured this uses a default $stdout logger, exactly like
85
- # log_pool_config_to.
80
+ # is disabled (CHA-2956). A fallback must never be silent, so unlike the
81
+ # structured-logging events below, this uses a default $stdout logger when
82
+ # none is configured.
86
83
  def warn_pool_fallback(fallback_adapter, error)
87
84
  warn_logger = @logger || Logger.new($stdout).tap { |l| l.level = Logger::WARN }
88
85
  warn_logger.warn(
@@ -297,6 +297,35 @@ module GetStream
297
297
  )
298
298
  end
299
299
 
300
+ # Returns a channel by its CID without creating it. Responds with 404 when the channel does not exist, so it doubles as an existence check. Pass state=true to also load messages, read state and watchers.
301
+ #
302
+ # @param _type [String]
303
+ # @param _id [String]
304
+ # @param state [Boolean]
305
+ # @param messages_limit [Integer]
306
+ # @param members_limit [Integer]
307
+ # @param watchers_limit [Integer]
308
+ # @return [Models::ChannelStateResponse]
309
+ def get_channel(_type, _id, state = nil, messages_limit = nil, members_limit = nil, watchers_limit = nil)
310
+ path = '/api/v2/chat/channels/{type}/{id}'
311
+ # Replace path parameters
312
+ path = path.gsub('{type}', _type.to_s)
313
+ path = path.gsub('{id}', _id.to_s)
314
+ # Build query parameters
315
+ query_params = {}
316
+ query_params['state'] = state unless state.nil?
317
+ query_params['messages_limit'] = messages_limit unless messages_limit.nil?
318
+ query_params['members_limit'] = members_limit unless members_limit.nil?
319
+ query_params['watchers_limit'] = watchers_limit unless watchers_limit.nil?
320
+
321
+ # Make the API request
322
+ @client.make_request(
323
+ :get,
324
+ path,
325
+ query_params: query_params
326
+ )
327
+ end
328
+
300
329
  # Updates certain fields of the channelSends events:- channel.updated
301
330
  #
302
331
  # @param _type [String]
@@ -32,11 +32,17 @@ module GetStream
32
32
  # Create a single feed for a given feed group
33
33
  #
34
34
  # @param get_or_create_feed_request [GetOrCreateFeedRequest]
35
+ # @param language [String]
36
+ # @param translate_text [Boolean]
35
37
  # @return [Models::GetOrCreateFeedResponse]
36
- def get_or_create_feed(get_or_create_feed_request)
38
+ def get_or_create_feed(get_or_create_feed_request, language = nil, translate_text = nil)
39
+ # Build query parameters
40
+ query_params = {}
41
+ query_params['language'] = language unless language.nil?
42
+ query_params['translate_text'] = translate_text unless translate_text.nil?
37
43
 
38
44
  # Delegate to the FeedsClient
39
- @client.feeds.get_or_create_feed(@feed_group_id, @feed_id, get_or_create_feed_request)
45
+ @client.feeds.get_or_create_feed(@feed_group_id, @feed_id, get_or_create_feed_request, query_params)
40
46
  end
41
47
 
42
48
  # Update an existing feed
@@ -139,11 +145,17 @@ module GetStream
139
145
  # Query pinned activities for a feed with filter query
140
146
  #
141
147
  # @param query_pinned_activities_request [QueryPinnedActivitiesRequest]
148
+ # @param language [String]
149
+ # @param translate_text [Boolean]
142
150
  # @return [Models::QueryPinnedActivitiesResponse]
143
- def query_pinned_activities(query_pinned_activities_request)
151
+ def query_pinned_activities(query_pinned_activities_request, language = nil, translate_text = nil)
152
+ # Build query parameters
153
+ query_params = {}
154
+ query_params['language'] = language unless language.nil?
155
+ query_params['translate_text'] = translate_text unless translate_text.nil?
144
156
 
145
157
  # Delegate to the FeedsClient
146
- @client.feeds.query_pinned_activities(@feed_group_id, @feed_id, query_pinned_activities_request)
158
+ @client.feeds.query_pinned_activities(@feed_group_id, @feed_id, query_pinned_activities_request, query_params)
147
159
  end
148
160
 
149
161
  end