JAMES-2292 Introduce GET mail queue messages endpoint
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/3a014174 Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/3a014174 Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/3a014174 Branch: refs/heads/master Commit: 3a014174946dbb440333ede3737290370c5b6351 Parents: 8d77e62 Author: Antoine Duprat <[email protected]> Authored: Tue Jan 23 15:35:11 2018 +0100 Committer: benwa <[email protected]> Committed: Thu Jan 25 11:46:04 2018 +0700 ---------------------------------------------------------------------- .../webadmin/webadmin-mailqueue/pom.xml | 5 ++ .../james/webadmin/routes/MailQueueRoutes.java | 54 +++++++++++++++++++- .../webadmin/routes/MailQueueRoutesTest.java | 53 +++++++++++++++++++ 3 files changed, 111 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/3a014174/server/protocols/webadmin/webadmin-mailqueue/pom.xml ---------------------------------------------------------------------- diff --git a/server/protocols/webadmin/webadmin-mailqueue/pom.xml b/server/protocols/webadmin/webadmin-mailqueue/pom.xml index bdb1860..92402e5 100644 --- a/server/protocols/webadmin/webadmin-mailqueue/pom.xml +++ b/server/protocols/webadmin/webadmin-mailqueue/pom.xml @@ -78,6 +78,11 @@ <artifactId>junit</artifactId> <scope>test</scope> </dependency> + <dependency> + <groupId>org.hamcrest</groupId> + <artifactId>java-hamcrest</artifactId> + <scope>test</scope> + </dependency> </dependencies> <build> http://git-wip-us.apache.org/repos/asf/james-project/blob/3a014174/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/routes/MailQueueRoutes.java ---------------------------------------------------------------------- diff --git a/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/routes/MailQueueRoutes.java b/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/routes/MailQueueRoutes.java index 5a6aa15..c44ee91 100644 --- a/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/routes/MailQueueRoutes.java +++ b/server/protocols/webadmin/webadmin-mailqueue/src/main/java/org/apache/james/webadmin/routes/MailQueueRoutes.java @@ -22,7 +22,6 @@ package org.apache.james.webadmin.routes; import static org.apache.james.webadmin.Constants.SEPARATOR; import java.util.List; -import java.util.Optional; import javax.inject.Inject; import javax.ws.rs.GET; @@ -32,8 +31,10 @@ import javax.ws.rs.Produces; import org.apache.james.queue.api.MailQueue.MailQueueException; import org.apache.james.queue.api.MailQueueFactory; import org.apache.james.queue.api.ManageableMailQueue; +import org.apache.james.util.streams.Iterators; import org.apache.james.webadmin.Routes; import org.apache.james.webadmin.dto.MailQueueDTO; +import org.apache.james.webadmin.dto.MailQueueItemDTO; import org.apache.james.webadmin.utils.ErrorResponder; import org.apache.james.webadmin.utils.ErrorResponder.ErrorType; import org.apache.james.webadmin.utils.JsonTransformer; @@ -41,8 +42,10 @@ import org.eclipse.jetty.http.HttpStatus; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.github.fge.lambdas.Throwing; import com.github.steveash.guavate.Guavate; import com.google.common.annotations.VisibleForTesting; + import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; @@ -60,6 +63,7 @@ public class MailQueueRoutes implements Routes { @VisibleForTesting static final String BASE_URL = "/mailQueues"; @VisibleForTesting static final String MAIL_QUEUE_NAME = ":mailQueueName"; + @VisibleForTesting static final String MESSAGES = "/messages"; private static final Logger LOGGER = LoggerFactory.getLogger(MailQueueRoutes.class); private final MailQueueFactory<ManageableMailQueue> mailQueueFactory; @@ -76,6 +80,8 @@ public class MailQueueRoutes implements Routes { defineListQueues(service); getMailQueue(service); + + listMessages(service); } @GET @@ -140,4 +146,50 @@ public class MailQueueRoutes implements Routes { .haltError(); } } + + @GET + @Path("/{mailQueueName}/messages") + @ApiImplicitParams({ + @ApiImplicitParam(required = true, dataType = "string", name = "mailQueueName", paramType = "path") + }) + @ApiOperation( + value = "List the messages of the MailQueue" + ) + @ApiResponses(value = { + @ApiResponse(code = HttpStatus.OK_200, message = "OK", response = List.class), + @ApiResponse(code = HttpStatus.NOT_FOUND_404, message = "The MailQueue does not exist."), + @ApiResponse(code = HttpStatus.INTERNAL_SERVER_ERROR_500, message = "Internal server error - Something went bad on the server side.") + }) + public void listMessages(Service service) { + service.get(BASE_URL + SEPARATOR + MAIL_QUEUE_NAME + MESSAGES, + (request, response) -> listMessages(request), + jsonTransformer); + } + + private List<MailQueueItemDTO> listMessages(Request request) { + String mailQueueName = request.params(MAIL_QUEUE_NAME); + return mailQueueFactory.getQueue(mailQueueName).map(this::listMessages) + .orElseThrow( + () -> ErrorResponder.builder() + .message(String.format("%s can not be found", mailQueueName)) + .statusCode(HttpStatus.NOT_FOUND_404) + .type(ErrorResponder.ErrorType.NOT_FOUND) + .haltError()); + } + + private List<MailQueueItemDTO> listMessages(ManageableMailQueue queue) { + try { + return Iterators.toStream(queue.browse()) + .map(Throwing.function(MailQueueItemDTO::from)) + .collect(Guavate.toImmutableList()); + } catch (MailQueueException e) { + LOGGER.info("Invalid request for getting the mail queue " + queue, e); + throw ErrorResponder.builder() + .statusCode(HttpStatus.BAD_REQUEST_400) + .type(ErrorType.INVALID_ARGUMENT) + .message("Invalid request for getting the mail queue " + queue) + .cause(e) + .haltError(); + } + } } http://git-wip-us.apache.org/repos/asf/james-project/blob/3a014174/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/routes/MailQueueRoutesTest.java ---------------------------------------------------------------------- diff --git a/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/routes/MailQueueRoutesTest.java b/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/routes/MailQueueRoutesTest.java index d45a438..44fc597 100644 --- a/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/routes/MailQueueRoutesTest.java +++ b/server/protocols/webadmin/webadmin-mailqueue/src/test/java/org/apache/james/webadmin/routes/MailQueueRoutesTest.java @@ -24,11 +24,14 @@ import static com.jayway.restassured.config.EncoderConfig.encoderConfig; import static com.jayway.restassured.config.RestAssuredConfig.newConfig; import static org.apache.james.webadmin.WebAdminServer.NO_CONFIGURATION; import static org.assertj.core.api.Assertions.assertThat; +import static org.hamcrest.Matchers.empty; import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.hasSize; import java.nio.charset.StandardCharsets; import java.util.List; +import org.apache.james.core.MailAddress; import org.apache.james.metrics.api.NoopMetricFactory; import org.apache.james.queue.api.Mails; import org.apache.james.queue.api.RawMailQueueItemDecoratorFactory; @@ -37,11 +40,13 @@ import org.apache.james.queue.memory.MemoryMailQueueFactory.MemoryMailQueue; import org.apache.james.webadmin.WebAdminServer; import org.apache.james.webadmin.WebAdminUtils; import org.apache.james.webadmin.utils.JsonTransformer; +import org.apache.mailet.base.test.FakeMail; import org.eclipse.jetty.http.HttpStatus; import org.junit.After; import org.junit.Before; import org.junit.Test; +import com.github.steveash.guavate.Guavate; import com.jayway.restassured.RestAssured; import com.jayway.restassured.builder.RequestSpecBuilder; import com.jayway.restassured.http.ContentType; @@ -162,4 +167,52 @@ public class MailQueueRoutesTest { .statusCode(HttpStatus.NOT_FOUND_404); } + @Test + public void listMessagesShouldReturnEmptyListWhenNoMessages() { + mailQueueFactory.createQueue(FIRST_QUEUE); + + when() + .get(FIRST_QUEUE + "/messages") + .then() + .statusCode(HttpStatus.OK_200) + .contentType(ContentType.JSON) + .body(".", empty()); + } + + @Test + public void listMessagesShouldReturnMessagesWhenSome() throws Exception { + MemoryMailQueue queue = mailQueueFactory.createQueue(FIRST_QUEUE); + queue.enQueue(Mails.defaultMail().build()); + queue.enQueue(Mails.defaultMail().build()); + + when() + .get(FIRST_QUEUE + "/messages") + .then() + .statusCode(HttpStatus.OK_200) + .contentType(ContentType.JSON) + .body(".", hasSize(2)); + } + + @Test + public void listMessagesShouldReturnMessageDetailWhenSome() throws Exception { + MemoryMailQueue queue = mailQueueFactory.createQueue(FIRST_QUEUE); + FakeMail mail = Mails.defaultMail().build(); + queue.enQueue(mail); + + String firstMessage = "[0]"; + List<String> expectedRecipients = mail.getRecipients().stream() + .map(MailAddress::asPrettyString) + .collect(Guavate.toImmutableList()); + + when() + .get(FIRST_QUEUE + "/messages") + .then() + .statusCode(HttpStatus.OK_200) + .contentType(ContentType.JSON) + .body(".", hasSize(1)) + .body(firstMessage + ".name", equalTo(mail.getName())) + .body(firstMessage + ".sender", equalTo(mail.getSender().asPrettyString())) + .body(firstMessage + ".recipients", equalTo(expectedRecipients)) + .body(firstMessage + ".delayed", equalTo(false)); + } } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
