1
0
mirror of https://github.com/sismics/docs.git synced 2026-01-06 13:29:30 +00:00

#159: return the active step in GET /document/id

This commit is contained in:
Benjamin Gamard
2018-01-31 22:07:38 +01:00
parent 5e713f0c2a
commit 503cfff82e
17 changed files with 176 additions and 119 deletions

View File

@@ -8,7 +8,10 @@ import com.sismics.docs.core.dao.jpa.criteria.GroupCriteria;
import com.sismics.docs.core.dao.jpa.criteria.UserCriteria;
import com.sismics.docs.core.dao.jpa.dto.GroupDto;
import com.sismics.docs.core.dao.jpa.dto.UserDto;
import com.sismics.docs.core.model.jpa.*;
import com.sismics.docs.core.model.jpa.Acl;
import com.sismics.docs.core.model.jpa.Document;
import com.sismics.docs.core.model.jpa.Tag;
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;
@@ -70,29 +73,8 @@ public class AclResource extends BaseResource {
AclTargetType type = AclTargetType.valueOf(ValidationUtil.validateLength(typeStr, "type", 1, 10, false));
targetName = ValidationUtil.validateLength(targetName, "target", 1, 50, false);
// Search user or group
String targetId = null;
switch (type) {
case USER:
UserDao userDao = new UserDao();
User user = userDao.getActiveByUsername(targetName);
if (user != null) {
targetId = user.getId();
}
break;
case GROUP:
GroupDao groupDao = new GroupDao();
Group group = groupDao.getActiveByName(targetName);
if (group != null) {
targetId = group.getId();
}
break;
case SHARE:
// Share must use the Share REST resource
break;
}
// Does a target has been found?
String targetId = SecurityUtil.getTargetIdFromName(targetName, type);
if (targetId == null) {
throw new ClientException("InvalidTarget", MessageFormat.format("This target does not exist: {0}", targetName));
}

View File

@@ -2,7 +2,6 @@ package com.sismics.docs.rest.resource;
import com.google.common.base.Joiner;
import com.google.common.base.Strings;
import com.google.common.io.ByteStreams;
import com.sismics.docs.core.constant.Constants;
import com.sismics.docs.core.constant.PermType;
import com.sismics.docs.core.dao.jpa.*;
@@ -13,11 +12,9 @@ import com.sismics.docs.core.event.DocumentCreatedAsyncEvent;
import com.sismics.docs.core.event.DocumentDeletedAsyncEvent;
import com.sismics.docs.core.event.DocumentUpdatedAsyncEvent;
import com.sismics.docs.core.event.FileDeletedAsyncEvent;
import com.sismics.docs.core.model.jpa.Acl;
import com.sismics.docs.core.model.jpa.Document;
import com.sismics.docs.core.model.jpa.File;
import com.sismics.docs.core.model.jpa.User;
import com.sismics.docs.core.model.jpa.*;
import com.sismics.docs.core.util.PdfUtil;
import com.sismics.docs.core.util.RoutingUtil;
import com.sismics.docs.core.util.jpa.PaginatedList;
import com.sismics.docs.core.util.jpa.PaginatedLists;
import com.sismics.docs.core.util.jpa.SortCriteria;
@@ -42,7 +39,6 @@ import javax.ws.rs.*;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.StreamingOutput;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.MessageFormat;
import java.util.*;
@@ -102,6 +98,10 @@ public class DocumentResource extends BaseResource {
* @apiSuccess {String} relations.id ID
* @apiSuccess {String} relations.title Title
* @apiSuccess {String} relations.source True if this document is the source of the relation
* @apiSuccess {Object} route_step The current active route step
* @apiSuccess {String} route_step.name Route step name
* @apiSuccess {String="APPROVE", "VALIDATE"} route_step.type Route step type
* @apiSuccess {Boolean} route_step.transitionable True if the route step is actionable by the current user
* @apiError (client) NotFound Document not found
* @apiPermission none
* @apiVersion 1.5.0
@@ -209,6 +209,15 @@ public class DocumentResource extends BaseResource {
.add("source", relationDto.isSource()));
}
document.add("relations", relationList);
// Add current route step
RouteStep routeStep = RoutingUtil.getCurrentStep(documentId);
if (routeStep != null && !principal.isAnonymous()) {
document.add("route_step", Json.createObjectBuilder()
.add("name", routeStep.getName())
.add("type", routeStep.getType().name())
.add("transitionable", getTargetIdList(null).contains(routeStep.getTargetId())));
}
return Response.ok().entity(document.build()).build();
}
@@ -423,7 +432,7 @@ public class DocumentResource extends BaseResource {
if (documentCriteria.getTagIdList() == null) {
documentCriteria.setTagIdList(new ArrayList<String>());
}
if (tagDtoList.size() == 0) {
if (tagDtoList.isEmpty()) {
// No tag found, the request must returns nothing
documentCriteria.getTagIdList().add(UUID.randomUUID().toString());
}

View File

@@ -123,7 +123,7 @@ public class RouteModelResource extends BaseResource {
try (JsonReader reader = Json.createReader(new StringReader(steps))) {
JsonArray stepsJson = reader.readArray();
if (stepsJson.size() == 0) {
if (stepsJson.isEmpty()) {
throw new ClientException("ValidationError", "At least one step is required");
}
for (int i = 0; i < stepsJson.size(); i++) {

View File

@@ -3,8 +3,14 @@ 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.docs.core.dao.jpa.AclDao;
import com.sismics.docs.core.dao.jpa.RouteDao;
import com.sismics.docs.core.dao.jpa.RouteModelDao;
import com.sismics.docs.core.dao.jpa.RouteStepDao;
import com.sismics.docs.core.model.jpa.Route;
import com.sismics.docs.core.model.jpa.RouteModel;
import com.sismics.docs.core.model.jpa.RouteStep;
import com.sismics.docs.core.util.SecurityUtil;
import com.sismics.rest.exception.ClientException;
import com.sismics.rest.exception.ForbiddenClientException;
@@ -69,8 +75,6 @@ public class RouteResource extends BaseResource {
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();
@@ -85,22 +89,8 @@ public class RouteResource extends BaseResource {
.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;
}
.setType(RouteStepType.valueOf(step.getString("type")))
.setTargetId(SecurityUtil.getTargetIdFromName(targetName, targetType));
if (routeStep.getTargetId() == null) {
throw new ClientException("InvalidRouteModel", "A step has an invalid target");

View File

@@ -116,7 +116,7 @@ public class ShareResource extends BaseResource {
// Check that the user can share the linked document
AclDao aclDao = new AclDao();
List<Acl> aclList = aclDao.getByTargetId(id);
if (aclList.size() == 0) {
if (aclList.isEmpty()) {
throw new ClientException("ShareNotFound", MessageFormat.format("Share not found: {0}", id));
}

View File

@@ -116,7 +116,7 @@ public class TagResource extends BaseResource {
TagDao tagDao = new TagDao();
List<TagDto> tagDtoList = tagDao.findByCriteria(new TagCriteria().setTargetIdList(getTargetIdList(null)).setId(id), null);
if (tagDtoList.size() == 0) {
if (tagDtoList.isEmpty()) {
throw new NotFoundException();
}