Skip to content

Commit c10a915

Browse files
committed
api: Add UserGroupEvent types
1 parent 7a40e0a commit c10a915

File tree

4 files changed

+157
-2
lines changed

4 files changed

+157
-2
lines changed

lib/api/model/events.dart

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,14 @@ sealed class Event {
3030
default: return UnexpectedEvent.fromJson(json);
3131
}
3232
case 'custom_profile_fields': return CustomProfileFieldsEvent.fromJson(json);
33+
case 'user_group':
34+
switch (json['op'] as String) {
35+
case 'add': return UserGroupAddEvent.fromJson(json);
36+
case 'update': return UserGroupUpdateEvent.fromJson(json);
37+
// TODO(#1687): add_members, remove_members, add_subgroups, remove_subgroups
38+
case 'remove': return UserGroupRemoveEvent.fromJson(json);
39+
default: return UnexpectedEvent.fromJson(json);
40+
}
3341
case 'realm_user':
3442
switch (json['op'] as String) {
3543
case 'add': return RealmUserAddEvent.fromJson(json);
@@ -206,6 +214,85 @@ class CustomProfileFieldsEvent extends Event {
206214
Map<String, dynamic> toJson() => _$CustomProfileFieldsEventToJson(this);
207215
}
208216

217+
/// A Zulip event of type `user_group`.
218+
///
219+
/// See API docs starting at:
220+
/// https://zulip.com/api/get-events#user_group-add
221+
sealed class UserGroupEvent extends Event {
222+
@override
223+
@JsonKey(includeToJson: true)
224+
String get type => 'user_group';
225+
226+
String get op;
227+
228+
UserGroupEvent({required super.id});
229+
}
230+
231+
/// A [UserGroupEvent] with op `add`: https://zulip.com/api/get-events#user_group-add
232+
@JsonSerializable(fieldRename: FieldRename.snake)
233+
class UserGroupAddEvent extends UserGroupEvent {
234+
@override
235+
@JsonKey(includeToJson: true)
236+
String get op => 'add';
237+
238+
final UserGroup group;
239+
240+
UserGroupAddEvent({required super.id, required this.group});
241+
242+
factory UserGroupAddEvent.fromJson(Map<String, dynamic> json) => _$UserGroupAddEventFromJson(json);
243+
244+
@override
245+
Map<String, dynamic> toJson() => _$UserGroupAddEventToJson(this);
246+
}
247+
248+
/// A [UserGroupEvent] with op `update`: https://zulip.com/api/get-events#user_group-update
249+
@JsonSerializable(fieldRename: FieldRename.snake)
250+
class UserGroupUpdateEvent extends UserGroupEvent {
251+
@override
252+
@JsonKey(includeToJson: true)
253+
String get op => 'update';
254+
255+
final int groupId;
256+
final UserGroupUpdateData data;
257+
258+
UserGroupUpdateEvent({required super.id, required this.groupId, required this.data});
259+
260+
factory UserGroupUpdateEvent.fromJson(Map<String, dynamic> json) => _$UserGroupUpdateEventFromJson(json);
261+
262+
@override
263+
Map<String, dynamic> toJson() => _$UserGroupUpdateEventToJson(this);
264+
}
265+
266+
@JsonSerializable(fieldRename: FieldRename.snake)
267+
class UserGroupUpdateData {
268+
final String? name;
269+
final String? description;
270+
final bool? deactivated;
271+
272+
UserGroupUpdateData({required this.name, required this.description, required this.deactivated});
273+
274+
factory UserGroupUpdateData.fromJson(Map<String, dynamic> json) => _$UserGroupUpdateDataFromJson(json);
275+
276+
Map<String, dynamic> toJson() => _$UserGroupUpdateDataToJson(this);
277+
}
278+
279+
/// A [UserGroupEvent] with op `remove`: https://zulip.com/api/get-events#user_group-remove
280+
@JsonSerializable(fieldRename: FieldRename.snake)
281+
class UserGroupRemoveEvent extends UserGroupEvent {
282+
@override
283+
@JsonKey(includeToJson: true)
284+
String get op => 'remove';
285+
286+
final int groupId;
287+
288+
UserGroupRemoveEvent({required super.id, required this.groupId});
289+
290+
factory UserGroupRemoveEvent.fromJson(Map<String, dynamic> json) => _$UserGroupRemoveEventFromJson(json);
291+
292+
@override
293+
Map<String, dynamic> toJson() => _$UserGroupRemoveEventToJson(this);
294+
}
295+
209296
/// A Zulip event of type `realm_user`.
210297
///
211298
/// The corresponding API docs are in several places for

lib/api/model/events.g.dart

Lines changed: 63 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/api/model/model.dart

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -199,11 +199,12 @@ enum Emojiset {
199199
.map((key, value) => MapEntry(value, key));
200200
}
201201

202-
/// As in [InitialSnapshot.realmUserGroups].
202+
/// As in [InitialSnapshot.realmUserGroups] or [UserGroupAddEvent].
203203
@JsonSerializable(fieldRename: FieldRename.snake)
204204
class UserGroup {
205205
final int id;
206206

207+
// TODO(#1687) to maintain members, also act on user deactivation: https://github.com/zulip/zulip-flutter/issues/662#issuecomment-2405845356
207208
// List<int> members; // TODO(#1687) track group members
208209
// List<int> directSubgroupIds; // TODO(#1687) track group members
209210

@@ -219,7 +220,7 @@ class UserGroup {
219220
@JsonKey(defaultValue: false)
220221
bool deactivated;
221222

222-
// TODO(#814): GroupSettingValue canAddMembersGroup, etc.
223+
// TODO(#814): GroupSettingValue canAddMembersGroup, etc.; add to update event too
223224

224225
UserGroup({
225226
required this.id,

lib/model/store.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -901,6 +901,10 @@ class PerAccountStore extends PerAccountStoreBase with ChangeNotifier, EmojiStor
901901
customProfileFields = _sortCustomProfileFields(event.fields);
902902
notifyListeners();
903903

904+
case UserGroupEvent():
905+
assert(debugLog("server event: user_group/${event.op}"));
906+
// TODO(#662) handle
907+
904908
case RealmUserAddEvent():
905909
assert(debugLog("server event: realm_user/add"));
906910
_users.handleRealmUserEvent(event);

0 commit comments

Comments
 (0)