Skip to content

Commit 8c6fc3e

Browse files
Merge branch 'master' into feature/future-channel-bans
2 parents 29c1276 + b6fe937 commit 8c6fc3e

File tree

6 files changed

+513
-1
lines changed

6 files changed

+513
-1
lines changed

src/Clients/ChannelBatchUpdater.cs

Lines changed: 202 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,202 @@
1+
using System.Collections.Generic;
2+
using System.Linq;
3+
using System.Threading.Tasks;
4+
using StreamChat.Models;
5+
6+
namespace StreamChat.Clients
7+
{
8+
/// <summary>
9+
/// Provides convenience methods for batch channel operations.
10+
/// </summary>
11+
public class ChannelBatchUpdater
12+
{
13+
private readonly IChannelClient _client;
14+
15+
public ChannelBatchUpdater(IChannelClient client)
16+
{
17+
_client = client;
18+
}
19+
20+
/// <summary>
21+
/// Adds members to channels matching the filter.
22+
/// </summary>
23+
public async Task<AsyncOperationResponse> AddMembersAsync(ChannelsBatchFilters filter, IEnumerable<ChannelBatchMemberRequest> members)
24+
{
25+
var options = new ChannelsBatchOptions
26+
{
27+
Operation = ChannelBatchOperation.AddMembers,
28+
Filter = filter,
29+
Members = members?.ToList(),
30+
};
31+
return await _client.UpdateChannelsBatchAsync(options);
32+
}
33+
34+
/// <summary>
35+
/// Removes members from channels matching the filter.
36+
/// </summary>
37+
public async Task<AsyncOperationResponse> RemoveMembersAsync(ChannelsBatchFilters filter, IEnumerable<ChannelBatchMemberRequest> members)
38+
{
39+
var options = new ChannelsBatchOptions
40+
{
41+
Operation = ChannelBatchOperation.RemoveMembers,
42+
Filter = filter,
43+
Members = members?.ToList(),
44+
};
45+
return await _client.UpdateChannelsBatchAsync(options);
46+
}
47+
48+
/// <summary>
49+
/// Invites members to channels matching the filter.
50+
/// </summary>
51+
public async Task<AsyncOperationResponse> InviteMembersAsync(ChannelsBatchFilters filter, IEnumerable<ChannelBatchMemberRequest> members)
52+
{
53+
var options = new ChannelsBatchOptions
54+
{
55+
Operation = ChannelBatchOperation.InviteMembers,
56+
Filter = filter,
57+
Members = members?.ToList(),
58+
};
59+
return await _client.UpdateChannelsBatchAsync(options);
60+
}
61+
62+
/// <summary>
63+
/// Assigns roles to members in channels matching the filter.
64+
/// </summary>
65+
public async Task<AsyncOperationResponse> AssignRolesAsync(ChannelsBatchFilters filter, IEnumerable<ChannelBatchMemberRequest> members)
66+
{
67+
var options = new ChannelsBatchOptions
68+
{
69+
Operation = ChannelBatchOperation.AssignRoles,
70+
Filter = filter,
71+
Members = members?.ToList(),
72+
};
73+
return await _client.UpdateChannelsBatchAsync(options);
74+
}
75+
76+
/// <summary>
77+
/// Adds moderators to channels matching the filter.
78+
/// </summary>
79+
public async Task<AsyncOperationResponse> AddModeratorsAsync(ChannelsBatchFilters filter, IEnumerable<ChannelBatchMemberRequest> members)
80+
{
81+
var options = new ChannelsBatchOptions
82+
{
83+
Operation = ChannelBatchOperation.AddModerators,
84+
Filter = filter,
85+
Members = members?.ToList(),
86+
};
87+
return await _client.UpdateChannelsBatchAsync(options);
88+
}
89+
90+
/// <summary>
91+
/// Removes moderator role from members in channels matching the filter.
92+
/// </summary>
93+
public async Task<AsyncOperationResponse> DemoteModeratorsAsync(ChannelsBatchFilters filter, IEnumerable<ChannelBatchMemberRequest> members)
94+
{
95+
var options = new ChannelsBatchOptions
96+
{
97+
Operation = ChannelBatchOperation.DemoteModerators,
98+
Filter = filter,
99+
Members = members?.ToList(),
100+
};
101+
return await _client.UpdateChannelsBatchAsync(options);
102+
}
103+
104+
/// <summary>
105+
/// Hides channels matching the filter for the specified members.
106+
/// </summary>
107+
public async Task<AsyncOperationResponse> HideAsync(ChannelsBatchFilters filter, IEnumerable<ChannelBatchMemberRequest> members)
108+
{
109+
var options = new ChannelsBatchOptions
110+
{
111+
Operation = ChannelBatchOperation.Hide,
112+
Filter = filter,
113+
Members = members?.ToList(),
114+
};
115+
return await _client.UpdateChannelsBatchAsync(options);
116+
}
117+
118+
/// <summary>
119+
/// Shows channels matching the filter for the specified members.
120+
/// </summary>
121+
public async Task<AsyncOperationResponse> ShowAsync(ChannelsBatchFilters filter, IEnumerable<ChannelBatchMemberRequest> members)
122+
{
123+
var options = new ChannelsBatchOptions
124+
{
125+
Operation = ChannelBatchOperation.Show,
126+
Filter = filter,
127+
Members = members?.ToList(),
128+
};
129+
return await _client.UpdateChannelsBatchAsync(options);
130+
}
131+
132+
/// <summary>
133+
/// Archives channels matching the filter for the specified members.
134+
/// </summary>
135+
public async Task<AsyncOperationResponse> ArchiveAsync(ChannelsBatchFilters filter, IEnumerable<ChannelBatchMemberRequest> members)
136+
{
137+
var options = new ChannelsBatchOptions
138+
{
139+
Operation = ChannelBatchOperation.Archive,
140+
Filter = filter,
141+
Members = members?.ToList(),
142+
};
143+
return await _client.UpdateChannelsBatchAsync(options);
144+
}
145+
146+
/// <summary>
147+
/// Unarchives channels matching the filter for the specified members.
148+
/// </summary>
149+
public async Task<AsyncOperationResponse> UnarchiveAsync(ChannelsBatchFilters filter, IEnumerable<ChannelBatchMemberRequest> members)
150+
{
151+
var options = new ChannelsBatchOptions
152+
{
153+
Operation = ChannelBatchOperation.Unarchive,
154+
Filter = filter,
155+
Members = members?.ToList(),
156+
};
157+
return await _client.UpdateChannelsBatchAsync(options);
158+
}
159+
160+
/// <summary>
161+
/// Updates data on channels matching the filter.
162+
/// </summary>
163+
public async Task<AsyncOperationResponse> UpdateDataAsync(ChannelsBatchFilters filter, ChannelDataUpdate data)
164+
{
165+
var options = new ChannelsBatchOptions
166+
{
167+
Operation = ChannelBatchOperation.UpdateData,
168+
Filter = filter,
169+
Data = data,
170+
};
171+
return await _client.UpdateChannelsBatchAsync(options);
172+
}
173+
174+
/// <summary>
175+
/// Adds filter tags to channels matching the filter.
176+
/// </summary>
177+
public async Task<AsyncOperationResponse> AddFilterTagsAsync(ChannelsBatchFilters filter, IEnumerable<string> tags)
178+
{
179+
var options = new ChannelsBatchOptions
180+
{
181+
Operation = ChannelBatchOperation.AddFilterTags,
182+
Filter = filter,
183+
FilterTagsUpdate = tags?.ToList(),
184+
};
185+
return await _client.UpdateChannelsBatchAsync(options);
186+
}
187+
188+
/// <summary>
189+
/// Removes filter tags from channels matching the filter.
190+
/// </summary>
191+
public async Task<AsyncOperationResponse> RemoveFilterTagsAsync(ChannelsBatchFilters filter, IEnumerable<string> tags)
192+
{
193+
var options = new ChannelsBatchOptions
194+
{
195+
Operation = ChannelBatchOperation.RemoveFilterTags,
196+
Filter = filter,
197+
FilterTagsUpdate = tags?.ToList(),
198+
};
199+
return await _client.UpdateChannelsBatchAsync(options);
200+
}
201+
}
202+
}

src/Clients/ChannelClient.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,14 @@ public async Task<AsyncOperationResponse> DeleteChannelsAsync(IEnumerable<string
3838
HttpStatusCode.Created,
3939
new { cids = cids, hard_delete = hardDelete });
4040

41+
public async Task<AsyncOperationResponse> UpdateChannelsBatchAsync(ChannelsBatchOptions options)
42+
=> await ExecuteRequestAsync<AsyncOperationResponse>("channels/batch",
43+
HttpMethod.PUT,
44+
HttpStatusCode.Created,
45+
options);
46+
47+
public ChannelBatchUpdater BatchUpdater() => new ChannelBatchUpdater(this);
48+
4149
public async Task<ApiResponse> HideAsync(string channelType, string channelId, string userId, bool clearHistory = false)
4250
=> await ExecuteRequestAsync<ApiResponse>($"channels/{channelType}/{channelId}/hide",
4351
HttpMethod.POST,

src/Clients/IChannelClient.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,18 @@ Task<UpdateChannelResponse> AssignRolesAsync(string channelType, string channelI
5050
/// <remarks>https://getstream.io/chat/docs/dotnet-csharp/channel_delete/?language=csharp</remarks>
5151
Task<AsyncOperationResponse> DeleteChannelsAsync(IEnumerable<string> cids, bool hardDelete = false);
5252

53+
/// <summary>
54+
/// <para>Updates channels in batch based on the provided options.</para>
55+
/// This is an asynchronous operation and the returned value is a task Id.
56+
/// You can use <see cref="ITaskClient.GetTaskStatusAsync"/> to check the status of the task.
57+
/// </summary>
58+
Task<AsyncOperationResponse> UpdateChannelsBatchAsync(ChannelsBatchOptions options);
59+
60+
/// <summary>
61+
/// Returns a <see cref="ChannelBatchUpdater"/> instance for convenient batch channel operations.
62+
/// </summary>
63+
ChannelBatchUpdater BatchUpdater();
64+
5365
/// <summary>
5466
/// Takes away moderators status from given user ids.
5567
/// </summary>

src/Models/Channel.cs

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
using System;
22
using System.Collections.Generic;
3+
using System.Runtime.Serialization;
34
using Newtonsoft.Json;
5+
using Newtonsoft.Json.Converters;
46

57
namespace StreamChat.Models
68
{
@@ -155,4 +157,110 @@ public class ChannelUnmuteRequest : ChannelMuteRequest
155157
public class ChannelUnmuteResponse : ChannelMuteResponse
156158
{
157159
}
160+
161+
[JsonConverter(typeof(StringEnumConverter))]
162+
public enum ChannelBatchOperation
163+
{
164+
[EnumMember(Value = "addMembers")]
165+
AddMembers,
166+
167+
[EnumMember(Value = "removeMembers")]
168+
RemoveMembers,
169+
170+
[EnumMember(Value = "inviteMembers")]
171+
InviteMembers,
172+
173+
[EnumMember(Value = "assignRoles")]
174+
AssignRoles,
175+
176+
[EnumMember(Value = "addModerators")]
177+
AddModerators,
178+
179+
[EnumMember(Value = "demoteModerators")]
180+
DemoteModerators,
181+
182+
[EnumMember(Value = "hide")]
183+
Hide,
184+
185+
[EnumMember(Value = "show")]
186+
Show,
187+
188+
[EnumMember(Value = "archive")]
189+
Archive,
190+
191+
[EnumMember(Value = "unarchive")]
192+
Unarchive,
193+
194+
[EnumMember(Value = "updateData")]
195+
UpdateData,
196+
197+
[EnumMember(Value = "addFilterTags")]
198+
AddFilterTags,
199+
200+
[EnumMember(Value = "removeFilterTags")]
201+
RemoveFilterTags,
202+
}
203+
204+
public class ChannelBatchMemberRequest
205+
{
206+
[JsonProperty("user_id")]
207+
public string UserId { get; set; }
208+
209+
[JsonProperty("channel_role")]
210+
public string ChannelRole { get; set; }
211+
}
212+
213+
public class ChannelDataUpdate
214+
{
215+
[JsonProperty("frozen")]
216+
public bool? Frozen { get; set; }
217+
218+
[JsonProperty("disabled")]
219+
public bool? Disabled { get; set; }
220+
221+
[JsonProperty("custom")]
222+
public Dictionary<string, object> Custom { get; set; }
223+
224+
[JsonProperty("team")]
225+
public string Team { get; set; }
226+
227+
[JsonProperty("config_overrides")]
228+
public Dictionary<string, object> ConfigOverrides { get; set; }
229+
230+
[JsonProperty("auto_translation_enabled")]
231+
public bool? AutoTranslationEnabled { get; set; }
232+
233+
[JsonProperty("auto_translation_language")]
234+
public string AutoTranslationLanguage { get; set; }
235+
}
236+
237+
public class ChannelsBatchFilters
238+
{
239+
[JsonProperty("cids")]
240+
public object Cids { get; set; }
241+
242+
[JsonProperty("types")]
243+
public object Types { get; set; }
244+
245+
[JsonProperty("filter_tags")]
246+
public object FilterTags { get; set; }
247+
}
248+
249+
public class ChannelsBatchOptions
250+
{
251+
[JsonProperty("operation", DefaultValueHandling = DefaultValueHandling.Include)]
252+
public ChannelBatchOperation Operation { get; set; }
253+
254+
[JsonProperty("filter")]
255+
public ChannelsBatchFilters Filter { get; set; }
256+
257+
[JsonProperty("members")]
258+
public IEnumerable<ChannelBatchMemberRequest> Members { get; set; }
259+
260+
[JsonProperty("data")]
261+
public ChannelDataUpdate Data { get; set; }
262+
263+
[JsonProperty("filter_tags_update")]
264+
public IEnumerable<string> FilterTagsUpdate { get; set; }
265+
}
158266
}

0 commit comments

Comments
 (0)