feat(sj_1.0.0): 修复组状态更新问题和空间新增添加格式校验

This commit is contained in:
opensnail 2024-06-01 14:15:15 +08:00
parent 39cd48b3d8
commit 691c5033f8
9 changed files with 53 additions and 22 deletions

View File

@ -177,4 +177,9 @@ public interface SystemConstants {
* Webhook告警工作流回调请求密钥 * Webhook告警工作流回调请求密钥
*/ */
String SECRET = "secret"; String SECRET = "secret";
/**
* 组名场景名空间ID通用正则
*/
String REGEXP = "^[A-Za-z0-9_-]{1,64}$";
} }

View File

@ -8,6 +8,7 @@ import com.aizuda.snailjob.server.web.model.base.PageResult;
import com.aizuda.snailjob.server.web.model.request.ExportGroupVO; import com.aizuda.snailjob.server.web.model.request.ExportGroupVO;
import com.aizuda.snailjob.server.web.model.request.GroupConfigQueryVO; import com.aizuda.snailjob.server.web.model.request.GroupConfigQueryVO;
import com.aizuda.snailjob.server.web.model.request.GroupConfigRequestVO; import com.aizuda.snailjob.server.web.model.request.GroupConfigRequestVO;
import com.aizuda.snailjob.server.web.model.request.GroupStatusUpdateRequestVO;
import com.aizuda.snailjob.server.web.model.response.GroupConfigResponseVO; import com.aizuda.snailjob.server.web.model.response.GroupConfigResponseVO;
import com.aizuda.snailjob.server.web.service.GroupConfigService; import com.aizuda.snailjob.server.web.service.GroupConfigService;
import com.aizuda.snailjob.server.web.util.ExportUtils; import com.aizuda.snailjob.server.web.util.ExportUtils;
@ -48,9 +49,9 @@ public class GroupConfigController {
@LoginRequired(role = RoleEnum.ADMIN) @LoginRequired(role = RoleEnum.ADMIN)
@PutMapping("status") @PutMapping("status")
public Boolean updateGroupStatus(@RequestBody @Validated GroupConfigRequestVO groupConfigRequestVO) { public Boolean updateGroupStatus(@RequestBody @Validated GroupStatusUpdateRequestVO requestVO) {
String groupName = groupConfigRequestVO.getGroupName(); String groupName = requestVO.getGroupName();
Integer groupStatus = groupConfigRequestVO.getGroupStatus(); Integer groupStatus = requestVO.getGroupStatus();
return groupConfigService.updateGroupStatus(groupName, groupStatus); return groupConfigService.updateGroupStatus(groupName, groupStatus);
} }

View File

@ -1,14 +1,12 @@
package com.aizuda.snailjob.server.web.controller; package com.aizuda.snailjob.server.web.controller;
import com.aizuda.snailjob.common.core.annotation.OriginalControllerReturnValue; import com.aizuda.snailjob.common.core.annotation.OriginalControllerReturnValue;
import com.aizuda.snailjob.common.core.exception.SnailJobCommonException;
import com.aizuda.snailjob.server.web.annotation.LoginRequired; import com.aizuda.snailjob.server.web.annotation.LoginRequired;
import com.aizuda.snailjob.server.web.annotation.RoleEnum;
import com.aizuda.snailjob.server.web.model.base.PageResult; import com.aizuda.snailjob.server.web.model.base.PageResult;
import com.aizuda.snailjob.server.web.model.request.ExportJobVO; import com.aizuda.snailjob.server.web.model.request.ExportJobVO;
import com.aizuda.snailjob.server.web.model.request.JobQueryVO; import com.aizuda.snailjob.server.web.model.request.JobQueryVO;
import com.aizuda.snailjob.server.web.model.request.JobRequestVO; import com.aizuda.snailjob.server.web.model.request.JobRequestVO;
import com.aizuda.snailjob.server.web.model.request.JobUpdateJobStatusRequestVO; import com.aizuda.snailjob.server.web.model.request.JobStatusUpdateRequestVO;
import com.aizuda.snailjob.server.web.model.response.JobResponseVO; import com.aizuda.snailjob.server.web.model.response.JobResponseVO;
import com.aizuda.snailjob.server.web.service.JobService; import com.aizuda.snailjob.server.web.service.JobService;
import com.aizuda.snailjob.server.web.util.ExportUtils; import com.aizuda.snailjob.server.web.util.ExportUtils;
@ -22,7 +20,6 @@ import org.springframework.web.multipart.MultipartFile;
import java.io.IOException; import java.io.IOException;
import java.util.List; import java.util.List;
import java.util.Set;
/** /**
* @author opensnail * @author opensnail
@ -69,7 +66,7 @@ public class JobController {
@PutMapping("/status") @PutMapping("/status")
@LoginRequired @LoginRequired
public Boolean updateJobStatus(@RequestBody @Validated JobUpdateJobStatusRequestVO jobRequestVO) { public Boolean updateJobStatus(@RequestBody @Validated JobStatusUpdateRequestVO jobRequestVO) {
return jobService.updateJobStatus(jobRequestVO); return jobService.updateJobStatus(jobRequestVO);
} }

View File

@ -17,7 +17,7 @@ import lombok.Data;
public class GroupConfigRequestVO { public class GroupConfigRequestVO {
@NotBlank(message = "组名称不能为空") @NotBlank(message = "组名称不能为空")
@Pattern(regexp = "^[A-Za-z0-9_-]{1,64}$", message = "仅支持长度为1~64字符且类型为数字、字母和下划线") @Pattern(regexp = "^[A-Za-z0-9_-]{1,64}$", message = "仅支持长度为1~64字符且类型为数字、字母、下划线和短横线")
private String groupName; private String groupName;
@NotNull(message = "组状态不能为空") @NotNull(message = "组状态不能为空")

View File

@ -0,0 +1,22 @@
package com.aizuda.snailjob.server.web.model.request;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Pattern;
import lombok.Data;
/**
* @author opensnail
* @date 2024-06-01 11:37:45
* @since sj_1.0.0
*/
@Data
public class GroupStatusUpdateRequestVO {
@NotBlank(message = "组名称不能为空")
@Pattern(regexp = "^[A-Za-z0-9_-]{1,64}$", message = "仅支持长度为1~64字符且类型为数字、字母和下划线")
private String groupName;
@NotNull(message = "组状态不能为空")
private Integer groupStatus;
}

View File

@ -9,7 +9,7 @@ import lombok.Data;
* @since 2.4.0 * @since 2.4.0
*/ */
@Data @Data
public class JobUpdateJobStatusRequestVO { public class JobStatusUpdateRequestVO {
@NotNull(message = "id 不能为空") @NotNull(message = "id 不能为空")
private Long id; private Long id;

View File

@ -4,9 +4,8 @@ import com.aizuda.snailjob.server.web.model.base.PageResult;
import com.aizuda.snailjob.server.web.model.request.ExportJobVO; import com.aizuda.snailjob.server.web.model.request.ExportJobVO;
import com.aizuda.snailjob.server.web.model.request.JobQueryVO; import com.aizuda.snailjob.server.web.model.request.JobQueryVO;
import com.aizuda.snailjob.server.web.model.request.JobRequestVO; import com.aizuda.snailjob.server.web.model.request.JobRequestVO;
import com.aizuda.snailjob.server.web.model.request.JobUpdateJobStatusRequestVO; import com.aizuda.snailjob.server.web.model.request.JobStatusUpdateRequestVO;
import com.aizuda.snailjob.server.web.model.response.JobResponseVO; import com.aizuda.snailjob.server.web.model.response.JobResponseVO;
import com.aizuda.snailjob.template.datasource.persistence.po.Job;
import jakarta.validation.Valid; import jakarta.validation.Valid;
import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotEmpty;
@ -26,7 +25,7 @@ public interface JobService {
boolean updateJob(JobRequestVO jobRequestVO); boolean updateJob(JobRequestVO jobRequestVO);
Boolean updateJobStatus(JobUpdateJobStatusRequestVO jobRequestVO); Boolean updateJobStatus(JobStatusUpdateRequestVO jobRequestVO);
Boolean deleteJobById(Long id); Boolean deleteJobById(Long id);

View File

@ -40,7 +40,6 @@ import lombok.Getter;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
@ -49,7 +48,6 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.Optional; import java.util.Optional;
import java.util.Set;
/** /**
* @author opensnail * @author opensnail
@ -199,7 +197,7 @@ public class JobServiceImpl implements JobService {
} }
@Override @Override
public Boolean updateJobStatus(JobUpdateJobStatusRequestVO jobRequestVO) { public Boolean updateJobStatus(JobStatusUpdateRequestVO jobRequestVO) {
Assert.notNull(jobRequestVO.getId(), () -> new SnailJobServerException("id 不能为空")); Assert.notNull(jobRequestVO.getId(), () -> new SnailJobServerException("id 不能为空"));
Assert.isTrue(1 == jobMapper.selectCount(new LambdaQueryWrapper<Job>().eq(Job::getId, jobRequestVO.getId()))); Assert.isTrue(1 == jobMapper.selectCount(new LambdaQueryWrapper<Job>().eq(Job::getId, jobRequestVO.getId())));
@ -260,7 +258,7 @@ public class JobServiceImpl implements JobService {
public void importJobs(List<JobRequestVO> requestList) { public void importJobs(List<JobRequestVO> requestList) {
String namespaceId = UserSessionUtils.currentUserSession().getNamespaceId(); String namespaceId = UserSessionUtils.currentUserSession().getNamespaceId();
groupHandler.validateGroupExistence( groupHandler.validateGroupExistence(
StreamUtils.toSet(requestList, JobRequestVO::getJobName), namespaceId StreamUtils.toSet(requestList, JobRequestVO::getGroupName), namespaceId
); );
requestList.forEach(this::saveJob); requestList.forEach(this::saveJob);
} }

View File

@ -3,6 +3,7 @@ package com.aizuda.snailjob.server.web.service.impl;
import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.aizuda.snailjob.common.core.constant.SystemConstants;
import com.aizuda.snailjob.common.core.enums.StatusEnum; import com.aizuda.snailjob.common.core.enums.StatusEnum;
import com.aizuda.snailjob.server.common.exception.SnailJobServerException; import com.aizuda.snailjob.server.common.exception.SnailJobServerException;
import com.aizuda.snailjob.server.web.model.base.PageResult; import com.aizuda.snailjob.server.web.model.base.PageResult;
@ -15,10 +16,13 @@ import com.aizuda.snailjob.template.datasource.persistence.mapper.NamespaceMappe
import com.aizuda.snailjob.template.datasource.persistence.po.Namespace; import com.aizuda.snailjob.template.datasource.persistence.po.Namespace;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.PageDTO; import com.baomidou.mybatisplus.extension.plugins.pagination.PageDTO;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.List; import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/** /**
* @author: xiaowoniu * @author: xiaowoniu
@ -26,15 +30,19 @@ import java.util.List;
* @since : 2.5.0 * @since : 2.5.0
*/ */
@Service @Service
@RequiredArgsConstructor
public class NamespaceServiceImpl implements NamespaceService { public class NamespaceServiceImpl implements NamespaceService {
private final NamespaceMapper namespaceMapper;
@Autowired
private NamespaceMapper namespaceMapper;
@Override @Override
public Boolean saveNamespace(final NamespaceRequestVO namespaceRequestVO) { public Boolean saveNamespace(final NamespaceRequestVO namespaceRequestVO) {
String uniqueId = namespaceRequestVO.getUniqueId();
if (StrUtil.isNotBlank(namespaceRequestVO.getUniqueId())) { if (StrUtil.isNotBlank(namespaceRequestVO.getUniqueId())) {
Pattern pattern = Pattern.compile(SystemConstants.REGEXP);
Matcher matcher = pattern.matcher(uniqueId);
Assert.isTrue(matcher.matches(), () -> new SnailJobServerException("仅支持长度为1~64字符且类型为数字、字母、下划线和短横线"));
Assert.isTrue(namespaceMapper.selectCount( Assert.isTrue(namespaceMapper.selectCount(
new LambdaQueryWrapper<Namespace>() new LambdaQueryWrapper<Namespace>()
.eq(Namespace::getUniqueId, namespaceRequestVO.getUniqueId())) == 0, .eq(Namespace::getUniqueId, namespaceRequestVO.getUniqueId())) == 0,
@ -43,10 +51,10 @@ public class NamespaceServiceImpl implements NamespaceService {
Namespace namespace = new Namespace(); Namespace namespace = new Namespace();
namespace.setName(namespaceRequestVO.getName()); namespace.setName(namespaceRequestVO.getName());
if (StrUtil.isBlank(namespaceRequestVO.getUniqueId())) { if (StrUtil.isBlank(uniqueId)) {
namespace.setUniqueId(IdUtil.simpleUUID()); namespace.setUniqueId(IdUtil.simpleUUID());
} else { } else {
namespace.setUniqueId(namespaceRequestVO.getUniqueId()); namespace.setUniqueId(uniqueId);
} }
return 1 == namespaceMapper.insert(namespace); return 1 == namespaceMapper.insert(namespace);
} }
@ -89,6 +97,7 @@ public class NamespaceServiceImpl implements NamespaceService {
List<Namespace> namespaces = namespaceMapper.selectList( List<Namespace> namespaces = namespaceMapper.selectList(
new LambdaQueryWrapper<Namespace>() new LambdaQueryWrapper<Namespace>()
.select(Namespace::getName, Namespace::getUniqueId) .select(Namespace::getName, Namespace::getUniqueId)
.orderByDesc(Namespace::getId)
); );
return NamespaceResponseVOConverter.INSTANCE.convertList(namespaces); return NamespaceResponseVOConverter.INSTANCE.convertList(namespaces);
} }