Skip to content

Commit 78c811d

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 78c811d

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
@@ -26,6 +26,14 @@ abstract class Event {
2626
default: return UnexpectedEvent.fromJson(json);
2727
}
2828
case 'message': return MessageEvent.fromJson(json);
29+
case 'stream':
30+
final op = json['op'] as String;
31+
switch (op) {
32+
case 'create': return StreamCreateEvent.fromJson(json);
33+
case 'delete': return StreamDeleteEvent.fromJson(json);
34+
// TODO(#182): case 'update': …
35+
default: return UnexpectedEvent.fromJson(json);
36+
}
2937
case 'heartbeat': return HeartbeatEvent.fromJson(json);
3038
// TODO add many more event types
3139
default: return UnexpectedEvent.fromJson(json);
@@ -215,6 +223,54 @@ class MessageEvent extends Event {
215223
}
216224
}
217225

226+
/// A Zulip event of type `stream`.
227+
abstract class StreamEvent extends Event {
228+
@override
229+
@JsonKey(includeToJson: true)
230+
String get type => 'stream';
231+
232+
String get op;
233+
234+
StreamEvent({required super.id});
235+
}
236+
237+
/// A [StreamEvent] with op `create`: https://zulip.com/api/get-events#stream-create
238+
@JsonSerializable(fieldRename: FieldRename.snake)
239+
class StreamCreateEvent extends StreamEvent {
240+
@override
241+
String get op => 'create';
242+
243+
final List<ZulipStream> streams;
244+
245+
StreamCreateEvent({required super.id, required this.streams});
246+
247+
factory StreamCreateEvent.fromJson(Map<String, dynamic> json) =>
248+
_$StreamCreateEventFromJson(json);
249+
250+
@override
251+
Map<String, dynamic> toJson() => _$StreamCreateEventToJson(this);
252+
}
253+
254+
/// A [StreamEvent] with op `delete`: https://zulip.com/api/get-events#stream-delete
255+
@JsonSerializable(fieldRename: FieldRename.snake)
256+
class StreamDeleteEvent extends StreamEvent {
257+
@override
258+
String get op => 'delete';
259+
260+
final List<ZulipStream> streams;
261+
262+
StreamDeleteEvent({required super.id, required this.streams});
263+
264+
factory StreamDeleteEvent.fromJson(Map<String, dynamic> json) =>
265+
_$StreamDeleteEventFromJson(json);
266+
267+
@override
268+
Map<String, dynamic> toJson() => _$StreamDeleteEventToJson(this);
269+
}
270+
271+
// TODO(#182) StreamUpdateEvent, for a [StreamEvent] with op `update`:
272+
// https://zulip.com/api/get-events#stream-update
273+
218274
@JsonSerializable(fieldRename: FieldRename.snake)
219275
class HeartbeatEvent extends Event {
220276
@override

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)