Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions DOCS.md
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Comment thread
daksh-r marked this conversation as resolved.
Outdated

// convenience methods
Message.hardDelete(messageId).request();
Message.deleteForMe(messageId, userId).request();
```

**Upload file or image**
Expand Down
35 changes: 34 additions & 1 deletion src/main/java/io/getstream/chat/java/models/Message.java
Original file line number Diff line number Diff line change
Expand Up @@ -810,6 +810,8 @@ public static class MessageDeleteRequest extends StreamRequest<MessageDeleteResp

@Nullable private String deletedBy;

@Nullable private Boolean deleteForMe;

@NotNull
public MessageDeleteRequest hard(@NotNull Boolean hard) {
this.hard = hard;
Expand All @@ -822,9 +824,17 @@ public MessageDeleteRequest deletedBy(@NotNull String deletedBy) {
return this;
}

@NotNull
public MessageDeleteRequest deleteForMe(@NotNull Boolean deleteForMe) {
this.deleteForMe = deleteForMe;
return this;
}

@Override
protected Call<MessageDeleteResponse> 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);
}
}

Expand Down Expand Up @@ -1477,6 +1487,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
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,8 @@ Call<StreamResponseObject> deleteImage(
Call<MessageDeleteResponse> 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<MessageGetResponse> get(
Expand Down
93 changes: 93 additions & 0 deletions src/test/java/io/getstream/chat/java/MessageTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -880,4 +880,97 @@ 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();

// 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")
@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();

// 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")
@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());
}
}