docs/docs-web/src/main/java/com/sismics/docs/rest/resource/RouteResource.java
2018-01-29 23:34:43 +01:00

119 lines
4.2 KiB
Java

package com.sismics.docs.rest.resource;
import com.sismics.docs.core.constant.AclTargetType;
import com.sismics.docs.core.constant.PermType;
import com.sismics.docs.core.constant.RouteStepType;
import com.sismics.docs.core.dao.jpa.*;
import com.sismics.docs.core.model.jpa.*;
import com.sismics.rest.exception.ClientException;
import com.sismics.rest.exception.ForbiddenClientException;
import javax.json.*;
import javax.ws.rs.FormParam;
import javax.ws.rs.NotFoundException;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.core.Response;
import java.io.StringReader;
/**
* Route REST resources.
*
* @author bgamard
*/
@Path("/route")
public class RouteResource extends BaseResource {
/**
* Start a route on a document.
*
* @api {post} /route/start Start a route on a document
* @apiName PostRouteStart
* @apiRouteModel Route
* @apiParam {String} routeModelId Route model ID
* @apiParam {String} documentId Document ID
* @apiSuccess {String} status Status OK
* @apiError (client) InvalidRouteModel Invalid route model
* @apiError (client) ForbiddenError Access denied
* @apiError (client) NotFound Route model or document not found
* @apiPermission user
* @apiVersion 1.5.0
*
* @return Response
*/
@POST
@Path("start")
public Response start(@FormParam("routeModelId") String routeModelId,
@FormParam("documentId") String documentId) {
if (!authenticate()) {
throw new ForbiddenClientException();
}
// Get the document
AclDao aclDao = new AclDao();
if (!aclDao.checkPermission(documentId, PermType.WRITE, getTargetIdList(null))) {
throw new NotFoundException();
}
// Get the route model
RouteModelDao routeModelDao = new RouteModelDao();
RouteModel routeModel = routeModelDao.getActiveById(routeModelId);
if (routeModel == null) {
throw new NotFoundException();
}
// Create the route
Route route = new Route()
.setDocumentId(documentId)
.setName(routeModel.getName());
RouteDao routeDao = new RouteDao();
routeDao.create(route, principal.getId());
// Create the steps
UserDao userDao = new UserDao();
GroupDao groupDao = new GroupDao();
RouteStepDao routeStepDao = new RouteStepDao();
try (JsonReader reader = Json.createReader(new StringReader(routeModel.getSteps()))) {
JsonArray stepsJson = reader.readArray();
int order = 0;
for (int i = 0; i < stepsJson.size(); i++) {
JsonObject step = stepsJson.getJsonObject(i);
JsonObject target = step.getJsonObject("target");
AclTargetType targetType = AclTargetType.valueOf(target.getString("type"));
String targetName = target.getString("name");
RouteStep routeStep = new RouteStep()
.setRouteId(route.getId())
.setName(step.getString("name"))
.setOrder(order++)
.setType(RouteStepType.valueOf(step.getString("type")));
switch (targetType) {
case USER:
User user = userDao.getActiveByUsername(targetName);
if (user != null) {
routeStep.setTargetId(user.getId());
}
break;
case GROUP:
Group group = groupDao.getActiveByName(targetName);
if (group != null) {
routeStep.setTargetId(group.getId());
}
break;
}
if (routeStep.getTargetId() == null) {
throw new ClientException("InvalidRouteModel", "A step has an invalid target");
}
routeStepDao.create(routeStep);
}
}
// Always return OK
JsonObjectBuilder response = Json.createObjectBuilder()
.add("status", "ok");
return Response.ok().entity(response.build()).build();
}
}