You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@james.apache.org by bt...@apache.org on 2022/10/11 01:41:16 UTC

[james-project] 01/02: JAMES-3831 Expose urn:apache:james:params:jmap:mail:identity:sortorder capability

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 7e1b57a93c91881ce55d5a6ba2e43286be391af1
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Thu Oct 6 16:39:12 2022 +0700

    JAMES-3831 Expose urn:apache:james:params:jmap:mail:identity:sortorder capability
---
 .../org/apache/james/jmap/draft/JMAPModule.java    |  2 ++
 .../rfc8621/contract/CustomMethodContract.scala    |  5 +++-
 .../rfc8621/contract/SessionRoutesContract.scala   |  4 ++-
 .../org/apache/james/jmap/core/Capabilities.scala  | 32 +---------------------
 .../org/apache/james/jmap/core/Capability.scala    | 16 ++++++++++-
 .../james/jmap/routes/SessionRoutesTest.scala      |  3 ++
 6 files changed, 28 insertions(+), 34 deletions(-)

diff --git a/server/container/guice/protocols/jmap/src/main/java/org/apache/james/jmap/draft/JMAPModule.java b/server/container/guice/protocols/jmap/src/main/java/org/apache/james/jmap/draft/JMAPModule.java
index 7cdb17f9db..784d9f937c 100644
--- a/server/container/guice/protocols/jmap/src/main/java/org/apache/james/jmap/draft/JMAPModule.java
+++ b/server/container/guice/protocols/jmap/src/main/java/org/apache/james/jmap/draft/JMAPModule.java
@@ -39,6 +39,7 @@ import org.apache.james.jmap.Version;
 import org.apache.james.jmap.change.MailboxChangeListener;
 import org.apache.james.jmap.core.CapabilityFactory;
 import org.apache.james.jmap.core.CoreCapabilityFactory;
+import org.apache.james.jmap.core.IdentitySortOrderCapabilityFactory$;
 import org.apache.james.jmap.core.JmapQuotaCapabilityFactory$;
 import org.apache.james.jmap.core.JmapRfc8621Configuration;
 import org.apache.james.jmap.core.MDNCapabilityFactory$;
@@ -146,6 +147,7 @@ public class JMAPModule extends AbstractModule {
         supportedCapabilities.addBinding().toInstance(MailCapabilityFactory$.MODULE$);
         supportedCapabilities.addBinding().toInstance(QuotaCapabilityFactory$.MODULE$);
         supportedCapabilities.addBinding().toInstance(JmapQuotaCapabilityFactory$.MODULE$);
+        supportedCapabilities.addBinding().toInstance(IdentitySortOrderCapabilityFactory$.MODULE$);
         supportedCapabilities.addBinding().toInstance(SharesCapabilityFactory$.MODULE$);
         supportedCapabilities.addBinding().toInstance(VacationResponseCapabilityFactory$.MODULE$);
         supportedCapabilities.addBinding().toInstance(SubmissionCapabilityFactory$.MODULE$);
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/CustomMethodContract.scala b/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/CustomMethodContract.scala
index 5fd115fc41..13633edd43 100644
--- a/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/CustomMethodContract.scala
+++ b/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/CustomMethodContract.scala
@@ -37,8 +37,8 @@ import org.apache.http.HttpStatus.SC_OK
 import org.apache.james.GuiceJamesServer
 import org.apache.james.events.Event.EventId
 import org.apache.james.events.EventBus
-import org.apache.james.jmap.api.model.{AccountId, State, TypeName}
 import org.apache.james.jmap.api.model.Size.Size
+import org.apache.james.jmap.api.model.{AccountId, State, TypeName}
 import org.apache.james.jmap.change.{AccountIdRegistrationKey, StateChangeEvent}
 import org.apache.james.jmap.core.CapabilityIdentifier.{CapabilityIdentifier, JMAP_CORE}
 import org.apache.james.jmap.core.Invocation.MethodName
@@ -107,6 +107,7 @@ object CustomMethodContract {
       |    },
       |    "urn:apache:james:params:jmap:mail:quota": {},
       |    "urn:ietf:params:jmap:quota": {},
+      |    "urn:apache:james:params:jmap:mail:identity:sortorder": {},
       |    "$CUSTOM": {"custom": "property"},
       |    "urn:apache:james:params:jmap:mail:shares": {},
       |    "urn:ietf:params:jmap:vacationresponse":{},
@@ -146,6 +147,7 @@ object CustomMethodContract {
       |        },
       |        "urn:apache:james:params:jmap:mail:quota": {},
       |        "urn:ietf:params:jmap:quota": {},
+      |        "urn:apache:james:params:jmap:mail:identity:sortorder": {},
       |        "urn:apache:james:params:jmap:mail:shares": {},
       |        "$CUSTOM": {"custom": "property"},
       |        "urn:ietf:params:jmap:vacationresponse":{},
@@ -160,6 +162,7 @@ object CustomMethodContract {
       |    "urn:ietf:params:jmap:mail" : "29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6",
       |    "urn:apache:james:params:jmap:mail:quota": "29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6",
       |    "urn:ietf:params:jmap:quota": "29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6",
+      |    "urn:apache:james:params:jmap:mail:identity:sortorder": "29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6",
       |    "urn:apache:james:params:jmap:mail:shares": "29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6",
       |    "$CUSTOM": "29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6",
       |    "urn:ietf:params:jmap:vacationresponse": "29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6",
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/SessionRoutesContract.scala b/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/SessionRoutesContract.scala
index 307cd22815..ecdcb3ad35 100644
--- a/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/SessionRoutesContract.scala
+++ b/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/SessionRoutesContract.scala
@@ -70,6 +70,7 @@ object SessionRoutesContract {
                          |    },
                          |    "urn:apache:james:params:jmap:mail:quota": {},
                          |    "urn:ietf:params:jmap:quota": {},
+                         |    "urn:apache:james:params:jmap:mail:identity:sortorder": {},
                          |    "urn:apache:james:params:jmap:mail:shares": {},
                          |    "urn:ietf:params:jmap:vacationresponse":{},
                          |    "urn:ietf:params:jmap:mdn":{}
@@ -108,6 +109,7 @@ object SessionRoutesContract {
                          |        },
                          |        "urn:apache:james:params:jmap:mail:quota": {},
                          |        "urn:ietf:params:jmap:quota": {},
+                         |        "urn:apache:james:params:jmap:mail:identity:sortorder": {},
                          |        "urn:apache:james:params:jmap:mail:shares": {},
                          |        "urn:ietf:params:jmap:vacationresponse":{},
                          |        "urn:ietf:params:jmap:mdn":{}
@@ -121,6 +123,7 @@ object SessionRoutesContract {
                          |    "urn:ietf:params:jmap:mail" : "29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6",
                          |    "urn:apache:james:params:jmap:mail:quota": "29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6",
                          |    "urn:ietf:params:jmap:quota": "29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6",
+                         |    "urn:apache:james:params:jmap:mail:identity:sortorder": "29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6",
                          |    "urn:apache:james:params:jmap:mail:shares": "29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6",
                          |    "urn:ietf:params:jmap:vacationresponse": "29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6",
                          |    "urn:ietf:params:jmap:mdn": "29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6"
@@ -167,7 +170,6 @@ trait SessionRoutesContract {
         .get("/session")
       .`then`
         .statusCode(SC_OK)
-        .header("Content-Length", "3185")
         .contentType(JSON)
       .extract()
         .body()
diff --git a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/core/Capabilities.scala b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/core/Capabilities.scala
index 2d8fe248a8..43a43190fb 100644
--- a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/core/Capabilities.scala
+++ b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/core/Capabilities.scala
@@ -18,47 +18,17 @@
  ****************************************************************/
 package org.apache.james.jmap.core
 
-import java.net.URI
-
 import com.google.common.annotations.VisibleForTesting
-import eu.timepit.refined.auto._
 import org.apache.james.jmap.core.CapabilityIdentifier.CapabilityIdentifier
 
 object DefaultCapabilities {
-  def coreCapability(maxUploadSize: MaxSizeUpload) = CoreCapability(
-    properties = CoreCapabilityProperties(
-      maxUploadSize,
-      MaxConcurrentUpload(4L),
-      MaxSizeRequest(10_000_000L),
-      MaxConcurrentRequests(4L),
-      MaxCallsInRequest(16L),
-      MaxObjectsInGet(500L),
-      MaxObjectsInSet(500L),
-      collationAlgorithms = List("i;unicode-casemap")))
-
-  def webSocketCapability(url: URI) = WebSocketCapability(
-    properties = WebSocketCapabilityProperties(SupportsPush(true), url))
-
-  val MAIL_CAPABILITY = MailCapability(
-    properties = MailCapabilityProperties(
-      MaxMailboxesPerEmail(Some(10_000_000L)),
-      MaxMailboxDepth(None),
-      MaxSizeMailboxName(200L),
-      MaxSizeAttachmentsPerEmail(20_000_000L),
-      emailQuerySortOptions = List("receivedAt", "sentAt", "size", "from", "to", "subject"),
-      MayCreateTopLevelMailbox(true)))
-  val QUOTA_CAPABILITY = QuotaCapability()
-  val SHARES_CAPABILITY = SharesCapability()
-  val MDN_CAPABILITY = MDNCapability()
-  val VACATION_RESPONSE_CAPABILITY = VacationResponseCapability()
-  val SUBMISSION_CAPABILITY = SubmissionCapability()
-
   @VisibleForTesting
   def supported(configuration: JmapRfc8621Configuration): Set[CapabilityFactory] = Set(
     CoreCapabilityFactory(configuration.maxUploadSize),
     MailCapabilityFactory,
     QuotaCapabilityFactory,
     JmapQuotaCapabilityFactory,
+    IdentitySortOrderCapabilityFactory,
     SharesCapabilityFactory,
     VacationResponseCapabilityFactory,
     SharesCapabilityFactory,
diff --git a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/core/Capability.scala b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/core/Capability.scala
index 49a6bd28c4..25a715e99e 100644
--- a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/core/Capability.scala
+++ b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/core/Capability.scala
@@ -26,7 +26,7 @@ import eu.timepit.refined.api.Refined
 import eu.timepit.refined.auto._
 import eu.timepit.refined.collection.NonEmpty
 import eu.timepit.refined.string.Uri
-import org.apache.james.jmap.core.CapabilityIdentifier.{CapabilityIdentifier, EMAIL_SUBMISSION, JAMES_QUOTA, JAMES_SHARES, JMAP_CORE, JMAP_MAIL, JMAP_MDN, JMAP_QUOTA, JMAP_VACATION_RESPONSE, JMAP_WEBSOCKET}
+import org.apache.james.jmap.core.CapabilityIdentifier.{CapabilityIdentifier, EMAIL_SUBMISSION, JAMES_IDENTITY_SORTORDER, JAMES_QUOTA, JAMES_SHARES, JMAP_CORE, JMAP_MAIL, JMAP_MDN, JMAP_QUOTA, JMAP_VACATION_RESPONSE, JMAP_WEBSOCKET}
 import org.apache.james.jmap.core.CoreCapabilityProperties.CollationAlgorithm
 import org.apache.james.jmap.core.MailCapability.EmailQuerySortOption
 import org.apache.james.jmap.core.UnsignedInt.{UnsignedInt, UnsignedIntConstraint}
@@ -50,6 +50,7 @@ object CapabilityIdentifier {
   val JAMES_QUOTA: CapabilityIdentifier = "urn:apache:james:params:jmap:mail:quota"
   val JMAP_QUOTA: CapabilityIdentifier = "urn:ietf:params:jmap:quota"
   val JAMES_SHARES: CapabilityIdentifier = "urn:apache:james:params:jmap:mail:shares"
+  val JAMES_IDENTITY_SORTORDER: CapabilityIdentifier = "urn:apache:james:params:jmap:mail:identity:sortorder"
   val JMAP_MDN: CapabilityIdentifier = "urn:ietf:params:jmap:mdn"
 }
 
@@ -218,6 +219,19 @@ case object QuotaCapabilityFactory extends CapabilityFactory {
   override def create(urlPrefixes: UrlPrefixes): Capability = QuotaCapability()
 }
 
+final case class IdentitySortOrderCapabilityProperties() extends CapabilityProperties {
+  override def jsonify(): JsObject = Json.obj()
+}
+
+final case class IdentitySortOrderCapability(properties: IdentitySortOrderCapabilityProperties = IdentitySortOrderCapabilityProperties(),
+                                             identifier: CapabilityIdentifier = JAMES_IDENTITY_SORTORDER) extends Capability
+
+case object IdentitySortOrderCapabilityFactory extends CapabilityFactory {
+  override def id(): CapabilityIdentifier = JAMES_IDENTITY_SORTORDER
+
+  override def create(urlPrefixes: UrlPrefixes): Capability = IdentitySortOrderCapability()
+}
+
 final case class SharesCapabilityProperties() extends CapabilityProperties {
   override def jsonify(): JsObject = Json.obj()
 }
diff --git a/server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/routes/SessionRoutesTest.scala b/server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/routes/SessionRoutesTest.scala
index 3f90df64c7..a32e7e4b36 100644
--- a/server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/routes/SessionRoutesTest.scala
+++ b/server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/routes/SessionRoutesTest.scala
@@ -149,6 +149,7 @@ class SessionRoutesTest extends AnyFlatSpec with BeforeAndAfter with Matchers {
                          |      "supportsPush": true,
                          |      "url": "ws://localhost/jmap/ws"
                          |    },
+                         |    "urn:apache:james:params:jmap:mail:identity:sortorder": {},
                          |    "urn:apache:james:params:jmap:mail:quota": {},
                          |    "urn:ietf:params:jmap:quota": {},
                          |    "urn:apache:james:params:jmap:mail:shares": {},
@@ -188,6 +189,7 @@ class SessionRoutesTest extends AnyFlatSpec with BeforeAndAfter with Matchers {
                          |        },
                          |        "urn:apache:james:params:jmap:mail:quota": {},
                          |        "urn:ietf:params:jmap:quota": {},
+                         |        "urn:apache:james:params:jmap:mail:identity:sortorder": {},
                          |        "urn:apache:james:params:jmap:mail:shares": {},
                          |        "urn:ietf:params:jmap:vacationresponse":{}
                          |      }
@@ -200,6 +202,7 @@ class SessionRoutesTest extends AnyFlatSpec with BeforeAndAfter with Matchers {
                          |    "urn:ietf:params:jmap:mail" : "0fe275bf13ff761407c17f64b1dfae2f4b3186feea223d7267b79f873a105401",
                          |    "urn:apache:james:params:jmap:mail:quota": "0fe275bf13ff761407c17f64b1dfae2f4b3186feea223d7267b79f873a105401",
                          |    "urn:ietf:params:jmap:quota": "0fe275bf13ff761407c17f64b1dfae2f4b3186feea223d7267b79f873a105401",
+                         |    "urn:apache:james:params:jmap:mail:identity:sortorder": "0fe275bf13ff761407c17f64b1dfae2f4b3186feea223d7267b79f873a105401",
                          |    "urn:apache:james:params:jmap:mail:shares": "0fe275bf13ff761407c17f64b1dfae2f4b3186feea223d7267b79f873a105401",
                          |    "urn:ietf:params:jmap:vacationresponse": "0fe275bf13ff761407c17f64b1dfae2f4b3186feea223d7267b79f873a105401"
                          |  },


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