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 1e190d045ec1824ad6b853d011f3a8e7002ce106
Author: Benoit Tellier <[email protected]>
AuthorDate: Mon Sep 28 11:00:57 2020 +0700

    JAMES-3377 Email/query: search by from
---
 .../contract/EmailQueryMethodContract.scala        | 151 ++++++++++++++++++++-
 .../james/jmap/utils/search/MailboxFilter.scala    |   4 +-
 2 files changed, 152 insertions(+), 3 deletions(-)

diff --git 
a/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/EmailQueryMethodContract.scala
 
b/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/EmailQueryMethodContract.scala
index 9f41fcf..c158b00 100644
--- 
a/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/EmailQueryMethodContract.scala
+++ 
b/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/EmailQueryMethodContract.scala
@@ -1603,7 +1603,6 @@ trait EmailQueryMethodContract {
     "someInThreadHaveKeyword",
     "noneInThreadHaveKeyword",
     "text",
-    "from",
     "to",
     "cc",
     "bcc",
@@ -3407,6 +3406,156 @@ trait EmailQueryMethodContract {
     }
   }
 
+  @Test
+  def fromShouldFilterResultsWhenAddress(server: GuiceJamesServer): Unit = {
+    
server.getProbe(classOf[MailboxProbeImpl]).createMailbox(MailboxPath.inbox(BOB))
+    def messageBuilder = Message.Builder
+      .of
+      .setSubject("test")
+      .setBody("testmail", StandardCharsets.UTF_8)
+    val messageId1 = server.getProbe(classOf[MailboxProbeImpl])
+      .appendMessage(BOB.asString, MailboxPath.inbox(BOB), 
AppendCommand.builder().build(
+        messageBuilder
+          .setFrom("[email protected]")
+          .build))
+      .getMessageId
+    val messageId2 = server.getProbe(classOf[MailboxProbeImpl])
+      .appendMessage(BOB.asString, MailboxPath.inbox(BOB), 
AppendCommand.builder().build(
+        messageBuilder
+          .setFrom("[email protected]")
+          .build))
+      .getMessageId
+    val messageId3 = server.getProbe(classOf[MailboxProbeImpl])
+      .appendMessage(BOB.asString, MailboxPath.inbox(BOB), 
AppendCommand.builder().build(
+        messageBuilder
+          .setFrom("[email protected]")
+          .build))
+      .getMessageId
+    val messageId4 = server.getProbe(classOf[MailboxProbeImpl])
+      .appendMessage(BOB.asString, MailboxPath.inbox(BOB), 
AppendCommand.builder().build(
+        messageBuilder
+          .setFrom("[email protected]", "[email protected]")
+          .build))
+      .getMessageId
+    val messageId5 = server.getProbe(classOf[MailboxProbeImpl])
+      .appendMessage(BOB.asString, MailboxPath.inbox(BOB), 
AppendCommand.builder().build(
+        messageBuilder.build))
+      .getMessageId
+    val messageId6 = server.getProbe(classOf[MailboxProbeImpl])
+      .appendMessage(BOB.asString, MailboxPath.inbox(BOB), 
AppendCommand.builder().build(
+        messageBuilder
+          .setFrom("\"User\" <[email protected]>")
+          .build))
+      .getMessageId
+    val messageId7 = server.getProbe(classOf[MailboxProbeImpl])
+      .appendMessage(BOB.asString, MailboxPath.inbox(BOB), 
AppendCommand.builder().build(
+        messageBuilder
+          .setFrom("\"[email protected]\" <[email protected]>")
+          .build))
+      .getMessageId
+
+    val request =
+      s"""{
+         |  "using": [
+         |    "urn:ietf:params:jmap:core",
+         |    "urn:ietf:params:jmap:mail"],
+         |  "methodCalls": [[
+         |    "Email/query",
+         |    {
+         |      "accountId": 
"29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6",
+         |      "filter" : {
+         |        "from": "[email protected]"
+         |      }
+         |    },
+         |    "c1"]]
+         |}""".stripMargin
+
+    awaitAtMostTenSeconds.untilAsserted { () =>
+      val response = `given`
+        .header(ACCEPT.toString, ACCEPT_RFC8621_VERSION_HEADER)
+        .body(request)
+      .when
+        .post
+      .`then`
+        .statusCode(SC_OK)
+        .contentType(JSON)
+        .extract
+        .body
+        .asString
+
+      assertThatJson(response)
+        .withOptions(new Options(IGNORING_ARRAY_ORDER))
+        .inPath("$.methodResponses[0][1].ids")
+        .isEqualTo(s"""["${messageId7.serialize}", "${messageId6.serialize}", 
"${messageId4.serialize}", "${messageId1.serialize}"]""")
+    }
+  }
+
+  @Test
+  def fromShouldFilterResultsWhenNotAnAddress(server: GuiceJamesServer): Unit 
= {
+    
server.getProbe(classOf[MailboxProbeImpl]).createMailbox(MailboxPath.inbox(BOB))
+    def messageBuilder = Message.Builder
+      .of
+      .setSubject("test")
+      .setBody("testmail", StandardCharsets.UTF_8)
+    val messageId1 = server.getProbe(classOf[MailboxProbeImpl])
+      .appendMessage(BOB.asString, MailboxPath.inbox(BOB), 
AppendCommand.builder().build(
+        messageBuilder
+          .setFrom("[email protected]")
+          .build))
+      .getMessageId
+    val messageId2 = server.getProbe(classOf[MailboxProbeImpl])
+      .appendMessage(BOB.asString, MailboxPath.inbox(BOB), 
AppendCommand.builder().build(
+        messageBuilder
+          .setFrom("\"Display\" <[email protected]>")
+          .build))
+      .getMessageId
+    val messageId3 = server.getProbe(classOf[MailboxProbeImpl])
+      .appendMessage(BOB.asString, MailboxPath.inbox(BOB), 
AppendCommand.builder().build(
+        messageBuilder
+          .setFrom("[email protected]")
+          .build))
+      .getMessageId
+    val messageId4 = server.getProbe(classOf[MailboxProbeImpl])
+      .appendMessage(BOB.asString, MailboxPath.inbox(BOB), 
AppendCommand.builder().build(
+        messageBuilder.build))
+      .getMessageId
+
+    val request =
+      s"""{
+         |  "using": [
+         |    "urn:ietf:params:jmap:core",
+         |    "urn:ietf:params:jmap:mail"],
+         |  "methodCalls": [[
+         |    "Email/query",
+         |    {
+         |      "accountId": 
"29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6",
+         |      "filter" : {
+         |        "from": "Display"
+         |      }
+         |    },
+         |    "c1"]]
+         |}""".stripMargin
+
+    awaitAtMostTenSeconds.untilAsserted { () =>
+      val response = `given`
+        .header(ACCEPT.toString, ACCEPT_RFC8621_VERSION_HEADER)
+        .body(request)
+      .when
+        .post
+      .`then`
+        .statusCode(SC_OK)
+        .contentType(JSON)
+        .extract
+        .body
+        .asString
+
+      assertThatJson(response)
+        .withOptions(new Options(IGNORING_ARRAY_ORDER))
+        .inPath("$.methodResponses[0][1].ids")
+        .isEqualTo(s"""["${messageId2.serialize}", 
"${messageId3.serialize}"]""")
+    }
+  }
+
   @ParameterizedTest
   @MethodSource(value = Array("jmapSystemKeywords"))
   def 
listMailsNotBySystemKeywordShouldReturnOnlyMailsWithoutThisSystemKeyword(keywordFlag:
 Flags, keywordName: String, server: GuiceJamesServer): Unit = {
diff --git 
a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/utils/search/MailboxFilter.scala
 
b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/utils/search/MailboxFilter.scala
index c547cf2..01d413d 100644
--- 
a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/utils/search/MailboxFilter.scala
+++ 
b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/utils/search/MailboxFilter.scala
@@ -27,7 +27,7 @@ import 
org.apache.james.jmap.model.CapabilityIdentifier.CapabilityIdentifier
 import org.apache.james.mailbox.MailboxSession
 import 
org.apache.james.mailbox.model.MultimailboxesSearchQuery.{AccessibleNamespace, 
Namespace, PersonalNamespace}
 import org.apache.james.mailbox.model.SearchQuery.DateResolution.Second
-import org.apache.james.mailbox.model.SearchQuery.{DateComparator, 
DateOperator, DateResolution, InternalDateCriterion}
+import org.apache.james.mailbox.model.SearchQuery.{AddressType, 
DateComparator, DateOperator, DateResolution, InternalDateCriterion}
 import org.apache.james.mailbox.model.{MultimailboxesSearchQuery, SearchQuery}
 
 import scala.jdk.CollectionConverters._
@@ -185,7 +185,7 @@ object MailboxFilter {
   case object From extends QueryFilter {
     override def toQuery(builder: SearchQuery.Builder, request: 
EmailQueryRequest): Either[UnsupportedFilterException, SearchQuery.Builder] =
       request.filter.flatMap(_.from) match {
-        case Some(_) => Left(UnsupportedFilterException("from"))
+        case Some(from) => 
Right(builder.andCriteria(SearchQuery.address(AddressType.From, from.value)))
         case None => Right(builder)
       }
   }


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

Reply via email to