#159: display and validate route steps

This commit is contained in:
Benjamin Gamard
2018-02-02 12:37:56 +01:00
parent 8a854bb37d
commit 5b8cd18128
20 changed files with 292 additions and 50 deletions
@@ -10,7 +10,7 @@ import com.sismics.docs.core.util.jpa.PaginatedList;
import com.sismics.docs.core.util.jpa.PaginatedLists;
import com.sismics.docs.core.util.jpa.SortCriteria;
import com.sismics.rest.exception.ForbiddenClientException;
import com.sismics.rest.util.JsonUtil;
import com.sismics.util.JsonUtil;
import javax.json.Json;
import javax.json.JsonArrayBuilder;
@@ -25,8 +25,8 @@ import com.sismics.rest.exception.ClientException;
import com.sismics.rest.exception.ForbiddenClientException;
import com.sismics.rest.exception.ServerException;
import com.sismics.rest.util.AclUtil;
import com.sismics.rest.util.JsonUtil;
import com.sismics.rest.util.ValidationUtil;
import com.sismics.util.JsonUtil;
import com.sismics.util.context.ThreadLocalContext;
import com.sismics.util.mime.MimeType;
import org.joda.time.DateTime;
@@ -216,10 +216,9 @@ public class DocumentResource extends BaseResource {
// Add current route step
RouteStepDto routeStepDto = new RouteStepDao().getCurrentStep(documentId);
if (routeStepDto != null && !principal.isAnonymous()) {
document.add("route_step", Json.createObjectBuilder()
.add("name", routeStepDto.getName())
.add("type", routeStepDto.getType().name())
.add("transitionable", getTargetIdList(null).contains(routeStepDto.getTargetId())));
JsonObjectBuilder step = routeStepDto.toJson();
step.add("transitionable", getTargetIdList(null).contains(routeStepDto.getTargetId()));
document.add("route_step", step);
}
return Response.ok().entity(document.build()).build();
@@ -22,9 +22,9 @@ import com.sismics.docs.core.util.PdfUtil;
import com.sismics.rest.exception.ClientException;
import com.sismics.rest.exception.ForbiddenClientException;
import com.sismics.rest.exception.ServerException;
import com.sismics.rest.util.JsonUtil;
import com.sismics.rest.util.ValidationUtil;
import com.sismics.util.HttpUtil;
import com.sismics.util.JsonUtil;
import com.sismics.util.context.ThreadLocalContext;
import com.sismics.util.mime.MimeType;
import com.sismics.util.mime.MimeTypeUtil;
@@ -14,8 +14,8 @@ import com.sismics.docs.core.util.jpa.SortCriteria;
import com.sismics.docs.rest.constant.BaseFunction;
import com.sismics.rest.exception.ClientException;
import com.sismics.rest.exception.ForbiddenClientException;
import com.sismics.rest.util.JsonUtil;
import com.sismics.rest.util.ValidationUtil;
import com.sismics.util.JsonUtil;
import javax.json.Json;
import javax.json.JsonArrayBuilder;
@@ -18,7 +18,6 @@ import com.sismics.docs.core.util.SecurityUtil;
import com.sismics.docs.core.util.jpa.SortCriteria;
import com.sismics.rest.exception.ClientException;
import com.sismics.rest.exception.ForbiddenClientException;
import com.sismics.rest.util.JsonUtil;
import com.sismics.rest.util.ValidationUtil;
import javax.json.*;
@@ -44,6 +43,7 @@ public class RouteResource extends BaseResource {
* @apiParam {String} documentId Document ID
* @apiSuccess {String} status Status OK
* @apiError (client) InvalidRouteModel Invalid route model
* @apiError (client) RunningRoute A running route already exists on this document
* @apiError (client) ForbiddenError Access denied
* @apiError (client) NotFound Route model or document not found
* @apiPermission user
@@ -72,6 +72,12 @@ public class RouteResource extends BaseResource {
throw new NotFoundException();
}
// Avoid creating 2 running routes on the same document
RouteStepDao routeStepDao = new RouteStepDao();
if (routeStepDao.getCurrentStep(documentId) != null) {
throw new ClientException("RunningRoute", "A running route already exists on this document");
}
// Create the route
Route route = new Route()
.setDocumentId(documentId)
@@ -80,7 +86,6 @@ public class RouteResource extends BaseResource {
routeDao.create(route, principal.getId());
// Create the steps
RouteStepDao routeStepDao = new RouteStepDao();
try (JsonReader reader = Json.createReader(new StringReader(routeModel.getSteps()))) {
JsonArray stepsJson = reader.readArray();
for (int order = 0; order < stepsJson.size(); order++) {
@@ -108,9 +113,8 @@ public class RouteResource extends BaseResource {
RouteStepDto routeStep = routeStepDao.getCurrentStep(documentId);
RoutingUtil.updateAcl(documentId, routeStep, null, principal.getId());
// Always return OK
JsonObjectBuilder response = Json.createObjectBuilder()
.add("status", "ok");
.add("route_step", routeStep.toJson());
return Response.ok().entity(response.build()).build();
}
@@ -173,10 +177,13 @@ public class RouteResource extends BaseResource {
RoutingUtil.updateAcl(documentId, newRouteStep, routeStep, principal.getId());
// TODO Send an email to the new route step
// Always return OK
// TODO Return if the document is still readable and return the new current step if any
JsonObjectBuilder response = Json.createObjectBuilder()
.add("status", "ok");
.add("readable", aclDao.checkPermission(documentId, PermType.READ, getTargetIdList(null)));
if (newRouteStep != null) {
JsonObjectBuilder step = newRouteStep.toJson();
step.add("transitionable", getTargetIdList(null).contains(newRouteStep.getTargetId()));
response.add("route_step", step);
}
return Response.ok().entity(response.build()).build();
}
@@ -232,17 +239,7 @@ public class RouteResource extends BaseResource {
JsonArrayBuilder steps = Json.createArrayBuilder();
for (RouteStepDto routeStepDto : routeStepDtoList) {
steps.add(Json.createObjectBuilder()
.add("name", routeStepDto.getName())
.add("type", routeStepDto.getType().name())
.add("comment", JsonUtil.nullable(routeStepDto.getComment()))
.add("end_date", JsonUtil.nullable(routeStepDto.getEndDateTimestamp()))
.add("validator_username", JsonUtil.nullable(routeStepDto.getValidatorUserName()))
.add("target", Json.createObjectBuilder()
.add("id", routeStepDto.getTargetId())
.add("name", JsonUtil.nullable(routeStepDto.getTargetName()))
.add("type", routeStepDto.getTargetType()))
.add("transition", JsonUtil.nullable(routeStepDto.getTransition())));
steps.add(routeStepDto.toJson());
}
routes.add(Json.createObjectBuilder()
@@ -253,7 +250,8 @@ public class RouteResource extends BaseResource {
JsonObjectBuilder json = Json.createObjectBuilder()
.add("routes", routes);
return Response.ok().entity(json.build()).build();
}
// TODO Workflow cancellation
}
@@ -10,8 +10,8 @@ import com.sismics.docs.core.model.jpa.Acl;
import com.sismics.docs.core.model.jpa.Share;
import com.sismics.rest.exception.ClientException;
import com.sismics.rest.exception.ForbiddenClientException;
import com.sismics.rest.util.JsonUtil;
import com.sismics.rest.util.ValidationUtil;
import com.sismics.util.JsonUtil;
import javax.json.Json;
import javax.json.JsonObjectBuilder;
@@ -10,9 +10,9 @@ import com.sismics.docs.rest.constant.BaseFunction;
import com.sismics.rest.exception.ClientException;
import com.sismics.rest.exception.ForbiddenClientException;
import com.sismics.rest.exception.ServerException;
import com.sismics.rest.util.JsonUtil;
import com.sismics.rest.util.ValidationUtil;
import com.sismics.util.HttpUtil;
import com.sismics.util.JsonUtil;
import com.sismics.util.css.Selector;
import org.glassfish.jersey.media.multipart.FormDataBodyPart;
import org.glassfish.jersey.media.multipart.FormDataParam;
@@ -21,9 +21,9 @@ import com.sismics.docs.rest.constant.BaseFunction;
import com.sismics.rest.exception.ClientException;
import com.sismics.rest.exception.ForbiddenClientException;
import com.sismics.rest.exception.ServerException;
import com.sismics.rest.util.JsonUtil;
import com.sismics.rest.util.ValidationUtil;
import com.sismics.security.UserPrincipal;
import com.sismics.util.JsonUtil;
import com.sismics.util.context.ThreadLocalContext;
import com.sismics.util.filter.TokenBasedSecurityFilter;
import com.sismics.util.totp.GoogleAuthenticator;