!469 update-完善对模型key校验逻辑

Merge pull request !469 from Remember_Ray/future/flowable-update-完善新建模型数据校验逻辑
This commit is contained in:
疯狂的狮子Li 2023-12-27 06:49:27 +00:00 committed by Gitee
commit a0e1413b69
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
3 changed files with 28 additions and 6 deletions

View File

@ -79,4 +79,8 @@ public interface FlowConstant {
*/ */
String FLOWABLE_SKIP_EXPRESSION_ENABLED = "_FLOWABLE_SKIP_EXPRESSION_ENABLED"; String FLOWABLE_SKIP_EXPRESSION_ENABLED = "_FLOWABLE_SKIP_EXPRESSION_ENABLED";
/**
* 模型标识key命名规范正则表达式
*/
String MODEL_KEY_PATTERN = "^[a-zA-Z][a-zA-Z0-9_]{0,254}$";
} }

View File

@ -1,10 +1,12 @@
package org.dromara.workflow.domain.bo; package org.dromara.workflow.domain.bo;
import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Pattern;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import org.dromara.common.core.validate.AddGroup; import org.dromara.common.core.validate.AddGroup;
import org.dromara.workflow.common.PageEntity; import org.dromara.workflow.common.PageEntity;
import org.dromara.workflow.common.constant.FlowConstant;
import java.io.Serial; import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
@ -31,6 +33,7 @@ public class ModelBo extends PageEntity implements Serializable {
* 模型标识key * 模型标识key
*/ */
@NotBlank(message = "模型标识key不能为空", groups = {AddGroup.class}) @NotBlank(message = "模型标识key不能为空", groups = {AddGroup.class})
@Pattern(regexp = FlowConstant.MODEL_KEY_PATTERN, message = "模型标识key只能字符或者下划线开头", groups = {AddGroup.class})
private String key; private String key;
/** /**

View File

@ -1,6 +1,7 @@
package org.dromara.workflow.service.impl; package org.dromara.workflow.service.impl;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.Validator;
import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
@ -24,6 +25,7 @@ import org.dromara.system.domain.SysRole;
import org.dromara.system.domain.SysUser; import org.dromara.system.domain.SysUser;
import org.dromara.system.mapper.SysRoleMapper; import org.dromara.system.mapper.SysRoleMapper;
import org.dromara.system.mapper.SysUserMapper; import org.dromara.system.mapper.SysUserMapper;
import org.dromara.workflow.common.constant.FlowConstant;
import org.dromara.workflow.domain.bo.ModelBo; import org.dromara.workflow.domain.bo.ModelBo;
import org.dromara.workflow.domain.vo.GroupRepresentation; import org.dromara.workflow.domain.vo.GroupRepresentation;
import org.dromara.workflow.domain.vo.ResultListDataRepresentation; import org.dromara.workflow.domain.vo.ResultListDataRepresentation;
@ -226,14 +228,27 @@ public class ActModelServiceImpl implements IActModelService {
model.setVersion(model.getVersion() + 1); model.setVersion(model.getVersion() + 1);
// 获取唯一标识key // 获取唯一标识key
String key = values.getFirst("key"); String key = values.getFirst("key");
// 校验key命名规范
if (!Validator.isMatchRegex(FlowConstant.MODEL_KEY_PATTERN, key)) {
throw new ServiceException("模型标识key只能字符或者下划线开头");
}
List<Model> list = repositoryService.createModelQuery().modelKey(key).modelTenantId(TenantHelper.getTenantId()).list(); List<Model> list = repositoryService.createModelQuery().modelKey(key).modelTenantId(TenantHelper.getTenantId()).list();
list.stream().filter(e -> !e.getId().equals(model.getId())).findFirst().ifPresent(e -> { list.stream().filter(e -> !e.getId().equals(model.getId())).findFirst().ifPresent(e -> {
throw new ServiceException("模型key已存在"); throw new ServiceException("模型标识key已存在");
}); });
model.setKey(key); model.setKey(key);
repositoryService.saveModel(model); repositoryService.saveModel(model);
// 解决设计器选择设置流程发起人设置变量有问题 // 解决设计器选择设置流程发起人设置变量有问题
JsonNode jsonNode = objectMapper.readTree(values.getFirst("json_xml")); JsonNode jsonNode = objectMapper.readTree(values.getFirst("json_xml"));
// 校验流程标识
String processId = jsonNode.get("properties").get("process_id").textValue();
if (StringUtils.isBlank(processId)) {
throw new ServiceException("流程标识不能为空!");
}
if (!Validator.isMatchRegex(FlowConstant.MODEL_KEY_PATTERN, processId)) {
throw new ServiceException("流程标识只能字符或者下划线开头!");
}
byte[] xmlBytes = WorkflowUtils.bpmnJsonToXmlBytes(Objects.requireNonNull(JsonUtils.toJsonString(jsonNode)).getBytes(StandardCharsets.UTF_8)); byte[] xmlBytes = WorkflowUtils.bpmnJsonToXmlBytes(Objects.requireNonNull(JsonUtils.toJsonString(jsonNode)).getBytes(StandardCharsets.UTF_8));
if (ArrayUtil.isEmpty(xmlBytes)) { if (ArrayUtil.isEmpty(xmlBytes)) {
throw new ServiceException("模型不能为空!"); throw new ServiceException("模型不能为空!");