Skip to content

Commit 4f19a12

Browse files
committed
feat: add batch updates support
1 parent e333b58 commit 4f19a12

File tree

8 files changed

+1262
-1
lines changed

8 files changed

+1262
-1
lines changed
Lines changed: 239 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,239 @@
1+
from typing import List
2+
3+
from stream_chat.types.channel_batch import (
4+
ChannelBatchMemberRequest,
5+
ChannelDataUpdate,
6+
ChannelsBatchFilters,
7+
ChannelsBatchOptions,
8+
)
9+
from stream_chat.types.stream_response import StreamResponse
10+
11+
12+
class ChannelBatchUpdater:
13+
"""
14+
Provides convenience methods for batch channel operations (async).
15+
"""
16+
17+
def __init__(self, client):
18+
self.client = client
19+
20+
async def add_members(
21+
self, filter: ChannelsBatchFilters, members: List[ChannelBatchMemberRequest]
22+
) -> StreamResponse:
23+
"""
24+
Adds members to channels matching the filter.
25+
26+
:param filter: The filter to match channels.
27+
:param members: List of members to add.
28+
:return: StreamResponse containing task_id.
29+
"""
30+
options: ChannelsBatchOptions = {
31+
"operation": "addMembers",
32+
"filter": filter,
33+
"members": members,
34+
}
35+
return await self.client.update_channels_batch(options)
36+
37+
async def remove_members(
38+
self, filter: ChannelsBatchFilters, members: List[ChannelBatchMemberRequest]
39+
) -> StreamResponse:
40+
"""
41+
Removes members from channels matching the filter.
42+
43+
:param filter: The filter to match channels.
44+
:param members: List of members to remove.
45+
:return: StreamResponse containing task_id.
46+
"""
47+
options: ChannelsBatchOptions = {
48+
"operation": "removeMembers",
49+
"filter": filter,
50+
"members": members,
51+
}
52+
return await self.client.update_channels_batch(options)
53+
54+
async def invite_members(
55+
self, filter: ChannelsBatchFilters, members: List[ChannelBatchMemberRequest]
56+
) -> StreamResponse:
57+
"""
58+
Invites members to channels matching the filter.
59+
60+
:param filter: The filter to match channels.
61+
:param members: List of members to invite.
62+
:return: StreamResponse containing task_id.
63+
"""
64+
options: ChannelsBatchOptions = {
65+
"operation": "inviteMembers",
66+
"filter": filter,
67+
"members": members,
68+
}
69+
return await self.client.update_channels_batch(options)
70+
71+
async def add_moderators(
72+
self, filter: ChannelsBatchFilters, members: List[ChannelBatchMemberRequest]
73+
) -> StreamResponse:
74+
"""
75+
Adds moderators to channels matching the filter.
76+
77+
:param filter: The filter to match channels.
78+
:param members: List of members to add as moderators.
79+
:return: StreamResponse containing task_id.
80+
"""
81+
options: ChannelsBatchOptions = {
82+
"operation": "addModerators",
83+
"filter": filter,
84+
"members": members,
85+
}
86+
return await self.client.update_channels_batch(options)
87+
88+
async def demote_moderators(
89+
self, filter: ChannelsBatchFilters, members: List[ChannelBatchMemberRequest]
90+
) -> StreamResponse:
91+
"""
92+
Removes moderator role from members in channels matching the filter.
93+
94+
:param filter: The filter to match channels.
95+
:param members: List of members to demote from moderators.
96+
:return: StreamResponse containing task_id.
97+
"""
98+
options: ChannelsBatchOptions = {
99+
"operation": "demoteModerators",
100+
"filter": filter,
101+
"members": members,
102+
}
103+
return await self.client.update_channels_batch(options)
104+
105+
async def assign_roles(
106+
self, filter: ChannelsBatchFilters, members: List[ChannelBatchMemberRequest]
107+
) -> StreamResponse:
108+
"""
109+
Assigns roles to members in channels matching the filter.
110+
111+
:param filter: The filter to match channels.
112+
:param members: List of members with roles to assign.
113+
:return: StreamResponse containing task_id.
114+
"""
115+
options: ChannelsBatchOptions = {
116+
"operation": "assignRoles",
117+
"filter": filter,
118+
"members": members,
119+
}
120+
return await self.client.update_channels_batch(options)
121+
122+
async def hide(
123+
self, filter: ChannelsBatchFilters, members: List[ChannelBatchMemberRequest]
124+
) -> StreamResponse:
125+
"""
126+
Hides channels matching the filter for the specified members.
127+
128+
:param filter: The filter to match channels.
129+
:param members: List of members for whom to hide channels.
130+
:return: StreamResponse containing task_id.
131+
"""
132+
options: ChannelsBatchOptions = {
133+
"operation": "hide",
134+
"filter": filter,
135+
"members": members,
136+
}
137+
return await self.client.update_channels_batch(options)
138+
139+
async def show(
140+
self, filter: ChannelsBatchFilters, members: List[ChannelBatchMemberRequest]
141+
) -> StreamResponse:
142+
"""
143+
Shows channels matching the filter for the specified members.
144+
145+
:param filter: The filter to match channels.
146+
:param members: List of members for whom to show channels.
147+
:return: StreamResponse containing task_id.
148+
"""
149+
options: ChannelsBatchOptions = {
150+
"operation": "show",
151+
"filter": filter,
152+
"members": members,
153+
}
154+
return await self.client.update_channels_batch(options)
155+
156+
async def archive(
157+
self, filter: ChannelsBatchFilters, members: List[ChannelBatchMemberRequest]
158+
) -> StreamResponse:
159+
"""
160+
Archives channels matching the filter for the specified members.
161+
162+
:param filter: The filter to match channels.
163+
:param members: List of members for whom to archive channels.
164+
:return: StreamResponse containing task_id.
165+
"""
166+
options: ChannelsBatchOptions = {
167+
"operation": "archive",
168+
"filter": filter,
169+
"members": members,
170+
}
171+
return await self.client.update_channels_batch(options)
172+
173+
async def unarchive(
174+
self, filter: ChannelsBatchFilters, members: List[ChannelBatchMemberRequest]
175+
) -> StreamResponse:
176+
"""
177+
Unarchives channels matching the filter for the specified members.
178+
179+
:param filter: The filter to match channels.
180+
:param members: List of members for whom to unarchive channels.
181+
:return: StreamResponse containing task_id.
182+
"""
183+
options: ChannelsBatchOptions = {
184+
"operation": "unarchive",
185+
"filter": filter,
186+
"members": members,
187+
}
188+
return await self.client.update_channels_batch(options)
189+
190+
async def update_data(
191+
self, filter: ChannelsBatchFilters, data: ChannelDataUpdate
192+
) -> StreamResponse:
193+
"""
194+
Updates data on channels matching the filter.
195+
196+
:param filter: The filter to match channels.
197+
:param data: Channel data to update.
198+
:return: StreamResponse containing task_id.
199+
"""
200+
options: ChannelsBatchOptions = {
201+
"operation": "updateData",
202+
"filter": filter,
203+
"data": data,
204+
}
205+
return await self.client.update_channels_batch(options)
206+
207+
async def add_filter_tags(
208+
self, filter: ChannelsBatchFilters, tags: List[str]
209+
) -> StreamResponse:
210+
"""
211+
Adds filter tags to channels matching the filter.
212+
213+
:param filter: The filter to match channels.
214+
:param tags: List of filter tags to add.
215+
:return: StreamResponse containing task_id.
216+
"""
217+
options: ChannelsBatchOptions = {
218+
"operation": "addFilterTags",
219+
"filter": filter,
220+
"filter_tags_update": tags,
221+
}
222+
return await self.client.update_channels_batch(options)
223+
224+
async def remove_filter_tags(
225+
self, filter: ChannelsBatchFilters, tags: List[str]
226+
) -> StreamResponse:
227+
"""
228+
Removes filter tags from channels matching the filter.
229+
230+
:param filter: The filter to match channels.
231+
:param tags: List of filter tags to remove.
232+
:return: StreamResponse containing task_id.
233+
"""
234+
options: ChannelsBatchOptions = {
235+
"operation": "removeFilterTags",
236+
"filter": filter,
237+
"filter_tags_update": tags,
238+
}
239+
return await self.client.update_channels_batch(options)

stream_chat/async_chat/client.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import warnings
55
from types import TracebackType
66
from typing import (
7+
TYPE_CHECKING,
78
Any,
89
AsyncContextManager,
910
Callable,
@@ -15,6 +16,9 @@
1516
Union,
1617
cast,
1718
)
19+
20+
if TYPE_CHECKING:
21+
from stream_chat.types.channel_batch import ChannelsBatchOptions
1822
from urllib.parse import urlparse
1923

2024
from stream_chat.async_chat.campaign import Campaign
@@ -1028,6 +1032,30 @@ async def mark_delivered_simple(
10281032

10291033
return await self.mark_delivered(data)
10301034

1035+
async def update_channels_batch(
1036+
self, options: "ChannelsBatchOptions"
1037+
) -> StreamResponse:
1038+
"""
1039+
Updates channels in batch based on the provided options.
1040+
1041+
:param options: ChannelsBatchOptions containing operation, filter, and operation-specific data.
1042+
:return: StreamResponse containing task_id.
1043+
"""
1044+
if options is None:
1045+
raise ValueError("options must not be None")
1046+
1047+
return await self.put("channels/batch", data=options)
1048+
1049+
def channel_batch_updater(self) -> "ChannelBatchUpdater":
1050+
"""
1051+
Returns a ChannelBatchUpdater instance for batch channel operations.
1052+
1053+
:return: ChannelBatchUpdater instance.
1054+
"""
1055+
from stream_chat.async_chat.channel_batch_updater import ChannelBatchUpdater
1056+
1057+
return ChannelBatchUpdater(self)
1058+
10311059
async def close(self) -> None:
10321060
await self.session.close()
10331061

stream_chat/base/client.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1302,6 +1302,27 @@ def get_task(
13021302
"""
13031303
pass
13041304

1305+
@abc.abstractmethod
1306+
def update_channels_batch(
1307+
self, options: Any
1308+
) -> Union[StreamResponse, Awaitable[StreamResponse]]:
1309+
"""
1310+
Updates channels in batch based on the provided options.
1311+
1312+
:param options: ChannelsBatchOptions containing operation, filter, and operation-specific data.
1313+
:return: StreamResponse containing task_id.
1314+
"""
1315+
pass
1316+
1317+
@abc.abstractmethod
1318+
def channel_batch_updater(self) -> Any:
1319+
"""
1320+
Returns a ChannelBatchUpdater instance for batch channel operations.
1321+
1322+
:return: ChannelBatchUpdater instance.
1323+
"""
1324+
pass
1325+
13051326
@abc.abstractmethod
13061327
def send_user_custom_event(
13071328
self, user_id: str, event: Dict

0 commit comments

Comments
 (0)