From 59eb3408c545d49e3fbaa11035b21caabe5eabcc Mon Sep 17 00:00:00 2001 From: Daksh Date: Mon, 1 Sep 2025 11:06:55 +0200 Subject: [PATCH 1/5] add fields and tests --- DOCS.md | 7 ++ .../getstream/chat/java/models/Message.java | 33 ++++++++- .../chat/java/services/MessageService.java | 3 +- .../io/getstream/chat/java/MessageTest.java | 69 +++++++++++++++++++ 4 files changed, 110 insertions(+), 2 deletions(-) diff --git a/DOCS.md b/DOCS.md index 8a3166a56..72f0de253 100644 --- a/DOCS.md +++ b/DOCS.md @@ -1214,6 +1214,13 @@ Message.delete(messageId).deletedBy(userId).request(); // combine parameters Message.delete(messageId).hard(true).deletedBy(userId).request(); + +// delete for me only (message is only deleted for the specified user) +Message.delete(messageId).deleteForMe(true).deletedBy(userId).request(); + +// convenience methods +Message.hardDelete(messageId).request(); +Message.deleteForMe(messageId, userId).request(); ``` **Upload file or image** diff --git a/src/main/java/io/getstream/chat/java/models/Message.java b/src/main/java/io/getstream/chat/java/models/Message.java index 7b4f19ac3..8a0b2d678 100644 --- a/src/main/java/io/getstream/chat/java/models/Message.java +++ b/src/main/java/io/getstream/chat/java/models/Message.java @@ -810,6 +810,8 @@ public static class MessageDeleteRequest extends StreamRequest generateCall(Client client) { - return client.create(MessageService.class).delete(this.id, this.hard, this.deletedBy); + return client.create(MessageService.class).delete(this.id, this.hard, this.deletedBy, this.deleteForMe); } } @@ -1477,6 +1485,29 @@ public static MessageDeleteRequest delete(@NotNull String id) { return new MessageDeleteRequest(id); } + /** + * Creates a hard delete request + * + * @param id the message id + * @return the created request + */ + @NotNull + public static MessageDeleteRequest hardDelete(@NotNull String id) { + return new MessageDeleteRequest(id).hard(true); + } + + /** + * Creates a delete for me request + * + * @param id the message id + * @param userId the user id for whom the message should be deleted + * @return the created request + */ + @NotNull + public static MessageDeleteRequest deleteForMe(@NotNull String id, @NotNull String userId) { + return new MessageDeleteRequest(id).deleteForMe(true).deletedBy(userId); + } + /** * Creates a search request * diff --git a/src/main/java/io/getstream/chat/java/services/MessageService.java b/src/main/java/io/getstream/chat/java/services/MessageService.java index e8550c23b..d2ea3acf8 100644 --- a/src/main/java/io/getstream/chat/java/services/MessageService.java +++ b/src/main/java/io/getstream/chat/java/services/MessageService.java @@ -93,7 +93,8 @@ Call deleteImage( Call delete( @NotNull @Path("id") String id, @Nullable @Query("hard") Boolean hard, - @Nullable @Query("deleted_by") String deletedBy); + @Nullable @Query("deleted_by") String deletedBy, + @Nullable @Query("delete_for_me") Boolean deleteForMe); @GET("messages/{id}") Call get( diff --git a/src/test/java/io/getstream/chat/java/MessageTest.java b/src/test/java/io/getstream/chat/java/MessageTest.java index bbf5726cb..d6ae56655 100644 --- a/src/test/java/io/getstream/chat/java/MessageTest.java +++ b/src/test/java/io/getstream/chat/java/MessageTest.java @@ -880,4 +880,73 @@ void whenUnblockingAMessage_thenIsUnblocked() { Assertions.assertDoesNotThrow(() -> Blocklist.delete(blocklistName).request()); } + + @DisplayName("Can delete message for me only") + @Test + void whenDeletingMessageForMe_thenIsDeletedForMe() { + String text = "This is a message to delete for me only"; + MessageRequestObject messageRequest = + MessageRequestObject.builder().text(text).userId(testUserRequestObject.getId()).build(); + Message message = + Assertions.assertDoesNotThrow( + () -> + Message.send(testChannel.getType(), testChannel.getId()) + .message(messageRequest) + .request()) + .getMessage(); + Assertions.assertNull(message.getDeletedAt()); + + // Test delete for me only + Message deletedMessage = + Assertions.assertDoesNotThrow( + () -> Message.delete(message.getId()).deleteForMe(true).deletedBy(testUserRequestObject.getId()).request()) + .getMessage(); + Assertions.assertNotNull(deletedMessage.getDeletedAt()); + } + + @DisplayName("Can use convenience method for delete for me") + @Test + void whenUsingDeleteForMeConvenienceMethod_thenIsDeletedForMe() { + String text = "This is a message to delete for me using convenience method"; + MessageRequestObject messageRequest = + MessageRequestObject.builder().text(text).userId(testUserRequestObject.getId()).build(); + Message message = + Assertions.assertDoesNotThrow( + () -> + Message.send(testChannel.getType(), testChannel.getId()) + .message(messageRequest) + .request()) + .getMessage(); + Assertions.assertNull(message.getDeletedAt()); + + // Test convenience method for delete for me + Message deletedMessage = + Assertions.assertDoesNotThrow( + () -> Message.deleteForMe(message.getId(), testUserRequestObject.getId()).request()) + .getMessage(); + Assertions.assertNotNull(deletedMessage.getDeletedAt()); + } + + @DisplayName("Can use convenience method for hard delete") + @Test + void whenUsingHardDeleteConvenienceMethod_thenIsHardDeleted() { + String text = "This is a message to hard delete using convenience method"; + MessageRequestObject messageRequest = + MessageRequestObject.builder().text(text).userId(testUserRequestObject.getId()).build(); + Message message = + Assertions.assertDoesNotThrow( + () -> + Message.send(testChannel.getType(), testChannel.getId()) + .message(messageRequest) + .request()) + .getMessage(); + Assertions.assertNull(message.getDeletedAt()); + + // Test convenience method for hard delete + Message deletedMessage = + Assertions.assertDoesNotThrow( + () -> Message.hardDelete(message.getId()).request()) + .getMessage(); + Assertions.assertNotNull(deletedMessage.getDeletedAt()); + } } From 1ee0a9c6677efd165d4c05f49a991c7c4eef179c Mon Sep 17 00:00:00 2001 From: Daksh Date: Mon, 1 Sep 2025 11:13:07 +0200 Subject: [PATCH 2/5] fix lint --- src/main/java/io/getstream/chat/java/models/Message.java | 4 +++- src/test/java/io/getstream/chat/java/MessageTest.java | 9 ++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/main/java/io/getstream/chat/java/models/Message.java b/src/main/java/io/getstream/chat/java/models/Message.java index 8a0b2d678..bb97bf655 100644 --- a/src/main/java/io/getstream/chat/java/models/Message.java +++ b/src/main/java/io/getstream/chat/java/models/Message.java @@ -832,7 +832,9 @@ public MessageDeleteRequest deleteForMe(@NotNull Boolean deleteForMe) { @Override protected Call generateCall(Client client) { - return client.create(MessageService.class).delete(this.id, this.hard, this.deletedBy, this.deleteForMe); + return client + .create(MessageService.class) + .delete(this.id, this.hard, this.deletedBy, this.deleteForMe); } } diff --git a/src/test/java/io/getstream/chat/java/MessageTest.java b/src/test/java/io/getstream/chat/java/MessageTest.java index d6ae56655..53d5e9762 100644 --- a/src/test/java/io/getstream/chat/java/MessageTest.java +++ b/src/test/java/io/getstream/chat/java/MessageTest.java @@ -899,7 +899,11 @@ void whenDeletingMessageForMe_thenIsDeletedForMe() { // Test delete for me only Message deletedMessage = Assertions.assertDoesNotThrow( - () -> Message.delete(message.getId()).deleteForMe(true).deletedBy(testUserRequestObject.getId()).request()) + () -> + Message.delete(message.getId()) + .deleteForMe(true) + .deletedBy(testUserRequestObject.getId()) + .request()) .getMessage(); Assertions.assertNotNull(deletedMessage.getDeletedAt()); } @@ -944,8 +948,7 @@ void whenUsingHardDeleteConvenienceMethod_thenIsHardDeleted() { // Test convenience method for hard delete Message deletedMessage = - Assertions.assertDoesNotThrow( - () -> Message.hardDelete(message.getId()).request()) + Assertions.assertDoesNotThrow(() -> Message.hardDelete(message.getId()).request()) .getMessage(); Assertions.assertNotNull(deletedMessage.getDeletedAt()); } From e7dda3a5303861ca12498ce1efd7bae22b260e6f Mon Sep 17 00:00:00 2001 From: Daksh Date: Mon, 1 Sep 2025 11:29:40 +0200 Subject: [PATCH 3/5] fix tests --- .../io/getstream/chat/java/MessageTest.java | 28 +++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/src/test/java/io/getstream/chat/java/MessageTest.java b/src/test/java/io/getstream/chat/java/MessageTest.java index 53d5e9762..9423bdc70 100644 --- a/src/test/java/io/getstream/chat/java/MessageTest.java +++ b/src/test/java/io/getstream/chat/java/MessageTest.java @@ -905,7 +905,21 @@ void whenDeletingMessageForMe_thenIsDeletedForMe() { .deletedBy(testUserRequestObject.getId()) .request()) .getMessage(); - Assertions.assertNotNull(deletedMessage.getDeletedAt()); + + // Verify the delete request was successful + Assertions.assertNotNull(deletedMessage); + + // For delete for me, the message should still exist but be marked as deleted for the specific user + // The deletedAt might be null as this is a "soft delete for me" operation + System.out.println("Delete for me response - deletedAt: " + deletedMessage.getDeletedAt()); + + // Verify the message still exists (delete for me doesn't permanently delete) + Message retrievedMessage = + Assertions.assertDoesNotThrow( + () -> Message.get(message.getId()).request()) + .getMessage(); + Assertions.assertNotNull(retrievedMessage); + Assertions.assertEquals(message.getId(), retrievedMessage.getId()); } @DisplayName("Can use convenience method for delete for me") @@ -928,7 +942,17 @@ void whenUsingDeleteForMeConvenienceMethod_thenIsDeletedForMe() { Assertions.assertDoesNotThrow( () -> Message.deleteForMe(message.getId(), testUserRequestObject.getId()).request()) .getMessage(); - Assertions.assertNotNull(deletedMessage.getDeletedAt()); + + // Verify the delete request was successful + Assertions.assertNotNull(deletedMessage); + + // Verify the message still exists (delete for me doesn't permanently delete) + Message retrievedMessage = + Assertions.assertDoesNotThrow( + () -> Message.get(message.getId()).request()) + .getMessage(); + Assertions.assertNotNull(retrievedMessage); + Assertions.assertEquals(message.getId(), retrievedMessage.getId()); } @DisplayName("Can use convenience method for hard delete") From a1c25920f991ba945547dd2a6fa338924ec33512 Mon Sep 17 00:00:00 2001 From: Daksh Date: Mon, 1 Sep 2025 11:39:42 +0200 Subject: [PATCH 4/5] . --- .../io/getstream/chat/java/MessageTest.java | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/src/test/java/io/getstream/chat/java/MessageTest.java b/src/test/java/io/getstream/chat/java/MessageTest.java index 9423bdc70..687a2d59c 100644 --- a/src/test/java/io/getstream/chat/java/MessageTest.java +++ b/src/test/java/io/getstream/chat/java/MessageTest.java @@ -905,19 +905,18 @@ void whenDeletingMessageForMe_thenIsDeletedForMe() { .deletedBy(testUserRequestObject.getId()) .request()) .getMessage(); - + // Verify the delete request was successful Assertions.assertNotNull(deletedMessage); - - // For delete for me, the message should still exist but be marked as deleted for the specific user + + // For delete for me, the message should still exist but be marked as deleted for the specific + // user // The deletedAt might be null as this is a "soft delete for me" operation System.out.println("Delete for me response - deletedAt: " + deletedMessage.getDeletedAt()); - + // Verify the message still exists (delete for me doesn't permanently delete) Message retrievedMessage = - Assertions.assertDoesNotThrow( - () -> Message.get(message.getId()).request()) - .getMessage(); + Assertions.assertDoesNotThrow(() -> Message.get(message.getId()).request()).getMessage(); Assertions.assertNotNull(retrievedMessage); Assertions.assertEquals(message.getId(), retrievedMessage.getId()); } @@ -942,15 +941,13 @@ void whenUsingDeleteForMeConvenienceMethod_thenIsDeletedForMe() { Assertions.assertDoesNotThrow( () -> Message.deleteForMe(message.getId(), testUserRequestObject.getId()).request()) .getMessage(); - + // Verify the delete request was successful Assertions.assertNotNull(deletedMessage); - + // Verify the message still exists (delete for me doesn't permanently delete) Message retrievedMessage = - Assertions.assertDoesNotThrow( - () -> Message.get(message.getId()).request()) - .getMessage(); + Assertions.assertDoesNotThrow(() -> Message.get(message.getId()).request()).getMessage(); Assertions.assertNotNull(retrievedMessage); Assertions.assertEquals(message.getId(), retrievedMessage.getId()); } From c533eeb779fdf26c1e2ac14f536c667efa6d487a Mon Sep 17 00:00:00 2001 From: Daksh Date: Mon, 1 Sep 2025 13:19:11 +0200 Subject: [PATCH 5/5] update request --- DOCS.md | 2 +- src/main/java/io/getstream/chat/java/models/Message.java | 7 ++++--- src/test/java/io/getstream/chat/java/MessageTest.java | 3 +-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/DOCS.md b/DOCS.md index 72f0de253..148896336 100644 --- a/DOCS.md +++ b/DOCS.md @@ -1216,7 +1216,7 @@ Message.delete(messageId).deletedBy(userId).request(); Message.delete(messageId).hard(true).deletedBy(userId).request(); // delete for me only (message is only deleted for the specified user) -Message.delete(messageId).deleteForMe(true).deletedBy(userId).request(); +Message.delete(messageId).deleteForMe(userId).request(); // convenience methods Message.hardDelete(messageId).request(); diff --git a/src/main/java/io/getstream/chat/java/models/Message.java b/src/main/java/io/getstream/chat/java/models/Message.java index bb97bf655..3d10d71ea 100644 --- a/src/main/java/io/getstream/chat/java/models/Message.java +++ b/src/main/java/io/getstream/chat/java/models/Message.java @@ -825,8 +825,9 @@ public MessageDeleteRequest deletedBy(@NotNull String deletedBy) { } @NotNull - public MessageDeleteRequest deleteForMe(@NotNull Boolean deleteForMe) { - this.deleteForMe = deleteForMe; + public MessageDeleteRequest deleteForMe(@NotNull String userId) { + this.deleteForMe = true; + this.deletedBy = userId; return this; } @@ -1507,7 +1508,7 @@ public static MessageDeleteRequest hardDelete(@NotNull String id) { */ @NotNull public static MessageDeleteRequest deleteForMe(@NotNull String id, @NotNull String userId) { - return new MessageDeleteRequest(id).deleteForMe(true).deletedBy(userId); + return new MessageDeleteRequest(id).deleteForMe(userId); } /** diff --git a/src/test/java/io/getstream/chat/java/MessageTest.java b/src/test/java/io/getstream/chat/java/MessageTest.java index 687a2d59c..6cadfc5e1 100644 --- a/src/test/java/io/getstream/chat/java/MessageTest.java +++ b/src/test/java/io/getstream/chat/java/MessageTest.java @@ -901,8 +901,7 @@ void whenDeletingMessageForMe_thenIsDeletedForMe() { Assertions.assertDoesNotThrow( () -> Message.delete(message.getId()) - .deleteForMe(true) - .deletedBy(testUserRequestObject.getId()) + .deleteForMe(testUserRequestObject.getId()) .request()) .getMessage();