Skip to content

Commit 4d94975

Browse files
PIG208gnprice
authored andcommitted
api: Start using 'direct' for MessageType.
We still offer support for 'private', which gets converted to 'direct' as well when deserialized. Signed-off-by: Zixuan James Li <[email protected]>
1 parent 13991b8 commit 4d94975

File tree

8 files changed

+89
-30
lines changed

8 files changed

+89
-30
lines changed

lib/api/model/events.dart

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -707,6 +707,9 @@ class DeleteMessageEvent extends Event {
707707

708708
final List<int> messageIds;
709709
// final int messageId; // Not present; we support the bulk_message_deletion capability
710+
// The server never actually sends "direct" here yet (it's "private" instead),
711+
// but we accept both forms for forward-compatibility.
712+
@MessageTypeConverter()
710713
final MessageType messageType;
711714
final int? streamId;
712715
final String? topic;
@@ -735,10 +738,25 @@ class DeleteMessageEvent extends Event {
735738

736739
/// As in [DeleteMessageEvent.messageType]
737740
/// or [UpdateMessageFlagsMessageDetail.type].
738-
@JsonEnum(fieldRename: FieldRename.snake)
741+
@JsonEnum(alwaysCreate: true)
739742
enum MessageType {
740743
stream,
741-
private;
744+
direct;
745+
}
746+
747+
class MessageTypeConverter extends JsonConverter<MessageType, String> {
748+
const MessageTypeConverter();
749+
750+
@override
751+
MessageType fromJson(String json) {
752+
if (json == 'private') json = 'direct'; // TODO(server-future)
753+
return $enumDecode(_$MessageTypeEnumMap, json);
754+
}
755+
756+
@override
757+
String toJson(MessageType object) {
758+
return _$MessageTypeEnumMap[object]!;
759+
}
742760
}
743761

744762
/// A Zulip event of type `update_message_flags`.
@@ -820,6 +838,9 @@ class UpdateMessageFlagsRemoveEvent extends UpdateMessageFlagsEvent {
820838
/// As in [UpdateMessageFlagsRemoveEvent.messageDetails].
821839
@JsonSerializable(fieldRename: FieldRename.snake)
822840
class UpdateMessageFlagsMessageDetail {
841+
// The server never actually sends "direct" here yet (it's "private" instead),
842+
// but we accept both forms for forward-compatibility.
843+
@MessageTypeConverter()
823844
final MessageType type;
824845
final bool? mentioned;
825846
final List<int>? userIds;
@@ -841,7 +862,7 @@ class UpdateMessageFlagsMessageDetail {
841862
case MessageType.stream:
842863
result.streamId as int;
843864
result.topic as String;
844-
case MessageType.private:
865+
case MessageType.direct:
845866
result.userIds as List<int>;
846867
}
847868
return result;

lib/api/model/events.g.dart

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

lib/model/narrow.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ class DmNarrow extends Narrow implements SendableNarrow {
204204
UpdateMessageFlagsMessageDetail detail, {
205205
required int selfUserId,
206206
}) {
207-
assert(detail.type == MessageType.private);
207+
assert(detail.type == MessageType.direct);
208208
return DmNarrow.withOtherUsers(detail.userIds!, selfUserId: selfUserId);
209209
}
210210

lib/model/unreads.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,7 @@ class Unreads extends ChangeNotifier {
288288
final streamId = event.streamId!;
289289
final topic = event.topic!;
290290
_removeAllInStreamTopic(messageIdsSet, streamId, topic);
291-
case MessageType.private:
291+
case MessageType.direct:
292292
_slowRemoveAllInDms(messageIdsSet);
293293
}
294294

@@ -363,7 +363,7 @@ class Unreads extends ChangeNotifier {
363363
final topics = (newlyUnreadInStreams[detail.streamId!] ??= {});
364364
final messageIds = (topics[detail.topic!] ??= QueueList());
365365
messageIds.add(messageId);
366-
case MessageType.private:
366+
case MessageType.direct:
367367
final narrow = DmNarrow.ofUpdateMessageFlagsMessageDetail(selfUserId: selfUserId,
368368
detail);
369369
(newlyUnreadInDms[narrow] ??= QueueList())

test/api/model/events_checks.dart

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,18 @@ extension UpdateMessageEventChecks on Subject<UpdateMessageEvent> {
6060
Subject<bool?> get isMeMessage => has((e) => e.isMeMessage, 'isMeMessage');
6161
}
6262

63+
extension DeleteMessageEventChecks on Subject<DeleteMessageEvent> {
64+
Subject<MessageType?> get messageType => has((e) => e.messageType, 'messageType');
65+
}
66+
67+
extension UpdateMessageFlagsRemoveEventChecks on Subject<UpdateMessageFlagsRemoveEvent> {
68+
Subject<Map<int, UpdateMessageFlagsMessageDetail>?> get messageDetails => has((e) => e.messageDetails, 'messageDetails');
69+
}
70+
71+
extension UpdateMessageFlagsMessageDetailCheck on Subject<UpdateMessageFlagsMessageDetail> {
72+
Subject<MessageType?> get type => has((e) => e.type, 'type');
73+
}
74+
6375
extension HeartbeatEventChecks on Subject<HeartbeatEvent> {
6476
// No properties not covered by Event.
6577
}

test/api/model/events_test.dart

Lines changed: 35 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,16 @@ void main() {
153153
})).throws<void>();
154154
});
155155

156-
test('update_message_flags/remove: require messageDetails in mark-as-unread', () {
156+
test('delete_message: private -> direct', () {
157+
check(DeleteMessageEvent.fromJson({
158+
'id': 1,
159+
'type': 'delete_message',
160+
'message_ids': [1, 2, 3],
161+
'message_type': 'private',
162+
})).messageType.equals(MessageType.direct);
163+
});
164+
165+
group('update_message_flags/remove', () {
157166
final baseJson = {
158167
'id': 1,
159168
'type': 'update_message_flags',
@@ -162,14 +171,30 @@ void main() {
162171
'messages': [123],
163172
'all': false,
164173
};
165-
check(() => UpdateMessageFlagsRemoveEvent.fromJson(baseJson)).returnsNormally();
166-
check(() => UpdateMessageFlagsRemoveEvent.fromJson({
167-
...baseJson, 'flag': 'read',
168-
})).throws<void>();
169-
check(() => UpdateMessageFlagsRemoveEvent.fromJson({
170-
...baseJson,
171-
'flag': 'read',
172-
'message_details': {'123': {'type': 'private', 'mentioned': false, 'user_ids': [2]}},
173-
})).returnsNormally();
174+
final messageDetail = {'type': 'direct', 'mentioned': false, 'user_ids': [2]};
175+
176+
test('require messageDetails in mark-as-unread', () {
177+
check(() => UpdateMessageFlagsRemoveEvent.fromJson(baseJson)).returnsNormally();
178+
check(() => UpdateMessageFlagsRemoveEvent.fromJson({
179+
...baseJson, 'flag': 'read',
180+
})).throws<void>();
181+
check(() => UpdateMessageFlagsRemoveEvent.fromJson({
182+
...baseJson,
183+
'flag': 'read',
184+
'message_details': {'123': messageDetail},
185+
})).returnsNormally();
186+
});
187+
188+
test('private -> direct', () {
189+
check(UpdateMessageFlagsRemoveEvent.fromJson({
190+
...baseJson,
191+
'flag': 'read',
192+
'message_details': {
193+
'123': {
194+
...messageDetail,
195+
'type': 'private',
196+
}}})).messageDetails.isNotNull()
197+
.values.single.type.equals(MessageType.direct);
198+
});
174199
});
175200
}

test/example_data.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -492,7 +492,7 @@ UpdateMessageFlagsRemoveEvent updateMessageFlagsRemoveEvent(
492492
userIds: null,
493493
),
494494
DmMessage() => UpdateMessageFlagsMessageDetail(
495-
type: MessageType.private,
495+
type: MessageType.direct,
496496
mentioned: mentioned,
497497
streamId: null,
498498
topic: null,

test/model/unreads_test.dart

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -449,7 +449,7 @@ void main() {
449449
),
450450
DmMessage() => DeleteMessageEvent(
451451
id: 0,
452-
messageType: MessageType.private,
452+
messageType: MessageType.direct,
453453
messageIds: [message.id],
454454
streamId: null,
455455
topic: null,
@@ -488,7 +488,7 @@ void main() {
488488
model.handleDeleteMessageEvent(DeleteMessageEvent(
489489
id: 0,
490490
messageIds: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
491-
messageType: MessageType.private,
491+
messageType: MessageType.direct,
492492
streamId: null,
493493
topic: null,
494494
));
@@ -523,7 +523,7 @@ void main() {
523523
model.handleDeleteMessageEvent(DeleteMessageEvent(
524524
id: 0,
525525
messageIds: [message.id],
526-
messageType: MessageType.private,
526+
messageType: MessageType.direct,
527527
streamId: null,
528528
topic: null,
529529
));
@@ -968,7 +968,7 @@ void main() {
968968
),
969969
// message 2 and 3 have their details missing
970970
message4.id: UpdateMessageFlagsMessageDetail(
971-
type: MessageType.private,
971+
type: MessageType.direct,
972972
mentioned: false,
973973
streamId: null,
974974
topic: null,

0 commit comments

Comments
 (0)