Skip to content

Commit 38c7348

Browse files
authored
feat: member custom data, pinning and archiving (#162)
1 parent 570548b commit 38c7348

File tree

3 files changed

+294
-0
lines changed

3 files changed

+294
-0
lines changed

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

Lines changed: 171 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import io.getstream.chat.java.models.Channel.ChannelListRequestData.ChannelListRequest;
1010
import io.getstream.chat.java.models.Channel.ChannelMarkAllReadRequestData.ChannelMarkAllReadRequest;
1111
import io.getstream.chat.java.models.Channel.ChannelMarkReadRequestData.ChannelMarkReadRequest;
12+
import io.getstream.chat.java.models.Channel.ChannelMemberPartialUpdateRequestData.ChannelMemberPartialUpdateRequest;
1213
import io.getstream.chat.java.models.Channel.ChannelMuteRequestData.ChannelMuteRequest;
1314
import io.getstream.chat.java.models.Channel.ChannelPartialUpdateRequestData.ChannelPartialUpdateRequest;
1415
import io.getstream.chat.java.models.Channel.ChannelQueryMembersRequestData.ChannelQueryMembersRequest;
@@ -138,6 +139,17 @@ public static class ChannelRead {
138139
@Data
139140
@NoArgsConstructor
140141
public static class ChannelMember {
142+
public enum InviteStatus {
143+
@JsonProperty("pending")
144+
PENDING,
145+
@JsonProperty("accepted")
146+
ACCEPTED,
147+
@JsonProperty("rejected")
148+
REJECTED,
149+
@JsonEnumDefaultValue
150+
UNKNOWN
151+
}
152+
141153
@Nullable
142154
@JsonProperty("user_id")
143155
private String userId;
@@ -193,6 +205,30 @@ public static class ChannelMember {
193205
@Nullable
194206
@JsonProperty("notifications_muted")
195207
private Boolean notificationsMuted;
208+
209+
@Nullable
210+
@JsonProperty("status")
211+
private InviteStatus status;
212+
213+
@Nullable
214+
@JsonProperty("archived_at")
215+
private Date archivedAt;
216+
217+
@Nullable
218+
@JsonProperty("pinned_at")
219+
private Date pinnedAt;
220+
221+
@Singular @Nullable @JsonIgnore private Map<String, Object> additionalFields = new HashMap<>();
222+
223+
@JsonAnyGetter
224+
public Map<String, Object> getAdditionalFields() {
225+
return this.additionalFields;
226+
}
227+
228+
@JsonAnySetter
229+
public void setAdditionalField(String name, Object value) {
230+
this.additionalFields.put(name, value);
231+
}
196232
}
197233

198234
@Data
@@ -1097,6 +1133,54 @@ protected Call<ChannelPartialUpdateResponse> generateCall(Client client) {
10971133
}
10981134
}
10991135

1136+
@Builder(
1137+
builderClassName = "ChannelMemberPartialUpdateRequest",
1138+
builderMethodName = "",
1139+
buildMethodName = "internalBuild")
1140+
public static class ChannelMemberPartialUpdateRequestData {
1141+
@Singular
1142+
@Nullable
1143+
@JsonProperty("set")
1144+
private Map<String, Object> setValues;
1145+
1146+
@Singular
1147+
@Nullable
1148+
@JsonProperty("unset")
1149+
private List<String> unsetValues;
1150+
1151+
public static class ChannelMemberPartialUpdateRequest
1152+
extends StreamRequest<ChannelMemberResponse> {
1153+
@NotNull private String channelType;
1154+
1155+
@NotNull private String channelId;
1156+
1157+
@NotNull private String userId;
1158+
1159+
private ChannelMemberPartialUpdateRequest(
1160+
@NotNull String channelType, @NotNull String channelId, @NotNull String userId) {
1161+
this.channelType = channelType;
1162+
this.channelId = channelId;
1163+
this.userId = userId;
1164+
}
1165+
1166+
@Override
1167+
protected Call<ChannelMemberResponse> generateCall(Client client) {
1168+
return client
1169+
.create(ChannelService.class)
1170+
.updateMemberPartial(channelType, channelId, userId, this.internalBuild());
1171+
}
1172+
}
1173+
}
1174+
1175+
@Data
1176+
@NoArgsConstructor
1177+
@EqualsAndHashCode(callSuper = true)
1178+
public static class ChannelMemberResponse extends StreamResponseObject {
1179+
@Nullable
1180+
@JsonProperty("channel_member")
1181+
private ChannelMember member;
1182+
}
1183+
11001184
@Data
11011185
@NoArgsConstructor
11021186
@EqualsAndHashCode(callSuper = true)
@@ -1344,6 +1428,23 @@ public static class ChannelUnMuteResponse extends StreamResponseObject {
13441428
private OwnUser ownUser;
13451429
}
13461430

1431+
@Data
1432+
@NoArgsConstructor
1433+
@EqualsAndHashCode(callSuper = true)
1434+
public static class ChannelPinResponse extends StreamResponseObject {
1435+
@Nullable
1436+
@JsonProperty("channel_mute")
1437+
private ChannelMute channelMute;
1438+
1439+
@Nullable
1440+
@JsonProperty("channel_mutes")
1441+
private List<ChannelMute> channelMutes;
1442+
1443+
@Nullable
1444+
@JsonProperty("own_user")
1445+
private OwnUser ownUser;
1446+
}
1447+
13471448
@Data
13481449
@NoArgsConstructor
13491450
@EqualsAndHashCode(callSuper = true)
@@ -1552,4 +1653,74 @@ public static ChannelPartialUpdateRequest partialUpdate(
15521653
public static AssignRoleRequest assignRoles(@NotNull String type, @NotNull String id) {
15531654
return new AssignRoleRequest(type, id);
15541655
}
1656+
1657+
/**
1658+
* Creates a update member partial request
1659+
*
1660+
* @param type the channel type
1661+
* @param id the channel id
1662+
* @param userId the user id
1663+
* @return the created request
1664+
*/
1665+
@NotNull
1666+
public static ChannelMemberPartialUpdateRequest updateMemberPartial(
1667+
@NotNull String type, @NotNull String id, @NotNull String userId) {
1668+
return new ChannelMemberPartialUpdateRequest(type, id, userId);
1669+
}
1670+
1671+
/**
1672+
* Creates a pin channel request
1673+
*
1674+
* @param type the channel type
1675+
* @param id the channel id
1676+
* @param userId the user id
1677+
* @return the created request
1678+
*/
1679+
@NotNull
1680+
public static ChannelMemberPartialUpdateRequest pin(
1681+
@NotNull String type, @NotNull String id, @NotNull String userId) {
1682+
return new ChannelMemberPartialUpdateRequest(type, id, userId).setValue("pinned", true);
1683+
}
1684+
1685+
/**
1686+
* Creates a unpin channel request
1687+
*
1688+
* @param type the channel type
1689+
* @param id the channel id
1690+
* @param userId the user id
1691+
* @return the created request
1692+
*/
1693+
@NotNull
1694+
public static ChannelMemberPartialUpdateRequest unpin(
1695+
@NotNull String type, @NotNull String id, @NotNull String userId) {
1696+
return new ChannelMemberPartialUpdateRequest(type, id, userId).setValue("pinned", false);
1697+
}
1698+
1699+
/**
1700+
* Creates a archive channel request
1701+
*
1702+
* @param type the channel type
1703+
* @param id the channel id
1704+
* @param userId the user id
1705+
* @return the created request
1706+
*/
1707+
@NotNull
1708+
public static ChannelMemberPartialUpdateRequest archive(
1709+
@NotNull String type, @NotNull String id, @NotNull String userId) {
1710+
return new ChannelMemberPartialUpdateRequest(type, id, userId).setValue("archived", true);
1711+
}
1712+
1713+
/**
1714+
* Creates a unarchive channel request
1715+
*
1716+
* @param type the channel type
1717+
* @param id the channel id
1718+
* @param userId the user id
1719+
* @return the created request
1720+
*/
1721+
@NotNull
1722+
public static ChannelMemberPartialUpdateRequest unarchive(
1723+
@NotNull String type, @NotNull String id, @NotNull String userId) {
1724+
return new ChannelMemberPartialUpdateRequest(type, id, userId).setValue("archived", false);
1725+
}
15551726
}

src/main/java/io/getstream/chat/java/services/ChannelService.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,4 +96,11 @@ Call<ChannelUpdateResponse> assignRoles(
9696
@NotNull @Path("type") String channelType,
9797
@NotNull @Path("id") String channelId,
9898
@NotNull @Body AssignRoleRequestData assignRoleRequestData);
99+
100+
@PATCH("channels/{type}/{id}/member/{user_id}")
101+
Call<ChannelMemberResponse> updateMemberPartial(
102+
@NotNull @Path("type") String channelType,
103+
@NotNull @Path("id") String channelId,
104+
@NotNull @Path("user_id") String userId,
105+
@NotNull @Body ChannelMemberPartialUpdateRequestData updateMemberPartialRequestData);
99106
}

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

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -431,4 +431,120 @@ void whenAssigningRole_throwsNoError() {
431431
.assignRole(assignment)
432432
.request());
433433
}
434+
435+
@DisplayName("Can update a channel member partially")
436+
@Test
437+
void whenUpdatingChannelMemberPartially_thenIsUpdated() {
438+
// We should not use testChannel to not modify it
439+
Channel channel = Assertions.assertDoesNotThrow(() -> createRandomChannel()).getChannel();
440+
ChannelMemberResponse channelMemberResponse =
441+
Assertions.assertDoesNotThrow(
442+
() ->
443+
Channel.updateMemberPartial(
444+
channel.getType(), channel.getId(), testUserRequestObject.getId())
445+
.setValue("custom_key", "custom_value")
446+
.setValue("channel_role", "channel_moderator")
447+
.request());
448+
449+
System.out.println(channelMemberResponse.getMember());
450+
Assertions.assertEquals(
451+
"custom_value", channelMemberResponse.getMember().getAdditionalFields().get("custom_key"));
452+
Assertions.assertEquals(
453+
"channel_moderator", channelMemberResponse.getMember().getChannelRole());
454+
455+
// unset
456+
channelMemberResponse =
457+
Assertions.assertDoesNotThrow(
458+
() ->
459+
Channel.updateMemberPartial(
460+
channel.getType(), channel.getId(), testUserRequestObject.getId())
461+
.unsetValue("custom_key")
462+
.request());
463+
464+
Assertions.assertNull(
465+
channelMemberResponse.getMember().getAdditionalFields().get("custom_key"));
466+
}
467+
468+
@DisplayName("Can pin and unpin a channel")
469+
@Test
470+
void whenPinningAndUnpinningAChannel_thenIsPinnedAndUnpinned() {
471+
Channel channel = Assertions.assertDoesNotThrow(() -> createRandomChannel()).getChannel();
472+
ChannelMemberResponse channelMemberResponse =
473+
Assertions.assertDoesNotThrow(
474+
() ->
475+
Channel.pin(channel.getType(), channel.getId(), testUserRequestObject.getId())
476+
.request());
477+
Date pinnedAt = channelMemberResponse.getMember().getPinnedAt();
478+
Assertions.assertNotNull(pinnedAt);
479+
480+
channelMemberResponse =
481+
Assertions.assertDoesNotThrow(
482+
() ->
483+
Channel.unpin(channel.getType(), channel.getId(), testUserRequestObject.getId())
484+
.request());
485+
Assertions.assertNull(channelMemberResponse.getMember().getPinnedAt());
486+
}
487+
488+
@DisplayName("Can pin and unpin a channel using unset")
489+
@Test
490+
void whenPinningAndUnpinningAChannelUsingUnset_thenIsPinnedAndUnpinned() {
491+
Channel channel = Assertions.assertDoesNotThrow(() -> createRandomChannel()).getChannel();
492+
ChannelMemberResponse channelMemberResponse =
493+
Assertions.assertDoesNotThrow(
494+
() ->
495+
Channel.pin(channel.getType(), channel.getId(), testUserRequestObject.getId())
496+
.request());
497+
System.out.println(channelMemberResponse.getMember());
498+
System.out.println(channelMemberResponse.getMember().getPinnedAt());
499+
Assertions.assertNotNull(channelMemberResponse.getMember().getPinnedAt());
500+
501+
channelMemberResponse =
502+
Assertions.assertDoesNotThrow(
503+
() ->
504+
Channel.updateMemberPartial(
505+
channel.getType(), channel.getId(), testUserRequestObject.getId())
506+
.unsetValue("pinned")
507+
.request());
508+
Assertions.assertNull(channelMemberResponse.getMember().getPinnedAt());
509+
}
510+
511+
@DisplayName("Can archive and unarchive a channel")
512+
@Test
513+
void whenArchivingChannel_thenIsArchived() {
514+
Channel channel = Assertions.assertDoesNotThrow(() -> createRandomChannel()).getChannel();
515+
ChannelMemberResponse channelMemberResponse =
516+
Assertions.assertDoesNotThrow(
517+
() ->
518+
Channel.archive(channel.getType(), channel.getId(), testUserRequestObject.getId())
519+
.request());
520+
Assertions.assertNotNull(channelMemberResponse.getMember().getArchivedAt());
521+
522+
channelMemberResponse =
523+
Assertions.assertDoesNotThrow(
524+
() ->
525+
Channel.unarchive(channel.getType(), channel.getId(), testUserRequestObject.getId())
526+
.request());
527+
Assertions.assertNull(channelMemberResponse.getMember().getArchivedAt());
528+
}
529+
530+
@DisplayName("Can archive and unarchive a channel using unset")
531+
@Test
532+
void whenArchivingChannelUsingUnset_thenIsArchived() {
533+
Channel channel = Assertions.assertDoesNotThrow(() -> createRandomChannel()).getChannel();
534+
ChannelMemberResponse channelMemberResponse =
535+
Assertions.assertDoesNotThrow(
536+
() ->
537+
Channel.archive(channel.getType(), channel.getId(), testUserRequestObject.getId())
538+
.request());
539+
Assertions.assertNotNull(channelMemberResponse.getMember().getArchivedAt());
540+
541+
channelMemberResponse =
542+
Assertions.assertDoesNotThrow(
543+
() ->
544+
Channel.updateMemberPartial(
545+
channel.getType(), channel.getId(), testUserRequestObject.getId())
546+
.unsetValue("archived")
547+
.request());
548+
Assertions.assertNull(channelMemberResponse.getMember().getArchivedAt());
549+
}
434550
}

0 commit comments

Comments
 (0)