diff --git a/src/main/java/com/realtime/protection/server/rule/dynamicrule/DynamicRuleController.java b/src/main/java/com/realtime/protection/server/rule/dynamicrule/DynamicRuleController.java index 32b4b9a..73990c8 100644 --- a/src/main/java/com/realtime/protection/server/rule/dynamicrule/DynamicRuleController.java +++ b/src/main/java/com/realtime/protection/server/rule/dynamicrule/DynamicRuleController.java @@ -6,7 +6,9 @@ import jakarta.validation.Valid; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; +import java.util.ArrayList; import java.util.List; +import java.util.Map; @RestController @RequestMapping("dynamicrule") @@ -19,7 +21,7 @@ public class DynamicRuleController implements DynamicRuleControllerApi { this.dynamicRuleService = dynamicRuleService; } - // 新增 要关联防护对象!!!! + // @Override @PostMapping("/new") public ResponseResult newDynamicRuleObject(@RequestBody @Valid DynamicRuleObject dynamicRuleObject) { @@ -120,6 +122,58 @@ public class DynamicRuleController implements DynamicRuleControllerApi { //详情查看?? 就是按id查询吧 - //审核?不需要 + /** + * 审批 + */ + @GetMapping("/{id}/audit/{auditStatus}") + public ResponseResult updateDynamicRuleAuditStatus(@PathVariable Integer id, @PathVariable Integer auditStatus) { + if (id <= 0 || auditStatus < 0 || auditStatus > 2) { + return new ResponseResult(400, "id or status is invalid") + .setData("staticRule_id", id) + .setData("success", false); + } + return ResponseResult.ok() + .addDataMap(dynamicRuleService.updateAuditStatus(id, auditStatus)) + .setData("dynamicRule_id", id); + } + + /** + * 批量审批 + */ + @PostMapping("/auditbatch") + public ResponseResult updateDynamicRuleAuditStatusBatch(@RequestBody Map idsWithAuditStatusMap) { + List errorIds = new ArrayList<>(); + for (Map.Entry entry: idsWithAuditStatusMap.entrySet()) { + Integer id = entry.getKey(); + Integer auditStatus = entry.getValue(); + if (id <= 0 || auditStatus < 0 || auditStatus > 2) { + errorIds.add(id); + } + } + if (!errorIds.isEmpty()){ + return new ResponseResult(400, "id or status is invalid") + .setData("staticRule_id", errorIds) + .setData("success", false); + } + + return ResponseResult.ok() + .setData("success", dynamicRuleService.updateAuditStatusBatch(idsWithAuditStatusMap)); + } + + + /** + * 获取统计数据 + */ + @GetMapping("/statistics") + public ResponseResult getStaticRuleStatisticsData(){ + + return ResponseResult.ok() + .setData("dynamic_rule_num", dynamicRuleService.queryDynamicRuleTotalNum(null, null, + null, null)) + .setData("dynamic_rule_used_num", dynamicRuleService.queryUsedDynamicRuleTotalNum()) + .setData("dynamic_rule_audit_num", dynamicRuleService.queryAuditDynamicRuleTotalNum(1)) + .setData("dynamic_rule_unaudit_num", dynamicRuleService.queryAuditDynamicRuleTotalNum(0)); + } + } diff --git a/src/main/java/com/realtime/protection/server/rule/dynamicrule/DynamicRuleMapper.java b/src/main/java/com/realtime/protection/server/rule/dynamicrule/DynamicRuleMapper.java index 04b9e73..7d589fb 100644 --- a/src/main/java/com/realtime/protection/server/rule/dynamicrule/DynamicRuleMapper.java +++ b/src/main/java/com/realtime/protection/server/rule/dynamicrule/DynamicRuleMapper.java @@ -7,6 +7,7 @@ import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import java.util.List; +import java.util.Map; @Mapper public interface DynamicRuleMapper { @@ -47,4 +48,14 @@ public interface DynamicRuleMapper { List queryDynamicRuleByIds(List ids); Integer queryTaskStatusBydynamicRuleId(Integer dynamicRuleId); + + Integer queryUsedDynamicRuleTotalNum(); + + Integer queryAuditDynamicRuleTotalNum(int auditStatus); + + Integer queryAuditStatusById(Integer dynamicRuleId); + + Boolean updateAuditStatusById(Integer dynamicRuleId, Integer auditStatus); + + void updateAuditStatusByIdBatch(@Param("idWithAuditStatusBatch") Map idWithAuditStatusBatch); } diff --git a/src/main/java/com/realtime/protection/server/rule/dynamicrule/DynamicRuleService.java b/src/main/java/com/realtime/protection/server/rule/dynamicrule/DynamicRuleService.java index c034ed6..b864643 100644 --- a/src/main/java/com/realtime/protection/server/rule/dynamicrule/DynamicRuleService.java +++ b/src/main/java/com/realtime/protection/server/rule/dynamicrule/DynamicRuleService.java @@ -5,11 +5,14 @@ import com.realtime.protection.configuration.entity.defense.template.Template; import com.realtime.protection.configuration.entity.rule.dynamicrule.DynamicRuleObject; import com.realtime.protection.configuration.utils.SqlSessionWrapper; import com.realtime.protection.configuration.utils.enums.StateEnum; +import com.realtime.protection.configuration.utils.enums.audit.AuditStatusValidator; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.function.Function; @Service @@ -73,16 +76,21 @@ public class DynamicRuleService { public void deleteDynamicRuleObject(Integer dynamicRuleId) { //根据任务状态判断能否删除 Integer taskStatus = dynamicRuleMapper.queryTaskStatusBydynamicRuleId(dynamicRuleId); - switch (StateEnum.getStateEnumByNum(taskStatus)){ - case RUNNING: - throw new IllegalArgumentException("使用该动态规则的任务处于运行状态"); - case PAUSED: - throw new IllegalArgumentException("使用该动态规则的任务处于暂停状态"); - default: - break; + if (taskStatus == null){ + dynamicRuleMapper.deleteDynamicRuleObject(dynamicRuleId); + }else{ + switch (StateEnum.getStateEnumByNum(taskStatus)){ + case RUNNING: + throw new IllegalArgumentException("使用该动态规则的任务处于运行状态"); + case PAUSED: + throw new IllegalArgumentException("使用该动态规则的任务处于暂停状态"); + default: + break; + } + //不需要使用 join,在数据库中设置了级联删除 ON DELETE CASCADE,在删除在从父表中删除数据时自动删除子表中的数据 + dynamicRuleMapper.deleteDynamicRuleObject(dynamicRuleId); } - //不需要使用 join,在数据库中设置了级联删除 ON DELETE CASCADE,在删除在从父表中删除数据时自动删除子表中的数据 - dynamicRuleMapper.deleteDynamicRuleObject(dynamicRuleId); + } @@ -177,4 +185,55 @@ public class DynamicRuleService { public List queryDynamicRuleByIds(List ids) { return dynamicRuleMapper.queryDynamicRuleByIds(ids); } + + public Integer queryUsedDynamicRuleTotalNum() { + return dynamicRuleMapper.queryUsedDynamicRuleTotalNum(); + } + + public Integer queryAuditDynamicRuleTotalNum(int auditStatus) { + return dynamicRuleMapper.queryAuditDynamicRuleTotalNum(auditStatus); + } + + public Map updateAuditStatus(Integer id, Integer auditStatus) { + Integer originalAuditStatus = dynamicRuleMapper.queryAuditStatusById(id); + if (originalAuditStatus == null) { + throw new IllegalArgumentException("cannot find audit status of static rule " + id + ", maybe static rule doesn't exist?"); + } + if (!AuditStatusValidator.setOriginal(originalAuditStatus).checkValidate(auditStatus)) { + throw new IllegalArgumentException("invalid audit status"); + } + Boolean success = dynamicRuleMapper.updateAuditStatusById(id, auditStatus); + + Map resultMap = new HashMap<>(); + resultMap.put("success", success); + resultMap.put("audit_status", auditStatus); + return resultMap; + } + + public Object updateAuditStatusBatch(Map idsWithAuditStatusMap) { + Function, Boolean>> updateDynamicRuleAuditStatusFunction = + mapper -> map -> { + if (map == null || map.isEmpty()) { + return false; + } + + Map idWithAuditStatusBatch = new HashMap<>(); + for (Map.Entry item : map.entrySet()) { + idWithAuditStatusBatch.put(item.getKey(), item.getValue()); + if (idWithAuditStatusBatch.size() < 100) { + continue; + } + //mapper指的就是外层函数输入的参数,也就是WhiteListMapper + mapper.updateAuditStatusByIdBatch(idWithAuditStatusBatch); + idWithAuditStatusBatch.clear(); + } + if (!idWithAuditStatusBatch.isEmpty()) { + mapper.updateAuditStatusByIdBatch(idWithAuditStatusBatch); + } + return true; + }; + //实现事务操作 + return sqlSessionWrapper.startBatchSession(DynamicRuleMapper.class, updateDynamicRuleAuditStatusFunction, idsWithAuditStatusMap); + + } } diff --git a/src/main/resources/mappers/DynamicRuleMapper.xml b/src/main/resources/mappers/DynamicRuleMapper.xml index a85f970..ec6e2ec 100644 --- a/src/main/resources/mappers/DynamicRuleMapper.xml +++ b/src/main/resources/mappers/DynamicRuleMapper.xml @@ -101,6 +101,26 @@ where dynamic_rule_id = #{dynamicRuleId} + + update t_dynamic_rule + set audit_status = #{auditStatus} + where dynamic_rule_id = #{dynamicRuleId} + + + + + update t_dynamic_rule + set audit_status = CASE dynamic_rule_id + + WHEN #{id} THEN #{auditStatus} + + ELSE audit_status + END + WHERE dynamic_rule_id IN + + #{id} + + + + + + \ No newline at end of file diff --git a/src/test/java/com/realtime/protection/server/rule/dynamic/DynamicRuleServiceTest.java b/src/test/java/com/realtime/protection/server/rule/dynamic/DynamicRuleServiceTest.java index c48bd61..9976537 100644 --- a/src/test/java/com/realtime/protection/server/rule/dynamic/DynamicRuleServiceTest.java +++ b/src/test/java/com/realtime/protection/server/rule/dynamic/DynamicRuleServiceTest.java @@ -14,7 +14,9 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import java.time.LocalDateTime; +import java.util.HashMap; import java.util.List; +import java.util.Map; @SpringBootTest public class DynamicRuleServiceTest extends ProtectionApplicationTests { @@ -136,4 +138,16 @@ public class DynamicRuleServiceTest extends ProtectionApplicationTests { null,null,null,null); System.out.println(num); } + + @Test + void testUpdateDynamicRuleAuditStatusBatch(){ + Map map = new HashMap<>(); + map.put(101, 1); + map.put(102, 2); + map.put(103, 2); + + + System.out.println(dynamicRuleService.updateAuditStatusBatch(map)); + } + }