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 2018/06/26 09:13:05 UTC

[09/20] james-project git commit: JAMES-2151 Update REST API endpoints for Sieve quota

JAMES-2151 Update REST API endpoints for Sieve quota

Differentiate /sieve/quota/default from /sieve/quota/users/bob@domain.tld

Also DELETEs should be idempotent.


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/3caa3d6c
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/3caa3d6c
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/3caa3d6c

Branch: refs/heads/master
Commit: 3caa3d6c3ae8366f21769000fe4c25b1666d8254
Parents: 685a13b
Author: benwa <bt...@linagora.com>
Authored: Fri Jun 22 11:34:10 2018 +0700
Committer: benwa <bt...@linagora.com>
Committed: Tue Jun 26 16:06:31 2018 +0700

----------------------------------------------------------------------
 .../james/webadmin/routes/SieveQuotaRoutes.java | 29 ++++------
 .../webadmin/routes/SieveQuotaRoutesTest.java   | 58 ++++++++++----------
 2 files changed, 40 insertions(+), 47 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/3caa3d6c/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/SieveQuotaRoutes.java
----------------------------------------------------------------------
diff --git a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/SieveQuotaRoutes.java b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/SieveQuotaRoutes.java
index a1fb584..1b99b72 100644
--- a/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/SieveQuotaRoutes.java
+++ b/server/protocols/webadmin/webadmin-data/src/main/java/org/apache/james/webadmin/routes/SieveQuotaRoutes.java
@@ -42,6 +42,8 @@ import org.eclipse.jetty.http.HttpStatus;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.base.Joiner;
+
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
@@ -57,8 +59,9 @@ import spark.Service;
 public class SieveQuotaRoutes implements Routes {
 
     static final String ROOT_PATH = "/sieve/quota";
+    public static final String DEFAULT_QUOTA_PATH = ROOT_PATH + SEPARATOR + "default";
     private static final String USER_ID = "userId";
-    private static final String USER_SIEVE_QUOTA_PATH = ROOT_PATH + SEPARATOR + ":" + USER_ID;
+    private static final String USER_SIEVE_QUOTA_PATH = Joiner.on(SEPARATOR).join(ROOT_PATH, "users", ":" + USER_ID);
     private static final String REQUESTED_SIZE = "requestedSize";
     private static final Logger LOGGER = LoggerFactory.getLogger(SieveQuotaRoutes.class);
 
@@ -92,7 +95,7 @@ public class SieveQuotaRoutes implements Routes {
             @ApiResponse(code = 500, message = "Internal server error - Something went bad on the server side.")
     })
     public void defineGetGlobalSieveQuota(Service service) {
-        service.get(ROOT_PATH, (request, response) -> {
+        service.get(DEFAULT_QUOTA_PATH, (request, response) -> {
             try {
                 QuotaSize sieveQuota = sieveQuotaRepository.getDefaultQuota();
                 response.status(HttpStatus.OK_200);
@@ -119,7 +122,7 @@ public class SieveQuotaRoutes implements Routes {
             @ApiResponse(code = 500, message = "Internal server error - Something went bad on the server side.")
     })
     public void defineUpdateGlobalSieveQuota(Service service) {
-        service.put(ROOT_PATH, (request, response) -> {
+        service.put(DEFAULT_QUOTA_PATH, (request, response) -> {
             try {
                 QuotaSize requestedSize = extractRequestedQuotaSizeFromRequest(request);
                 sieveQuotaRepository.setDefaultQuota(requestedSize);
@@ -145,18 +148,13 @@ public class SieveQuotaRoutes implements Routes {
             @ApiResponse(code = 500, message = "Internal server error - Something went bad on the server side.")
     })
     public void defineRemoveGlobalSieveQuota(Service service) {
-        service.delete(ROOT_PATH, (request, response) -> {
+        service.delete(DEFAULT_QUOTA_PATH, (request, response) -> {
             try {
                 sieveQuotaRepository.removeQuota();
-                response.status(HttpStatus.NO_CONTENT_204);
             } catch (QuotaNotFoundException e) {
-                LOGGER.info("Global sieve quota not set", e);
-                throw ErrorResponder.builder()
-                    .type(ErrorResponder.ErrorType.NOT_FOUND)
-                    .statusCode(HttpStatus.NOT_FOUND_404)
-                    .message("Global sieve quota not set")
-                    .haltError();
+                // Do nothing
             }
+            response.status(HttpStatus.NO_CONTENT_204);
             return Constants.EMPTY_BODY;
         });
     }
@@ -235,15 +233,10 @@ public class SieveQuotaRoutes implements Routes {
             User userId = User.fromUsername(request.params(USER_ID));
             try {
                 sieveQuotaRepository.removeQuota(userId);
-                response.status(HttpStatus.NO_CONTENT_204);
             } catch (QuotaNotFoundException e) {
-                LOGGER.info("User sieve quota not set", e);
-                throw ErrorResponder.builder()
-                    .type(ErrorResponder.ErrorType.NOT_FOUND)
-                    .statusCode(HttpStatus.NOT_FOUND_404)
-                    .message("User sieve quota not set")
-                    .haltError();
+                // Do nothing
             }
+            response.status(HttpStatus.NO_CONTENT_204);
             return Constants.EMPTY_BODY;
         });
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/3caa3d6c/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/SieveQuotaRoutesTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/SieveQuotaRoutesTest.java b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/SieveQuotaRoutesTest.java
index 41be8cc..80b3891 100644
--- a/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/SieveQuotaRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-data/src/test/java/org/apache/james/webadmin/routes/SieveQuotaRoutesTest.java
@@ -20,11 +20,11 @@
 package org.apache.james.webadmin.routes;
 
 import static com.jayway.restassured.RestAssured.given;
-import static org.apache.james.webadmin.Constants.SEPARATOR;
 import static org.apache.james.webadmin.WebAdminServer.NO_CONFIGURATION;
-import static org.apache.james.webadmin.routes.SieveQuotaRoutes.ROOT_PATH;
 import static org.assertj.core.api.Assertions.assertThat;
 
+import org.apache.james.core.User;
+import org.apache.james.core.quota.QuotaSize;
 import org.apache.james.metrics.logger.DefaultMetricFactory;
 import org.apache.james.sieverepository.api.SieveQuotaRepository;
 import org.apache.james.sieverepository.memory.InMemorySieveQuotaRepository;
@@ -41,7 +41,7 @@ import com.jayway.restassured.http.ContentType;
 
 public class SieveQuotaRoutesTest {
 
-    private static final String USER_A = "userA";
+    private static final User USER_A = User.fromUsername("userA");
 
     private WebAdminServer webAdminServer;
     private SieveQuotaRepository sieveRepository;
@@ -67,47 +67,47 @@ public class SieveQuotaRoutesTest {
     @Test
     public void getGlobalSieveQuotaShouldReturn404WhenNoQuotaSet() {
         given()
-            .get(SieveQuotaRoutes.ROOT_PATH)
+            .get("/sieve/quota/default")
         .then()
             .statusCode(404);
     }
 
     @Test
     public void getGlobalSieveQuotaShouldReturnStoredValue() throws Exception {
-        long value = 1000L;
+        QuotaSize value = QuotaSize.size(1000L);
         sieveRepository.setDefaultQuota(value);
 
         long actual =
             given()
-                .get(SieveQuotaRoutes.ROOT_PATH)
+                .get("/sieve/quota/default")
             .then()
                 .statusCode(HttpStatus.OK_200)
                 .contentType(ContentType.JSON)
                 .extract()
                 .as(Long.class);
 
-        assertThat(actual).isEqualTo(value);
+        assertThat(actual).isEqualTo(value.asLong());
     }
 
     @Test
     public void updateGlobalSieveQuotaShouldUpdateStoredValue() throws Exception {
-        sieveRepository.setDefaultQuota(500L);
+        sieveRepository.setDefaultQuota(QuotaSize.size(500L));
         long requiredSize = 1024L;
 
         given()
             .body(requiredSize)
-            .put(SieveQuotaRoutes.ROOT_PATH)
+            .put("/sieve/quota/default")
         .then()
             .statusCode(HttpStatus.NO_CONTENT_204);
 
-        assertThat(sieveRepository.getDefaultQuota()).isEqualTo(requiredSize);
+        assertThat(sieveRepository.getDefaultQuota().asLong()).isEqualTo(requiredSize);
     }
 
     @Test
     public void updateGlobalSieveQuotaShouldReturn400WhenMalformedJSON() {
         given()
             .body("invalid")
-            .put(SieveQuotaRoutes.ROOT_PATH)
+            .put("/sieve/quota/default")
         .then()
             .statusCode(HttpStatus.BAD_REQUEST_400);
     }
@@ -116,7 +116,7 @@ public class SieveQuotaRoutesTest {
     public void updateGlobalSieveQuotaShouldReturn400WhenRequestedSizeNotPositiveInteger() {
         given()
             .body(-100L)
-            .put(SieveQuotaRoutes.ROOT_PATH)
+            .put("/sieve/quota/default")
         .then()
             .statusCode(HttpStatus.BAD_REQUEST_400);
     }
@@ -124,17 +124,17 @@ public class SieveQuotaRoutesTest {
     @Test
     public void removeGlobalSieveQuotaShouldReturn404WhenNoQuotaSet() {
         given()
-            .delete(SieveQuotaRoutes.ROOT_PATH)
+            .delete("/sieve/quota/default")
         .then()
-            .statusCode(HttpStatus.NOT_FOUND_404);
+            .statusCode(HttpStatus.NO_CONTENT_204);
     }
 
     @Test
     public void removeGlobalSieveQuotaShouldRemoveGlobalSieveQuota() throws Exception {
-        sieveRepository.setDefaultQuota(1024L);
+        sieveRepository.setDefaultQuota(QuotaSize.size(1024L));
 
         given()
-            .delete(SieveQuotaRoutes.ROOT_PATH)
+            .delete("/sieve/quota/default")
         .then()
             .statusCode(HttpStatus.NO_CONTENT_204);
     }
@@ -142,47 +142,47 @@ public class SieveQuotaRoutesTest {
     @Test
     public void getPerUserQuotaShouldReturn404WhenNoQuotaSetForUser() {
         given()
-            .get(ROOT_PATH + SEPARATOR + USER_A)
+            .get("/sieve/quota/users/" + USER_A.asString())
         .then()
             .statusCode(HttpStatus.NOT_FOUND_404);
     }
 
     @Test
     public void getPerUserSieveQuotaShouldReturnedStoredValue() throws Exception {
-        long value = 1024L;
+        QuotaSize value = QuotaSize.size(1024L);
         sieveRepository.setQuota(USER_A, value);
 
         long actual =
             given()
-                .get(ROOT_PATH + SEPARATOR + USER_A)
+                .get("/sieve/quota/users/" + USER_A.asString())
             .then()
                 .statusCode(HttpStatus.OK_200)
                 .contentType(ContentType.JSON)
                 .extract()
                 .as(Long.class);
 
-        assertThat(actual).isEqualTo(value);
+        assertThat(actual).isEqualTo(value.asLong());
     }
 
     @Test
     public void updatePerUserSieveQuotaShouldUpdateStoredValue() throws Exception {
-        sieveRepository.setQuota(USER_A, 500L);
+        sieveRepository.setQuota(USER_A, QuotaSize.size(500L));
         long requiredSize = 1024L;
 
         given()
             .body(requiredSize)
-            .put(ROOT_PATH + SEPARATOR + USER_A)
+            .put("/sieve/quota/users/" + USER_A.asString())
         .then()
             .statusCode(HttpStatus.NO_CONTENT_204);
 
-        assertThat(sieveRepository.getQuota(USER_A)).isEqualTo(requiredSize);
+        assertThat(sieveRepository.getQuota(USER_A).asLong()).isEqualTo(requiredSize);
     }
 
     @Test
     public void updatePerUserSieveQuotaShouldReturn400WhenMalformedJSON() {
         given()
             .body("invalid")
-            .put(ROOT_PATH + SEPARATOR + USER_A)
+            .put("/sieve/quota/users/" + USER_A.asString())
         .then()
             .statusCode(HttpStatus.BAD_REQUEST_400);
     }
@@ -191,7 +191,7 @@ public class SieveQuotaRoutesTest {
     public void updatePerUserSieveQuotaShouldReturn400WhenRequestedSizeNotPositiveInteger() {
         given()
             .body(-100L)
-            .put(ROOT_PATH + SEPARATOR + USER_A)
+            .put("/sieve/quota/users/" + USER_A.asString())
         .then()
             .statusCode(HttpStatus.BAD_REQUEST_400);
     }
@@ -199,17 +199,17 @@ public class SieveQuotaRoutesTest {
     @Test
     public void removePerUserSieveQuotaShouldReturn404WhenNoQuotaSetForUser() {
         given()
-            .delete(ROOT_PATH + SEPARATOR + USER_A)
+            .delete("/sieve/quota/users/" + USER_A.asString())
         .then()
-            .statusCode(HttpStatus.NOT_FOUND_404);
+            .statusCode(HttpStatus.NO_CONTENT_204);
     }
 
     @Test
     public void removePerUserSieveQuotaShouldRemoveQuotaForUser() throws Exception {
-        sieveRepository.setQuota(USER_A, 1024L);
+        sieveRepository.setQuota(USER_A, QuotaSize.size(1024));
 
         given()
-            .delete(ROOT_PATH + SEPARATOR + USER_A)
+            .delete("/sieve/quota/users/" + USER_A.asString())
         .then()
             .statusCode(HttpStatus.NO_CONTENT_204);
     }


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