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 879006ec8fa6cfce3473ab6775636b4481dd9e0a
Author: Rene Cordier <[email protected]>
AuthorDate: Tue Sep 22 14:55:15 2020 +0700

    JAMES-3384 collapseThreads parameter should noop in Email/query
---
 .../contract/EmailQueryMethodContract.scala        | 57 ++++++++++++++++++++++
 .../james/jmap/json/EmailQuerySerializer.scala     |  3 +-
 .../org/apache/james/jmap/mail/EmailQuery.scala    |  9 +++-
 3 files changed, 67 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 eba54dd..ebf740d 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
@@ -911,6 +911,63 @@ trait EmailQueryMethodContract {
        """)
   }
 
+  @ParameterizedTest
+  @ValueSource(strings = Array(
+    "true",
+    "false"
+  ))
+  def collapseThreadsParameterShouldNoop(collapseThreads: Boolean, server: 
GuiceJamesServer): Unit = {
+    val message: Message = Message.Builder
+      .of
+      .setSubject("test")
+      .setBody("testmail", StandardCharsets.UTF_8)
+      .build
+    
server.getProbe(classOf[MailboxProbeImpl]).createMailbox(MailboxPath.inbox(BOB))
+    val otherMailboxPath = MailboxPath.forUser(BOB, "other")
+    val otherMailboxId = 
server.getProbe(classOf[MailboxProbeImpl]).createMailbox(otherMailboxPath)
+    server.getProbe(classOf[MailboxProbeImpl])
+      .appendMessage(BOB.asString, MailboxPath.inbox(BOB), 
AppendCommand.from(message))
+      .getMessageId
+    val messageId2: MessageId = server.getProbe(classOf[MailboxProbeImpl])
+      .appendMessage(BOB.asString, otherMailboxPath, 
AppendCommand.from(message))
+      .getMessageId
+
+    val request =
+      s"""{
+         |  "using": [
+         |    "urn:ietf:params:jmap:core",
+         |    "urn:ietf:params:jmap:mail"],
+         |  "methodCalls": [[
+         |    "Email/query",
+         |    {
+         |      "accountId": 
"29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6",
+         |      "filter": {
+         |        "inMailbox": "${otherMailboxId.serialize}"
+         |       },
+         |       "collapseThreads": $collapseThreads
+         |    },
+         |    "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)
+        .inPath("$.methodResponses[0][1].ids")
+        .isEqualTo(s"""["${messageId2.serialize}"]""")
+    }
+  }
+
   @Test
   def 
shouldReturnIllegalArgumentErrorForAnUnknownSpecificUserMailboxes(server: 
GuiceJamesServer): Unit = {
     val message: Message = Message.Builder
diff --git 
a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/json/EmailQuerySerializer.scala
 
b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/json/EmailQuerySerializer.scala
index 3fac550..57d1810 100644
--- 
a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/json/EmailQuerySerializer.scala
+++ 
b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/json/EmailQuerySerializer.scala
@@ -20,7 +20,7 @@
 package org.apache.james.jmap.json
 
 import javax.inject.Inject
-import org.apache.james.jmap.mail.{AllInThreadHaveKeywordSortProperty, 
Collation, Comparator, EmailQueryRequest, EmailQueryResponse, FilterCondition, 
HasAttachment, IsAscending, ReceivedAtSortProperty, 
SomeInThreadHaveKeywordSortProperty, SortProperty}
+import org.apache.james.jmap.mail.{AllInThreadHaveKeywordSortProperty, 
CollapseThreads, Collation, Comparator, EmailQueryRequest, EmailQueryResponse, 
FilterCondition, HasAttachment, IsAscending, ReceivedAtSortProperty, 
SomeInThreadHaveKeywordSortProperty, SortProperty}
 import org.apache.james.jmap.model.{AccountId, CanCalculateChanges, Keyword, 
LimitUnparsed, PositionUnparsed, QueryState}
 import org.apache.james.mailbox.model.{MailboxId, MessageId}
 import play.api.libs.json._
@@ -71,6 +71,7 @@ class EmailQuerySerializer @Inject()(mailboxIdFactory: 
MailboxId.Factory) {
   private implicit val isAscendingFormat: Format[IsAscending] = 
Json.valueFormat[IsAscending]
   private implicit val collationFormat: Format[Collation] = 
Json.valueFormat[Collation]
   private implicit val comparatorFormat: Format[Comparator] = 
Json.format[Comparator]
+  private implicit val collapseThreadsReads: Reads[CollapseThreads] = 
Json.valueReads[CollapseThreads]
 
   private implicit val emailQueryRequestReads: Reads[EmailQueryRequest] = 
Json.reads[EmailQueryRequest]
 
diff --git 
a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/EmailQuery.scala
 
b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/EmailQuery.scala
index e2ab4ea..6fa3ef6 100644
--- 
a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/EmailQuery.scala
+++ 
b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/EmailQuery.scala
@@ -39,7 +39,12 @@ case class FilterCondition(inMailbox: Option[MailboxId],
                            maxSize: Option[Size],
                            hasAttachment: Option[HasAttachment])
 
-case class EmailQueryRequest(accountId: AccountId, position: 
Option[PositionUnparsed], limit: Option[LimitUnparsed], filter: 
Option[FilterCondition], comparator: Option[Set[Comparator]])
+case class EmailQueryRequest(accountId: AccountId,
+                             position: Option[PositionUnparsed],
+                             limit: Option[LimitUnparsed],
+                             filter: Option[FilterCondition],
+                             comparator: Option[Set[Comparator]],
+                             collapseThreads: Option[CollapseThreads])
 
 sealed trait SortProperty {
   def toSortClause: Either[UnsupportedSortException, SortClause]
@@ -83,6 +88,8 @@ case class Comparator(property: SortProperty,
     } yield new SearchQuery.Sort(sortClause, 
isAscending.getOrElse(ASCENDING).toSortOrder)
 }
 
+case class CollapseThreads(value: Boolean) extends AnyVal
+
 case class EmailQueryResponse(accountId: AccountId,
                               queryState: QueryState,
                               canCalculateChanges: CanCalculateChanges,


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

Reply via email to