Skip to content

Commit cf0e744

Browse files
committed
api: Add Message type, with JSON deserialization
1 parent c21cdf7 commit cf0e744

File tree

2 files changed

+236
-0
lines changed

2 files changed

+236
-0
lines changed

lib/api/model/model.dart

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,3 +99,136 @@ class Subscription {
9999
factory Subscription.fromJson(Map<String, dynamic> json) =>
100100
_$SubscriptionFromJson(json);
101101
}
102+
103+
/// As in the get-messages response.
104+
///
105+
/// https://zulip.com/api/get-messages#response
106+
abstract class Message {
107+
final String? avatar_url;
108+
final String client;
109+
final String content;
110+
final String content_type;
111+
112+
// final List<MessageEditHistory> edit_history; // TODO handle
113+
final int id;
114+
final bool is_me_message;
115+
final int? last_edit_timestamp;
116+
117+
// final List<Reaction> reactions; // TODO handle
118+
final int recipient_id;
119+
final String sender_email;
120+
final String sender_full_name;
121+
final int sender_id;
122+
final String sender_realm_str;
123+
final String subject; // TODO call it "topic" internally; also similar others
124+
// final List<string> submessages; // TODO handle
125+
final int timestamp;
126+
127+
// final List<TopicLink> topic_links; // TODO handle
128+
// final string type; // handled by runtime type of object
129+
final List<String> flags; // TODO enum
130+
final String? match_content;
131+
final String? match_subject;
132+
133+
Message({
134+
this.avatar_url,
135+
required this.client,
136+
required this.content,
137+
required this.content_type,
138+
required this.id,
139+
required this.is_me_message,
140+
this.last_edit_timestamp,
141+
required this.recipient_id,
142+
required this.sender_email,
143+
required this.sender_full_name,
144+
required this.sender_id,
145+
required this.sender_realm_str,
146+
required this.subject,
147+
required this.timestamp,
148+
required this.flags,
149+
this.match_content,
150+
this.match_subject,
151+
});
152+
153+
factory Message.fromJson(Map<String, dynamic> json) {
154+
final type = json['type'] as String;
155+
if (type == 'stream') return StreamMessage.fromJson(json);
156+
if (type == 'private') return PmMessage.fromJson(json);
157+
throw Exception("Message.fromJson: unexpected message type $type");
158+
}
159+
}
160+
161+
@JsonSerializable()
162+
class StreamMessage extends Message {
163+
final String display_recipient;
164+
final int stream_id;
165+
166+
StreamMessage({
167+
super.avatar_url,
168+
required super.client,
169+
required super.content,
170+
required super.content_type,
171+
required super.id,
172+
required super.is_me_message,
173+
super.last_edit_timestamp,
174+
required super.recipient_id,
175+
required super.sender_email,
176+
required super.sender_full_name,
177+
required super.sender_id,
178+
required super.sender_realm_str,
179+
required super.subject,
180+
required super.timestamp,
181+
required super.flags,
182+
super.match_content,
183+
super.match_subject,
184+
required this.display_recipient,
185+
required this.stream_id,
186+
});
187+
188+
factory StreamMessage.fromJson(Map<String, dynamic> json) =>
189+
_$StreamMessageFromJson(json);
190+
}
191+
192+
@JsonSerializable()
193+
class PmRecipient {
194+
final int id;
195+
final String email;
196+
final String full_name;
197+
198+
// final String? short_name; // obsolete, ignore
199+
// final bool? is_mirror_dummy; // obsolete, ignore
200+
201+
PmRecipient({required this.id, required this.email, required this.full_name});
202+
203+
factory PmRecipient.fromJson(Map<String, dynamic> json) =>
204+
_$PmRecipientFromJson(json);
205+
}
206+
207+
@JsonSerializable()
208+
class PmMessage extends Message {
209+
final List<PmRecipient> display_recipient;
210+
211+
PmMessage({
212+
super.avatar_url,
213+
required super.client,
214+
required super.content,
215+
required super.content_type,
216+
required super.id,
217+
required super.is_me_message,
218+
super.last_edit_timestamp,
219+
required super.recipient_id,
220+
required super.sender_email,
221+
required super.sender_full_name,
222+
required super.sender_id,
223+
required super.sender_realm_str,
224+
required super.subject,
225+
required super.timestamp,
226+
required super.flags,
227+
super.match_content,
228+
super.match_subject,
229+
required this.display_recipient,
230+
});
231+
232+
factory PmMessage.fromJson(Map<String, dynamic> json) =>
233+
_$PmMessageFromJson(json);
234+
}

lib/api/model/model.g.dart

Lines changed: 103 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)