Skip to content

Commit f6dc4d2

Browse files
authored
feat: add support for filter tags to channels (#215)
1 parent d5158cd commit f6dc4d2

File tree

3 files changed

+162
-0
lines changed

3 files changed

+162
-0
lines changed

DOCS.md

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -365,6 +365,19 @@ Channel.getOrCreate("messaging", "red-general")
365365
.request();
366366
```
367367

368+
Create a channel with filter tags
369+
370+
```java
371+
Channel.getOrCreate("messaging", "support-channel")
372+
.data(
373+
ChannelRequestObject.builder()
374+
.filterTag("important")
375+
.filterTag("urgent")
376+
.createdBy(UserRequestObject.builder().id("myuserid").build())
377+
.build())
378+
.request();
379+
```
380+
368381
**Get or create channel (type)**
369382

370383
```java
@@ -486,6 +499,12 @@ Remove overrides and go back to default settings
486499
Channel.partialUpdate(type, id).setValue("config_overrides", Collections.EMPTY_MAP).request();
487500
```
488501

502+
Set filter tags
503+
504+
```java
505+
Channel.partialUpdate(type, id).setValue("filter_tags", List.of("tag1", "tag2")).request();
506+
```
507+
489508
**Update channel**
490509
Full update (overwrite)
491510

@@ -539,6 +558,16 @@ Channel.update(type, id).addModerator("thierry").addModerator("josh").request();
539558
Channel.update(type, id).demoteModerator("tommaso").request();
540559
```
541560

561+
Add/remove filter tags
562+
563+
```java
564+
// Add filter tags to a channel
565+
Channel.update(type, id).addFilterTag("important").addFilterTag("urgent").request();
566+
567+
// Remove filter tags from a channel
568+
Channel.update(type, id).removeFilterTag("urgent").request();
569+
```
570+
542571
Inviting users
543572

544573
```java

src/main/java/io/getstream/chat/java/models/Channel.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,10 @@ public class Channel {
113113
@JsonProperty("truncated_by")
114114
private User truncatedBy;
115115

116+
@Nullable
117+
@JsonProperty("filter_tags")
118+
private List<String> filterTags;
119+
116120
@NotNull @JsonIgnore private Map<String, Object> additionalFields = new HashMap<>();
117121

118122
@JsonAnyGetter
@@ -289,6 +293,11 @@ public static class ChannelRequestObject {
289293
@JsonProperty("config_overrides")
290294
private ConfigOverridesRequestObject configOverrides;
291295

296+
@Singular
297+
@Nullable
298+
@JsonProperty("filter_tags")
299+
private List<String> filterTags;
300+
292301
@Singular @Nullable @JsonIgnore private Map<String, Object> additionalFields;
293302

294303
@JsonAnyGetter
@@ -315,6 +324,7 @@ private ChannelRequestObject(
315324
@Nullable List<ChannelMemberRequestObject> members,
316325
@Nullable List<ChannelMemberRequestObject> invites,
317326
@Nullable ConfigOverridesRequestObject configOverrides,
327+
@Nullable List<String> filterTags,
318328
Map<String, Object> additionalFields) {
319329
this.createdBy = createdBy;
320330
this.team = team;
@@ -324,6 +334,7 @@ private ChannelRequestObject(
324334
this.members = members;
325335
this.invites = invites;
326336
this.configOverrides = configOverrides;
337+
this.filterTags = filterTags;
327338
this.additionalFields = new HashMap<String, Object>(additionalFields);
328339
}
329340
}
@@ -577,6 +588,18 @@ public static class ChannelUpdateRequestData {
577588
@JsonProperty("invites")
578589
private List<String> invites;
579590

591+
// Singular is required because cannot be null
592+
@Singular
593+
@Nullable
594+
@JsonProperty("add_filter_tags")
595+
private List<String> addFilterTags;
596+
597+
// Singular is required because cannot be null
598+
@Singular
599+
@Nullable
600+
@JsonProperty("remove_filter_tags")
601+
private List<String> removeFilterTags;
602+
580603
@Nullable
581604
@JsonProperty("cooldown")
582605
private Integer cooldown;

src/test/java/io/getstream/chat/java/ChannelTest.java

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -421,6 +421,116 @@ void whenUpdatingTeamWithPartialUpdate_thenIsUpdated() {
421421
Assertions.assertEquals(updatedTeam, updateChannel.getTeam());
422422
}
423423

424+
@DisplayName("Can add filter tags to a channel")
425+
@Test
426+
void whenAddingFilterTags_thenHasFilterTags() {
427+
// Create a fresh channel to not modify testChannel
428+
ChannelGetResponse channelGetResponse =
429+
Assertions.assertDoesNotThrow(() -> createRandomChannel());
430+
Channel channel = channelGetResponse.getChannel();
431+
432+
// Add filter tags
433+
ChannelUpdateResponse channelUpdateResponse =
434+
Assertions.assertDoesNotThrow(
435+
() ->
436+
Channel.update(channel.getType(), channel.getId())
437+
.user(testUserRequestObject)
438+
.addFilterTag("tag1")
439+
.addFilterTag("tag2")
440+
.request());
441+
442+
Channel updatedChannel = channelUpdateResponse.getChannel();
443+
Assertions.assertNotNull(updatedChannel.getFilterTags());
444+
Assertions.assertEquals(2, updatedChannel.getFilterTags().size());
445+
Assertions.assertTrue(updatedChannel.getFilterTags().contains("tag1"));
446+
Assertions.assertTrue(updatedChannel.getFilterTags().contains("tag2"));
447+
}
448+
449+
@DisplayName("Can remove filter tags from a channel")
450+
@Test
451+
void whenRemovingFilterTags_thenFilterTagsRemoved() {
452+
// Create a channel and add filter tags via update
453+
ChannelGetResponse channelGetResponse =
454+
Assertions.assertDoesNotThrow(() -> createRandomChannel());
455+
Channel channel = channelGetResponse.getChannel();
456+
457+
// First add filter tags using update
458+
ChannelUpdateResponse addResponse =
459+
Assertions.assertDoesNotThrow(
460+
() ->
461+
Channel.update(channel.getType(), channel.getId())
462+
.user(testUserRequestObject)
463+
.addFilterTag("tag1")
464+
.addFilterTag("tag2")
465+
.addFilterTag("tag3")
466+
.request());
467+
468+
Channel channelWithTags = addResponse.getChannel();
469+
Assertions.assertNotNull(channelWithTags.getFilterTags());
470+
Assertions.assertEquals(3, channelWithTags.getFilterTags().size());
471+
472+
// Now remove some filter tags
473+
ChannelUpdateResponse removeResponse =
474+
Assertions.assertDoesNotThrow(
475+
() ->
476+
Channel.update(channel.getType(), channel.getId())
477+
.user(testUserRequestObject)
478+
.removeFilterTag("tag1")
479+
.removeFilterTag("tag2")
480+
.request());
481+
482+
Channel updatedChannel = removeResponse.getChannel();
483+
Assertions.assertNotNull(updatedChannel.getFilterTags());
484+
Assertions.assertEquals(1, updatedChannel.getFilterTags().size());
485+
Assertions.assertTrue(updatedChannel.getFilterTags().contains("tag3"));
486+
}
487+
488+
@DisplayName("Can create channel with filter tags")
489+
@Test
490+
void whenCreatingChannelWithFilterTags_thenHasFilterTags() {
491+
var channelReq =
492+
ChannelRequestObject.builder()
493+
.createdBy(testUserRequestObject)
494+
.members(buildChannelMembersList())
495+
.filterTag("important")
496+
.filterTag("urgent")
497+
.build();
498+
var channelType = "messaging";
499+
var channelId = RandomStringUtils.randomAlphabetic(12);
500+
501+
ChannelGetResponse channelGetResponse =
502+
Assertions.assertDoesNotThrow(
503+
() -> Channel.getOrCreate(channelType, channelId).data(channelReq).request());
504+
505+
Channel channel = channelGetResponse.getChannel();
506+
Assertions.assertNotNull(channel.getFilterTags());
507+
Assertions.assertEquals(2, channel.getFilterTags().size());
508+
Assertions.assertTrue(channel.getFilterTags().contains("important"));
509+
Assertions.assertTrue(channel.getFilterTags().contains("urgent"));
510+
}
511+
512+
@DisplayName("Can set filter tags using partial update")
513+
@Test
514+
void whenSettingFilterTagsWithPartialUpdate_thenFilterTagsSet() {
515+
// Create a fresh channel
516+
Channel channel = Assertions.assertDoesNotThrow(() -> createRandomChannel()).getChannel();
517+
518+
// Set filter tags using partial update
519+
Channel updatedChannel =
520+
Assertions.assertDoesNotThrow(
521+
() ->
522+
Channel.partialUpdate(channel.getType(), channel.getId())
523+
.setValue("filter_tags", List.of("partial1", "partial2"))
524+
.user(testUserRequestObject)
525+
.request()
526+
.getChannel());
527+
528+
Assertions.assertNotNull(updatedChannel.getFilterTags());
529+
Assertions.assertEquals(2, updatedChannel.getFilterTags().size());
530+
Assertions.assertTrue(updatedChannel.getFilterTags().contains("partial1"));
531+
Assertions.assertTrue(updatedChannel.getFilterTags().contains("partial2"));
532+
}
533+
424534
@DisplayName("Can assign roles")
425535
@Test
426536
void whenAssigningRole_throwsNoError() {

0 commit comments

Comments
 (0)