stream-chat-ruby 2.19.0 → 2.22.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.
@@ -1,49 +1,72 @@
1
+ # typed: strict
1
2
  # frozen_string_literal: true
2
3
 
4
+ require 'stream-chat/client'
3
5
  require 'stream-chat/errors'
4
6
  require 'stream-chat/util'
7
+ require 'stream-chat/types'
5
8
 
6
9
  module StreamChat
7
- class Channel # rubocop:todo Metrics/ClassLength # rubocop:todo Style/Documentation
10
+ class Channel
11
+ extend T::Sig
12
+ T::Configuration.default_checked_level = :never
13
+ # For now we disable runtime type checks.
14
+ # We will enable it with a major bump in the future,
15
+ # but for now, let's just run a static type check.
16
+
17
+ sig { returns(T.nilable(String)) }
8
18
  attr_reader :id
19
+
20
+ sig { returns(String) }
9
21
  attr_reader :channel_type
22
+
23
+ sig { returns(StringKeyHash) }
10
24
  attr_reader :custom_data
25
+
26
+ sig { returns(T::Array[StringKeyHash]) }
11
27
  attr_reader :members
12
28
 
29
+ sig { params(client: StreamChat::Client, channel_type: String, channel_id: T.nilable(String), custom_data: T.nilable(StringKeyHash)).void }
13
30
  def initialize(client, channel_type, channel_id = nil, custom_data = nil)
14
31
  @channel_type = channel_type
15
32
  @id = channel_id
16
- @cid = "#{@channel_type}:#{@id}"
33
+ @cid = T.let("#{@channel_type}:#{@id}", String)
17
34
  @client = client
18
- @custom_data = custom_data
19
- @custom_data = {} if @custom_data.nil?
35
+ @custom_data = T.let(custom_data || {}, StringKeyHash)
36
+ @members = T.let([], T::Array[StringKeyHash])
20
37
  end
21
38
 
39
+ sig { returns(String) }
22
40
  def url
23
41
  raise StreamChannelException, 'channel does not have an id' if @id.nil?
24
42
 
25
43
  "channels/#{@channel_type}/#{@id}"
26
44
  end
27
45
 
46
+ sig { params(message_ids: T::Array[String]).returns(StreamChat::StreamResponse) }
28
47
  def get_messages(message_ids)
29
48
  @client.get("#{url}/messages", params: { 'ids' => message_ids.join(',') })
30
49
  end
31
50
 
51
+ sig { params(message: StringKeyHash, user_id: String).returns(StreamChat::StreamResponse) }
32
52
  def send_message(message, user_id)
33
53
  payload = { message: add_user_id(message, user_id) }
34
54
  @client.post("#{url}/message", data: payload)
35
55
  end
36
56
 
57
+ sig { params(event: StringKeyHash, user_id: String).returns(StreamChat::StreamResponse) }
37
58
  def send_event(event, user_id)
38
59
  payload = { 'event' => add_user_id(event, user_id) }
39
60
  @client.post("#{url}/event", data: payload)
40
61
  end
41
62
 
63
+ sig { params(message_id: String, reaction: StringKeyHash, user_id: String).returns(StreamChat::StreamResponse) }
42
64
  def send_reaction(message_id, reaction, user_id)
43
65
  payload = { reaction: add_user_id(reaction, user_id) }
44
66
  @client.post("messages/#{message_id}/reaction", data: payload)
45
67
  end
46
68
 
69
+ sig { params(message_id: String, reaction_type: String, user_id: String).returns(StreamChat::StreamResponse) }
47
70
  def delete_reaction(message_id, reaction_type, user_id)
48
71
  @client.delete(
49
72
  "messages/#{message_id}/reaction/#{reaction_type}",
@@ -51,11 +74,13 @@ module StreamChat
51
74
  )
52
75
  end
53
76
 
77
+ sig { params(user_id: String).returns(StreamChat::StreamResponse) }
54
78
  def create(user_id)
55
79
  @custom_data['created_by'] = { id: user_id }
56
80
  query(watch: false, state: false, presence: false)
57
81
  end
58
82
 
83
+ sig { params(options: T.untyped).returns(StreamChat::StreamResponse) }
59
84
  def query(**options)
60
85
  payload = { state: true, data: @custom_data }.merge(options)
61
86
  url = "channels/#{@channel_type}"
@@ -66,17 +91,18 @@ module StreamChat
66
91
  state
67
92
  end
68
93
 
94
+ sig { params(filter_conditions: StringKeyHash, sort: T.nilable(T::Hash[String, Integer]), options: T.untyped).returns(StreamChat::StreamResponse) }
69
95
  def query_members(filter_conditions = {}, sort: nil, **options)
70
96
  params = {}.merge(options).merge({
71
97
  id: @id,
72
98
  type: @channel_type,
73
99
  filter_conditions: filter_conditions,
74
- sort: get_sort_fields(sort)
100
+ sort: StreamChat.get_sort_fields(sort)
75
101
  })
76
102
 
77
103
  if @id == '' && @members.length.positive?
78
104
  params['members'] = []
79
- @members&.each do |m|
105
+ @members.each do |m|
80
106
  params['members'] << m['user'].nil? ? m['user_id'] : m['user']['id']
81
107
  end
82
108
  end
@@ -84,11 +110,13 @@ module StreamChat
84
110
  @client.get('members', params: { payload: params.to_json })
85
111
  end
86
112
 
87
- def update(channel_data, update_message = nil)
88
- payload = { data: channel_data, message: update_message }
113
+ sig { params(channel_data: T.nilable(StringKeyHash), update_message: T.nilable(StringKeyHash), options: T.untyped).returns(StreamChat::StreamResponse) }
114
+ def update(channel_data, update_message = nil, **options)
115
+ payload = { data: channel_data, message: update_message }.merge(options)
89
116
  @client.post(url, data: payload)
90
117
  end
91
118
 
119
+ sig { params(set: T.nilable(StringKeyHash), unset: T.nilable(T::Array[String])).returns(StreamChat::StreamResponse) }
92
120
  def update_partial(set = nil, unset = nil)
93
121
  raise StreamChannelException, 'set or unset is needed' if set.nil? && unset.nil?
94
122
 
@@ -96,96 +124,131 @@ module StreamChat
96
124
  @client.patch(url, data: payload)
97
125
  end
98
126
 
127
+ sig { returns(StreamChat::StreamResponse) }
99
128
  def delete
100
129
  @client.delete(url)
101
130
  end
102
131
 
132
+ sig { params(options: T.untyped).returns(StreamChat::StreamResponse) }
103
133
  def truncate(**options)
104
134
  @client.post("#{url}/truncate", data: options)
105
135
  end
106
136
 
137
+ sig { params(user_id: String, expiration: T.nilable(Integer)).returns(StreamChat::StreamResponse) }
107
138
  def mute(user_id, expiration = nil)
108
139
  data = { user_id: user_id, channel_cid: @cid }
109
140
  data['expiration'] = expiration if expiration
110
141
  @client.post('moderation/mute/channel', data: data)
111
142
  end
112
143
 
144
+ sig { params(user_id: String).returns(StreamChat::StreamResponse) }
113
145
  def unmute(user_id)
114
146
  @client.post('moderation/unmute/channel', data: { 'user_id' => user_id, 'channel_cid' => @cid })
115
147
  end
116
148
 
149
+ sig { params(user_ids: T::Array[String], options: T.untyped).returns(StreamChat::StreamResponse) }
117
150
  def add_members(user_ids, **options)
118
151
  payload = options.merge({ add_members: user_ids })
119
- @client.post(url, data: payload)
152
+ update(nil, nil, **payload)
153
+ end
154
+
155
+ sig { params(user_ids: T::Array[String], options: T.untyped).returns(StreamChat::StreamResponse) }
156
+ def invite_members(user_ids, **options)
157
+ payload = options.merge({ invites: user_ids })
158
+ update(nil, nil, **payload)
159
+ end
160
+
161
+ sig { params(user_id: String, options: T.untyped).returns(StreamChat::StreamResponse) }
162
+ def accept_invite(user_id, **options)
163
+ payload = options.merge({ user_id: user_id, accept_invite: true })
164
+ update(nil, nil, **payload)
120
165
  end
121
166
 
122
- def invite_members(user_ids)
123
- @client.post(url, data: { invites: user_ids })
167
+ sig { params(user_id: String, options: T.untyped).returns(StreamChat::StreamResponse) }
168
+ def reject_invite(user_id, **options)
169
+ payload = options.merge({ user_id: user_id, reject_invite: true })
170
+ update(nil, nil, **payload)
124
171
  end
125
172
 
173
+ sig { params(user_ids: T::Array[String]).returns(StreamChat::StreamResponse) }
126
174
  def add_moderators(user_ids)
127
- @client.post(url, data: { add_moderators: user_ids })
175
+ update(nil, nil, add_moderators: user_ids)
128
176
  end
129
177
 
178
+ sig { params(user_ids: T::Array[String]).returns(StreamChat::StreamResponse) }
130
179
  def remove_members(user_ids)
131
- @client.post(url, data: { remove_members: user_ids })
180
+ update(nil, nil, remove_members: user_ids)
132
181
  end
133
182
 
183
+ sig { params(members: T::Array[StringKeyHash], message: T.nilable(StringKeyHash)).returns(StreamChat::StreamResponse) }
134
184
  def assign_roles(members, message = nil)
135
- @client.post(url, data: { assign_roles: members, message: message })
185
+ update(nil, message, assign_roles: members)
136
186
  end
137
187
 
188
+ sig { params(user_ids: T::Array[String]).returns(StreamChat::StreamResponse) }
138
189
  def demote_moderators(user_ids)
139
- @client.post(url, data: { demote_moderators: user_ids })
190
+ update(nil, nil, demote_moderators: user_ids)
140
191
  end
141
192
 
193
+ sig { params(user_id: String, options: StringKeyHash).returns(StreamChat::StreamResponse) }
142
194
  def mark_read(user_id, **options)
143
195
  payload = add_user_id(options, user_id)
144
196
  @client.post("#{url}/read", data: payload)
145
197
  end
146
198
 
199
+ sig { params(parent_id: String, options: T.untyped).returns(StreamChat::StreamResponse) }
147
200
  def get_replies(parent_id, **options)
148
201
  @client.get("messages/#{parent_id}/replies", params: options)
149
202
  end
150
203
 
204
+ sig { params(message_id: String, options: T.untyped).returns(StreamChat::StreamResponse) }
151
205
  def get_reactions(message_id, **options)
152
206
  @client.get("messages/#{message_id}/reactions", params: options)
153
207
  end
154
208
 
209
+ sig { params(user_id: String, options: T.untyped).returns(StreamChat::StreamResponse) }
155
210
  def ban_user(user_id, **options)
156
211
  @client.ban_user(user_id, type: @channel_type, id: @id, **options)
157
212
  end
158
213
 
214
+ sig { params(user_id: String).returns(StreamChat::StreamResponse) }
159
215
  def unban_user(user_id)
160
216
  @client.unban_user(user_id, type: @channel_type, id: @id)
161
217
  end
162
218
 
219
+ sig { params(user_id: String).returns(StreamChat::StreamResponse) }
163
220
  def hide(user_id)
164
221
  @client.post("#{url}/hide", data: { user_id: user_id })
165
222
  end
166
223
 
224
+ sig { params(user_id: String).returns(StreamChat::StreamResponse) }
167
225
  def show(user_id)
168
226
  @client.post("#{url}/show", data: { user_id: user_id })
169
227
  end
170
228
 
229
+ sig { params(url: String, user: StringKeyHash, content_type: T.nilable(String)).returns(StreamChat::StreamResponse) }
171
230
  def send_file(url, user, content_type = nil)
172
231
  @client.send_file("#{self.url}/file", url, user, content_type)
173
232
  end
174
233
 
234
+ sig { params(url: String, user: StringKeyHash, content_type: T.nilable(String)).returns(StreamChat::StreamResponse) }
175
235
  def send_image(url, user, content_type = nil)
176
236
  @client.send_file("#{self.url}/image", url, user, content_type)
177
237
  end
178
238
 
239
+ sig { params(url: String).returns(StreamChat::StreamResponse) }
179
240
  def delete_file(url)
180
241
  @client.delete("#{self.url}/file", params: { url: url })
181
242
  end
182
243
 
244
+ sig { params(url: String).returns(StreamChat::StreamResponse) }
183
245
  def delete_image(url)
184
246
  @client.delete("#{self.url}/image", params: { url: url })
185
247
  end
186
248
 
187
249
  private
188
250
 
251
+ sig { params(payload: StringKeyHash, user_id: String).returns(StringKeyHash) }
189
252
  def add_user_id(payload, user_id)
190
253
  payload.merge({ user: { id: user_id } })
191
254
  end