mirror of
https://github.com/sismics/docs.git
synced 2025-12-13 09:46:17 +00:00
#159: start a route on a document
This commit is contained in:
@@ -201,7 +201,8 @@ public class RouteModelResource extends BaseResource {
|
||||
|
||||
// Validate input
|
||||
name = ValidationUtil.validateLength(name, "name", 1, 50, false);
|
||||
// TODO Validate steps data
|
||||
steps = ValidationUtil.validateLength(steps, "steps", 1, 5000, false);
|
||||
validateRouteModelSteps(steps);
|
||||
|
||||
// Get the route model
|
||||
RouteModelDao routeModelDao = new RouteModelDao();
|
||||
|
||||
@@ -0,0 +1,118 @@
|
||||
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();
|
||||
}
|
||||
}
|
||||
@@ -45,6 +45,9 @@
|
||||
<span ng-switch-when="RouteModel">
|
||||
<a href="#/settings/workflow/edit/{{ log.target }}">{{ log.message }}</a>
|
||||
</span>
|
||||
<span ng-switch-when="Route">
|
||||
<a ng-href="#/document/view/{{ log.message }}">{{ 'open' | translate }}</a>
|
||||
</span>
|
||||
</span>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
@@ -0,0 +1,56 @@
|
||||
package com.sismics.docs.rest;
|
||||
|
||||
import com.sismics.util.filter.TokenBasedSecurityFilter;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
|
||||
import javax.json.JsonArray;
|
||||
import javax.json.JsonObject;
|
||||
import javax.ws.rs.client.Entity;
|
||||
import javax.ws.rs.core.Form;
|
||||
import java.util.Date;
|
||||
|
||||
|
||||
/**
|
||||
* Test the route resource.
|
||||
*
|
||||
* @author bgamard
|
||||
*/
|
||||
public class TestRouteResource extends BaseJerseyTest {
|
||||
/**
|
||||
* Test the route resource.
|
||||
*/
|
||||
@Test
|
||||
public void testRouteResource() {
|
||||
// Login admin
|
||||
String adminToken = clientUtil.login("admin", "admin", false);
|
||||
|
||||
// Get all route models
|
||||
JsonObject json = target().path("/routemodel")
|
||||
.queryParam("sort_column", "2")
|
||||
.queryParam("asc", "false")
|
||||
.request()
|
||||
.cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminToken)
|
||||
.get(JsonObject.class);
|
||||
JsonArray routeModels = json.getJsonArray("routemodels");
|
||||
Assert.assertEquals(1, routeModels.size());
|
||||
|
||||
// Create a document
|
||||
long create1Date = new Date().getTime();
|
||||
json = target().path("/document").request()
|
||||
.cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminToken)
|
||||
.put(Entity.form(new Form()
|
||||
.param("title", "My super title document 1")
|
||||
.param("description", "My super description for document 1")
|
||||
.param("language", "eng")
|
||||
.param("create_date", Long.toString(create1Date))), JsonObject.class);
|
||||
String document1Id = json.getString("id");
|
||||
|
||||
// Start the default route on document1
|
||||
target().path("/route/start").request()
|
||||
.cookie(TokenBasedSecurityFilter.COOKIE_NAME, adminToken)
|
||||
.post(Entity.form(new Form()
|
||||
.param("documentId", document1Id)
|
||||
.param("routeModelId", routeModels.getJsonObject(0).getString("id"))), JsonObject.class);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user