stream-chat-ruby 2.18.0 → 2.21.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.
- checksums.yaml +4 -4
- data/.rubocop.yml +3 -0
- data/CHANGELOG.md +30 -0
- data/CONTRIBUTING.md +64 -0
- data/Gemfile +1 -0
- data/README.md +67 -115
- data/lib/stream-chat/channel.rb +78 -15
- data/lib/stream-chat/client.rb +158 -32
- data/lib/stream-chat/errors.rb +22 -9
- data/lib/stream-chat/stream_rate_limits.rb +16 -5
- data/lib/stream-chat/stream_response.rb +21 -8
- data/lib/stream-chat/types.rb +13 -0
- data/lib/stream-chat/util.rb +16 -6
- data/lib/stream-chat/version.rb +2 -3
- data/lib/stream-chat.rb +2 -1
- data/stream-chat.gemspec +4 -1
- metadata +46 -2
data/lib/stream-chat/client.rb
CHANGED
@@ -1,16 +1,19 @@
|
|
1
|
+
# typed: strict
|
1
2
|
# frozen_string_literal: true
|
2
3
|
|
3
|
-
# lib/client.rb
|
4
4
|
require 'open-uri'
|
5
5
|
require 'faraday'
|
6
6
|
require 'faraday/multipart'
|
7
|
+
require 'faraday/net_http_persistent'
|
7
8
|
require 'jwt'
|
8
9
|
require 'time'
|
10
|
+
require 'sorbet-runtime'
|
9
11
|
require 'stream-chat/channel'
|
10
12
|
require 'stream-chat/errors'
|
11
13
|
require 'stream-chat/stream_response'
|
12
14
|
require 'stream-chat/version'
|
13
15
|
require 'stream-chat/util'
|
16
|
+
require 'stream-chat/types'
|
14
17
|
|
15
18
|
module StreamChat
|
16
19
|
DEFAULT_BLOCKLIST = 'profanity_en_2020_v1'
|
@@ -18,38 +21,76 @@ module StreamChat
|
|
18
21
|
HARD_DELETE = 'hard'
|
19
22
|
|
20
23
|
class Client
|
21
|
-
|
24
|
+
extend T::Sig
|
25
|
+
T::Configuration.default_checked_level = :never
|
26
|
+
# For now we disable runtime type checks.
|
27
|
+
# We will enable it with a major bump in the future,
|
28
|
+
# but for now, let's just run a static type check.
|
22
29
|
|
30
|
+
DEFAULT_BASE_URL = 'https://chat.stream-io-api.com'
|
31
|
+
DEFAULT_TIMEOUT = 6.0
|
32
|
+
|
33
|
+
sig { returns(String) }
|
23
34
|
attr_reader :api_key
|
35
|
+
|
36
|
+
sig { returns(String) }
|
24
37
|
attr_reader :api_secret
|
38
|
+
|
39
|
+
sig { returns(Faraday::Connection) }
|
25
40
|
attr_reader :conn
|
26
|
-
attr_reader :options
|
27
41
|
|
28
42
|
# initializes a Stream Chat API Client
|
29
43
|
#
|
30
44
|
# @param [string] api_key your application api_key
|
31
45
|
# @param [string] api_secret your application secret
|
32
|
-
# @param [
|
33
|
-
# @param [
|
46
|
+
# @param [float] timeout the timeout for the http requests
|
47
|
+
# @param [Hash] options extra options such as base_url
|
34
48
|
#
|
35
49
|
# @example initialized the client with a timeout setting
|
36
50
|
# StreamChat::Client.new('my_key', 'my_secret', 3.0)
|
37
51
|
#
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
@
|
43
|
-
@
|
44
|
-
@
|
45
|
-
@
|
52
|
+
sig { params(api_key: String, api_secret: String, timeout: T.nilable(T.any(Float, String)), options: T.untyped).void }
|
53
|
+
def initialize(api_key, api_secret, timeout = nil, **options)
|
54
|
+
raise ArgumentError, 'api_key and api_secret are required' if api_key.to_s.empty? || api_secret.to_s.empty?
|
55
|
+
|
56
|
+
@api_key = api_key
|
57
|
+
@api_secret = api_secret
|
58
|
+
@timeout = T.let(timeout&.to_f || DEFAULT_TIMEOUT, Float)
|
59
|
+
@auth_token = T.let(JWT.encode({ server: true }, @api_secret, 'HS256'), String)
|
60
|
+
@base_url = T.let(options[:base_url] || DEFAULT_BASE_URL, String)
|
61
|
+
conn = Faraday.new(@base_url) do |faraday|
|
46
62
|
faraday.options[:open_timeout] = @timeout
|
47
63
|
faraday.options[:timeout] = @timeout
|
48
64
|
faraday.request :multipart
|
49
|
-
faraday.adapter :
|
65
|
+
faraday.adapter :net_http_persistent, pool_size: 5 do |http|
|
66
|
+
# AWS load balancer idle timeout is 60 secs, so let's make it 59
|
67
|
+
http.idle_timeout = 59
|
68
|
+
end
|
50
69
|
end
|
70
|
+
@conn = T.let(conn, Faraday::Connection)
|
71
|
+
end
|
72
|
+
|
73
|
+
# initializes a Stream Chat API Client from STREAM_KEY and STREAM_SECRET
|
74
|
+
# environmental variables. STREAM_CHAT_TIMEOUT and STREAM_CHAT_URL
|
75
|
+
# variables are optional.
|
76
|
+
# @param [StringKeyHash] options extra options
|
77
|
+
sig { params(options: T.untyped).returns(Client) }
|
78
|
+
def self.from_env(**options)
|
79
|
+
Client.new(T.must(ENV['STREAM_KEY']),
|
80
|
+
T.must(ENV['STREAM_SECRET']),
|
81
|
+
ENV['STREAM_CHAT_TIMEOUT'],
|
82
|
+
**{ base_url: ENV['STREAM_CHAT_URL'] }.merge(options))
|
51
83
|
end
|
52
84
|
|
85
|
+
# Sets the underlying Faraday http client.
|
86
|
+
#
|
87
|
+
# @param [client] an instance of Faraday::Connection
|
88
|
+
sig { params(client: Faraday::Connection).void }
|
89
|
+
def set_http_client(client)
|
90
|
+
@conn = client
|
91
|
+
end
|
92
|
+
|
93
|
+
sig { params(user_id: String, exp: T.nilable(Integer), iat: T.nilable(Integer)).returns(String) }
|
53
94
|
def create_token(user_id, exp = nil, iat = nil)
|
54
95
|
payload = { user_id: user_id }
|
55
96
|
payload['exp'] = exp unless exp.nil?
|
@@ -57,24 +98,29 @@ module StreamChat
|
|
57
98
|
JWT.encode(payload, @api_secret, 'HS256')
|
58
99
|
end
|
59
100
|
|
101
|
+
sig { params(settings: T.untyped).returns(StreamChat::StreamResponse) }
|
60
102
|
def update_app_settings(**settings)
|
61
|
-
patch('app',
|
103
|
+
patch('app', data: settings)
|
62
104
|
end
|
63
105
|
|
106
|
+
sig { returns(StreamChat::StreamResponse) }
|
64
107
|
def get_app_settings
|
65
108
|
get('app')
|
66
109
|
end
|
67
110
|
|
111
|
+
sig { params(id: String, options: T.untyped).returns(StreamChat::StreamResponse) }
|
68
112
|
def flag_message(id, **options)
|
69
113
|
payload = { target_message_id: id }.merge(options)
|
70
114
|
post('moderation/flag', data: payload)
|
71
115
|
end
|
72
116
|
|
117
|
+
sig { params(id: String, options: T.untyped).returns(StreamChat::StreamResponse) }
|
73
118
|
def unflag_message(id, **options)
|
74
119
|
payload = { target_message_id: id }.merge(options)
|
75
120
|
post('moderation/unflag', data: payload)
|
76
121
|
end
|
77
122
|
|
123
|
+
sig { params(filter_conditions: StringKeyHash, options: T.untyped).returns(StreamChat::StreamResponse) }
|
78
124
|
def query_message_flags(filter_conditions, **options)
|
79
125
|
params = options.merge({
|
80
126
|
filter_conditions: filter_conditions
|
@@ -82,28 +128,32 @@ module StreamChat
|
|
82
128
|
get('moderation/flags/message', params: { payload: params.to_json })
|
83
129
|
end
|
84
130
|
|
131
|
+
sig { params(id: String, options: T.untyped).returns(StreamChat::StreamResponse) }
|
85
132
|
def flag_user(id, **options)
|
86
133
|
payload = { target_user_id: id }.merge(options)
|
87
134
|
post('moderation/flag', data: payload)
|
88
135
|
end
|
89
136
|
|
137
|
+
sig { params(id: String, options: T.untyped).returns(StreamChat::StreamResponse) }
|
90
138
|
def unflag_user(id, **options)
|
91
139
|
payload = { target_user_id: id }.merge(options)
|
92
140
|
post('moderation/unflag', data: payload)
|
93
141
|
end
|
94
142
|
|
143
|
+
sig { params(id: String).returns(StreamChat::StreamResponse) }
|
95
144
|
def get_message(id)
|
96
145
|
get("messages/#{id}")
|
97
146
|
end
|
98
147
|
|
148
|
+
sig { params(filter_conditions: StringKeyHash, query: T.any(String, StringKeyHash), sort: T.nilable(T::Hash[String, Integer]), options: T.untyped).returns(StreamChat::StreamResponse) }
|
99
149
|
def search(filter_conditions, query, sort: nil, **options)
|
100
|
-
offset = options[:offset]
|
150
|
+
offset = T.cast(options[:offset], T.nilable(Integer))
|
101
151
|
next_value = options[:next]
|
102
152
|
raise ArgumentError, 'cannot use offset with next or sort parameters' if offset&.positive? && (next_value || (!sort.nil? && !sort.empty?))
|
103
153
|
|
104
154
|
to_merge = {
|
105
155
|
filter_conditions: filter_conditions,
|
106
|
-
sort: get_sort_fields(sort)
|
156
|
+
sort: StreamChat.get_sort_fields(sort)
|
107
157
|
}
|
108
158
|
if query.is_a? String
|
109
159
|
to_merge[:query] = query
|
@@ -113,6 +163,7 @@ module StreamChat
|
|
113
163
|
get('search', params: { payload: options.merge(to_merge).to_json })
|
114
164
|
end
|
115
165
|
|
166
|
+
sig { params(users: T::Array[StringKeyHash]).returns(StreamChat::StreamResponse) }
|
116
167
|
def update_users(users)
|
117
168
|
payload = {}
|
118
169
|
users.each do |user|
|
@@ -124,69 +175,84 @@ module StreamChat
|
|
124
175
|
post('users', data: { users: payload })
|
125
176
|
end
|
126
177
|
|
178
|
+
sig { params(user: StringKeyHash).returns(StreamChat::StreamResponse) }
|
127
179
|
def update_user(user)
|
128
180
|
update_users([user])
|
129
181
|
end
|
130
182
|
|
183
|
+
sig { params(updates: T::Array[StringKeyHash]).returns(StreamChat::StreamResponse) }
|
131
184
|
def update_users_partial(updates)
|
132
185
|
patch('users', data: { users: updates })
|
133
186
|
end
|
134
187
|
|
188
|
+
sig { params(update: StringKeyHash).returns(StreamChat::StreamResponse) }
|
135
189
|
def update_user_partial(update)
|
136
190
|
update_users_partial([update])
|
137
191
|
end
|
138
192
|
|
193
|
+
sig { params(user_id: String, options: T.untyped).returns(StreamChat::StreamResponse) }
|
139
194
|
def delete_user(user_id, **options)
|
140
195
|
delete("users/#{user_id}", params: options)
|
141
196
|
end
|
142
197
|
|
198
|
+
sig { params(user_id: String, options: T.untyped).returns(StreamChat::StreamResponse) }
|
143
199
|
def deactivate_user(user_id, **options)
|
144
|
-
post("users/#{user_id}/deactivate",
|
200
|
+
post("users/#{user_id}/deactivate", params: options)
|
145
201
|
end
|
146
202
|
|
203
|
+
sig { params(user_id: String, options: T.untyped).returns(StreamChat::StreamResponse) }
|
147
204
|
def reactivate_user(user_id, **options)
|
148
|
-
post("users/#{user_id}/reactivate",
|
205
|
+
post("users/#{user_id}/reactivate", params: options)
|
149
206
|
end
|
150
207
|
|
208
|
+
sig { params(user_id: String, options: T.untyped).returns(StreamChat::StreamResponse) }
|
151
209
|
def export_user(user_id, **options)
|
152
210
|
get("users/#{user_id}/export", params: options)
|
153
211
|
end
|
154
212
|
|
213
|
+
sig { params(target_id: String, options: T.untyped).returns(StreamChat::StreamResponse) }
|
155
214
|
def ban_user(target_id, **options)
|
156
215
|
payload = { target_user_id: target_id }.merge(options)
|
157
216
|
post('moderation/ban', data: payload)
|
158
217
|
end
|
159
218
|
|
219
|
+
sig { params(target_id: String, options: T.untyped).returns(StreamChat::StreamResponse) }
|
160
220
|
def unban_user(target_id, **options)
|
161
221
|
params = { target_user_id: target_id }.merge(options)
|
162
222
|
delete('moderation/ban', params: params)
|
163
223
|
end
|
164
224
|
|
225
|
+
sig { params(target_id: String, options: T.untyped).returns(StreamChat::StreamResponse) }
|
165
226
|
def shadow_ban(target_id, **options)
|
166
227
|
payload = { target_user_id: target_id, shadow: true }.merge(options)
|
167
228
|
post('moderation/ban', data: payload)
|
168
229
|
end
|
169
230
|
|
231
|
+
sig { params(target_id: String, options: T.untyped).returns(StreamChat::StreamResponse) }
|
170
232
|
def remove_shadow_ban(target_id, **options)
|
171
233
|
params = { target_user_id: target_id, shadow: true }.merge(options)
|
172
234
|
delete('moderation/ban', params: params)
|
173
235
|
end
|
174
236
|
|
237
|
+
sig { params(target_id: String, user_id: String).returns(StreamChat::StreamResponse) }
|
175
238
|
def mute_user(target_id, user_id)
|
176
239
|
payload = { target_id: target_id, user_id: user_id }
|
177
240
|
post('moderation/mute', data: payload)
|
178
241
|
end
|
179
242
|
|
243
|
+
sig { params(target_id: String, user_id: String).returns(StreamChat::StreamResponse) }
|
180
244
|
def unmute_user(target_id, user_id)
|
181
245
|
payload = { target_id: target_id, user_id: user_id }
|
182
246
|
post('moderation/unmute', data: payload)
|
183
247
|
end
|
184
248
|
|
249
|
+
sig { params(user_id: String).returns(StreamChat::StreamResponse) }
|
185
250
|
def mark_all_read(user_id)
|
186
251
|
payload = { user: { id: user_id } }
|
187
252
|
post('channels/read', data: payload)
|
188
253
|
end
|
189
254
|
|
255
|
+
sig { params(message_id: String, user_id: String, expiration: T.nilable(String)).returns(StreamChat::StreamResponse) }
|
190
256
|
def pin_message(message_id, user_id, expiration: nil)
|
191
257
|
updates = {
|
192
258
|
set: {
|
@@ -197,6 +263,7 @@ module StreamChat
|
|
197
263
|
update_message_partial(message_id, updates, user_id: user_id)
|
198
264
|
end
|
199
265
|
|
266
|
+
sig { params(message_id: String, user_id: String).returns(StreamChat::StreamResponse) }
|
200
267
|
def unpin_message(message_id, user_id)
|
201
268
|
updates = {
|
202
269
|
set: {
|
@@ -206,64 +273,75 @@ module StreamChat
|
|
206
273
|
update_message_partial(message_id, updates, user_id: user_id)
|
207
274
|
end
|
208
275
|
|
276
|
+
sig { params(message: StringKeyHash).returns(StreamChat::StreamResponse) }
|
209
277
|
def update_message(message)
|
210
|
-
raise ArgumentError 'message must have an id' unless message.key? 'id'
|
278
|
+
raise ArgumentError, 'message must have an id' unless message.key? 'id'
|
211
279
|
|
212
280
|
post("messages/#{message['id']}", data: { message: message })
|
213
281
|
end
|
214
282
|
|
283
|
+
sig { params(message_id: String, updates: StringKeyHash, user_id: T.nilable(String), options: T.untyped).returns(StreamChat::StreamResponse) }
|
215
284
|
def update_message_partial(message_id, updates, user_id: nil, **options)
|
216
285
|
params = updates.merge(options)
|
217
286
|
params['user'] = { id: user_id } if user_id
|
218
287
|
put("messages/#{message_id}", data: params)
|
219
288
|
end
|
220
289
|
|
221
|
-
|
222
|
-
|
290
|
+
sig { params(message_id: String, options: T.untyped).returns(StreamChat::StreamResponse) }
|
291
|
+
def delete_message(message_id, **options)
|
292
|
+
delete("messages/#{message_id}", params: options)
|
223
293
|
end
|
224
294
|
|
295
|
+
sig { params(filter_conditions: StringKeyHash, sort: T.nilable(T::Hash[String, Integer]), options: T.untyped).returns(StreamChat::StreamResponse) }
|
225
296
|
def query_banned_users(filter_conditions, sort: nil, **options)
|
226
297
|
params = options.merge({
|
227
298
|
filter_conditions: filter_conditions,
|
228
|
-
sort: get_sort_fields(sort)
|
299
|
+
sort: StreamChat.get_sort_fields(sort)
|
229
300
|
})
|
230
301
|
get('query_banned_users', params: { payload: params.to_json })
|
231
302
|
end
|
232
303
|
|
304
|
+
sig { params(filter_conditions: StringKeyHash, sort: T.nilable(T::Hash[String, Integer]), options: T.untyped).returns(StreamChat::StreamResponse) }
|
233
305
|
def query_users(filter_conditions, sort: nil, **options)
|
234
306
|
params = options.merge({
|
235
307
|
filter_conditions: filter_conditions,
|
236
|
-
sort: get_sort_fields(sort)
|
308
|
+
sort: StreamChat.get_sort_fields(sort)
|
237
309
|
})
|
238
310
|
get('users', params: { payload: params.to_json })
|
239
311
|
end
|
240
312
|
|
313
|
+
sig { params(filter_conditions: StringKeyHash, sort: T.nilable(T::Hash[String, Integer]), options: T.untyped).returns(StreamChat::StreamResponse) }
|
241
314
|
def query_channels(filter_conditions, sort: nil, **options)
|
242
315
|
data = { state: true, watch: false, presence: false }
|
243
316
|
data = data.merge(options).merge({
|
244
317
|
filter_conditions: filter_conditions,
|
245
|
-
sort: get_sort_fields(sort)
|
318
|
+
sort: StreamChat.get_sort_fields(sort)
|
246
319
|
})
|
247
320
|
post('channels', data: data)
|
248
321
|
end
|
249
322
|
|
323
|
+
sig { params(data: StringKeyHash).returns(StreamChat::StreamResponse) }
|
250
324
|
def create_channel_type(data)
|
251
325
|
data['commands'] = ['all'] unless data.key?('commands') || data['commands'].nil? || data['commands'].empty?
|
252
326
|
post('channeltypes', data: data)
|
253
327
|
end
|
254
328
|
|
329
|
+
sig { params(channel_type: String).returns(StreamChat::StreamResponse) }
|
255
330
|
def get_channel_type(channel_type)
|
256
331
|
get("channeltypes/#{channel_type}")
|
257
332
|
end
|
258
333
|
|
334
|
+
sig { returns(StreamChat::StreamResponse) }
|
259
335
|
def list_channel_types
|
260
336
|
get('channeltypes')
|
261
337
|
end
|
262
338
|
|
339
|
+
sig { params(channel_type: String, options: T.untyped).returns(StreamChat::StreamResponse) }
|
263
340
|
def update_channel_type(channel_type, **options)
|
264
341
|
put("channeltypes/#{channel_type}", data: options)
|
265
342
|
end
|
266
343
|
|
344
|
+
sig { params(channel_type: String).returns(StreamChat::StreamResponse) }
|
267
345
|
def delete_channel_type(channel_type)
|
268
346
|
delete("channeltypes/#{channel_type}")
|
269
347
|
end
|
@@ -272,14 +350,16 @@ module StreamChat
|
|
272
350
|
#
|
273
351
|
# @param [string] channel_type the channel type
|
274
352
|
# @param [string] channel_id the channel identifier
|
275
|
-
# @param [
|
353
|
+
# @param [StringKeyHash] data additional channel data
|
276
354
|
#
|
277
355
|
# @return [StreamChat::Channel]
|
278
356
|
#
|
357
|
+
sig { params(channel_type: String, channel_id: T.nilable(String), data: T.nilable(StringKeyHash)).returns(StreamChat::Channel) }
|
279
358
|
def channel(channel_type, channel_id: nil, data: nil)
|
280
359
|
StreamChat::Channel.new(self, channel_type, channel_id, data)
|
281
360
|
end
|
282
361
|
|
362
|
+
sig { params(device_id: String, push_provider: String, user_id: String).returns(StreamChat::StreamResponse) }
|
283
363
|
def add_device(device_id, push_provider, user_id)
|
284
364
|
post('devices', data: {
|
285
365
|
id: device_id,
|
@@ -288,14 +368,17 @@ module StreamChat
|
|
288
368
|
})
|
289
369
|
end
|
290
370
|
|
371
|
+
sig { params(device_id: String, user_id: String).returns(StreamChat::StreamResponse) }
|
291
372
|
def delete_device(device_id, user_id)
|
292
373
|
delete('devices', params: { id: device_id, user_id: user_id })
|
293
374
|
end
|
294
375
|
|
376
|
+
sig { params(user_id: String).returns(StreamChat::StreamResponse) }
|
295
377
|
def get_devices(user_id)
|
296
378
|
get('devices', params: { user_id: user_id })
|
297
379
|
end
|
298
380
|
|
381
|
+
sig { params(server_side: T::Boolean, android: T::Boolean, ios: T::Boolean, web: T::Boolean, endpoints: T::Array[String]).returns(StreamChat::StreamResponse) }
|
299
382
|
def get_rate_limits(server_side: false, android: false, ios: false, web: false, endpoints: [])
|
300
383
|
params = {}
|
301
384
|
params['server_side'] = server_side if server_side
|
@@ -307,78 +390,96 @@ module StreamChat
|
|
307
390
|
get('rate_limits', params: params)
|
308
391
|
end
|
309
392
|
|
393
|
+
sig { params(request_body: String, x_signature: String).returns(T::Boolean) }
|
310
394
|
def verify_webhook(request_body, x_signature)
|
311
395
|
signature = OpenSSL::HMAC.hexdigest('SHA256', @api_secret, request_body)
|
312
396
|
signature == x_signature
|
313
397
|
end
|
314
398
|
|
399
|
+
sig { params(user_id: String, event: StringKeyHash).returns(StreamChat::StreamResponse) }
|
315
400
|
def send_user_event(user_id, event)
|
316
401
|
post("users/#{user_id}/event", data: event)
|
317
402
|
end
|
318
403
|
|
404
|
+
sig { params(message_id: String, language: String).returns(StreamChat::StreamResponse) }
|
319
405
|
def translate_message(message_id, language)
|
320
406
|
post("messages/#{message_id}/translate", data: { language: language })
|
321
407
|
end
|
322
408
|
|
409
|
+
sig { params(message_id: String, data: StringKeyHash).returns(StreamChat::StreamResponse) }
|
323
410
|
def run_message_action(message_id, data)
|
324
411
|
post("messages/#{message_id}/action", data: data)
|
325
412
|
end
|
326
413
|
|
414
|
+
sig { params(user: StringKeyHash).returns(StreamChat::StreamResponse) }
|
327
415
|
def create_guest(user)
|
328
416
|
post('guests', data: user)
|
329
417
|
end
|
330
418
|
|
419
|
+
sig { returns(StreamChat::StreamResponse) }
|
331
420
|
def list_blocklists
|
332
421
|
get('blocklists')
|
333
422
|
end
|
334
423
|
|
424
|
+
sig { params(name: String).returns(StreamChat::StreamResponse) }
|
335
425
|
def get_blocklist(name)
|
336
426
|
get("blocklists/#{name}")
|
337
427
|
end
|
338
428
|
|
429
|
+
sig { params(name: String, words: StringKeyHash).returns(StreamChat::StreamResponse) }
|
339
430
|
def create_blocklist(name, words)
|
340
431
|
post('blocklists', data: { name: name, words: words })
|
341
432
|
end
|
342
433
|
|
434
|
+
sig { params(name: String, words: StringKeyHash).returns(StreamChat::StreamResponse) }
|
343
435
|
def update_blocklist(name, words)
|
344
436
|
put("blocklists/#{name}", data: { words: words })
|
345
437
|
end
|
346
438
|
|
439
|
+
sig { params(name: String).returns(StreamChat::StreamResponse) }
|
347
440
|
def delete_blocklist(name)
|
348
441
|
delete("blocklists/#{name}")
|
349
442
|
end
|
350
443
|
|
444
|
+
sig { params(channels: StringKeyHash, options: T.untyped).returns(StreamChat::StreamResponse) }
|
351
445
|
def export_channels(*channels, **options)
|
352
446
|
post('export_channels', data: { channels: channels, **options })
|
353
447
|
end
|
354
448
|
|
449
|
+
sig { params(task_id: String).returns(StreamChat::StreamResponse) }
|
355
450
|
def get_export_channel_status(task_id)
|
356
451
|
get("export_channels/#{task_id}")
|
357
452
|
end
|
358
453
|
|
454
|
+
sig { params(task_id: String).returns(StreamChat::StreamResponse) }
|
359
455
|
def get_task(task_id)
|
360
456
|
get("tasks/#{task_id}")
|
361
457
|
end
|
362
458
|
|
459
|
+
sig { params(user_ids: T::Array[String], user: String, messages: T.nilable(StringKeyHash), conversations: T.nilable(String)).returns(StreamChat::StreamResponse) }
|
363
460
|
def delete_users(user_ids, user: SOFT_DELETE, messages: nil, conversations: nil)
|
364
461
|
post('users/delete', data: { user_ids: user_ids, user: user, messages: messages, conversations: conversations })
|
365
462
|
end
|
366
463
|
|
464
|
+
sig { params(cids: T::Array[String], hard_delete: T::Boolean).returns(StreamChat::StreamResponse) }
|
367
465
|
def delete_channels(cids, hard_delete: false)
|
368
466
|
post('channels/delete', data: { cids: cids, hard_delete: hard_delete })
|
369
467
|
end
|
370
468
|
|
469
|
+
sig { params(before: T.any(DateTime, String)).returns(StreamChat::StreamResponse) }
|
371
470
|
def revoke_tokens(before)
|
372
|
-
before = before.rfc3339 if before.instance_of?(DateTime)
|
471
|
+
before = T.cast(before, DateTime).rfc3339 if before.instance_of?(DateTime)
|
373
472
|
update_app_settings({ 'revoke_tokens_issued_before' => before })
|
374
473
|
end
|
375
474
|
|
475
|
+
sig { params(user_id: String, before: T.any(DateTime, String)).returns(StreamChat::StreamResponse) }
|
376
476
|
def revoke_user_token(user_id, before)
|
377
477
|
revoke_users_token([user_id], before)
|
378
478
|
end
|
379
479
|
|
480
|
+
sig { params(user_ids: T::Array[String], before: T.any(DateTime, String)).returns(StreamChat::StreamResponse) }
|
380
481
|
def revoke_users_token(user_ids, before)
|
381
|
-
before = before.rfc3339 if before.instance_of?(DateTime)
|
482
|
+
before = T.cast(before, DateTime).rfc3339 if before.instance_of?(DateTime)
|
382
483
|
|
383
484
|
updates = []
|
384
485
|
user_ids.each do |user_id|
|
@@ -392,32 +493,38 @@ module StreamChat
|
|
392
493
|
update_users_partial(updates)
|
393
494
|
end
|
394
495
|
|
496
|
+
sig { params(relative_url: String, params: T.nilable(StringKeyHash), data: T.nilable(StringKeyHash)).returns(StreamChat::StreamResponse) }
|
395
497
|
def put(relative_url, params: nil, data: nil)
|
396
498
|
make_http_request(:put, relative_url, params: params, data: data)
|
397
499
|
end
|
398
500
|
|
501
|
+
sig { params(relative_url: String, params: T.nilable(StringKeyHash), data: T.nilable(StringKeyHash)).returns(StreamChat::StreamResponse) }
|
399
502
|
def post(relative_url, params: nil, data: nil)
|
400
503
|
make_http_request(:post, relative_url, params: params, data: data)
|
401
504
|
end
|
402
505
|
|
506
|
+
sig { params(relative_url: String, params: T.nilable(StringKeyHash)).returns(StreamChat::StreamResponse) }
|
403
507
|
def get(relative_url, params: nil)
|
404
508
|
make_http_request(:get, relative_url, params: params)
|
405
509
|
end
|
406
510
|
|
511
|
+
sig { params(relative_url: String, params: T.nilable(StringKeyHash)).returns(StreamChat::StreamResponse) }
|
407
512
|
def delete(relative_url, params: nil)
|
408
513
|
make_http_request(:delete, relative_url, params: params)
|
409
514
|
end
|
410
515
|
|
516
|
+
sig { params(relative_url: String, params: T.nilable(StringKeyHash), data: T.nilable(StringKeyHash)).returns(StreamChat::StreamResponse) }
|
411
517
|
def patch(relative_url, params: nil, data: nil)
|
412
518
|
make_http_request(:patch, relative_url, params: params, data: data)
|
413
519
|
end
|
414
520
|
|
415
|
-
|
521
|
+
sig { params(relative_url: String, file_url: String, user: StringKeyHash, content_type: T.nilable(String)).returns(StreamChat::StreamResponse) }
|
522
|
+
def send_file(relative_url, file_url, user, content_type = nil)
|
416
523
|
url = [@base_url, relative_url].join('/')
|
417
524
|
|
418
525
|
body = { user: user.to_json }
|
419
526
|
|
420
|
-
body[:file] = Faraday::UploadIO.new(file_url, content_type)
|
527
|
+
body[:file] = Faraday::UploadIO.new(file_url, content_type || 'application/octet-stream')
|
421
528
|
|
422
529
|
response = @conn.post url do |req|
|
423
530
|
req.headers['X-Stream-Client'] = get_user_agent
|
@@ -430,76 +537,94 @@ module StreamChat
|
|
430
537
|
parse_response(response)
|
431
538
|
end
|
432
539
|
|
540
|
+
sig { params(push_data: StringKeyHash).returns(StreamChat::StreamResponse) }
|
433
541
|
def check_push(push_data)
|
434
542
|
post('check_push', data: push_data)
|
435
543
|
end
|
436
544
|
|
545
|
+
sig { params(sqs_key: T.nilable(String), sqs_secret: T.nilable(String), sqs_url: T.nilable(String)).returns(StreamChat::StreamResponse) }
|
437
546
|
def check_sqs(sqs_key = nil, sqs_secret = nil, sqs_url = nil)
|
438
547
|
post('check_sqs', data: { sqs_key: sqs_key, sqs_secret: sqs_secret, sqs_url: sqs_url })
|
439
548
|
end
|
440
549
|
|
550
|
+
sig { params(command: StringKeyHash).returns(StreamChat::StreamResponse) }
|
441
551
|
def create_command(command)
|
442
552
|
post('commands', data: command)
|
443
553
|
end
|
444
554
|
|
555
|
+
sig { params(name: String).returns(StreamChat::StreamResponse) }
|
445
556
|
def get_command(name)
|
446
557
|
get("commands/#{name}")
|
447
558
|
end
|
448
559
|
|
560
|
+
sig { params(name: String, command: StringKeyHash).returns(StreamChat::StreamResponse) }
|
449
561
|
def update_command(name, command)
|
450
562
|
put("commands/#{name}", data: command)
|
451
563
|
end
|
452
564
|
|
565
|
+
sig { params(name: String).returns(StreamChat::StreamResponse) }
|
453
566
|
def delete_command(name)
|
454
567
|
delete("commands/#{name}")
|
455
568
|
end
|
456
569
|
|
570
|
+
sig { returns(StreamChat::StreamResponse) }
|
457
571
|
def list_commands
|
458
572
|
get('commands')
|
459
573
|
end
|
460
574
|
|
575
|
+
sig { returns(StreamChat::StreamResponse) }
|
461
576
|
def list_permissions
|
462
577
|
get('permissions')
|
463
578
|
end
|
464
579
|
|
580
|
+
sig { params(id: String).returns(StreamChat::StreamResponse) }
|
465
581
|
def get_permission(id)
|
466
582
|
get("permissions/#{id}")
|
467
583
|
end
|
468
584
|
|
585
|
+
sig { params(permission: StringKeyHash).returns(StreamChat::StreamResponse) }
|
469
586
|
def create_permission(permission)
|
470
587
|
post('permissions', data: permission)
|
471
588
|
end
|
472
589
|
|
590
|
+
sig { params(id: String, permission: StringKeyHash).returns(StreamChat::StreamResponse) }
|
473
591
|
def update_permission(id, permission)
|
474
592
|
put("permissions/#{id}", data: permission)
|
475
593
|
end
|
476
594
|
|
595
|
+
sig { params(id: String).returns(StreamChat::StreamResponse) }
|
477
596
|
def delete_permission(id)
|
478
597
|
delete("permissions/#{id}")
|
479
598
|
end
|
480
599
|
|
600
|
+
sig { params(name: String).returns(StreamChat::StreamResponse) }
|
481
601
|
def create_role(name)
|
482
602
|
post('roles', data: { name: name })
|
483
603
|
end
|
484
604
|
|
605
|
+
sig { params(name: String).returns(StreamChat::StreamResponse) }
|
485
606
|
def delete_role(name)
|
486
607
|
delete("roles/#{name}")
|
487
608
|
end
|
488
609
|
|
610
|
+
sig { returns(StreamChat::StreamResponse) }
|
489
611
|
def list_roles
|
490
612
|
get('roles')
|
491
613
|
end
|
492
614
|
|
493
615
|
private
|
494
616
|
|
617
|
+
sig { returns(T::Hash[String, String]) }
|
495
618
|
def get_default_params
|
496
619
|
{ api_key: @api_key }
|
497
620
|
end
|
498
621
|
|
622
|
+
sig { returns(String) }
|
499
623
|
def get_user_agent
|
500
624
|
"stream-ruby-client-#{StreamChat::VERSION}"
|
501
625
|
end
|
502
626
|
|
627
|
+
sig { returns(T::Hash[String, String]) }
|
503
628
|
def get_default_headers
|
504
629
|
{
|
505
630
|
'Content-Type': 'application/json',
|
@@ -507,6 +632,7 @@ module StreamChat
|
|
507
632
|
}
|
508
633
|
end
|
509
634
|
|
635
|
+
sig { params(response: Faraday::Response).returns(StreamChat::StreamResponse) }
|
510
636
|
def parse_response(response)
|
511
637
|
begin
|
512
638
|
parsed_result = JSON.parse(response.body)
|
@@ -518,14 +644,14 @@ module StreamChat
|
|
518
644
|
StreamResponse.new(parsed_result, response)
|
519
645
|
end
|
520
646
|
|
647
|
+
sig { params(method: Symbol, relative_url: String, params: T.nilable(StringKeyHash), data: T.nilable(StringKeyHash)).returns(StreamChat::StreamResponse) }
|
521
648
|
def make_http_request(method, relative_url, params: nil, data: nil)
|
522
649
|
headers = get_default_headers
|
523
650
|
headers['Authorization'] = @auth_token
|
524
651
|
headers['stream-auth-type'] = 'jwt'
|
525
|
-
url = [@base_url, relative_url].join('/')
|
526
652
|
params = {} if params.nil?
|
527
653
|
params = (get_default_params.merge(params).sort_by { |k, _v| k.to_s }).to_h
|
528
|
-
url = "#{
|
654
|
+
url = "#{relative_url}?#{URI.encode_www_form(params)}"
|
529
655
|
|
530
656
|
body = data.to_json if %w[patch post put].include? method.to_s
|
531
657
|
|