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 7d3624a9ba169e75889ca7aabf81e31003a2e8dd
Author: Benoit Tellier <[email protected]>
AuthorDate: Thu Oct 22 13:03:10 2020 +0700

    JAMES-3411 [REFACTORING] Validate EmailSetUpdates upfront
---
 .../apache/james/jmap/method/EmailSetMethod.scala  | 33 ++++++++++------------
 1 file changed, 15 insertions(+), 18 deletions(-)

diff --git 
a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/EmailSetMethod.scala
 
b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/EmailSetMethod.scala
index 8455658..051d435 100644
--- 
a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/EmailSetMethod.scala
+++ 
b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/EmailSetMethod.scala
@@ -25,7 +25,7 @@ import javax.mail.Flags
 import org.apache.james.jmap.http.SessionSupplier
 import org.apache.james.jmap.json.{EmailSetSerializer, ResponseSerializer}
 import org.apache.james.jmap.mail.EmailSet.UnparsedMessageId
-import org.apache.james.jmap.mail.{DestroyIds, EmailSet, EmailSetRequest, 
EmailSetResponse, EmailSetUpdate, MailboxIds, ValidatedEmailSetUpdate}
+import org.apache.james.jmap.mail.{DestroyIds, EmailSet, EmailSetRequest, 
EmailSetResponse, MailboxIds, ValidatedEmailSetUpdate}
 import org.apache.james.jmap.model.CapabilityIdentifier.CapabilityIdentifier
 import org.apache.james.jmap.model.DefaultCapabilities.{CORE_CAPABILITY, 
MAIL_CAPABILITY}
 import org.apache.james.jmap.model.Invocation.{Arguments, MethodName}
@@ -174,22 +174,23 @@ class EmailSetMethod @Inject()(serializer: 
EmailSetSerializer,
   }
 
   private def update(updates: Map[UnparsedMessageId, JsObject], session: 
MailboxSession): SMono[UpdateResults] = {
-    val validatedUpdates: List[Either[UpdateFailure, (MessageId, 
EmailSetUpdate)]] = updates
+    val validatedUpdates: List[Either[UpdateFailure, (MessageId, 
ValidatedEmailSetUpdate)]] = updates
       .map({
         case (unparsedMessageId, json) => 
EmailSet.parse(messageIdFactory)(unparsedMessageId)
           .toEither
           .left.map(e => UpdateFailure(unparsedMessageId, e))
           .flatMap(id => serializer.deserializeEmailSetUpdate(json)
-            .asEither
-            .fold(e => Left(UpdateFailure(unparsedMessageId, new 
IllegalArgumentException(e.toString()))),
-              (emailSetUpdate: EmailSetUpdate) => Right((id, emailSetUpdate))))
+            .asEither.left.map(e => new IllegalArgumentException(e.toString))
+            .flatMap(_.validate)
+            .fold(e => Left(UpdateFailure(unparsedMessageId, e)),
+              emailSetUpdate => Right((id, emailSetUpdate))))
       })
       .toList
     val failures: List[UpdateFailure] = validatedUpdates.flatMap({
       case Left(e) => Some(e)
       case _ => None
     })
-    val validUpdates: List[(MessageId, EmailSetUpdate)] = 
validatedUpdates.flatMap({
+    val validUpdates: List[(MessageId, ValidatedEmailSetUpdate)] = 
validatedUpdates.flatMap({
       case Right(pair) => Some(pair)
       case _ => None
     })
@@ -210,7 +211,7 @@ class EmailSetMethod @Inject()(serializer: 
EmailSetSerializer,
     }
   }
 
-  private def doUpdate(messageId: MessageId, update: EmailSetUpdate, 
storedMetaData: List[ComposedMessageIdWithMetaData], session: MailboxSession): 
SMono[UpdateResult] = {
+  private def doUpdate(messageId: MessageId, update: ValidatedEmailSetUpdate, 
storedMetaData: List[ComposedMessageIdWithMetaData], session: MailboxSession): 
SMono[UpdateResult] = {
     val mailboxIds: MailboxIds = MailboxIds(storedMetaData.map(metaData => 
metaData.getComposedMessageId.getMailboxId))
     val originFlags: Flags = storedMetaData
       .foldLeft[Flags](new Flags())((flags: Flags, m: 
ComposedMessageIdWithMetaData) => {
@@ -221,17 +222,13 @@ class EmailSetMethod @Inject()(serializer: 
EmailSetSerializer,
     if (mailboxIds.value.isEmpty) {
       SMono.just[UpdateResult](UpdateFailure(EmailSet.asUnparsed(messageId), 
MessageNotFoundExeception(messageId)))
     } else {
-      update.validate
-        .fold(
-          e => SMono.just(UpdateFailure(EmailSet.asUnparsed(messageId), e)),
-          validatedUpdate =>
-            updateFlags(messageId, validatedUpdate, mailboxIds, originFlags, 
session)
-              .flatMap {
-                case failure: UpdateFailure => 
SMono.just[UpdateResult](failure)
-                case _: UpdateSuccess => updateMailboxIds(messageId, 
validatedUpdate, mailboxIds, session)
-              }
-              .onErrorResume(e => 
SMono.just[UpdateResult](UpdateFailure(EmailSet.asUnparsed(messageId), e)))
-              
.switchIfEmpty(SMono.just[UpdateResult](UpdateSuccess(messageId))))
+      updateFlags(messageId, update, mailboxIds, originFlags, session)
+        .flatMap {
+          case failure: UpdateFailure => SMono.just[UpdateResult](failure)
+          case _: UpdateSuccess => updateMailboxIds(messageId, update, 
mailboxIds, session)
+        }
+        .onErrorResume(e => 
SMono.just[UpdateResult](UpdateFailure(EmailSet.asUnparsed(messageId), e)))
+        .switchIfEmpty(SMono.just[UpdateResult](UpdateSuccess(messageId)))
     }
   }
 


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

Reply via email to