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 2020/11/20 02:18:08 UTC
[james-project] 02/18: JAMES-3440 EmailQuery Limit & Position
validation should not rely on Mono
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 8e6d0efbb67804b8ea662aa1a5c21bdd1fb3c236
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Mon Nov 16 13:57:36 2020 +0700
JAMES-3440 EmailQuery Limit & Position validation should not rely on Mono
Synchronous checks needs to be represented via an Either
---
.../scala/org/apache/james/jmap/core/Query.scala | 21 ++++++++++----------
.../james/jmap/method/EmailQueryMethod.scala | 23 ++++++++++++----------
2 files changed, 23 insertions(+), 21 deletions(-)
diff --git a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/core/Query.scala b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/core/Query.scala
index 3e746d8..b5d0473 100644
--- a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/core/Query.scala
+++ b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/core/Query.scala
@@ -25,20 +25,19 @@ import eu.timepit.refined.auto._
import eu.timepit.refined.numeric.{NonNegative, Positive}
import eu.timepit.refined.refineV
import org.apache.james.mailbox.model.{MailboxId, MessageId}
-import reactor.core.scala.publisher.SMono
case class PositionUnparsed(value: Int) extends AnyVal
object Position {
type Position = Int Refined NonNegative
val zero: Position = 0
- def validateRequestPosition(requestPosition: Option[PositionUnparsed]): SMono[Position] = {
+ def validateRequestPosition(requestPosition: Option[PositionUnparsed]): Either[IllegalArgumentException, Position] = {
val refinedPosition : Option[Either[String, Position]] = requestPosition.map(position => refineV[NonNegative](position.value))
refinedPosition match {
- case Some(Left(_)) => SMono.raiseError(new IllegalArgumentException(s"Negative position are not supported yet. ${requestPosition.map(_.value).getOrElse("")} was provided."))
- case Some(Right(position)) => SMono.just(position)
- case None => SMono.just(Position.zero)
+ case Some(Left(_)) => Left(new IllegalArgumentException(s"Negative position are not supported yet. ${requestPosition.map(_.value).getOrElse("")} was provided."))
+ case Some(Right(position)) => Right(position)
+ case None => Right(Position.zero)
}
}
}
@@ -46,16 +45,16 @@ object Position {
case class LimitUnparsed(value: Long) extends AnyVal
object Limit {
- type Limit = Long Refined Positive
- val default: Limit = 256L
+ type Limit = Int Refined Positive
+ val default: Limit = 256
- def validateRequestLimit(requestLimit: Option[LimitUnparsed]): SMono[Limit] = {
+ def validateRequestLimit(requestLimit: Option[LimitUnparsed]): Either[IllegalArgumentException, Limit] = {
val refinedLimit : Option[Either[String, Limit]] = requestLimit.map(limit => refineV[Positive](limit.value))
refinedLimit match {
- case Some(Left(_)) => SMono.raiseError(new IllegalArgumentException(s"The limit can not be negative. ${requestLimit.map(_.value).getOrElse("")} was provided."))
- case Some(Right(limit)) if limit.value < default.value => SMono.just(limit)
- case _ => SMono.just(default)
+ case Some(Left(_)) => Left(new IllegalArgumentException(s"The limit can not be negative. ${requestLimit.map(_.value).getOrElse("")} was provided."))
+ case Some(Right(limit)) if limit.value < default.value => Right(limit)
+ case _ => Right(default)
}
}
}
diff --git a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/EmailQueryMethod.scala b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/EmailQueryMethod.scala
index 895d890..b2bfb02 100644
--- a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/EmailQueryMethod.scala
+++ b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/EmailQueryMethod.scala
@@ -54,16 +54,19 @@ class EmailQueryMethod @Inject() (serializer: EmailQuerySerializer,
private def processRequest(mailboxSession: MailboxSession,
invocation: Invocation,
request: EmailQueryRequest,
- capabilities: Set[CapabilityIdentifier]): SMono[Invocation] = {
- searchQueryFromRequest(request, capabilities, mailboxSession) match {
- case Left(error) => SMono.raiseError(error)
- case Right(searchQuery) => for {
- positionToUse <- Position.validateRequestPosition(request.position)
- limitToUse <- Limit.validateRequestLimit(request.limit)
- response <- executeQuery(mailboxSession, request, searchQuery, positionToUse, limitToUse)
- } yield Invocation(methodName = methodName, arguments = Arguments(serializer.serialize(response)), methodCallId = invocation.methodCallId)
- }
- }
+ capabilities: Set[CapabilityIdentifier]): SMono[Invocation] =
+ searchQueryFromRequest(request, capabilities, mailboxSession)
+ .flatMap(searchQuery => Limit.validateRequestLimit(request.limit).map((searchQuery, _)))
+ .flatMap {
+ case (searchQuery, limit) => Position.validateRequestPosition(request.position)
+ .map((searchQuery, limit, _))
+ }.map {
+ case (searchQuery, limitToUse, positionToUse) => executeQuery(mailboxSession, request, searchQuery, positionToUse, limitToUse)
+ .map(response => Invocation(
+ methodName = methodName,
+ arguments = Arguments(serializer.serialize(response)),
+ methodCallId = invocation.methodCallId))
+ }.fold(SMono.raiseError, res => res)
override def getRequest(mailboxSession: MailboxSession, invocation: Invocation): SMono[EmailQueryRequest] = asEmailQueryRequest(invocation.arguments)
---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org