This is an automated email from the ASF dual-hosted git repository. rcordier pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git
commit 91490ec447e8293c3fcaefc084356a9a6d0cc59e Author: Benoit TELLIER <[email protected]> AuthorDate: Thu Mar 5 21:00:54 2026 +0100 JAMES-4185 Deleted message vault query: add support for messageId --- docs/modules/servers/partials/operate/webadmin.adoc | 19 +++++++++++++++++++ .../apache/james/vault/dto/query/QueryTranslator.java | 3 ++- .../apache/james/vault/search/CriterionFactory.java | 5 +++++ .../james/vault/search/DeletedMessageField.java | 3 +++ .../java/org/apache/james/vault/search/FieldName.java | 3 ++- .../vault/routes/DeletedMessagesVaultRoutes.java | 3 +-- .../vault/routes/DeletedMessagesVaultRoutesTest.java | 2 +- 7 files changed, 33 insertions(+), 5 deletions(-) diff --git a/docs/modules/servers/partials/operate/webadmin.adoc b/docs/modules/servers/partials/operate/webadmin.adoc index c5dee36353..3efd9a83e4 100644 --- a/docs/modules/servers/partials/operate/webadmin.adoc +++ b/docs/modules/servers/partials/operate/webadmin.adoc @@ -4595,6 +4595,21 @@ curl -XPOST http://ip:port/deletedMessages/users/[email protected]/messages } .... +To retrieve a specific message by its id: + +.... +{ + "combinator": "and", + "criteria": [ + { + "fieldName": "messageId", + "operator": "equals", + "value": "3294a976-ce63-491e-bd52-1b6f465ed7a2" + } + ] +} +.... + The query body follows the same structure as link:#_restore_deleted_messages[Restore Deleted Messages]. Pass an empty criteria list to retrieve all deleted messages: @@ -4738,6 +4753,10 @@ field matching. Tested value is a string serialized of mailbox id. Supports list mailbox id operators: ** contains: does the tested deleted message’s originMailbox ids contain tested mailbox id ? +* messageId: represents for deleted message `messageId` field matching. +Tested value is a string serialized message id. Supports string operator: +** equals: does the tested deleted message’s messageId equal the tested +value? Messages in the Deleted Messages Vault of a specified user that are matched with Query Json Object in the body will be appended to his diff --git a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/dto/query/QueryTranslator.java b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/dto/query/QueryTranslator.java index 4c1db1bb4c..b43e959b76 100644 --- a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/dto/query/QueryTranslator.java +++ b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/dto/query/QueryTranslator.java @@ -168,7 +168,8 @@ public class QueryTranslator { .put(FieldName.SUBJECT, EQUALS, testedValue -> CriterionFactory.subject().equals(STRING_PARSER.parse(testedValue))) .put(FieldName.SUBJECT, EQUALS_IGNORE_CASE, testedValue -> CriterionFactory.subject().equalsIgnoreCase(STRING_PARSER.parse(testedValue))) .put(FieldName.SUBJECT, CONTAINS, testedValue -> CriterionFactory.subject().contains(STRING_PARSER.parse(testedValue))) - .put(FieldName.SUBJECT, CONTAINS_IGNORE_CASE, testedValue -> CriterionFactory.subject().containsIgnoreCase(STRING_PARSER.parse(testedValue))); + .put(FieldName.SUBJECT, CONTAINS_IGNORE_CASE, testedValue -> CriterionFactory.subject().containsIgnoreCase(STRING_PARSER.parse(testedValue))) + .put(FieldName.MESSAGE_ID, EQUALS, testedValue -> CriterionFactory.messageId().equals(STRING_PARSER.parse(testedValue))); } private Criterion<?> translate(CriterionDTO dto) throws QueryTranslatorException { diff --git a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/search/CriterionFactory.java b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/search/CriterionFactory.java index aa0a330854..38d698883f 100644 --- a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/search/CriterionFactory.java +++ b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/search/CriterionFactory.java @@ -22,6 +22,7 @@ package org.apache.james.vault.search; import static org.apache.james.vault.search.DeletedMessageField.DELETION_DATE; import static org.apache.james.vault.search.DeletedMessageField.DELIVERY_DATE; import static org.apache.james.vault.search.DeletedMessageField.HAS_ATTACHMENT; +import static org.apache.james.vault.search.DeletedMessageField.MESSAGE_ID; import static org.apache.james.vault.search.DeletedMessageField.ORIGIN_MAILBOXES; import static org.apache.james.vault.search.DeletedMessageField.RECIPIENTS; import static org.apache.james.vault.search.DeletedMessageField.SENDER; @@ -119,6 +120,10 @@ public interface CriterionFactory { return new StringCriterionFactory(Criterion.Builder.forField(SUBJECT)); } + static StringCriterionFactory messageId() { + return new StringCriterionFactory(Criterion.Builder.forField(MESSAGE_ID)); + } + static Criterion<Collection<MailboxId>> containsOriginMailbox(MailboxId mailboxId) { return Criterion.Builder.forField(ORIGIN_MAILBOXES) .withMatcher(new Criterion.ValueMatcher<>(mailboxId, CONTAINS, value -> value.contains(mailboxId))); diff --git a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/search/DeletedMessageField.java b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/search/DeletedMessageField.java index 76b6f7c2ec..841391641d 100644 --- a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/search/DeletedMessageField.java +++ b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/search/DeletedMessageField.java @@ -22,6 +22,7 @@ package org.apache.james.vault.search; import static org.apache.james.vault.search.DeletedMessageField.ValueExtractor.DELETION_DATE_EXTRACTOR; import static org.apache.james.vault.search.DeletedMessageField.ValueExtractor.DELIVERY_DATE_EXTRACTOR; import static org.apache.james.vault.search.DeletedMessageField.ValueExtractor.HAS_ATTACHMENT_EXTRACTOR; +import static org.apache.james.vault.search.DeletedMessageField.ValueExtractor.MESSAGE_ID_EXTRACTOR; import static org.apache.james.vault.search.DeletedMessageField.ValueExtractor.ORIGIN_MAILBOXES_EXTRACTOR; import static org.apache.james.vault.search.DeletedMessageField.ValueExtractor.RECIPIENTS_EXTRACTOR; import static org.apache.james.vault.search.DeletedMessageField.ValueExtractor.SENDER_EXTRACTOR; @@ -63,6 +64,7 @@ public class DeletedMessageField<T> { ValueExtractor<Boolean> HAS_ATTACHMENT_EXTRACTOR = deletedMessage -> Optional.of(deletedMessage.hasAttachment()); ValueExtractor<Collection<MailboxId>> ORIGIN_MAILBOXES_EXTRACTOR = deletedMessage -> Optional.of(deletedMessage.getOriginMailboxes()); ValueExtractor<String> SUBJECT_EXTRACTOR = DeletedMessage::getSubject; + ValueExtractor<String> MESSAGE_ID_EXTRACTOR = deletedMessage -> Optional.of(deletedMessage.getMessageId().serialize()); } static final DeletedMessageField<ZonedDateTime> DELETION_DATE = new DeletedMessageField<>(FieldName.DELETION_DATE, DELETION_DATE_EXTRACTOR); @@ -72,5 +74,6 @@ public class DeletedMessageField<T> { static final DeletedMessageField<Boolean> HAS_ATTACHMENT = new DeletedMessageField<>(FieldName.HAS_ATTACHMENT, HAS_ATTACHMENT_EXTRACTOR); static final DeletedMessageField<Collection<MailboxId>> ORIGIN_MAILBOXES = new DeletedMessageField<>(FieldName.ORIGIN_MAILBOXES, ORIGIN_MAILBOXES_EXTRACTOR); static final DeletedMessageField<String> SUBJECT = new DeletedMessageField<>(FieldName.SUBJECT, SUBJECT_EXTRACTOR); + static final DeletedMessageField<String> MESSAGE_ID = new DeletedMessageField<>(FieldName.MESSAGE_ID, MESSAGE_ID_EXTRACTOR); } diff --git a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/search/FieldName.java b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/search/FieldName.java index b42ca7fc00..99c2bb6bd6 100644 --- a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/search/FieldName.java +++ b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/search/FieldName.java @@ -25,7 +25,8 @@ public enum FieldName { SENDER("sender"), HAS_ATTACHMENT("hasAttachment"), ORIGIN_MAILBOXES("originMailboxes"), - SUBJECT("subject"); + SUBJECT("subject"), + MESSAGE_ID("messageId"); private final String value; diff --git a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutes.java b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutes.java index dcf3bd997d..deb7955b15 100644 --- a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutes.java +++ b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutes.java @@ -40,8 +40,6 @@ import org.apache.james.vault.dto.query.QueryTranslator; import org.apache.james.vault.search.Query; import org.apache.james.webadmin.Routes; import org.apache.james.webadmin.tasks.TaskFromRequest; - -import reactor.core.publisher.Flux; import org.apache.james.webadmin.tasks.TaskFromRequestRegistry; import org.apache.james.webadmin.tasks.TaskRegistrationKey; import org.apache.james.webadmin.utils.ErrorResponder; @@ -52,6 +50,7 @@ import org.eclipse.jetty.http.HttpStatus; import com.google.common.annotations.VisibleForTesting; +import reactor.core.publisher.Flux; import spark.Request; import spark.Route; import spark.Service; diff --git a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutesTest.java b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutesTest.java index 80ba05d218..09f2124af6 100644 --- a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutesTest.java +++ b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutesTest.java @@ -25,8 +25,8 @@ import static io.restassured.RestAssured.with; import static org.apache.james.vault.DeletedMessageFixture.CONTENT; import static org.apache.james.vault.DeletedMessageFixture.DELETED_MESSAGE; import static org.apache.james.vault.DeletedMessageFixture.DELETED_MESSAGE_2; -import static org.apache.james.vault.DeletedMessageFixture.DELETED_MESSAGE_OTHER_USER; import static org.apache.james.vault.DeletedMessageFixture.DELETED_MESSAGE_GENERATOR; +import static org.apache.james.vault.DeletedMessageFixture.DELETED_MESSAGE_OTHER_USER; import static org.apache.james.vault.DeletedMessageFixture.DELETION_DATE; import static org.apache.james.vault.DeletedMessageFixture.DELIVERY_DATE; import static org.apache.james.vault.DeletedMessageFixture.FINAL_STAGE; --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
