You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by bt...@apache.org on 2020/08/14 09:07:30 UTC

[james-project] 02/13: JAMES-3349: Propose a refactor for using ProblemDetails

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 4b2825dd56c55874c3d3bcafa41c62bcb02d95c8
Author: duc91 <vd...@linagora.com>
AuthorDate: Tue Aug 11 10:16:33 2020 +0700

    JAMES-3349: Propose a refactor for using ProblemDetails
---
 .../scala/org/apache/james/jmap/model/ProblemDetails.scala    |  8 ++++++++
 .../scala/org/apache/james/jmap/routes/JMAPApiRoutes.scala    | 11 +++++------
 2 files changed, 13 insertions(+), 6 deletions(-)

diff --git a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/model/ProblemDetails.scala b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/model/ProblemDetails.scala
index f617c86..4bfb65c 100644
--- a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/model/ProblemDetails.scala
+++ b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/model/ProblemDetails.scala
@@ -18,6 +18,8 @@
  ****************************************************************/
 package org.apache.james.jmap.model
 
+import eu.timepit.refined.auto._
+import org.apache.http.HttpStatus.SC_BAD_REQUEST
 import org.apache.james.jmap.model.RequestLevelErrorType.ErrorTypeIdentifier
 import org.apache.james.jmap.model.StatusCode.ErrorStatus
 
@@ -27,3 +29,9 @@ import org.apache.james.jmap.model.StatusCode.ErrorStatus
  * see https://jmap.io/spec-core.html#errors
  */
 case class ProblemDetails(`type`: ErrorTypeIdentifier, status: ErrorStatus, limit: Option[String], detail: String)
+
+object ProblemDetails {
+  def notRequestProblem(message: String): ProblemDetails = ProblemDetails(RequestLevelErrorType.NOT_REQUEST, SC_BAD_REQUEST, None, message)
+  def notJSONProblem(message: String): ProblemDetails = ProblemDetails(RequestLevelErrorType.NOT_JSON, SC_BAD_REQUEST, None, message)
+  def unknownCapabilityProblem(message: String): ProblemDetails = ProblemDetails(RequestLevelErrorType.UNKNOWN_CAPABILITY, SC_BAD_REQUEST, None, message)
+}
diff --git a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/routes/JMAPApiRoutes.scala b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/routes/JMAPApiRoutes.scala
index 66b2370..9623f74 100644
--- a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/routes/JMAPApiRoutes.scala
+++ b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/routes/JMAPApiRoutes.scala
@@ -39,7 +39,8 @@ import org.apache.james.jmap.json.Serializer
 import org.apache.james.jmap.method.Method
 import org.apache.james.jmap.model.CapabilityIdentifier.CapabilityIdentifier
 import org.apache.james.jmap.model.Invocation.MethodName
-import org.apache.james.jmap.model.{DefaultCapabilities, ErrorCode, Invocation, ProblemDetails, RequestLevelErrorType, RequestObject, ResponseObject}
+import org.apache.james.jmap.model.ProblemDetails.{notJSONProblem, notRequestProblem, unknownCapabilityProblem}
+import org.apache.james.jmap.model._
 import org.apache.james.jmap.{Endpoint, JMAPRoute, JMAPRoutes}
 import org.apache.james.mailbox.MailboxSession
 import org.slf4j.{Logger, LoggerFactory}
@@ -142,16 +143,14 @@ class JMAPApiRoutes (val authenticator: Authenticator,
 
   private def handleError(throwable: Throwable, httpServerResponse: HttpServerResponse): SMono[Void] = throwable match {
     case exception: IllegalArgumentException => respondDetails(httpServerResponse,
-      ProblemDetails(RequestLevelErrorType.NOT_REQUEST, SC_BAD_REQUEST, None,
+      notRequestProblem(
         s"The request was successfully parsed as JSON but did not match the type signature of the Request object: ${exception.getMessage}"))
     case exception: UnauthorizedException => SMono(handleAuthenticationFailure(httpServerResponse, JMAPApiRoutes.LOGGER, exception))
     case exception: JsonParseException => respondDetails(httpServerResponse,
-      ProblemDetails(RequestLevelErrorType.NOT_JSON, SC_BAD_REQUEST, None,
+      notJSONProblem(
         s"The content type of the request was not application/json or the request did not parse as I-JSON: ${exception.getMessage}"))
     case exception: UnsupportedCapabilitiesException => respondDetails(httpServerResponse,
-      ProblemDetails(RequestLevelErrorType.UNKNOWN_CAPABILITY,
-        SC_BAD_REQUEST, None,
-        s"The request used unsupported capabilities: ${exception.capabilities}"))
+      unknownCapabilityProblem(s"The request used unsupported capabilities: ${exception.capabilities}"))
     case _ => SMono.fromPublisher(handleInternalError(httpServerResponse, throwable))
   }
 


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