You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@james.apache.org by rc...@apache.org on 2023/04/19 09:57:18 UTC

[james-project] 01/04: JAMES-3440 Reduce EmailQueryView JMAP RFC-8621 boiler plate

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 279240298bbeee9603276facb27f715e3f8eb159
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Tue Apr 18 13:58:43 2023 +0700

    JAMES-3440 Reduce EmailQueryView JMAP RFC-8621 boiler plate
---
 .../james/jmap/method/EmailQueryMethod.scala       | 62 +++++++---------------
 1 file changed, 20 insertions(+), 42 deletions(-)

diff --git a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/EmailQueryMethod.scala b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/EmailQueryMethod.scala
index c61cb30f7f..e643925670 100644
--- a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/EmailQueryMethod.scala
+++ b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/EmailQueryMethod.scala
@@ -111,69 +111,47 @@ class EmailQueryMethod @Inject() (serializer: EmailQuerySerializer,
     val condition: FilterCondition = request.filter.get.asInstanceOf[FilterCondition]
     val mailboxId: MailboxId = condition.inMailbox.get
     val after: ZonedDateTime = condition.after.get.asUTC
-    SMono(mailboxManager.getMailboxReactive(mailboxId, mailboxSession))
-      .filter(messageManager => namespace.keepAccessible(messageManager.getMailboxEntity))
-      .flatMap(_ => SFlux.fromPublisher(
-        emailQueryView.listMailboxContentSinceAfterSortedBySentAt(mailboxId, after, JavaLimit.from(limitToUse.value + position.value)))
-        .drop(position.value)
-        .take(limitToUse.value)
-        .collectSeq())
-      .switchIfEmpty(SMono.just[Seq[MessageId]](Seq()))
-      .onErrorResume({
-        case _: MailboxNotFoundException => SMono.just[Seq[MessageId]](Seq())
-        case e => SMono.error[Seq[MessageId]](e)
-      })
+
+    val queryViewEntries: SFlux[MessageId] = SFlux.fromPublisher(emailQueryView.listMailboxContentSinceAfterSortedBySentAt(mailboxId, after, JavaLimit.from(limitToUse.value + position.value)))
+
+    fromQueryViewEntries(mailboxId, queryViewEntries, mailboxSession, position, limitToUse, namespace)
   }
 
   private def queryViewForContentAfterSortedByReceivedAt(mailboxSession: MailboxSession, position: Position, limitToUse: Limit, request: EmailQueryRequest, namespace: Namespace): SMono[Seq[MessageId]] = {
     val condition: FilterCondition = request.filter.get.asInstanceOf[FilterCondition]
     val mailboxId: MailboxId = condition.inMailbox.get
     val after: ZonedDateTime = condition.after.get.asUTC
-    SMono(mailboxManager.getMailboxReactive(mailboxId, mailboxSession))
-      .filter(messageManager => namespace.keepAccessible(messageManager.getMailboxEntity))
-      .flatMap(_ => SFlux.fromPublisher(
-        emailQueryView.listMailboxContentSinceAfterSortedByReceivedAt(mailboxId, after, JavaLimit.from(limitToUse.value + position.value)))
-        .drop(position.value)
-        .take(limitToUse.value)
-        .collectSeq())
-      .switchIfEmpty(SMono.just[Seq[MessageId]](Seq()))
-      .onErrorResume({
-        case _: MailboxNotFoundException => SMono.just[Seq[MessageId]](Seq())
-        case e => SMono.error[Seq[MessageId]](e)
-      })
+    val queryViewEntries: SFlux[MessageId] = SFlux.fromPublisher(emailQueryView.listMailboxContentSinceAfterSortedByReceivedAt(mailboxId, after, JavaLimit.from(limitToUse.value + position.value)))
+
+    fromQueryViewEntries(mailboxId, queryViewEntries, mailboxSession, position, limitToUse, namespace)
   }
 
   private def queryViewForListingSortedBySentAt(mailboxSession: MailboxSession, position: Position, limitToUse: Limit, request: EmailQueryRequest, namespace: Namespace): SMono[Seq[MessageId]] = {
     val mailboxId: MailboxId = request.filter.get.asInstanceOf[FilterCondition].inMailbox.get
-    SMono(mailboxManager.getMailboxReactive(mailboxId, mailboxSession))
-      .filter(messageManager => namespace.keepAccessible(messageManager.getMailboxEntity))
-      .flatMap(_ => SFlux.fromPublisher(
-        emailQueryView.listMailboxContentSortedBySentAt(mailboxId, JavaLimit.from(limitToUse.value + position.value)))
-        .drop(position.value)
-        .take(limitToUse.value)
-        .collectSeq())
-      .switchIfEmpty(SMono.just[Seq[MessageId]](Seq()))
-      .onErrorResume({
-        case _: MailboxNotFoundException => SMono.just[Seq[MessageId]](Seq())
-        case e => SMono.error[Seq[MessageId]](e)
-      })
+    val queryViewEntries: SFlux[MessageId] = SFlux.fromPublisher(emailQueryView.listMailboxContentSortedBySentAt(mailboxId, JavaLimit.from(limitToUse.value + position.value)))
+
+    fromQueryViewEntries(mailboxId, queryViewEntries, mailboxSession, position, limitToUse, namespace)
   }
 
   private def queryViewForListingSortedByReceivedAt(mailboxSession: MailboxSession, position: Position, limitToUse: Limit, request: EmailQueryRequest, namespace: Namespace): SMono[Seq[MessageId]] = {
     val mailboxId: MailboxId = request.filter.get.asInstanceOf[FilterCondition].inMailbox.get
+    val queryViewEntries: SFlux[MessageId] = SFlux.fromPublisher(emailQueryView.listMailboxContentSortedByReceivedAt(mailboxId, JavaLimit.from(limitToUse.value + position.value)))
+
+    fromQueryViewEntries(mailboxId, queryViewEntries, mailboxSession, position, limitToUse, namespace)
+  }
+
+  private def fromQueryViewEntries(mailboxId: MailboxId, queryViewEntries: SFlux[MessageId], mailboxSession: MailboxSession, position: Position, limitToUse: Limit, namespace: Namespace): SMono[Seq[MessageId]] =
     SMono(mailboxManager.getMailboxReactive(mailboxId, mailboxSession))
       .filter(messageManager => namespace.keepAccessible(messageManager.getMailboxEntity))
-      .flatMap(_ => SFlux.fromPublisher(
-        emailQueryView.listMailboxContentSortedByReceivedAt(mailboxId, JavaLimit.from(limitToUse.value + position.value)))
-        .drop(position.value)
-        .take(limitToUse.value)
-        .collectSeq())
+      .flatMap(_ => queryViewEntries
+          .drop(position.value)
+          .take(limitToUse.value)
+          .collectSeq())
       .switchIfEmpty(SMono.just[Seq[MessageId]](Seq()))
       .onErrorResume({
         case _: MailboxNotFoundException => SMono.just[Seq[MessageId]](Seq())
         case e => SMono.error[Seq[MessageId]](e)
       })
-  }
 
   private def matchesInMailboxSortedBySentAt(request: EmailQueryRequest): Boolean =
     configuration.isEmailQueryViewEnabled &&


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org