Skip to content

Commit 0f81c7e

Browse files
daksh-rDaksh
andauthored
Feat: Added Delete for me support on behalf of a user (#193)
* add fields and tests * fix lint * fix tests * . * update request --------- Co-authored-by: Daksh <[email protected]>
1 parent cac5652 commit 0f81c7e

File tree

4 files changed

+136
-2
lines changed

4 files changed

+136
-2
lines changed

DOCS.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1214,6 +1214,13 @@ Message.delete(messageId).deletedBy(userId).request();
12141214

12151215
// combine parameters
12161216
Message.delete(messageId).hard(true).deletedBy(userId).request();
1217+
1218+
// delete for me only (message is only deleted for the specified user)
1219+
Message.delete(messageId).deleteForMe(userId).request();
1220+
1221+
// convenience methods
1222+
Message.hardDelete(messageId).request();
1223+
Message.deleteForMe(messageId, userId).request();
12171224
```
12181225

12191226
**Upload file or image**

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

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -810,6 +810,8 @@ public static class MessageDeleteRequest extends StreamRequest<MessageDeleteResp
810810

811811
@Nullable private String deletedBy;
812812

813+
@Nullable private Boolean deleteForMe;
814+
813815
@NotNull
814816
public MessageDeleteRequest hard(@NotNull Boolean hard) {
815817
this.hard = hard;
@@ -822,9 +824,18 @@ public MessageDeleteRequest deletedBy(@NotNull String deletedBy) {
822824
return this;
823825
}
824826

827+
@NotNull
828+
public MessageDeleteRequest deleteForMe(@NotNull String userId) {
829+
this.deleteForMe = true;
830+
this.deletedBy = userId;
831+
return this;
832+
}
833+
825834
@Override
826835
protected Call<MessageDeleteResponse> generateCall(Client client) {
827-
return client.create(MessageService.class).delete(this.id, this.hard, this.deletedBy);
836+
return client
837+
.create(MessageService.class)
838+
.delete(this.id, this.hard, this.deletedBy, this.deleteForMe);
828839
}
829840
}
830841

@@ -1477,6 +1488,29 @@ public static MessageDeleteRequest delete(@NotNull String id) {
14771488
return new MessageDeleteRequest(id);
14781489
}
14791490

1491+
/**
1492+
* Creates a hard delete request
1493+
*
1494+
* @param id the message id
1495+
* @return the created request
1496+
*/
1497+
@NotNull
1498+
public static MessageDeleteRequest hardDelete(@NotNull String id) {
1499+
return new MessageDeleteRequest(id).hard(true);
1500+
}
1501+
1502+
/**
1503+
* Creates a delete for me request
1504+
*
1505+
* @param id the message id
1506+
* @param userId the user id for whom the message should be deleted
1507+
* @return the created request
1508+
*/
1509+
@NotNull
1510+
public static MessageDeleteRequest deleteForMe(@NotNull String id, @NotNull String userId) {
1511+
return new MessageDeleteRequest(id).deleteForMe(userId);
1512+
}
1513+
14801514
/**
14811515
* Creates a search request
14821516
*

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,8 @@ Call<StreamResponseObject> deleteImage(
9393
Call<MessageDeleteResponse> delete(
9494
@NotNull @Path("id") String id,
9595
@Nullable @Query("hard") Boolean hard,
96-
@Nullable @Query("deleted_by") String deletedBy);
96+
@Nullable @Query("deleted_by") String deletedBy,
97+
@Nullable @Query("delete_for_me") Boolean deleteForMe);
9798

9899
@GET("messages/{id}")
99100
Call<MessageGetResponse> get(

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

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -880,4 +880,96 @@ void whenUnblockingAMessage_thenIsUnblocked() {
880880

881881
Assertions.assertDoesNotThrow(() -> Blocklist.delete(blocklistName).request());
882882
}
883+
884+
@DisplayName("Can delete message for me only")
885+
@Test
886+
void whenDeletingMessageForMe_thenIsDeletedForMe() {
887+
String text = "This is a message to delete for me only";
888+
MessageRequestObject messageRequest =
889+
MessageRequestObject.builder().text(text).userId(testUserRequestObject.getId()).build();
890+
Message message =
891+
Assertions.assertDoesNotThrow(
892+
() ->
893+
Message.send(testChannel.getType(), testChannel.getId())
894+
.message(messageRequest)
895+
.request())
896+
.getMessage();
897+
Assertions.assertNull(message.getDeletedAt());
898+
899+
// Test delete for me only
900+
Message deletedMessage =
901+
Assertions.assertDoesNotThrow(
902+
() ->
903+
Message.delete(message.getId())
904+
.deleteForMe(testUserRequestObject.getId())
905+
.request())
906+
.getMessage();
907+
908+
// Verify the delete request was successful
909+
Assertions.assertNotNull(deletedMessage);
910+
911+
// For delete for me, the message should still exist but be marked as deleted for the specific
912+
// user
913+
// The deletedAt might be null as this is a "soft delete for me" operation
914+
System.out.println("Delete for me response - deletedAt: " + deletedMessage.getDeletedAt());
915+
916+
// Verify the message still exists (delete for me doesn't permanently delete)
917+
Message retrievedMessage =
918+
Assertions.assertDoesNotThrow(() -> Message.get(message.getId()).request()).getMessage();
919+
Assertions.assertNotNull(retrievedMessage);
920+
Assertions.assertEquals(message.getId(), retrievedMessage.getId());
921+
}
922+
923+
@DisplayName("Can use convenience method for delete for me")
924+
@Test
925+
void whenUsingDeleteForMeConvenienceMethod_thenIsDeletedForMe() {
926+
String text = "This is a message to delete for me using convenience method";
927+
MessageRequestObject messageRequest =
928+
MessageRequestObject.builder().text(text).userId(testUserRequestObject.getId()).build();
929+
Message message =
930+
Assertions.assertDoesNotThrow(
931+
() ->
932+
Message.send(testChannel.getType(), testChannel.getId())
933+
.message(messageRequest)
934+
.request())
935+
.getMessage();
936+
Assertions.assertNull(message.getDeletedAt());
937+
938+
// Test convenience method for delete for me
939+
Message deletedMessage =
940+
Assertions.assertDoesNotThrow(
941+
() -> Message.deleteForMe(message.getId(), testUserRequestObject.getId()).request())
942+
.getMessage();
943+
944+
// Verify the delete request was successful
945+
Assertions.assertNotNull(deletedMessage);
946+
947+
// Verify the message still exists (delete for me doesn't permanently delete)
948+
Message retrievedMessage =
949+
Assertions.assertDoesNotThrow(() -> Message.get(message.getId()).request()).getMessage();
950+
Assertions.assertNotNull(retrievedMessage);
951+
Assertions.assertEquals(message.getId(), retrievedMessage.getId());
952+
}
953+
954+
@DisplayName("Can use convenience method for hard delete")
955+
@Test
956+
void whenUsingHardDeleteConvenienceMethod_thenIsHardDeleted() {
957+
String text = "This is a message to hard delete using convenience method";
958+
MessageRequestObject messageRequest =
959+
MessageRequestObject.builder().text(text).userId(testUserRequestObject.getId()).build();
960+
Message message =
961+
Assertions.assertDoesNotThrow(
962+
() ->
963+
Message.send(testChannel.getType(), testChannel.getId())
964+
.message(messageRequest)
965+
.request())
966+
.getMessage();
967+
Assertions.assertNull(message.getDeletedAt());
968+
969+
// Test convenience method for hard delete
970+
Message deletedMessage =
971+
Assertions.assertDoesNotThrow(() -> Message.hardDelete(message.getId()).request())
972+
.getMessage();
973+
Assertions.assertNotNull(deletedMessage.getDeletedAt());
974+
}
883975
}

0 commit comments

Comments
 (0)