From 5804fe89ab2fd43d1643bf67863cde039d9e6548 Mon Sep 17 00:00:00 2001 From: javierdfm Date: Fri, 29 Aug 2025 08:51:30 +0200 Subject: [PATCH 1/6] Added member to message response --- src/main/java/io/getstream/chat/java/models/Message.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/io/getstream/chat/java/models/Message.java b/src/main/java/io/getstream/chat/java/models/Message.java index 7b4f19ac3..c343226c0 100644 --- a/src/main/java/io/getstream/chat/java/models/Message.java +++ b/src/main/java/io/getstream/chat/java/models/Message.java @@ -172,6 +172,10 @@ public class Message { @JsonProperty("shared_location") private SharedLocation sharedLocation; + @Nullable + @JsonProperty("member") + private ChannelMember member; + @NotNull @JsonIgnore private Map additionalFields = new HashMap<>(); @JsonAnyGetter From 74959a76ceb168f3544e36db94d9d4b3a27e7390 Mon Sep 17 00:00:00 2001 From: javierdfm Date: Fri, 29 Aug 2025 08:51:38 +0200 Subject: [PATCH 2/6] Added member to message response --- .../java/ChannelMemberRoleMessageTest.java | 111 ++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 src/test/java/io/getstream/chat/java/ChannelMemberRoleMessageTest.java diff --git a/src/test/java/io/getstream/chat/java/ChannelMemberRoleMessageTest.java b/src/test/java/io/getstream/chat/java/ChannelMemberRoleMessageTest.java new file mode 100644 index 000000000..2c3edae80 --- /dev/null +++ b/src/test/java/io/getstream/chat/java/ChannelMemberRoleMessageTest.java @@ -0,0 +1,111 @@ +package io.getstream.chat.java; + +import io.getstream.chat.java.models.Channel; +import io.getstream.chat.java.models.Channel.*; +import io.getstream.chat.java.models.Message; +import io.getstream.chat.java.models.Message.MessageRequestObject; +import io.getstream.chat.java.models.Role; +import io.getstream.chat.java.models.User.UserRequestObject; +import java.util.List; +import org.apache.commons.lang3.RandomStringUtils; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +public class ChannelMemberRoleMessageTest extends BasicTest { + + @DisplayName("Messages include channel member role") + @Test + void whenSendingMessages_thenMemberRoleIsIncluded() { + // Create a unique custom role + String customRole = "custom_role_" + RandomStringUtils.randomAlphabetic(5); + Assertions.assertDoesNotThrow(() -> Role.create().name(customRole).request()); + // Wait for the role to be fully propagated + pause(); + + // Select two different users from the pre-created user list + UserRequestObject userWithRole = testUsersRequestObjects.get(0); + UserRequestObject userWithoutRole = testUsersRequestObjects.get(1); + + // Build channel members – assign the custom role to the first user only + var memberWithRole = + ChannelMemberRequestObject.builder().user(userWithRole).role(customRole).build(); + var memberWithoutRole = + ChannelMemberRequestObject.builder().user(userWithoutRole).build(); + + // Create a new channel with these members + var channelResp = + Assertions.assertDoesNotThrow( + () -> + Channel.getOrCreate("team", RandomStringUtils.randomAlphabetic(12)) + .data( + ChannelRequestObject.builder() + .createdBy(testUserRequestObject) + .member(memberWithRole) + .member(memberWithoutRole) + .build()) + .request()); + var channel = channelResp.getChannel(); + + // User with role sends a message + Message messageWithRole = + Assertions.assertDoesNotThrow( + () -> + Message.send(channel.getType(), channel.getId()) + .message( + MessageRequestObject.builder() + .text("Message from user with role") + .userId(userWithRole.getId()) + .build()) + .request()) + .getMessage(); + + // User without role sends a message + Message messageWithoutRole = + Assertions.assertDoesNotThrow( + () -> + Message.send(channel.getType(), channel.getId()) + .message( + MessageRequestObject.builder() + .text("Message from user without role") + .userId(userWithoutRole.getId()) + .build()) + .request()) + .getMessage(); + + // Assert the role information in the immediate responses + Assertions.assertNotNull(messageWithRole.getMember()); + Assertions.assertEquals(customRole, messageWithRole.getMember().getRole()); + + Assertions.assertNotNull(messageWithoutRole.getMember()); + Assertions.assertNull(messageWithoutRole.getMember().getRole()); + + // Retrieve the channel again and ensure both messages still carry the correct member role + var channelState = + Assertions.assertDoesNotThrow( + () -> Channel.getOrCreate(channel.getType(), channel.getId()).state(true).request()); + + List messages = channelState.getMessages(); + Assertions.assertNotNull(messages); + // The messages list may include more than our two messages – find them by id + Message storedWithRole = + messages.stream() + .filter(m -> m.getId().equals(messageWithRole.getId())) + .findFirst() + .orElse(null); + Message storedWithoutRole = + messages.stream() + .filter(m -> m.getId().equals(messageWithoutRole.getId())) + .findFirst() + .orElse(null); + + Assertions.assertNotNull(storedWithRole); + Assertions.assertNotNull(storedWithRole.getMember()); + Assertions.assertEquals(customRole, storedWithRole.getMember().getRole()); + + Assertions.assertNotNull(storedWithoutRole); + Assertions.assertNotNull(storedWithoutRole.getMember()); + Assertions.assertNull(storedWithoutRole.getMember().getRole()); + } +} + From e4486159242efd283d382200f9d42c3bd9b76482 Mon Sep 17 00:00:00 2001 From: javierdfm Date: Fri, 29 Aug 2025 10:16:34 +0200 Subject: [PATCH 3/6] Updated test --- .../getstream/chat/java/models/Message.java | 1 + .../java/ChannelMemberRoleMessageTest.java | 38 ++++++++++--------- 2 files changed, 22 insertions(+), 17 deletions(-) diff --git a/src/main/java/io/getstream/chat/java/models/Message.java b/src/main/java/io/getstream/chat/java/models/Message.java index c343226c0..d4c5c38f3 100644 --- a/src/main/java/io/getstream/chat/java/models/Message.java +++ b/src/main/java/io/getstream/chat/java/models/Message.java @@ -15,6 +15,7 @@ import io.getstream.chat.java.models.Message.MessageUpdateRequestData.MessageUpdateRequest; import io.getstream.chat.java.models.User.UserRequestObject; import io.getstream.chat.java.models.framework.*; +import io.getstream.chat.java.models.Channel.ChannelMember; import io.getstream.chat.java.services.MessageService; import io.getstream.chat.java.services.framework.Client; import java.io.File; diff --git a/src/test/java/io/getstream/chat/java/ChannelMemberRoleMessageTest.java b/src/test/java/io/getstream/chat/java/ChannelMemberRoleMessageTest.java index 2c3edae80..6565c7000 100644 --- a/src/test/java/io/getstream/chat/java/ChannelMemberRoleMessageTest.java +++ b/src/test/java/io/getstream/chat/java/ChannelMemberRoleMessageTest.java @@ -24,16 +24,10 @@ void whenSendingMessages_thenMemberRoleIsIncluded() { pause(); // Select two different users from the pre-created user list - UserRequestObject userWithRole = testUsersRequestObjects.get(0); - UserRequestObject userWithoutRole = testUsersRequestObjects.get(1); + UserRequestObject userWithCustomRole = testUsersRequestObjects.get(0); + UserRequestObject userWithDefaultRole = testUsersRequestObjects.get(1); - // Build channel members – assign the custom role to the first user only - var memberWithRole = - ChannelMemberRequestObject.builder().user(userWithRole).role(customRole).build(); - var memberWithoutRole = - ChannelMemberRequestObject.builder().user(userWithoutRole).build(); - - // Create a new channel with these members + // Create a new channel with these members (roles will be assigned later) var channelResp = Assertions.assertDoesNotThrow( () -> @@ -41,12 +35,21 @@ void whenSendingMessages_thenMemberRoleIsIncluded() { .data( ChannelRequestObject.builder() .createdBy(testUserRequestObject) - .member(memberWithRole) - .member(memberWithoutRole) + .member(ChannelMemberRequestObject.builder().user(userWithCustomRole).build()) + .member(ChannelMemberRequestObject.builder().user(userWithDefaultRole).build()) .build()) .request()); var channel = channelResp.getChannel(); + // Assign the custom role to the first user *after* channel creation + var assignment = new RoleAssignment(); + assignment.setChannelRole(customRole); + assignment.setUserId(userWithCustomRole.getId()); + Assertions.assertDoesNotThrow( + () -> Channel.assignRoles(channel.getType(), channel.getId()).assignRole(assignment).request()); + + pause(); // give backend time to apply the role + // User with role sends a message Message messageWithRole = Assertions.assertDoesNotThrow( @@ -55,7 +58,7 @@ void whenSendingMessages_thenMemberRoleIsIncluded() { .message( MessageRequestObject.builder() .text("Message from user with role") - .userId(userWithRole.getId()) + .userId(userWithCustomRole.getId()) .build()) .request()) .getMessage(); @@ -68,17 +71,17 @@ void whenSendingMessages_thenMemberRoleIsIncluded() { .message( MessageRequestObject.builder() .text("Message from user without role") - .userId(userWithoutRole.getId()) + .userId(userWithDefaultRole.getId()) .build()) .request()) .getMessage(); // Assert the role information in the immediate responses Assertions.assertNotNull(messageWithRole.getMember()); - Assertions.assertEquals(customRole, messageWithRole.getMember().getRole()); + Assertions.assertEquals(customRole, messageWithRole.getMember().getChannelRole()); Assertions.assertNotNull(messageWithoutRole.getMember()); - Assertions.assertNull(messageWithoutRole.getMember().getRole()); + Assertions.assertEquals("channel_member", messageWithoutRole.getMember().getChannelRole()); // Retrieve the channel again and ensure both messages still carry the correct member role var channelState = @@ -101,11 +104,12 @@ void whenSendingMessages_thenMemberRoleIsIncluded() { Assertions.assertNotNull(storedWithRole); Assertions.assertNotNull(storedWithRole.getMember()); - Assertions.assertEquals(customRole, storedWithRole.getMember().getRole()); + Assertions.assertEquals(customRole, storedWithRole.getMember().getChannelRole()); Assertions.assertNotNull(storedWithoutRole); Assertions.assertNotNull(storedWithoutRole.getMember()); - Assertions.assertNull(storedWithoutRole.getMember().getRole()); + Assertions.assertEquals("channel_member", storedWithoutRole.getMember().getChannelRole()); } } + From 4bee6838e8f9e01094fbb2d12d19440aace1c7d9 Mon Sep 17 00:00:00 2001 From: javierdfm Date: Fri, 29 Aug 2025 16:03:10 +0200 Subject: [PATCH 4/6] Spotless apply --- .../getstream/chat/java/models/Message.java | 2 +- .../java/ChannelMemberRoleMessageTest.java | 29 +++++++++---------- 2 files changed, 14 insertions(+), 17 deletions(-) diff --git a/src/main/java/io/getstream/chat/java/models/Message.java b/src/main/java/io/getstream/chat/java/models/Message.java index d4c5c38f3..03892fe8c 100644 --- a/src/main/java/io/getstream/chat/java/models/Message.java +++ b/src/main/java/io/getstream/chat/java/models/Message.java @@ -2,6 +2,7 @@ import com.fasterxml.jackson.annotation.*; import io.getstream.chat.java.exceptions.StreamException; +import io.getstream.chat.java.models.Channel.ChannelMember; import io.getstream.chat.java.models.Flag.FlagCreateRequestData.FlagCreateRequest; import io.getstream.chat.java.models.Flag.FlagDeleteRequestData.FlagDeleteRequest; import io.getstream.chat.java.models.Flag.FlagMessageQueryRequestData.FlagMessageQueryRequest; @@ -15,7 +16,6 @@ import io.getstream.chat.java.models.Message.MessageUpdateRequestData.MessageUpdateRequest; import io.getstream.chat.java.models.User.UserRequestObject; import io.getstream.chat.java.models.framework.*; -import io.getstream.chat.java.models.Channel.ChannelMember; import io.getstream.chat.java.services.MessageService; import io.getstream.chat.java.services.framework.Client; import java.io.File; diff --git a/src/test/java/io/getstream/chat/java/ChannelMemberRoleMessageTest.java b/src/test/java/io/getstream/chat/java/ChannelMemberRoleMessageTest.java index 6565c7000..36d015172 100644 --- a/src/test/java/io/getstream/chat/java/ChannelMemberRoleMessageTest.java +++ b/src/test/java/io/getstream/chat/java/ChannelMemberRoleMessageTest.java @@ -17,17 +17,13 @@ public class ChannelMemberRoleMessageTest extends BasicTest { @DisplayName("Messages include channel member role") @Test void whenSendingMessages_thenMemberRoleIsIncluded() { - // Create a unique custom role String customRole = "custom_role_" + RandomStringUtils.randomAlphabetic(5); Assertions.assertDoesNotThrow(() -> Role.create().name(customRole).request()); - // Wait for the role to be fully propagated pause(); - // Select two different users from the pre-created user list UserRequestObject userWithCustomRole = testUsersRequestObjects.get(0); UserRequestObject userWithDefaultRole = testUsersRequestObjects.get(1); - // Create a new channel with these members (roles will be assigned later) var channelResp = Assertions.assertDoesNotThrow( () -> @@ -35,22 +31,29 @@ void whenSendingMessages_thenMemberRoleIsIncluded() { .data( ChannelRequestObject.builder() .createdBy(testUserRequestObject) - .member(ChannelMemberRequestObject.builder().user(userWithCustomRole).build()) - .member(ChannelMemberRequestObject.builder().user(userWithDefaultRole).build()) + .member( + ChannelMemberRequestObject.builder() + .user(userWithCustomRole) + .build()) + .member( + ChannelMemberRequestObject.builder() + .user(userWithDefaultRole) + .build()) .build()) .request()); var channel = channelResp.getChannel(); - // Assign the custom role to the first user *after* channel creation var assignment = new RoleAssignment(); assignment.setChannelRole(customRole); assignment.setUserId(userWithCustomRole.getId()); Assertions.assertDoesNotThrow( - () -> Channel.assignRoles(channel.getType(), channel.getId()).assignRole(assignment).request()); + () -> + Channel.assignRoles(channel.getType(), channel.getId()) + .assignRole(assignment) + .request()); - pause(); // give backend time to apply the role + pause(); - // User with role sends a message Message messageWithRole = Assertions.assertDoesNotThrow( () -> @@ -63,7 +66,6 @@ void whenSendingMessages_thenMemberRoleIsIncluded() { .request()) .getMessage(); - // User without role sends a message Message messageWithoutRole = Assertions.assertDoesNotThrow( () -> @@ -76,21 +78,18 @@ void whenSendingMessages_thenMemberRoleIsIncluded() { .request()) .getMessage(); - // Assert the role information in the immediate responses Assertions.assertNotNull(messageWithRole.getMember()); Assertions.assertEquals(customRole, messageWithRole.getMember().getChannelRole()); Assertions.assertNotNull(messageWithoutRole.getMember()); Assertions.assertEquals("channel_member", messageWithoutRole.getMember().getChannelRole()); - // Retrieve the channel again and ensure both messages still carry the correct member role var channelState = Assertions.assertDoesNotThrow( () -> Channel.getOrCreate(channel.getType(), channel.getId()).state(true).request()); List messages = channelState.getMessages(); Assertions.assertNotNull(messages); - // The messages list may include more than our two messages – find them by id Message storedWithRole = messages.stream() .filter(m -> m.getId().equals(messageWithRole.getId())) @@ -111,5 +110,3 @@ void whenSendingMessages_thenMemberRoleIsIncluded() { Assertions.assertEquals("channel_member", storedWithoutRole.getMember().getChannelRole()); } } - - From a1dc6e65f8510da84c0b4b274e864acf86382174 Mon Sep 17 00:00:00 2001 From: javierdfm Date: Fri, 29 Aug 2025 16:20:29 +0200 Subject: [PATCH 5/6] Updated test --- .../chat/java/ChannelMemberRoleMessageTest.java | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/src/test/java/io/getstream/chat/java/ChannelMemberRoleMessageTest.java b/src/test/java/io/getstream/chat/java/ChannelMemberRoleMessageTest.java index 36d015172..87dc8ba2f 100644 --- a/src/test/java/io/getstream/chat/java/ChannelMemberRoleMessageTest.java +++ b/src/test/java/io/getstream/chat/java/ChannelMemberRoleMessageTest.java @@ -17,9 +17,7 @@ public class ChannelMemberRoleMessageTest extends BasicTest { @DisplayName("Messages include channel member role") @Test void whenSendingMessages_thenMemberRoleIsIncluded() { - String customRole = "custom_role_" + RandomStringUtils.randomAlphabetic(5); - Assertions.assertDoesNotThrow(() -> Role.create().name(customRole).request()); - pause(); + String customRole = "custom_role"; UserRequestObject userWithCustomRole = testUsersRequestObjects.get(0); UserRequestObject userWithDefaultRole = testUsersRequestObjects.get(1); @@ -34,6 +32,7 @@ void whenSendingMessages_thenMemberRoleIsIncluded() { .member( ChannelMemberRequestObject.builder() .user(userWithCustomRole) + .channelRole(customRole) .build()) .member( ChannelMemberRequestObject.builder() @@ -43,17 +42,6 @@ void whenSendingMessages_thenMemberRoleIsIncluded() { .request()); var channel = channelResp.getChannel(); - var assignment = new RoleAssignment(); - assignment.setChannelRole(customRole); - assignment.setUserId(userWithCustomRole.getId()); - Assertions.assertDoesNotThrow( - () -> - Channel.assignRoles(channel.getType(), channel.getId()) - .assignRole(assignment) - .request()); - - pause(); - Message messageWithRole = Assertions.assertDoesNotThrow( () -> From 904889e0019cc8ef90c38a72e64366db41cc06a6 Mon Sep 17 00:00:00 2001 From: javierdfm Date: Fri, 29 Aug 2025 16:34:54 +0200 Subject: [PATCH 6/6] Format --- .../io/getstream/chat/java/ChannelMemberRoleMessageTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/java/io/getstream/chat/java/ChannelMemberRoleMessageTest.java b/src/test/java/io/getstream/chat/java/ChannelMemberRoleMessageTest.java index 87dc8ba2f..fb01d853d 100644 --- a/src/test/java/io/getstream/chat/java/ChannelMemberRoleMessageTest.java +++ b/src/test/java/io/getstream/chat/java/ChannelMemberRoleMessageTest.java @@ -4,7 +4,6 @@ import io.getstream.chat.java.models.Channel.*; import io.getstream.chat.java.models.Message; import io.getstream.chat.java.models.Message.MessageRequestObject; -import io.getstream.chat.java.models.Role; import io.getstream.chat.java.models.User.UserRequestObject; import java.util.List; import org.apache.commons.lang3.RandomStringUtils;