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 8e83fe5427419109694c5403c9fcdec507ac3244 Author: Benoit Tellier <[email protected]> AuthorDate: Mon Oct 26 08:45:56 2020 +0100 JAMES-3436 Email/set create: Support receivedAt --- .../rfc8621/contract/EmailSetMethodContract.scala | 63 ++++++++++++++++++++++ .../org/apache/james/jmap/mail/EmailSet.scala | 5 +- .../apache/james/jmap/method/EmailSetMethod.scala | 11 ++-- 3 files changed, 71 insertions(+), 8 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/EmailSetMethodContract.scala b/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/EmailSetMethodContract.scala index 6992bb6..64bbdf6 100644 --- a/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/EmailSetMethodContract.scala +++ b/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/EmailSetMethodContract.scala @@ -20,6 +20,8 @@ package org.apache.james.jmap.rfc8621.contract import java.io.ByteArrayInputStream import java.nio.charset.StandardCharsets +import java.time.ZonedDateTime +import java.time.format.DateTimeFormatter import java.util.Date import io.netty.handler.codec.http.HttpHeaderNames.ACCEPT @@ -31,6 +33,7 @@ import org.apache.http.HttpStatus.SC_OK import org.apache.james.GuiceJamesServer import org.apache.james.jmap.draft.{JmapGuiceProbe, MessageIdProbe} import org.apache.james.jmap.http.UserCredential +import org.apache.james.jmap.model.UTCDate import org.apache.james.jmap.rfc8621.contract.Fixture.{ACCEPT_RFC8621_VERSION_HEADER, ACCOUNT_ID, ANDRE, ANDRE_PASSWORD, BOB, BOB_PASSWORD, DOMAIN, authScheme, baseRequestSpecBuilder} import org.apache.james.mailbox.FlagsBuilder import org.apache.james.mailbox.MessageManager.AppendCommand @@ -48,6 +51,8 @@ import org.junit.jupiter.params.provider.ValueSource import scala.jdk.CollectionConverters._ trait EmailSetMethodContract { + private lazy val UTC_DATE_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssX") + @BeforeEach def setUp(server: GuiceJamesServer): Unit = { server.getProbe(classOf[DataProbeImpl]) @@ -295,6 +300,64 @@ trait EmailSetMethodContract { } @Test + def createShouldSupportReceivedAt(server: GuiceJamesServer): Unit = { + val bobPath = MailboxPath.inbox(BOB) + val mailboxId = server.getProbe(classOf[MailboxProbeImpl]).createMailbox(bobPath) + val receivedAt = ZonedDateTime.now().minusDays(1) + + val request = s"""{ + | "using": ["urn:ietf:params:jmap:core", "urn:ietf:params:jmap:mail"], + | "methodCalls": [ + | ["Email/set", { + | "accountId": "$ACCOUNT_ID", + | "create": { + | "aaaaaa":{ + | "mailboxIds": { + | "${mailboxId.serialize}": true + | }, + | "receivedAt": "${UTCDate(receivedAt).asUTC.format(UTC_DATE_FORMAT)}" + | } + | } + | }, "c1"], + | ["Email/get", + | { + | "accountId": "$ACCOUNT_ID", + | "ids": ["#aaaaaa"], + | "properties": ["mailboxIds", "receivedAt"] + | }, + | "c2"]] + |}""".stripMargin + + 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) + .whenIgnoringPaths("methodResponses[0][1].created.aaaaaa.id") + .inPath("methodResponses[0][1].created.aaaaaa") + .isEqualTo("{}".stripMargin) + + assertThatJson(response) + .whenIgnoringPaths("methodResponses[1][1].list[0].id") + .inPath(s"methodResponses[1][1].list") + .isEqualTo( + s"""[{ + | "mailboxIds": { + | "${mailboxId.serialize}": true + | }, + | "receivedAt": "${UTCDate(receivedAt).asUTC.format(UTC_DATE_FORMAT)}" + |}]""".stripMargin) + } + + @Test def createShouldFailIfForbidden(server: GuiceJamesServer): Unit = { val andrePath = MailboxPath.inbox(ANDRE) val mailboxId = server.getProbe(classOf[MailboxProbeImpl]).createMailbox(andrePath) diff --git a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/EmailSet.scala b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/EmailSet.scala index baedcf7..90c9c41 100644 --- a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/EmailSet.scala +++ b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/mail/EmailSet.scala @@ -27,7 +27,7 @@ import org.apache.james.jmap.mail.EmailSet.{EmailCreationId, UnparsedMessageId} import org.apache.james.jmap.method.WithAccountId import org.apache.james.jmap.model.Id.Id import org.apache.james.jmap.model.State.State -import org.apache.james.jmap.model.{AccountId, Keywords, SetError} +import org.apache.james.jmap.model.{AccountId, Keywords, SetError, UTCDate} import org.apache.james.mailbox.model.MessageId import org.apache.james.mime4j.dom.Message import play.api.libs.json.JsObject @@ -50,7 +50,8 @@ object EmailSet { case class EmailCreationRequest(mailboxIds: MailboxIds, subject: Option[Subject], - keywords: Option[Keywords]) { + keywords: Option[Keywords], + receivedAt: Option[UTCDate]) { def toMime4JMessage: Message = { val builder = Message.Builder.of subject.foreach(value => builder.setSubject(value.value)) 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 759cd30..5cf9af6 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 @@ -18,6 +18,8 @@ ****************************************************************/ package org.apache.james.jmap.method +import java.time.ZonedDateTime +import java.util.Date import java.util.function.Consumer import com.google.common.collect.ImmutableList @@ -26,22 +28,18 @@ import javax.inject.Inject 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, MailboxIds, ValidatedEmailSetUpdate} import org.apache.james.jmap.mail.EmailSet.{EmailCreationId, UnparsedMessageId} -import org.apache.james.jmap.mail.{DestroyIds, EmailCreationRequest, EmailCreationResponse, EmailSet, EmailSetRequest, EmailSetResponse, EmailSetUpdate, MailboxIds, ValidatedEmailSetUpdate} +import org.apache.james.jmap.mail.{DestroyIds, EmailCreationRequest, EmailCreationResponse, 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} import org.apache.james.jmap.model.KeywordsFactory.LENIENT_KEYWORDS_FACTORY import org.apache.james.jmap.model.SetError.SetErrorDescription -import org.apache.james.jmap.model.{Capabilities, ClientId, Id, Invocation, ServerId, SetError, State} +import org.apache.james.jmap.model.{Capabilities, ClientId, Id, Invocation, ServerId, SetError, State, UTCDate} import org.apache.james.mailbox.MessageManager.{AppendCommand, FlagsUpdateMode} import org.apache.james.mailbox.exception.MailboxNotFoundException import org.apache.james.mailbox.model.{ComposedMessageIdWithMetaData, DeleteResult, MailboxId, MessageId, MessageRange} import org.apache.james.mailbox.{MailboxManager, MailboxSession, MessageIdManager, MessageManager} -import org.apache.james.mailbox.model.{ComposedMessageIdWithMetaData, DeleteResult, MailboxId, MessageId} -import org.apache.james.mailbox.{MailboxManager, MailboxSession, MessageIdManager} import org.apache.james.metrics.api.MetricFactory import play.api.libs.json.{JsError, JsObject, JsSuccess} import reactor.core.scala.publisher.{SFlux, SMono} @@ -232,6 +230,7 @@ class EmailSetMethod @Inject()(serializer: EmailSetSerializer, .appendMessage(AppendCommand.builder() .recent() .withFlags(request.keywords.map(_.asFlags).getOrElse(new Flags())) + .withInternalDate(Date.from(request.receivedAt.getOrElse(UTCDate(ZonedDateTime.now())).asUTC.toInstant)) .build(request.toMime4JMessage), mailboxSession) CreationSuccess(clientId, EmailCreationResponse(appendResult.getId.getMessageId)) --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
