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]

Reply via email to