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 7c9a5651e954006f8bd6ef34e3170ba4449d5045
Author: Benoit Tellier <[email protected]>
AuthorDate: Mon Sep 28 11:16:15 2020 +0700

    JAMES-3377 Email/query: search by cc
---
 .../contract/EmailQueryMethodContract.scala        | 153 ++++++++++++++++++++-
 .../james/jmap/utils/search/MailboxFilter.scala    |   2 +-
 2 files changed, 153 insertions(+), 2 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 ad26606..50a4a8c 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
@@ -45,6 +45,7 @@ import org.apache.james.mailbox.model.MailboxACL.Right
 import org.apache.james.mailbox.model.MailboxPath.inbox
 import org.apache.james.mailbox.model.{MailboxACL, MailboxPath, MessageId}
 import org.apache.james.mime4j.dom.Message
+import org.apache.james.mime4j.field.address.DefaultAddressParser
 import org.apache.james.mime4j.message.DefaultMessageWriter
 import org.apache.james.modules.{ACLProbeImpl, MailboxProbeImpl}
 import org.apache.james.utils.DataProbeImpl
@@ -1603,7 +1604,6 @@ trait EmailQueryMethodContract {
     "someInThreadHaveKeyword",
     "noneInThreadHaveKeyword",
     "text",
-    "cc",
     "bcc",
     "subject",
     "body"
@@ -3705,6 +3705,157 @@ trait EmailQueryMethodContract {
     }
   }
 
+  @Test
+  def ccShouldFilterResultsWhenAddress(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
+          .setCc(DefaultAddressParser.DEFAULT.parseMailbox("[email protected]"))
+          .build))
+      .getMessageId
+    val messageId2 = server.getProbe(classOf[MailboxProbeImpl])
+      .appendMessage(BOB.asString, MailboxPath.inbox(BOB), 
AppendCommand.builder().build(
+        messageBuilder
+          .setCc(DefaultAddressParser.DEFAULT.parseMailbox("[email protected]"))
+          .build))
+      .getMessageId
+    val messageId3 = server.getProbe(classOf[MailboxProbeImpl])
+      .appendMessage(BOB.asString, MailboxPath.inbox(BOB), 
AppendCommand.builder().build(
+        messageBuilder
+          .setCc(DefaultAddressParser.DEFAULT.parseMailbox("[email protected]"))
+          .build))
+      .getMessageId
+    val messageId4 = server.getProbe(classOf[MailboxProbeImpl])
+      .appendMessage(BOB.asString, MailboxPath.inbox(BOB), 
AppendCommand.builder().build(
+        messageBuilder
+          .setCc(DefaultAddressParser.DEFAULT.parseMailbox("[email protected]"),
+            DefaultAddressParser.DEFAULT.parseMailbox("[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
+          .setCc(DefaultAddressParser.DEFAULT.parseMailbox("\"User\" 
<[email protected]>"))
+          .build))
+      .getMessageId
+    val messageId7 = server.getProbe(classOf[MailboxProbeImpl])
+      .appendMessage(BOB.asString, MailboxPath.inbox(BOB), 
AppendCommand.builder().build(
+        messageBuilder
+          
.setCc(DefaultAddressParser.DEFAULT.parseMailbox("\"[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" : {
+         |        "cc": "[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 ccShouldFilterResultsWhenNotAnAddress(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
+          .setCc(DefaultAddressParser.DEFAULT.parseMailbox("[email protected]"))
+          .build))
+      .getMessageId
+    val messageId2 = server.getProbe(classOf[MailboxProbeImpl])
+      .appendMessage(BOB.asString, MailboxPath.inbox(BOB), 
AppendCommand.builder().build(
+        messageBuilder
+          .setCc(DefaultAddressParser.DEFAULT.parseMailbox("\"Display\" 
<[email protected]>"))
+          .build))
+      .getMessageId
+    val messageId3 = server.getProbe(classOf[MailboxProbeImpl])
+      .appendMessage(BOB.asString, MailboxPath.inbox(BOB), 
AppendCommand.builder().build(
+        messageBuilder
+          
.setCc(DefaultAddressParser.DEFAULT.parseMailbox("[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" : {
+         |        "cc": "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 17f81bd..25753d1 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
@@ -199,7 +199,7 @@ object MailboxFilter {
   case object Cc extends QueryFilter {
     override def toQuery(builder: SearchQuery.Builder, request: 
EmailQueryRequest): Either[UnsupportedFilterException, SearchQuery.Builder] =
       request.filter.flatMap(_.cc) match {
-        case Some(_) => Left(UnsupportedFilterException("cc"))
+        case Some(cc) => 
Right(builder.andCriteria(SearchQuery.address(AddressType.Cc, cc.value)))
         case None => Right(builder)
       }
   }


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

Reply via email to