Skip to content

Commit 13cd6c2

Browse files
committed
api: Add stream events (create and delete; not yet update)
(Handling `op: update` events is zulip#182, as mentioned in the TODOs.)
1 parent 631f4d6 commit 13cd6c2

File tree

2 files changed

+86
-0
lines changed

2 files changed

+86
-0
lines changed

lib/api/model/events.dart

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,14 @@ abstract class Event {
2525
case 'update': return RealmUserUpdateEvent.fromJson(json);
2626
default: return UnexpectedEvent.fromJson(json);
2727
}
28+
case 'stream':
29+
final op = json['op'] as String;
30+
switch (op) {
31+
case 'create': return StreamCreateEvent.fromJson(json);
32+
case 'delete': return StreamDeleteEvent.fromJson(json);
33+
// TODO(#182): case 'update': …
34+
default: return UnexpectedEvent.fromJson(json);
35+
}
2836
case 'message': return MessageEvent.fromJson(json);
2937
case 'heartbeat': return HeartbeatEvent.fromJson(json);
3038
// TODO add many more event types
@@ -179,6 +187,54 @@ class RealmUserUpdateEvent extends RealmUserEvent {
179187
Map<String, dynamic> toJson() => _$RealmUserUpdateEventToJson(this);
180188
}
181189

190+
/// A Zulip event of type `stream`.
191+
abstract class StreamEvent extends Event {
192+
@override
193+
@JsonKey(includeToJson: true)
194+
String get type => 'stream';
195+
196+
String get op;
197+
198+
StreamEvent({required super.id});
199+
}
200+
201+
/// A [StreamEvent] with op `create`: https://zulip.com/api/get-events#stream-create
202+
@JsonSerializable(fieldRename: FieldRename.snake)
203+
class StreamCreateEvent extends StreamEvent {
204+
@override
205+
String get op => 'create';
206+
207+
final List<ZulipStream> streams;
208+
209+
StreamCreateEvent({required super.id, required this.streams});
210+
211+
factory StreamCreateEvent.fromJson(Map<String, dynamic> json) =>
212+
_$StreamCreateEventFromJson(json);
213+
214+
@override
215+
Map<String, dynamic> toJson() => _$StreamCreateEventToJson(this);
216+
}
217+
218+
/// A [StreamEvent] with op `delete`: https://zulip.com/api/get-events#stream-delete
219+
@JsonSerializable(fieldRename: FieldRename.snake)
220+
class StreamDeleteEvent extends StreamEvent {
221+
@override
222+
String get op => 'delete';
223+
224+
final List<ZulipStream> streams;
225+
226+
StreamDeleteEvent({required super.id, required this.streams});
227+
228+
factory StreamDeleteEvent.fromJson(Map<String, dynamic> json) =>
229+
_$StreamDeleteEventFromJson(json);
230+
231+
@override
232+
Map<String, dynamic> toJson() => _$StreamDeleteEventToJson(this);
233+
}
234+
235+
// TODO(#182) StreamUpdateEvent, for a [StreamEvent] with op `update`:
236+
// https://zulip.com/api/get-events#stream-update
237+
182238
/// A Zulip event of type `message`.
183239
// TODO use [JsonSerializable] here too, using its customization features,
184240
// in order to skip the boilerplate in [fromJson] and [toJson].

lib/api/model/events.g.dart

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

0 commit comments

Comments
 (0)