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]
