Skip to content

Commit dd72053

Browse files
author
Rafael Marinho
committed
feat[CHA-1223]: support delivery receipts
1 parent c4d394d commit dd72053

File tree

4 files changed

+244
-0
lines changed

4 files changed

+244
-0
lines changed
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package io.getstream.chat.java.models;
2+
3+
import com.fasterxml.jackson.annotation.JsonProperty;
4+
import lombok.*;
5+
import org.jetbrains.annotations.NotNull;
6+
import org.jetbrains.annotations.Nullable;
7+
8+
@Data
9+
@NoArgsConstructor
10+
public class DeliveredMessageConfirmation {
11+
@NotNull
12+
@JsonProperty("cid")
13+
private String cid;
14+
15+
@NotNull
16+
@JsonProperty("id")
17+
private String id;
18+
19+
@Nullable
20+
@JsonProperty("parent_id")
21+
private String parentId;
22+
}
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
package io.getstream.chat.java.models;
2+
3+
import com.fasterxml.jackson.annotation.JsonProperty;
4+
import io.getstream.chat.java.models.framework.StreamRequest;
5+
import io.getstream.chat.java.models.framework.StreamResponseObject;
6+
import io.getstream.chat.java.services.ChannelService;
7+
import io.getstream.chat.java.services.framework.Client;
8+
import java.util.List;
9+
import lombok.*;
10+
import org.jetbrains.annotations.NotNull;
11+
import org.jetbrains.annotations.Nullable;
12+
import retrofit2.Call;
13+
14+
@Data
15+
@NoArgsConstructor
16+
public class MarkDeliveredOptions {
17+
@NotNull
18+
@JsonProperty("latest_delivered_messages")
19+
private List<DeliveredMessageConfirmation> latestDeliveredMessages;
20+
21+
@Nullable
22+
@JsonProperty("user")
23+
private User user;
24+
25+
@Nullable
26+
@JsonProperty("user_id")
27+
private String userId;
28+
29+
@Data
30+
@NoArgsConstructor
31+
@EqualsAndHashCode(callSuper = true)
32+
public static class MarkDeliveredResponse extends StreamResponseObject {}
33+
34+
public static class MarkDeliveredRequest extends StreamRequest<MarkDeliveredResponse> {
35+
private MarkDeliveredOptions options;
36+
37+
public MarkDeliveredRequest() {}
38+
39+
public MarkDeliveredRequest(MarkDeliveredOptions options) {
40+
this.options = options;
41+
}
42+
43+
public MarkDeliveredRequest options(MarkDeliveredOptions options) {
44+
this.options = options;
45+
return this;
46+
}
47+
48+
@Override
49+
protected Call<MarkDeliveredResponse> generateCall(Client client) {
50+
return client.create(ChannelService.class).markChannelsDelivered(options);
51+
}
52+
}
53+
54+
/**
55+
* Creates a mark channels delivered request
56+
*
57+
* @return the created request
58+
*/
59+
@NotNull
60+
public static MarkDeliveredRequest markChannelsDelivered() {
61+
return new MarkDeliveredRequest();
62+
}
63+
64+
/**
65+
* Creates a mark channels delivered request with options
66+
*
67+
* @param options the mark delivered options
68+
* @return the created request
69+
*/
70+
@NotNull
71+
public static MarkDeliveredRequest markChannelsDelivered(MarkDeliveredOptions options) {
72+
return new MarkDeliveredRequest(options);
73+
}
74+
75+
/**
76+
* Creates a mark channels delivered request with a list of delivered message confirmations
77+
*
78+
* @param latestDeliveredMessages the list of delivered message confirmations
79+
* @return the created request
80+
*/
81+
@NotNull
82+
public static MarkDeliveredRequest markChannelsDelivered(
83+
List<DeliveredMessageConfirmation> latestDeliveredMessages) {
84+
MarkDeliveredOptions options = new MarkDeliveredOptions();
85+
options.setLatestDeliveredMessages(latestDeliveredMessages);
86+
return new MarkDeliveredRequest(options);
87+
}
88+
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import io.getstream.chat.java.models.Channel;
44
import io.getstream.chat.java.models.Channel.*;
5+
import io.getstream.chat.java.models.MarkDeliveredOptions;
56
import io.getstream.chat.java.models.framework.StreamResponseObject;
67
import io.getstream.chat.java.services.framework.ToJson;
78
import org.jetbrains.annotations.NotNull;
@@ -103,4 +104,8 @@ Call<ChannelMemberResponse> updateMemberPartial(
103104
@NotNull @Path("id") String channelId,
104105
@NotNull @Path("user_id") String userId,
105106
@NotNull @Body ChannelMemberPartialUpdateRequestData updateMemberPartialRequestData);
107+
108+
@POST("channels/delivered")
109+
Call<MarkDeliveredOptions.MarkDeliveredResponse> markChannelsDelivered(
110+
@NotNull @Body MarkDeliveredOptions markDeliveredOptions);
106111
}
Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
package io.getstream.chat.java;
2+
3+
import io.getstream.chat.java.exceptions.StreamException;
4+
import io.getstream.chat.java.models.DeliveredMessageConfirmation;
5+
import io.getstream.chat.java.models.MarkDeliveredOptions;
6+
import io.getstream.chat.java.models.Message;
7+
import io.getstream.chat.java.models.Message.MessageRequestObject;
8+
import io.getstream.chat.java.models.Message.MessageType;
9+
import java.util.Arrays;
10+
import java.util.List;
11+
import org.junit.jupiter.api.Assertions;
12+
import org.junit.jupiter.api.DisplayName;
13+
import org.junit.jupiter.api.Test;
14+
15+
/** Tests for the delivery receipts functionality. */
16+
public class DeliveryReceiptsTest extends BasicTest {
17+
18+
@DisplayName("Can mark channels as delivered")
19+
@Test
20+
void whenMarkingChannelsDelivered_thenNoException() throws StreamException {
21+
// Send a test message first
22+
MessageRequestObject messageRequest =
23+
MessageRequestObject.builder()
24+
.text("Test message for delivery receipts")
25+
.userId(testUserRequestObject.getId())
26+
.type(MessageType.REGULAR)
27+
.build();
28+
29+
Message message =
30+
Message.send(testChannel.getType(), testChannel.getId())
31+
.message(messageRequest)
32+
.request()
33+
.getMessage();
34+
35+
// Create delivered message confirmation
36+
DeliveredMessageConfirmation confirmation = new DeliveredMessageConfirmation();
37+
confirmation.setCid(testChannel.getCId());
38+
confirmation.setId(message.getId());
39+
40+
// Mark channels as delivered
41+
MarkDeliveredOptions.MarkDeliveredResponse response =
42+
MarkDeliveredOptions.markChannelsDelivered(Arrays.asList(confirmation)).request();
43+
44+
// Verify response is not null (successful call)
45+
Assertions.assertNotNull(response);
46+
}
47+
48+
@DisplayName("Can mark channels as delivered with options")
49+
@Test
50+
void whenMarkingChannelsDeliveredWithOptions_thenNoException() throws StreamException {
51+
// Send a test message first
52+
MessageRequestObject messageRequest =
53+
MessageRequestObject.builder()
54+
.text("Test message for delivery receipts with options")
55+
.userId(testUserRequestObject.getId())
56+
.type(MessageType.REGULAR)
57+
.build();
58+
59+
Message message =
60+
Message.send(testChannel.getType(), testChannel.getId())
61+
.message(messageRequest)
62+
.request()
63+
.getMessage();
64+
65+
// Create delivered message confirmation
66+
DeliveredMessageConfirmation confirmation = new DeliveredMessageConfirmation();
67+
confirmation.setCid(testChannel.getCId());
68+
confirmation.setId(message.getId());
69+
70+
// Create mark delivered options
71+
MarkDeliveredOptions options = new MarkDeliveredOptions();
72+
options.setLatestDeliveredMessages(Arrays.asList(confirmation));
73+
options.setUserId(testUserRequestObject.getId());
74+
75+
// Mark channels as delivered
76+
MarkDeliveredOptions.MarkDeliveredResponse response =
77+
MarkDeliveredOptions.markChannelsDelivered(options).request();
78+
79+
// Verify response is not null (successful call)
80+
Assertions.assertNotNull(response);
81+
}
82+
83+
@DisplayName("Can mark channels as delivered with multiple messages")
84+
@Test
85+
void whenMarkingChannelsDeliveredWithMultipleMessages_thenNoException() throws StreamException {
86+
// Send multiple test messages
87+
List<Message> messages =
88+
Arrays.asList(
89+
Message.send(testChannel.getType(), testChannel.getId())
90+
.message(
91+
MessageRequestObject.builder()
92+
.text("Test message 1")
93+
.userId(testUserRequestObject.getId())
94+
.type(MessageType.REGULAR)
95+
.build())
96+
.request()
97+
.getMessage(),
98+
Message.send(testChannel.getType(), testChannel.getId())
99+
.message(
100+
MessageRequestObject.builder()
101+
.text("Test message 2")
102+
.userId(testUserRequestObject.getId())
103+
.type(MessageType.REGULAR)
104+
.build())
105+
.request()
106+
.getMessage());
107+
108+
// Create delivered message confirmations
109+
List<DeliveredMessageConfirmation> confirmations =
110+
Arrays.asList(
111+
createConfirmation(testChannel.getCId(), messages.get(0).getId()),
112+
createConfirmation(testChannel.getCId(), messages.get(1).getId()));
113+
114+
// Mark channels as delivered
115+
MarkDeliveredOptions.MarkDeliveredResponse response =
116+
MarkDeliveredOptions.markChannelsDelivered(confirmations).request();
117+
118+
// Verify response is not null (successful call)
119+
Assertions.assertNotNull(response);
120+
}
121+
122+
private DeliveredMessageConfirmation createConfirmation(String cid, String messageId) {
123+
DeliveredMessageConfirmation confirmation = new DeliveredMessageConfirmation();
124+
confirmation.setCid(cid);
125+
confirmation.setId(messageId);
126+
return confirmation;
127+
}
128+
}
129+

0 commit comments

Comments
 (0)