From 174468379b4232121b583bc098c3bb6705c3e11c Mon Sep 17 00:00:00 2001 From: Chris Bobbe Date: Wed, 5 Jul 2023 11:33:45 -0700 Subject: [PATCH] api: Add delete_message events --- lib/api/model/events.dart | 46 +++++++++++++++++++++++++++++++++++++ lib/api/model/events.g.dart | 19 +++++++++++++++ lib/model/store.dart | 2 ++ 3 files changed, 67 insertions(+) diff --git a/lib/api/model/events.dart b/lib/api/model/events.dart index 9f95af91851..ad95105438f 100644 --- a/lib/api/model/events.dart +++ b/lib/api/model/events.dart @@ -32,6 +32,7 @@ sealed class Event { } case 'message': return MessageEvent.fromJson(json); case 'update_message': return UpdateMessageEvent.fromJson(json); + case 'delete_message': return DeleteMessageEvent.fromJson(json); case 'heartbeat': return HeartbeatEvent.fromJson(json); // TODO add many more event types default: return UnexpectedEvent.fromJson(json); @@ -344,6 +345,51 @@ enum PropagateMode { }; } +/// A Zulip event of type `delete_message`. +@JsonSerializable(fieldRename: FieldRename.snake) +class DeleteMessageEvent extends Event { + @override + String get type => 'delete_message'; + + final List messageIds; + // final int messageId; // Not present; we support the bulk_message_deletion capability + @JsonKey(fromJson: MessageType.fromJson, toJson: MessageType.toJson) + final MessageType messageType; + final int? streamId; + final String? topic; + + DeleteMessageEvent({ + required super.id, + required this.messageIds, + required this.messageType, + this.streamId, + this.topic, + }); + + factory DeleteMessageEvent.fromJson(Map json) => + _$DeleteMessageEventFromJson(json); + + @override + Map toJson() => _$DeleteMessageEventToJson(this); +} + +/// As in [DeleteMessageEvent.messageType]. +enum MessageType { + stream, + private; + + factory MessageType.fromJson(dynamic json) => switch (json) { + 'stream' => MessageType.stream, + 'private' => MessageType.private, + _ => throw Exception("MessageType.fromJson: unexpected message type $json"), + }; + + static String toJson(MessageType value) => switch (value) { + MessageType.stream => 'stream', + MessageType.private => 'private', + }; +} + @JsonSerializable(fieldRename: FieldRename.snake) class HeartbeatEvent extends Event { @override diff --git a/lib/api/model/events.g.dart b/lib/api/model/events.g.dart index 5ca5583f880..da45c78531d 100644 --- a/lib/api/model/events.g.dart +++ b/lib/api/model/events.g.dart @@ -178,6 +178,25 @@ Map _$UpdateMessageEventToJson(UpdateMessageEvent instance) => 'is_me_message': instance.isMeMessage, }; +DeleteMessageEvent _$DeleteMessageEventFromJson(Map json) => + DeleteMessageEvent( + id: json['id'] as int, + messageIds: + (json['message_ids'] as List).map((e) => e as int).toList(), + messageType: MessageType.fromJson(json['message_type']), + streamId: json['stream_id'] as int?, + topic: json['topic'] as String?, + ); + +Map _$DeleteMessageEventToJson(DeleteMessageEvent instance) => + { + 'id': instance.id, + 'message_ids': instance.messageIds, + 'message_type': MessageType.toJson(instance.messageType), + 'stream_id': instance.streamId, + 'topic': instance.topic, + }; + HeartbeatEvent _$HeartbeatEventFromJson(Map json) => HeartbeatEvent( id: json['id'] as int, diff --git a/lib/model/store.dart b/lib/model/store.dart index 477641bc2ae..c06e21671bf 100644 --- a/lib/model/store.dart +++ b/lib/model/store.dart @@ -259,6 +259,8 @@ class PerAccountStore extends ChangeNotifier { } } else if (event is UpdateMessageEvent) { // TODO handle + } else if (event is DeleteMessageEvent) { + // TODO handle } else if (event is UnexpectedEvent) { assert(debugLog("server event: ${jsonEncode(event.toJson())}")); // TODO log better } else {