From 5387c533f732049f12b8ea9e338b9e602de493de Mon Sep 17 00:00:00 2001 From: Ali Momen Sani Date: Tue, 23 Sep 2025 12:02:54 +0200 Subject: [PATCH] feat: add additional fields to channel member request --- .../getstream/chat/java/models/Channel.java | 12 ++++ .../io/getstream/chat/java/ChannelTest.java | 69 +++++++++++++++++++ 2 files changed, 81 insertions(+) diff --git a/src/main/java/io/getstream/chat/java/models/Channel.java b/src/main/java/io/getstream/chat/java/models/Channel.java index b1bc35f2e..9156dcb5d 100644 --- a/src/main/java/io/getstream/chat/java/models/Channel.java +++ b/src/main/java/io/getstream/chat/java/models/Channel.java @@ -380,6 +380,18 @@ public static class ChannelMemberRequestObject { @JsonProperty("shadow_banned") private Boolean shadowBanned; + @Singular @Nullable @JsonIgnore private Map additionalFields; + + @JsonAnyGetter + public Map getAdditionalFields() { + return this.additionalFields; + } + + @JsonAnySetter + public void setAdditionalField(String name, Object value) { + this.additionalFields.put(name, value); + } + @Nullable public static ChannelMemberRequestObject buildFrom(@Nullable ChannelMember channelMember) { return RequestObjectBuilder.build(ChannelMemberRequestObject.class, channelMember); diff --git a/src/test/java/io/getstream/chat/java/ChannelTest.java b/src/test/java/io/getstream/chat/java/ChannelTest.java index eefc8163b..c63dccf6c 100644 --- a/src/test/java/io/getstream/chat/java/ChannelTest.java +++ b/src/test/java/io/getstream/chat/java/ChannelTest.java @@ -555,4 +555,73 @@ void whenArchivingChannelUsingUnset_thenIsArchived() { .request()); Assertions.assertNull(channelMemberResponse.getMember().getArchivedAt()); } + + @DisplayName("Can set custom field on channel member") + @Test + void whenSettingCustomFieldOnMember_thenNoException() { + final var customField = "custom_field_on_member"; + final var customValue = "custom_value"; + + var channelMemberReq = + ChannelMemberRequestObject.builder() + .user(testUserRequestObject) + .additionalField(customField, customValue) + .build(); + var channelReq = + ChannelRequestObject.builder() + .createdBy(testUserRequestObject) + .members(List.of(channelMemberReq)) + .build(); + var channel = + Assertions.assertDoesNotThrow( + () -> + Channel.getOrCreate(testChannel.getType(), RandomStringUtils.randomAlphabetic(12)) + .data(channelReq) + .request()); + + Assertions.assertNotNull(channel.getMembers()); + var members = channel.getMembers(); + Assertions.assertEquals(1, members.size()); + var member = members.get(0); + Assertions.assertEquals(customValue, member.getAdditionalFields().get(customField)); + } + + @DisplayName("Can set custom field on channel member") + @Test + void whenPartialUpdateMember_thenNoException() { + var channelType = "messaging"; + var channelId = RandomStringUtils.randomAlphabetic(12); + var channelMemberReq = + ChannelMemberRequestObject.builder() + .user(testUserRequestObject) + .additionalField("field1", "value1") + .build(); + var channelReq = + ChannelRequestObject.builder() + .createdBy(testUserRequestObject) + .members(List.of(channelMemberReq)) + .build(); + var channel = + Assertions.assertDoesNotThrow( + () -> Channel.getOrCreate(channelType, channelId).data(channelReq).request()); + + Assertions.assertNotNull(channel.getMembers()); + var members = channel.getMembers(); + Assertions.assertEquals(1, members.size()); + var member = members.get(0); + Assertions.assertEquals("value1", member.getAdditionalFields().get("field1")); + + // update partial + var partialUpdateResponse = + Assertions.assertDoesNotThrow( + () -> + Channel.updateMemberPartial(channelType, channelId, testUserRequestObject.getId()) + .setValue("field1", "updated_value1") + .setValue("field2", "value2") + .request()); + + var updatedMember = partialUpdateResponse.getMember(); + Assertions.assertEquals("updated_value1", updatedMember.getAdditionalFields().get("field1")); + Assertions.assertEquals("value2", updatedMember.getAdditionalFields().get("field2")); + } }