This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit b2544721c076f94d472ae64e11dc99712768e572
Author: Quan Tran <[email protected]>
AuthorDate: Thu Mar 19 16:50:34 2026 +0700

    JAMES-4191 MessageFastViewProjectionDeletionListener: only delete message 
fast view if no longer referenced
---
 .../MessageFastViewProjectionDeletionListener.java | 28 ++++++++++++++++++++--
 1 file changed, 26 insertions(+), 2 deletions(-)

diff --git 
a/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/projections/MessageFastViewProjectionDeletionListener.java
 
b/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/projections/MessageFastViewProjectionDeletionListener.java
index 3ffc9973f2..f9b1f2e592 100644
--- 
a/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/projections/MessageFastViewProjectionDeletionListener.java
+++ 
b/server/data/data-jmap/src/main/java/org/apache/james/jmap/api/projections/MessageFastViewProjectionDeletionListener.java
@@ -21,10 +21,17 @@ package org.apache.james.jmap.api.projections;
 
 import jakarta.inject.Inject;
 
+import org.apache.james.core.Username;
 import org.apache.james.events.Event;
 import org.apache.james.events.EventListener;
 import org.apache.james.events.Group;
+import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.SessionProvider;
 import org.apache.james.mailbox.events.MailboxEvents;
+import org.apache.james.mailbox.model.MailboxId;
+import org.apache.james.mailbox.model.MessageId;
+import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
+import org.apache.james.util.FunctionalUtils;
 import org.reactivestreams.Publisher;
 
 import reactor.core.publisher.Mono;
@@ -36,11 +43,17 @@ public class MessageFastViewProjectionDeletionListener 
implements EventListener.
 
     private static final Group GROUP = new 
MessageFastViewProjectionDeletionListenerGroup();
 
+    private final MailboxSession session;
     private final MessageFastViewProjection messageFastViewProjection;
+    private final MailboxSessionMapperFactory mapperFactory;
 
     @Inject
-    public MessageFastViewProjectionDeletionListener(MessageFastViewProjection 
messageFastViewProjection) {
+    public MessageFastViewProjectionDeletionListener(MessageFastViewProjection 
messageFastViewProjection,
+                                                     SessionProvider 
sessionProvider,
+                                                     
MailboxSessionMapperFactory mapperFactory) {
+        this.session = 
sessionProvider.createSystemSession(Username.of(getClass().getName()));
         this.messageFastViewProjection = messageFastViewProjection;
+        this.mapperFactory = mapperFactory;
     }
 
     @Override
@@ -56,10 +69,21 @@ public class MessageFastViewProjectionDeletionListener 
implements EventListener.
     @Override
     public Publisher<Void> reactiveEvent(Event event) {
         if (event instanceof MailboxEvents.MessageContentDeletionEvent 
contentDeletionEvent) {
-            return 
Mono.from(messageFastViewProjection.delete(contentDeletionEvent.messageId()));
+            return isUnreferenced(contentDeletionEvent.messageId(), 
contentDeletionEvent.mailboxId())
+                .filter(Boolean::booleanValue)
+                .flatMap(any -> 
Mono.from(messageFastViewProjection.delete(contentDeletionEvent.messageId())));
         }
 
         return Mono.empty();
     }
 
+    private Mono<Boolean> isUnreferenced(MessageId messageId,
+                                         MailboxId excludedMailboxId) {
+        return mapperFactory.getMessageIdMapper(session)
+            .findMailboxesReactive(messageId)
+            .filter(mailboxId -> !mailboxId.equals(excludedMailboxId))
+            .hasElements()
+            .map(FunctionalUtils.negate());
+    }
+
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to