diff --git a/DOCS.md b/DOCS.md index 14889633..ea40c1ba 100644 --- a/DOCS.md +++ b/DOCS.md @@ -365,6 +365,19 @@ Channel.getOrCreate("messaging", "red-general") .request(); ``` +Create a channel with filter tags + +```java +Channel.getOrCreate("messaging", "support-channel") + .data( + ChannelRequestObject.builder() + .filterTag("important") + .filterTag("urgent") + .createdBy(UserRequestObject.builder().id("myuserid").build()) + .build()) + .request(); +``` + **Get or create channel (type)** ```java @@ -486,6 +499,12 @@ Remove overrides and go back to default settings Channel.partialUpdate(type, id).setValue("config_overrides", Collections.EMPTY_MAP).request(); ``` +Set filter tags + +```java +Channel.partialUpdate(type, id).setValue("filter_tags", List.of("tag1", "tag2")).request(); +``` + **Update channel** Full update (overwrite) @@ -539,6 +558,16 @@ Channel.update(type, id).addModerator("thierry").addModerator("josh").request(); Channel.update(type, id).demoteModerator("tommaso").request(); ``` +Add/remove filter tags + +```java +// Add filter tags to a channel +Channel.update(type, id).addFilterTag("important").addFilterTag("urgent").request(); + +// Remove filter tags from a channel +Channel.update(type, id).removeFilterTag("urgent").request(); +``` + Inviting users ```java 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 78cb4344..ffe6d9e7 100644 --- a/src/main/java/io/getstream/chat/java/models/Channel.java +++ b/src/main/java/io/getstream/chat/java/models/Channel.java @@ -113,6 +113,10 @@ public class Channel { @JsonProperty("truncated_by") private User truncatedBy; + @Nullable + @JsonProperty("filter_tags") + private List filterTags; + @NotNull @JsonIgnore private Map additionalFields = new HashMap<>(); @JsonAnyGetter @@ -289,6 +293,11 @@ public static class ChannelRequestObject { @JsonProperty("config_overrides") private ConfigOverridesRequestObject configOverrides; + @Singular + @Nullable + @JsonProperty("filter_tags") + private List filterTags; + @Singular @Nullable @JsonIgnore private Map additionalFields; @JsonAnyGetter @@ -315,6 +324,7 @@ private ChannelRequestObject( @Nullable List members, @Nullable List invites, @Nullable ConfigOverridesRequestObject configOverrides, + @Nullable List filterTags, Map additionalFields) { this.createdBy = createdBy; this.team = team; @@ -324,6 +334,7 @@ private ChannelRequestObject( this.members = members; this.invites = invites; this.configOverrides = configOverrides; + this.filterTags = filterTags; this.additionalFields = new HashMap(additionalFields); } } @@ -577,6 +588,18 @@ public static class ChannelUpdateRequestData { @JsonProperty("invites") private List invites; + // Singular is required because cannot be null + @Singular + @Nullable + @JsonProperty("add_filter_tags") + private List addFilterTags; + + // Singular is required because cannot be null + @Singular + @Nullable + @JsonProperty("remove_filter_tags") + private List removeFilterTags; + @Nullable @JsonProperty("cooldown") private Integer cooldown; diff --git a/src/test/java/io/getstream/chat/java/ChannelTest.java b/src/test/java/io/getstream/chat/java/ChannelTest.java index 8cff6063..d871b145 100644 --- a/src/test/java/io/getstream/chat/java/ChannelTest.java +++ b/src/test/java/io/getstream/chat/java/ChannelTest.java @@ -421,6 +421,116 @@ void whenUpdatingTeamWithPartialUpdate_thenIsUpdated() { Assertions.assertEquals(updatedTeam, updateChannel.getTeam()); } + @DisplayName("Can add filter tags to a channel") + @Test + void whenAddingFilterTags_thenHasFilterTags() { + // Create a fresh channel to not modify testChannel + ChannelGetResponse channelGetResponse = + Assertions.assertDoesNotThrow(() -> createRandomChannel()); + Channel channel = channelGetResponse.getChannel(); + + // Add filter tags + ChannelUpdateResponse channelUpdateResponse = + Assertions.assertDoesNotThrow( + () -> + Channel.update(channel.getType(), channel.getId()) + .user(testUserRequestObject) + .addFilterTag("tag1") + .addFilterTag("tag2") + .request()); + + Channel updatedChannel = channelUpdateResponse.getChannel(); + Assertions.assertNotNull(updatedChannel.getFilterTags()); + Assertions.assertEquals(2, updatedChannel.getFilterTags().size()); + Assertions.assertTrue(updatedChannel.getFilterTags().contains("tag1")); + Assertions.assertTrue(updatedChannel.getFilterTags().contains("tag2")); + } + + @DisplayName("Can remove filter tags from a channel") + @Test + void whenRemovingFilterTags_thenFilterTagsRemoved() { + // Create a channel and add filter tags via update + ChannelGetResponse channelGetResponse = + Assertions.assertDoesNotThrow(() -> createRandomChannel()); + Channel channel = channelGetResponse.getChannel(); + + // First add filter tags using update + ChannelUpdateResponse addResponse = + Assertions.assertDoesNotThrow( + () -> + Channel.update(channel.getType(), channel.getId()) + .user(testUserRequestObject) + .addFilterTag("tag1") + .addFilterTag("tag2") + .addFilterTag("tag3") + .request()); + + Channel channelWithTags = addResponse.getChannel(); + Assertions.assertNotNull(channelWithTags.getFilterTags()); + Assertions.assertEquals(3, channelWithTags.getFilterTags().size()); + + // Now remove some filter tags + ChannelUpdateResponse removeResponse = + Assertions.assertDoesNotThrow( + () -> + Channel.update(channel.getType(), channel.getId()) + .user(testUserRequestObject) + .removeFilterTag("tag1") + .removeFilterTag("tag2") + .request()); + + Channel updatedChannel = removeResponse.getChannel(); + Assertions.assertNotNull(updatedChannel.getFilterTags()); + Assertions.assertEquals(1, updatedChannel.getFilterTags().size()); + Assertions.assertTrue(updatedChannel.getFilterTags().contains("tag3")); + } + + @DisplayName("Can create channel with filter tags") + @Test + void whenCreatingChannelWithFilterTags_thenHasFilterTags() { + var channelReq = + ChannelRequestObject.builder() + .createdBy(testUserRequestObject) + .members(buildChannelMembersList()) + .filterTag("important") + .filterTag("urgent") + .build(); + var channelType = "messaging"; + var channelId = RandomStringUtils.randomAlphabetic(12); + + ChannelGetResponse channelGetResponse = + Assertions.assertDoesNotThrow( + () -> Channel.getOrCreate(channelType, channelId).data(channelReq).request()); + + Channel channel = channelGetResponse.getChannel(); + Assertions.assertNotNull(channel.getFilterTags()); + Assertions.assertEquals(2, channel.getFilterTags().size()); + Assertions.assertTrue(channel.getFilterTags().contains("important")); + Assertions.assertTrue(channel.getFilterTags().contains("urgent")); + } + + @DisplayName("Can set filter tags using partial update") + @Test + void whenSettingFilterTagsWithPartialUpdate_thenFilterTagsSet() { + // Create a fresh channel + Channel channel = Assertions.assertDoesNotThrow(() -> createRandomChannel()).getChannel(); + + // Set filter tags using partial update + Channel updatedChannel = + Assertions.assertDoesNotThrow( + () -> + Channel.partialUpdate(channel.getType(), channel.getId()) + .setValue("filter_tags", List.of("partial1", "partial2")) + .user(testUserRequestObject) + .request() + .getChannel()); + + Assertions.assertNotNull(updatedChannel.getFilterTags()); + Assertions.assertEquals(2, updatedChannel.getFilterTags().size()); + Assertions.assertTrue(updatedChannel.getFilterTags().contains("partial1")); + Assertions.assertTrue(updatedChannel.getFilterTags().contains("partial2")); + } + @DisplayName("Can assign roles") @Test void whenAssigningRole_throwsNoError() {