Skip to content

Commit d1ace07

Browse files
rafaelmf3Rafael Marinhojavierdfm
authored
[CHA-1610] Add support channels batch update (#188)
* [CHA-1610] Add support channels batch update * fix: removed trailing blank line * fix: Add channel_batch_updater to client.rb * fix: fixed archive and unarchive and added tests * fix: fixed archive and unarchive and added tests * fix: fixed tests * fix: tests * fix: tests * fix: update members * fix: try members * fix: use correct values * fix: removed loop_times * fix: use correct params * fix: rubocop --------- Co-authored-by: Rafael Marinho <rafael.marinho@getstream.io> Co-authored-by: javierdfm <javierdfm@gmail.com>
1 parent 1b67323 commit d1ace07

4 files changed

Lines changed: 507 additions & 0 deletions

File tree

lib/stream-chat/channel.rb

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,22 @@ def query(**options)
9797
state
9898
end
9999

100+
# Refreshes the channel state from the server.
101+
# Updates the channel's members attribute with fresh data.
102+
sig { returns(StreamChat::StreamResponse) }
103+
def refresh_state
104+
url = "channels/#{@channel_type}/#{@id}/query"
105+
state = @client.post(url, data: { state: true })
106+
107+
# Members can be at top level or inside channel object (like Go's updateChannel)
108+
if state['members'] && !state['members'].empty?
109+
@members = state['members']
110+
elsif state['channel'] && state['channel']['members']
111+
@members = state['channel']['members']
112+
end
113+
state
114+
end
115+
100116
# Queries members of a channel.
101117
#
102118
# The queryMembers endpoint allows you to list and paginate members from a channel. The
Lines changed: 214 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,214 @@
1+
# typed: strict
2+
# frozen_string_literal: true
3+
4+
require 'stream-chat/client'
5+
require 'stream-chat/stream_response'
6+
require 'stream-chat/types'
7+
8+
module StreamChat
9+
class ChannelBatchUpdater
10+
extend T::Sig
11+
12+
sig { params(client: StreamChat::Client).void }
13+
def initialize(client)
14+
@client = client
15+
end
16+
17+
# Member operations
18+
19+
# addMembers - Add members to channels matching the filter
20+
# @param filter [StringKeyHash] Filter to select channels
21+
# @param members [T.any(T::Array[String], T::Array[StringKeyHash])] Members to add
22+
# @return [StreamChat::StreamResponse] The server response
23+
sig { params(filter: StringKeyHash, members: T.any(T::Array[String], T::Array[StringKeyHash])).returns(StreamChat::StreamResponse) }
24+
def add_members(filter, members)
25+
@client.update_channels_batch(
26+
{
27+
operation: 'addMembers',
28+
filter: filter,
29+
members: members
30+
}
31+
)
32+
end
33+
34+
# removeMembers - Remove members from channels matching the filter
35+
# @param filter [StringKeyHash] Filter to select channels
36+
# @param members [T::Array[StringKeyHash]] Members to remove (each with user_id key)
37+
# @return [StreamChat::StreamResponse] The server response
38+
sig { params(filter: StringKeyHash, members: T::Array[StringKeyHash]).returns(StreamChat::StreamResponse) }
39+
def remove_members(filter, members)
40+
@client.update_channels_batch(
41+
{
42+
operation: 'removeMembers',
43+
filter: filter,
44+
members: members
45+
}
46+
)
47+
end
48+
49+
# inviteMembers - Invite members to channels matching the filter
50+
# @param filter [StringKeyHash] Filter to select channels
51+
# @param members [T.any(T::Array[String], T::Array[StringKeyHash])] Members to invite
52+
# @return [StreamChat::StreamResponse] The server response
53+
sig { params(filter: StringKeyHash, members: T.any(T::Array[String], T::Array[StringKeyHash])).returns(StreamChat::StreamResponse) }
54+
def invite_members(filter, members)
55+
@client.update_channels_batch(
56+
{
57+
operation: 'invites',
58+
filter: filter,
59+
members: members
60+
}
61+
)
62+
end
63+
64+
# addModerators - Add moderators to channels matching the filter
65+
# @param filter [StringKeyHash] Filter to select channels
66+
# @param members [T::Array[String]] Member IDs to promote to moderator
67+
# @return [StreamChat::StreamResponse] The server response
68+
sig { params(filter: StringKeyHash, members: T::Array[String]).returns(StreamChat::StreamResponse) }
69+
def add_moderators(filter, members)
70+
@client.update_channels_batch(
71+
{
72+
operation: 'addModerators',
73+
filter: filter,
74+
members: members
75+
}
76+
)
77+
end
78+
79+
# demoteModerators - Remove moderator role from members in channels matching the filter
80+
# @param filter [StringKeyHash] Filter to select channels
81+
# @param members [T::Array[String]] Member IDs to demote
82+
# @return [StreamChat::StreamResponse] The server response
83+
sig { params(filter: StringKeyHash, members: T::Array[String]).returns(StreamChat::StreamResponse) }
84+
def demote_moderators(filter, members)
85+
@client.update_channels_batch(
86+
{
87+
operation: 'demoteModerators',
88+
filter: filter,
89+
members: members
90+
}
91+
)
92+
end
93+
94+
# assignRoles - Assign roles to members in channels matching the filter
95+
# @param filter [StringKeyHash] Filter to select channels
96+
# @param members [T::Array[StringKeyHash]] Members with role assignments
97+
# @return [StreamChat::StreamResponse] The server response
98+
sig { params(filter: StringKeyHash, members: T::Array[StringKeyHash]).returns(StreamChat::StreamResponse) }
99+
def assign_roles(filter, members)
100+
@client.update_channels_batch(
101+
{
102+
operation: 'assignRoles',
103+
filter: filter,
104+
members: members
105+
}
106+
)
107+
end
108+
109+
# Visibility operations
110+
111+
# hide - Hide channels matching the filter
112+
# @param filter [StringKeyHash] Filter to select channels
113+
# @return [StreamChat::StreamResponse] The server response
114+
sig { params(filter: StringKeyHash).returns(StreamChat::StreamResponse) }
115+
def hide(filter)
116+
@client.update_channels_batch(
117+
{
118+
operation: 'hide',
119+
filter: filter
120+
}
121+
)
122+
end
123+
124+
# show - Show channels matching the filter
125+
# @param filter [StringKeyHash] Filter to select channels
126+
# @return [StreamChat::StreamResponse] The server response
127+
sig { params(filter: StringKeyHash).returns(StreamChat::StreamResponse) }
128+
def show(filter)
129+
@client.update_channels_batch(
130+
{
131+
operation: 'show',
132+
filter: filter
133+
}
134+
)
135+
end
136+
137+
# archive - Archive channels matching the filter for specified members
138+
# @param filter [StringKeyHash] Filter to select channels
139+
# @param members [T::Array[StringKeyHash]] Members to archive channels for (each with user_id key)
140+
# @return [StreamChat::StreamResponse] The server response
141+
sig { params(filter: StringKeyHash, members: T::Array[StringKeyHash]).returns(StreamChat::StreamResponse) }
142+
def archive(filter, members)
143+
@client.update_channels_batch(
144+
{
145+
operation: 'archive',
146+
filter: filter,
147+
members: members
148+
}
149+
)
150+
end
151+
152+
# unarchive - Unarchive channels matching the filter for specified members
153+
# @param filter [StringKeyHash] Filter to select channels
154+
# @param members [T::Array[StringKeyHash]] Members to unarchive channels for (each with user_id key)
155+
# @return [StreamChat::StreamResponse] The server response
156+
sig { params(filter: StringKeyHash, members: T::Array[StringKeyHash]).returns(StreamChat::StreamResponse) }
157+
def unarchive(filter, members)
158+
@client.update_channels_batch(
159+
{
160+
operation: 'unarchive',
161+
filter: filter,
162+
members: members
163+
}
164+
)
165+
end
166+
167+
# Data operations
168+
169+
# updateData - Update data on channels matching the filter
170+
# @param filter [StringKeyHash] Filter to select channels
171+
# @param data [StringKeyHash] Data to update
172+
# @return [StreamChat::StreamResponse] The server response
173+
sig { params(filter: StringKeyHash, data: StringKeyHash).returns(StreamChat::StreamResponse) }
174+
def update_data(filter, data)
175+
@client.update_channels_batch(
176+
{
177+
operation: 'updateData',
178+
filter: filter,
179+
data: data
180+
}
181+
)
182+
end
183+
184+
# addFilterTags - Add filter tags to channels matching the filter
185+
# @param filter [StringKeyHash] Filter to select channels
186+
# @param tags [T::Array[String]] Tags to add
187+
# @return [StreamChat::StreamResponse] The server response
188+
sig { params(filter: StringKeyHash, tags: T::Array[String]).returns(StreamChat::StreamResponse) }
189+
def add_filter_tags(filter, tags)
190+
@client.update_channels_batch(
191+
{
192+
operation: 'addFilterTags',
193+
filter: filter,
194+
filter_tags_update: tags
195+
}
196+
)
197+
end
198+
199+
# removeFilterTags - Remove filter tags from channels matching the filter
200+
# @param filter [StringKeyHash] Filter to select channels
201+
# @param tags [T::Array[String]] Tags to remove
202+
# @return [StreamChat::StreamResponse] The server response
203+
sig { params(filter: StringKeyHash, tags: T::Array[String]).returns(StreamChat::StreamResponse) }
204+
def remove_filter_tags(filter, tags)
205+
@client.update_channels_batch(
206+
{
207+
operation: 'removeFilterTags',
208+
filter: filter,
209+
filter_tags_update: tags
210+
}
211+
)
212+
end
213+
end
214+
end

lib/stream-chat/client.rb

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
require 'stream-chat/util'
1818
require 'stream-chat/types'
1919
require 'stream-chat/moderation'
20+
require 'stream-chat/channel_batch_updater'
2021

2122
module StreamChat
2223
DEFAULT_BLOCKLIST = 'profanity_en_2020_v1'
@@ -1179,6 +1180,21 @@ def mark_delivered(data = nil, user_id: nil)
11791180
post('channels/delivered', data: data || {}, params: { user_id: user_id })
11801181
end
11811182

1183+
# Update channels in batch.
1184+
# @param payload [StringKeyHash] Payload containing operation, filter, and optional members/data/filter_tags_update
1185+
# @return [StreamChat::StreamResponse] API response
1186+
sig { params(payload: StringKeyHash).returns(StreamChat::StreamResponse) }
1187+
def update_channels_batch(payload)
1188+
put('channels/batch', data: payload)
1189+
end
1190+
1191+
# Returns a ChannelBatchUpdater instance for batch channel operations.
1192+
# @return [StreamChat::ChannelBatchUpdater] A ChannelBatchUpdater instance
1193+
sig { returns(StreamChat::ChannelBatchUpdater) }
1194+
def channel_batch_updater
1195+
ChannelBatchUpdater.new(self)
1196+
end
1197+
11821198
private
11831199

11841200
sig { returns(T::Hash[String, String]) }

0 commit comments

Comments
 (0)