Skip to content

Commit 8b59fc5

Browse files
fix(event): keep message_id in additional fields
Event.messageId from #278 was a typed Jackson field, so a top-level message_id on message.*, reminder.* and poll.* webhooks moved out of getAdditionalFields() and getAdditionalFields().get("message_id") returned null after upgrading. getMessageId()/setMessageId() now read and write the additional-fields map instead, so parsing and serialization match 1.50.0 and both accessors return the ID on every event. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
1 parent b3dad6d commit 8b59fc5

2 files changed

Lines changed: 45 additions & 4 deletions

File tree

‎src/main/java/io/getstream/chat/java/models/Event.java‎

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -117,12 +117,35 @@ public class Event {
117117
@JsonProperty("scheduled_message")
118118
private ScheduledMessage scheduledMessage;
119119

120-
/** On scheduled_message.sent, the ID of the message that was sent. */
120+
@NotNull @JsonIgnore private Map<String, Object> additionalFields = new HashMap<>();
121+
122+
/**
123+
* The ID of the message the event is about (on scheduled_message.sent, the message that was
124+
* sent). The backend also sends it on message.*, reminder.* and poll.* events.
125+
*
126+
* <p>Backed by {@link #getAdditionalFields()} so {@code getAdditionalFields().get("message_id")}
127+
* keeps working for existing events.
128+
*/
121129
@Nullable
122-
@JsonProperty("message_id")
123-
private String messageId;
130+
@JsonIgnore
131+
public String getMessageId() {
132+
Object value = this.additionalFields.get("message_id");
133+
return value == null ? null : value.toString();
134+
}
124135

125-
@NotNull @JsonIgnore private Map<String, Object> additionalFields = new HashMap<>();
136+
/**
137+
* Sets the ID of the message the event is about; stored in {@link #getAdditionalFields()}.
138+
*
139+
* @param messageId the message ID, or null to remove it
140+
*/
141+
@JsonIgnore
142+
public void setMessageId(@Nullable String messageId) {
143+
if (messageId == null) {
144+
this.additionalFields.remove("message_id");
145+
} else {
146+
this.additionalFields.put("message_id", messageId);
147+
}
148+
}
126149

127150
@JsonAnyGetter
128151
public Map<String, Object> getAdditionalFields() {

‎src/test/java/io/getstream/chat/java/ScheduledMessageTest.java‎

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,25 @@ void whenEventIsScheduledMessageSent_thenFieldsAreTyped() throws Exception {
180180
Event.class);
181181

182182
Assertions.assertEquals("m-1", event.getMessageId());
183+
Assertions.assertEquals("m-1", event.getAdditionalFields().get("message_id"));
183184
Assertions.assertEquals("sm-1", event.getScheduledMessage().getId());
184185
Assertions.assertFalse(event.getAdditionalFields().containsKey("scheduled_message"));
185186
}
187+
188+
@DisplayName("message.new events keep message_id in additional fields")
189+
@Test
190+
void whenEventIsMessageNew_thenMessageIdStaysInAdditionalFields() throws Exception {
191+
String json =
192+
"{\"type\":\"message.new\",\"cid\":\"messaging:general\",\"message_id\":\"m-2\","
193+
+ "\"message\":{\"id\":\"m-2\",\"text\":\"hi\"}}";
194+
Event event = MAPPER.readValue(json, Event.class);
195+
196+
Assertions.assertEquals("m-2", event.getAdditionalFields().get("message_id"));
197+
Assertions.assertEquals("m-2", event.getMessageId());
198+
Assertions.assertEquals("m-2", event.getMessage().getId());
199+
200+
String out = MAPPER.writeValueAsString(event);
201+
Assertions.assertEquals(1, out.split("\"message_id\"", -1).length - 1, out);
202+
Assertions.assertFalse(out.contains("messageId"), out);
203+
}
186204
}

0 commit comments

Comments
 (0)