Skip to content

Commit

Permalink
JAMES-2099 Swagger API for UserMaibox and GlobalQuota
Browse files Browse the repository at this point in the history
  • Loading branch information
quynhn committed Jul 31, 2017
1 parent 80dae30 commit 9cd602f
Show file tree
Hide file tree
Showing 2 changed files with 264 additions and 50 deletions.
Expand Up @@ -20,6 +20,11 @@
package org.apache.james.webadmin.routes;

import javax.inject.Inject;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;

import org.apache.james.mailbox.model.Quota;
import org.apache.james.mailbox.quota.MaxQuotaManager;
Expand All @@ -30,11 +35,20 @@
import org.apache.james.webadmin.utils.JsonExtractException;
import org.apache.james.webadmin.utils.JsonExtractor;
import org.apache.james.webadmin.utils.JsonTransformer;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import spark.Service;

@Api(tags = "GlobalQuota")
@Path(GlobalQuotaRoutes.QUOTA_ENDPOINT)
@Produces("application/json")
public class GlobalQuotaRoutes implements Routes {

public static final String QUOTA_ENDPOINT = "/quota";
Expand All @@ -45,6 +59,7 @@ public class GlobalQuotaRoutes implements Routes {
private final MaxQuotaManager maxQuotaManager;
private final JsonTransformer jsonTransformer;
private final JsonExtractor<QuotaDTO> jsonExtractor;
private Service service;

@Inject
public GlobalQuotaRoutes(MaxQuotaManager maxQuotaManager, JsonTransformer jsonTransformer) {
Expand All @@ -55,42 +70,96 @@ public GlobalQuotaRoutes(MaxQuotaManager maxQuotaManager, JsonTransformer jsonTr

@Override
public void define(Service service) {
service.get(COUNT_ENDPOINT, (request, response) -> {
long value = maxQuotaManager.getDefaultMaxMessage();
response.status(200);
return value;
}, jsonTransformer);
this.service = service;

service.delete(COUNT_ENDPOINT, (request, response) -> {
maxQuotaManager.setDefaultMaxMessage(Quota.UNLIMITED);
response.status(204);
return Constants.EMPTY_BODY;
});
defineGetQuotaCount();

service.put(COUNT_ENDPOINT, (request, response) -> {
defineDeleteQuotaCount();

defineUpdateQuotaCount();

defineGetQuotaSize();

defineDeleteQuotaSize();

defineUpdateQuotaSize();

defineGetQuota();

defineUpdateQuota();
}

@PUT
@ApiOperation(value = "Updating count and size at the same time")
@ApiImplicitParams({
@ApiImplicitParam(required = true, dataType = "org.apache.james.webadmin.dto.QuotaDTO", paramType = "body")
})
@ApiResponses(value = {
@ApiResponse(code = 204, message = "OK. The value has been updated."),
@ApiResponse(code = 400, message = "The body is not a positive integer or not unlimited value (-1)."),
@ApiResponse(code = 500, message = "Internal server error - Something went bad on the server side.")
})
public void defineUpdateQuota() {
service.put(QUOTA_ENDPOINT, ((request, response) -> {
try {
QuotaRequest quotaRequest = QuotaRequest.parse(request.body());
maxQuotaManager.setDefaultMaxMessage(quotaRequest.getValue());
QuotaDTO quotaDTO = jsonExtractor.parse(request.body());
maxQuotaManager.setDefaultMaxMessage(quotaDTO.getCount());
maxQuotaManager.setDefaultMaxStorage(quotaDTO.getSize());
response.status(204);
} catch (JsonExtractException e) {
LOGGER.info("Malformed JSON", e);
response.status(400);
} catch (IllegalArgumentException e) {
LOGGER.info("Invalid quota. Need to be an integer value greater than 0");
LOGGER.info("Quota should be positive or unlimited (-1)", e);
response.status(400);
}
return Constants.EMPTY_BODY;
});
}));
}

service.get(SIZE_ENDPOINT, (request, response) -> {
long value = maxQuotaManager.getDefaultMaxStorage();
@GET
@ApiOperation(value = "Reading count and size at the same time")
@ApiResponses(value = {
@ApiResponse(code = 200, message = "OK", response = QuotaDTO.class),
@ApiResponse(code = 500, message = "Internal server error - Something went bad on the server side.")
})
public void defineGetQuota() {
service.get(QUOTA_ENDPOINT, (request, response) -> {
QuotaDTO quotaDTO = QuotaDTO.builder()
.count(maxQuotaManager.getDefaultMaxMessage())
.size(maxQuotaManager.getDefaultMaxStorage()).build();
response.status(200);
return value;
return quotaDTO;
}, jsonTransformer);
}

@DELETE
@Path("/size")
@ApiOperation(value = "Removing per quotaroot mail size limitation by updating to unlimited value")
@ApiResponses(value = {
@ApiResponse(code = 204, message = "The value is updated to unlimited value."),
@ApiResponse(code = 500, message = "Internal server error - Something went bad on the server side.")
})
public void defineDeleteQuotaSize() {
service.delete(SIZE_ENDPOINT, (request, response) -> {
maxQuotaManager.setDefaultMaxStorage(Quota.UNLIMITED);
response.status(204);
return Constants.EMPTY_BODY;
});
}

@PUT
@Path("/size")
@ApiOperation(value = "Updating per quotaroot mail size limitation")
@ApiImplicitParams({
@ApiImplicitParam(required = true, dataType = "integer", paramType = "body")
})
@ApiResponses(value = {
@ApiResponse(code = 204, message = "OK. The value has been updated."),
@ApiResponse(code = 400, message = "The body is not a positive integer."),
@ApiResponse(code = 500, message = "Internal server error - Something went bad on the server side.")
})
public void defineUpdateQuotaSize() {
service.put(SIZE_ENDPOINT, (request, response) -> {
try {
QuotaRequest quotaRequest = QuotaRequest.parse(request.body());
Expand All @@ -102,29 +171,75 @@ public void define(Service service) {
}
return Constants.EMPTY_BODY;
});
}

service.get(QUOTA_ENDPOINT, (request, response) -> {
QuotaDTO quotaDTO = QuotaDTO.builder()
.count(maxQuotaManager.getDefaultMaxMessage())
.size(maxQuotaManager.getDefaultMaxStorage()).build();
@GET
@Path("/size")
@ApiOperation(value = "Reading per quotaroot mail size limitation")
@ApiResponses(value = {
@ApiResponse(code = 200, message = "OK", response = Long.class),
@ApiResponse(code = 500, message = "Internal server error - Something went bad on the server side.")
})
public void defineGetQuotaSize() {
service.get(SIZE_ENDPOINT, (request, response) -> {
long value = maxQuotaManager.getDefaultMaxStorage();
response.status(200);
return quotaDTO;
return value;
}, jsonTransformer);
}

service.put(QUOTA_ENDPOINT, ((request, response) -> {
@DELETE
@Path("/count")
@ApiOperation(value = "Removing per quotaroot mail count limitation by updating to unlimited value")
@ApiResponses(value = {
@ApiResponse(code = 204, message = "The value is updated to unlimited value."),
@ApiResponse(code = 500, message = "Internal server error - Something went bad on the server side.")
})
public void defineDeleteQuotaCount() {
service.delete(COUNT_ENDPOINT, (request, response) -> {
maxQuotaManager.setDefaultMaxMessage(Quota.UNLIMITED);
response.status(204);
return Constants.EMPTY_BODY;
});
}

@PUT
@Path("/count")
@ApiOperation(value = "Updating per quotaroot mail count limitation")
@ApiImplicitParams({
@ApiImplicitParam(required = true, dataType = "integer", paramType = "body")
})
@ApiResponses(value = {
@ApiResponse(code = 204, message = "OK. The value has been updated."),
@ApiResponse(code = 400, message = "The body is not a positive integer."),
@ApiResponse(code = 500, message = "Internal server error - Something went bad on the server side.")
})
public void defineUpdateQuotaCount() {
service.put(COUNT_ENDPOINT, (request, response) -> {
try {
QuotaDTO quotaDTO = jsonExtractor.parse(request.body());
maxQuotaManager.setDefaultMaxMessage(quotaDTO.getCount());
maxQuotaManager.setDefaultMaxStorage(quotaDTO.getSize());
QuotaRequest quotaRequest = QuotaRequest.parse(request.body());
maxQuotaManager.setDefaultMaxMessage(quotaRequest.getValue());
response.status(204);
} catch (JsonExtractException e) {
LOGGER.info("Malformed JSON", e);
response.status(400);
} catch (IllegalArgumentException e) {
LOGGER.info("Quota should be positive or unlimited (-1)", e);
LOGGER.info("Invalid quota. Need to be an integer value greater than 0");
response.status(400);
}
return Constants.EMPTY_BODY;
}));
});
}

@GET
@Path("/count")
@ApiOperation(value = "Reading per quotaroot mail count limitation")
@ApiResponses(value = {
@ApiResponse(code = 200, message = "OK", response = Long.class),
@ApiResponse(code = 500, message = "Internal server error - Something went bad on the server side.")
})
public void defineGetQuotaCount() {
service.get(COUNT_ENDPOINT, (request, response) -> {
long value = maxQuotaManager.getDefaultMaxMessage();
response.status(200);
return value;
}, jsonTransformer);
}
}

0 comments on commit 9cd602f

Please sign in to comment.