Skip to content

Commit 4f107dd

Browse files
feat: implemented the message reminders feature (#175)
* feat: implemented the message reminders feature * fixed failng specs * fixed linting issues * chore: fixed falky test
1 parent 5c415db commit 4f107dd

File tree

5 files changed

+519
-1
lines changed

5 files changed

+519
-1
lines changed

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -419,6 +419,10 @@ public static class ConfigOverridesRequestObject {
419419
@Nullable
420420
@JsonProperty("commands")
421421
private List<String> Commands;
422+
423+
@Nullable
424+
@JsonProperty("user_message_reminders")
425+
private Boolean userMessageReminders;
422426
}
423427

424428
@Builder
Lines changed: 267 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,267 @@
1+
package io.getstream.chat.java.models;
2+
3+
import com.fasterxml.jackson.annotation.JsonAnyGetter;
4+
import com.fasterxml.jackson.annotation.JsonAnySetter;
5+
import com.fasterxml.jackson.annotation.JsonIgnore;
6+
import com.fasterxml.jackson.annotation.JsonProperty;
7+
import io.getstream.chat.java.models.Reminder.ReminderCreateRequestData.ReminderCreateRequest;
8+
import io.getstream.chat.java.models.Reminder.ReminderQueryRequestData.ReminderQueryRequest;
9+
import io.getstream.chat.java.models.Reminder.ReminderUpdateRequestData.ReminderUpdateRequest;
10+
import io.getstream.chat.java.models.framework.StreamRequest;
11+
import io.getstream.chat.java.models.framework.StreamResponseObject;
12+
import io.getstream.chat.java.services.ReminderService;
13+
import io.getstream.chat.java.services.framework.Client;
14+
import java.util.Date;
15+
import java.util.HashMap;
16+
import java.util.List;
17+
import java.util.Map;
18+
import lombok.Builder;
19+
import lombok.Data;
20+
import lombok.EqualsAndHashCode;
21+
import lombok.NoArgsConstructor;
22+
import lombok.RequiredArgsConstructor;
23+
import lombok.Singular;
24+
import org.jetbrains.annotations.NotNull;
25+
import org.jetbrains.annotations.Nullable;
26+
import retrofit2.Call;
27+
28+
@Data
29+
@NoArgsConstructor
30+
public class Reminder {
31+
@NotNull
32+
@JsonProperty("id")
33+
private String id;
34+
35+
@NotNull
36+
@JsonProperty("message_id")
37+
private String messageId;
38+
39+
@Nullable
40+
@JsonProperty("message")
41+
private Message message;
42+
43+
@NotNull
44+
@JsonProperty("user_id")
45+
private String userId;
46+
47+
@Nullable
48+
@JsonProperty("user")
49+
private User user;
50+
51+
@NotNull
52+
@JsonProperty("channel_cid")
53+
private String channelCid;
54+
55+
@Nullable
56+
@JsonProperty("remind_at")
57+
private Date remindAt;
58+
59+
@Nullable
60+
@JsonProperty("created_at")
61+
private Date createdAt;
62+
63+
@Nullable
64+
@JsonProperty("updated_at")
65+
private Date updatedAt;
66+
67+
@NotNull @JsonIgnore private Map<String, Object> additionalFields = new HashMap<>();
68+
69+
@JsonAnyGetter
70+
public Map<String, Object> getAdditionalFields() {
71+
return additionalFields;
72+
}
73+
74+
@JsonAnySetter
75+
public void setAdditionalField(String name, Object value) {
76+
additionalFields.put(name, value);
77+
}
78+
79+
@Builder(
80+
builderClassName = "ReminderCreateRequest",
81+
builderMethodName = "",
82+
buildMethodName = "internalBuild")
83+
public static class ReminderCreateRequestData {
84+
@NotNull
85+
@JsonProperty("user_id")
86+
private String userId;
87+
88+
@Nullable
89+
@JsonProperty("remind_at")
90+
private Date remindAt;
91+
92+
public static class ReminderCreateRequest extends StreamRequest<ReminderCreateResponse> {
93+
@NotNull private String messageId;
94+
95+
private ReminderCreateRequest(@NotNull String messageId) {
96+
this.messageId = messageId;
97+
}
98+
99+
@Override
100+
protected Call<ReminderCreateResponse> generateCall(Client client) {
101+
return client.create(ReminderService.class).create(messageId, this.internalBuild());
102+
}
103+
}
104+
}
105+
106+
@Builder(
107+
builderClassName = "ReminderUpdateRequest",
108+
builderMethodName = "",
109+
buildMethodName = "internalBuild")
110+
public static class ReminderUpdateRequestData {
111+
@NotNull
112+
@JsonProperty("user_id")
113+
private String userId;
114+
115+
@Nullable
116+
@JsonProperty("remind_at")
117+
private Date remindAt;
118+
119+
public static class ReminderUpdateRequest extends StreamRequest<ReminderUpdateResponse> {
120+
@NotNull private String messageId;
121+
122+
private ReminderUpdateRequest(@NotNull String messageId) {
123+
this.messageId = messageId;
124+
}
125+
126+
@Override
127+
protected Call<ReminderUpdateResponse> generateCall(Client client) {
128+
return client.create(ReminderService.class).update(messageId, this.internalBuild());
129+
}
130+
}
131+
}
132+
133+
@RequiredArgsConstructor
134+
public static class ReminderDeleteRequest extends StreamRequest<ReminderDeleteResponse> {
135+
@NotNull private String messageId;
136+
@NotNull private String userId;
137+
138+
@Override
139+
protected Call<ReminderDeleteResponse> generateCall(Client client) {
140+
return client.create(ReminderService.class).delete(messageId, userId);
141+
}
142+
}
143+
144+
@Builder(
145+
builderClassName = "ReminderQueryRequest",
146+
builderMethodName = "",
147+
buildMethodName = "internalBuild")
148+
public static class ReminderQueryRequestData {
149+
@NotNull
150+
@JsonProperty("user_id")
151+
private String userId;
152+
153+
@Singular
154+
@Nullable
155+
@JsonProperty("filter_conditions")
156+
private Map<String, Object> filterConditions;
157+
158+
@Singular
159+
@Nullable
160+
@JsonProperty("sort")
161+
private List<Map<String, Object>> sorts;
162+
163+
@Nullable
164+
@JsonProperty("limit")
165+
private Integer limit;
166+
167+
@Nullable
168+
@JsonProperty("offset")
169+
private Integer offset;
170+
171+
public static class ReminderQueryRequest extends StreamRequest<ReminderQueryResponse> {
172+
@Override
173+
protected Call<ReminderQueryResponse> generateCall(Client client) {
174+
return client.create(ReminderService.class).query(this.internalBuild());
175+
}
176+
}
177+
}
178+
179+
@Data
180+
@NoArgsConstructor
181+
@EqualsAndHashCode(callSuper = true)
182+
public static class ReminderCreateResponse extends StreamResponseObject {
183+
@NotNull
184+
@JsonProperty("reminder")
185+
private Reminder reminder;
186+
}
187+
188+
@Data
189+
@NoArgsConstructor
190+
@EqualsAndHashCode(callSuper = true)
191+
public static class ReminderUpdateResponse extends StreamResponseObject {
192+
@NotNull
193+
@JsonProperty("reminder")
194+
private Reminder reminder;
195+
}
196+
197+
@Data
198+
@NoArgsConstructor
199+
@EqualsAndHashCode(callSuper = true)
200+
public static class ReminderDeleteResponse extends StreamResponseObject {
201+
@NotNull
202+
@JsonProperty("reminder")
203+
private Reminder reminder;
204+
}
205+
206+
@Data
207+
@NoArgsConstructor
208+
@EqualsAndHashCode(callSuper = true)
209+
public static class ReminderQueryResponse extends StreamResponseObject {
210+
@NotNull
211+
@JsonProperty("reminders")
212+
private List<Reminder> reminders;
213+
214+
@Nullable
215+
@JsonProperty("prev")
216+
private String prev;
217+
218+
@Nullable
219+
@JsonProperty("next")
220+
private String next;
221+
}
222+
223+
/**
224+
* Creates a reminder for a message.
225+
*
226+
* @param messageId The ID of the message to create a reminder for
227+
* @return A request builder for creating a reminder
228+
*/
229+
@NotNull
230+
public static ReminderCreateRequest createReminder(@NotNull String messageId) {
231+
return new ReminderCreateRequest(messageId);
232+
}
233+
234+
/**
235+
* Updates a reminder for a message.
236+
*
237+
* @param messageId The ID of the message with the reminder
238+
* @return A request builder for updating a reminder
239+
*/
240+
@NotNull
241+
public static ReminderUpdateRequest updateReminder(@NotNull String messageId) {
242+
return new ReminderUpdateRequest(messageId);
243+
}
244+
245+
/**
246+
* Deletes a reminder for a message.
247+
*
248+
* @param messageId The ID of the message with the reminder
249+
* @param userId The ID of the user who owns the reminder
250+
* @return A request for deleting a reminder
251+
*/
252+
@NotNull
253+
public static ReminderDeleteRequest deleteReminder(
254+
@NotNull String messageId, @NotNull String userId) {
255+
return new ReminderDeleteRequest(messageId, userId);
256+
}
257+
258+
/**
259+
* Queries reminders based on filter conditions.
260+
*
261+
* @return A request builder for querying reminders
262+
*/
263+
@NotNull
264+
public static ReminderQueryRequest queryReminders() {
265+
return new ReminderQueryRequest();
266+
}
267+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package io.getstream.chat.java.services;
2+
3+
import io.getstream.chat.java.models.Reminder.ReminderCreateRequestData;
4+
import io.getstream.chat.java.models.Reminder.ReminderCreateResponse;
5+
import io.getstream.chat.java.models.Reminder.ReminderDeleteResponse;
6+
import io.getstream.chat.java.models.Reminder.ReminderQueryRequestData;
7+
import io.getstream.chat.java.models.Reminder.ReminderQueryResponse;
8+
import io.getstream.chat.java.models.Reminder.ReminderUpdateRequestData;
9+
import io.getstream.chat.java.models.Reminder.ReminderUpdateResponse;
10+
import org.jetbrains.annotations.NotNull;
11+
import retrofit2.Call;
12+
import retrofit2.http.Body;
13+
import retrofit2.http.DELETE;
14+
import retrofit2.http.PATCH;
15+
import retrofit2.http.POST;
16+
import retrofit2.http.Path;
17+
import retrofit2.http.Query;
18+
19+
public interface ReminderService {
20+
@POST("messages/{id}/reminders")
21+
Call<ReminderCreateResponse> create(
22+
@NotNull @Path("id") String messageId,
23+
@NotNull @Body ReminderCreateRequestData reminderCreateRequestData);
24+
25+
@PATCH("messages/{id}/reminders")
26+
Call<ReminderUpdateResponse> update(
27+
@NotNull @Path("id") String messageId,
28+
@NotNull @Body ReminderUpdateRequestData reminderUpdateRequestData);
29+
30+
@DELETE("messages/{id}/reminders")
31+
Call<ReminderDeleteResponse> delete(
32+
@NotNull @Path("id") String messageId, @NotNull @Query("user_id") String userId);
33+
34+
@POST("reminders/query")
35+
Call<ReminderQueryResponse> query(
36+
@NotNull @Body ReminderQueryRequestData reminderQueryRequestData);
37+
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -545,7 +545,7 @@ void whenDeletingMessageWithDeletedBy_thenIsDeletedWithSpecifiedUser() {
545545
.getMessage();
546546
Assertions.assertNull(message.getDeletedAt());
547547

548-
String deletedByUserId = "test-deleted-by-user";
548+
String deletedByUserId = testUsersRequestObjects.get(1).getId();
549549
Message deletedMessage =
550550
Assertions.assertDoesNotThrow(
551551
() -> Message.delete(message.getId()).deletedBy(deletedByUserId).request())

0 commit comments

Comments
 (0)