1. 添加部分swagger文档

This commit is contained in:
EnderByEndera
2024-01-12 14:31:34 +08:00
parent 8f545110f1
commit c1a5d2462f
30 changed files with 614 additions and 65 deletions

View File

@@ -7,7 +7,6 @@ import org.apache.ibatis.annotations.Param;
import java.util.List;
@DS("doris")
@Mapper
public interface CommandMapper {
Boolean createCommand(@Param("command") Command command);

View File

@@ -1,10 +1,14 @@
package com.realtime.protection.server.command;
import com.alibaba.excel.util.ListUtils;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.realtime.protection.configuration.entity.task.Command;
import com.realtime.protection.configuration.entity.task.TaskCommandInfo;
import com.realtime.protection.configuration.exception.DorisStartException;
import com.realtime.protection.configuration.utils.SqlSessionWrapper;
import com.realtime.protection.configuration.utils.enums.StateEnum;
import com.realtime.protection.server.task.TaskMapper;
import com.realtime.protection.server.task.TaskService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
@@ -18,17 +22,19 @@ import java.util.function.Function;
public class CommandService {
private final CommandMapper commandMapper;
private final TaskService taskService;
private final SqlSessionWrapper sqlSessionWrapper;
private static final int BatchSize = 1000;
private static final int BatchSize = 100;
private final Function<CommandMapper, Function<TaskCommandInfo, Void>> createCommandBatchFunction;
public CommandService(CommandMapper commandMapper, SqlSessionWrapper sqlSessionWrapper) {
public CommandService(CommandMapper commandMapper, TaskService taskService, SqlSessionWrapper sqlSessionWrapper) {
this.commandMapper = commandMapper;
this.taskService = taskService;
this.sqlSessionWrapper = sqlSessionWrapper;
this.createCommandBatchFunction = mapper -> info -> {
if (info.getFrequency() == null) {
Command command = Command.generateCommand(info, info.getStartTime());
commandMapper.createCommand(command);
mapper.createCommand(command);
}
List<Command> commandBatch = ListUtils.newArrayListWithExpectedSize(BatchSize);
@@ -43,12 +49,12 @@ public class CommandService {
if (commandBatch.size() < BatchSize) {
continue;
}
commandMapper.createCommands(commandBatch);
mapper.createCommands(commandBatch);
commandBatch.clear();
}
if (!commandBatch.isEmpty()) {
commandMapper.createCommands(commandBatch);
mapper.createCommands(commandBatch);
commandBatch.clear();
}
@@ -59,15 +65,17 @@ public class CommandService {
}
@Async
@DS("doris")
public void createCommand(TaskCommandInfo commandInfo) throws DorisStartException {
try {
sqlSessionWrapper.startBatchSession(CommandMapper.class, createCommandBatchFunction, commandInfo);
} catch (Exception e) {
throw new DorisStartException(e);
throw new DorisStartException(e, commandInfo.getTaskId());
}
}
@Async
@DS("doris")
public void createCommands(List<TaskCommandInfo> taskCommandInfos) throws DorisStartException {
Function<CommandMapper, Function<List<TaskCommandInfo>, Void>> function = mapper -> list -> {
if (list == null || list.isEmpty()) {
@@ -77,24 +85,34 @@ public class CommandService {
for (TaskCommandInfo info : list) {
createCommandBatchFunction.apply(mapper).apply(info);
}
taskService.changeTaskStatus(list.get(0).getTaskId(), StateEnum.RUNNING.getStateNum());
return null;
};
try {
sqlSessionWrapper.startBatchSession(CommandMapper.class, function, taskCommandInfos);
} catch (Exception e) {
throw new DorisStartException(e);
TaskCommandInfo info = taskCommandInfos.get(0);
Long taskId = null;
if (info != null) {
taskId = info.getTaskId();
}
throw new DorisStartException(e, taskId);
}
}
@DS("doris")
public Boolean startCommandsByTaskId(Long taskId) {
return commandMapper.startCommandsByTaskId(taskId);
}
@DS("doris")
public Boolean stopCommandsByTaskId(Long taskId) {
return commandMapper.stopCommandsByTaskId(taskId);
}
@DS("doris")
public Boolean removeCommandsByTaskId(Long taskId) {
return commandMapper.removeCommandsByTaskId(taskId);
}

View File

@@ -18,7 +18,7 @@ import java.util.List;
@RestController
@RequestMapping("/proobj")
public class ProtectObjectController {
public class ProtectObjectController implements ProtectObjectControllerApi {
private final ProtectObjectService protectObjectService;
@@ -26,6 +26,7 @@ public class ProtectObjectController {
this.protectObjectService = protectObjectService;
}
@Override
@PostMapping("/new")
public ResponseResult newProtectObject(@RequestBody @Valid ProtectObject protectObject) {
Integer protectObjectId = protectObjectService.newProtectObject(protectObject);
@@ -42,15 +43,17 @@ public class ProtectObjectController {
.setData("success", true);
}
@Override
@PostMapping("/upload")
public ResponseResult uploadFile(
@NotNull(message = "uploadFile cannot be null") MultipartFile uploadFile
@NotNull(message = "uploadFile cannot be null. ") MultipartFile uploadFile
) throws IOException {
EasyExcel.read(uploadFile.getInputStream(), ProtectObject.class,
new ProjectObjectDataListener(protectObjectService)).sheet().doRead();
return ResponseResult.ok();
}
@Override
@GetMapping("/download")
public void downloadTemplate(HttpServletResponse response) throws IOException {
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
@@ -64,6 +67,7 @@ public class ProtectObjectController {
.doWrite(List.of());
}
@Override
@GetMapping("/query")
public ResponseResult queryProtectObjects(@RequestParam(value = "proobj_name", required = false)
String protectObjectName,
@@ -77,6 +81,7 @@ public class ProtectObjectController {
}
@Override
@GetMapping("/{protectObjectId}/query")
public ResponseResult queryProtectObject(@PathVariable Integer protectObjectId) throws IllegalAccessException {
ProtectObject protectObject = protectObjectService.queryProtectObject(protectObjectId);
@@ -84,6 +89,7 @@ public class ProtectObjectController {
.setDataMap(EntityUtils.entityToMap(protectObject));
}
@Override
@PostMapping("/{protectObjectId}/update")
public ResponseResult updateProtectObject(@PathVariable Integer protectObjectId,
@RequestBody @Valid ProtectObject protectObject) {
@@ -93,6 +99,7 @@ public class ProtectObjectController {
.setData("success", protectObjectService.updateProtectObject(protectObject));
}
@Override
@DeleteMapping("/{protectObjectId}/delete")
public ResponseResult deleteProtectObject(@PathVariable Integer protectObjectId) {
return ResponseResult.ok()
@@ -100,14 +107,16 @@ public class ProtectObjectController {
.setData("success", protectObjectService.deleteProtectObject(protectObjectId));
}
@PostMapping("/delete")
public ResponseResult deleteProtectObject(@RequestBody List<Integer> protectObjectIds) {
@Override
@DeleteMapping("/delete/{protectObjectIds}")
public ResponseResult deleteProtectObject(@PathVariable List<Integer> protectObjectIds) {
return ResponseResult.ok()
.setData("proobj_ids", protectObjectIds)
.setData("success", protectObjectService.deleteProtectObjects(protectObjectIds));
}
@PostMapping("/{protectObjectId}/audit/{auditStatus}")
@Override
@GetMapping("/{protectObjectId}/audit/{auditStatus}")
public ResponseResult changeProtectObjectAuditStatus(@PathVariable Integer protectObjectId,
@PathVariable Integer auditStatus) {
return ResponseResult.ok()

View File

@@ -0,0 +1,115 @@
package com.realtime.protection.server.defense.object;
import com.realtime.protection.configuration.entity.defense.object.ProtectObject;
import com.realtime.protection.configuration.response.ResponseResult;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.Valid;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotNull;
import org.apache.coyote.Response;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.util.List;
@Tag(name = "防护对象API", description = "防护对象模块所有接口")
public interface ProtectObjectControllerApi {
@PostMapping("/new")
@Operation(
summary = "新建防护对象",
description = "新建一个防护对象",
responses = {
@ApiResponse(
description = "返回新建对象结果",
content = @Content(
mediaType = "application/json",
schema = @Schema(implementation = ResponseResult.class)
)
)
},
requestBody = @io.swagger.v3.oas.annotations.parameters.RequestBody(description = "防护对象信息")
)
ResponseResult newProtectObject(@RequestBody @Valid ProtectObject protectObject);
@PostMapping("/upload")
@Operation(
summary = "批量上传防护对象",
description = "使用模板文件上传并新建多个防护对象",
responses = {
@ApiResponse(
description = "返回批量上传新建对象结果",
content = @Content(
mediaType = "application/json",
schema = @Schema(implementation = ResponseResult.class)
)
)
},
requestBody = @io.swagger.v3.oas.annotations.parameters.RequestBody(description = "上传文件")
)
ResponseResult uploadFile(
@NotNull(message = "uploadFile cannot be null. ") MultipartFile uploadFile
) throws IOException;
@GetMapping("/download")
@Operation(
summary = "下载模板文件",
description = "下载防护对象上传模板文件",
responses = {
@ApiResponse(
description = "返回防护对象模板文件",
content = @Content(
mediaType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
)
)
}
)
void downloadTemplate(HttpServletResponse response) throws IOException;
@GetMapping("/query")
@Operation(
summary = "根据条件查询多个防护对象",
description = "根据查询条件和页码等,查询多个对象并以列表返回",
responses = {
@ApiResponse(
description = "返回多个防护对象",
content = @Content(
mediaType = "application/json",
schema = @Schema(implementation = ResponseResult.class)
)
)
},
parameters = {
@Parameter()
}
)
ResponseResult queryProtectObjects(@RequestParam(value = "proobj_name", required = false)
String protectObjectName,
@RequestParam(value = "proobj_id", required = false) @Min(1)
Integer protectObjectId,
@RequestParam("page") @Min(1) Integer page,
@RequestParam("page_size") @Min(1) Integer pageSize);
@GetMapping("/{protectObjectId}/query")
ResponseResult queryProtectObject(@PathVariable Integer protectObjectId) throws IllegalAccessException;
@PostMapping("/{protectObjectId}/update")
ResponseResult updateProtectObject(@PathVariable Integer protectObjectId,
@RequestBody @Valid ProtectObject protectObject);
@DeleteMapping("/{protectObjectId}/delete")
ResponseResult deleteProtectObject(@PathVariable Integer protectObjectId);
@DeleteMapping("/delete/{protectObjectIds}")
ResponseResult deleteProtectObject(@PathVariable List<Integer> protectObjectIds);
@GetMapping("/{protectObjectId}/audit/{auditStatus}")
ResponseResult changeProtectObjectAuditStatus(@PathVariable Integer protectObjectId,
@PathVariable Integer auditStatus);
}

View File

@@ -10,7 +10,7 @@ import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/deftac")
@RequestMapping("/template")
public class TemplateController {
private final TemplateService templateService;
@@ -21,15 +21,8 @@ public class TemplateController {
@PostMapping("/new")
public ResponseResult newTemplate(@RequestBody @Valid Template template) {
Integer templateId;
try {
templateId = templateService.newTemplate(template);
} catch (IllegalArgumentException e) {
return new ResponseResult(400, "Illegal Argument in template_elements or default_op")
.setData("template_id", null)
.setData("success", false);
}
Integer templateId = templateService.newTemplate(template);
if (templateId > 0) {
return ResponseResult.ok()

View File

@@ -15,7 +15,7 @@ import java.util.List;
@RestController
@RequestMapping("/task")
public class TaskController {
public class TaskController implements TaskControllerApi {
private final TaskService taskService;
private final StateChangeService stateChangeService;
@@ -25,6 +25,7 @@ public class TaskController {
this.stateChangeService = stateChangeService;
}
@Override
@PostMapping("/new")
public ResponseResult newTask(@RequestBody @Valid Task task) {
Long taskId = taskService.newTask(task);
@@ -42,6 +43,7 @@ public class TaskController {
.setData("success", false);
}
@Override
@GetMapping("/query")
public ResponseResult queryTasks(@RequestParam(value = "task_status", required = false) Integer taskStatus,
@RequestParam(value = "task_type", required = false) String taskType,
@@ -54,6 +56,7 @@ public class TaskController {
.setData("task_list", tasks);
}
@Override
@GetMapping("/{id}/query")
public ResponseResult queryTask(@PathVariable @Min(1) Long id) throws IllegalAccessException {
Task task = taskService.queryTask(id);
@@ -66,13 +69,16 @@ public class TaskController {
.setDataMap(EntityUtils.entityToMap(task));
}
@PostMapping("/update")
public ResponseResult updateTask(@RequestBody @Valid Task task) {
@Override
@PostMapping("/{taskId}/update")
public ResponseResult updateTask(@PathVariable Long taskId, @RequestBody @Valid Task task) {
task.setTaskId(taskId);
return ResponseResult.ok()
.setData("task_id", task.getTaskId())
.setData("success", taskService.updateTask(task));
}
@Override
@GetMapping("/{taskId}/audit/{auditStatus}")
public ResponseResult changeTaskAuditStatus(@PathVariable @NotNull @Max(10) Integer auditStatus,
@PathVariable @NotNull @Min(1) Long taskId) {
@@ -83,13 +89,15 @@ public class TaskController {
.setData("audit_status", taskService.queryTaskAuditStatus(taskId));
}
@GetMapping("/{taskId}/delete")
@Override
@DeleteMapping("/{taskId}/delete")
public ResponseResult deleteTask(@PathVariable @NotNull @Min(1) Long taskId) {
return ResponseResult.ok()
.setData("task_id", taskId)
.setData("success", taskService.deleteTask(taskId));
}
@Override
@GetMapping("/{taskId}/running/{stateNum}")
public ResponseResult changeTaskStatus(@PathVariable @NotNull Integer stateNum,
@PathVariable @NotNull Long taskId) throws DorisStartException {

View File

@@ -0,0 +1,162 @@
package com.realtime.protection.server.task;
import com.realtime.protection.configuration.entity.task.Task;
import com.realtime.protection.configuration.exception.DorisStartException;
import com.realtime.protection.configuration.response.ResponseResult;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotNull;
import org.springframework.web.bind.annotation.*;
@Tag(name = "任务控制器API", description = "任务管理模块相关的所有接口")
public interface TaskControllerApi {
@PostMapping("/new")
@Operation(
summary = "添加任务",
description = "根据任务信息添加任务并返回任务添加结果",
responses = {
@ApiResponse(
description = "返回任务添加结果信息",
content = @Content(
mediaType = "application/json",
schema = @Schema(implementation = ResponseResult.class)
)
)
},
requestBody = @io.swagger.v3.oas.annotations.parameters.RequestBody(description = "任务信息")
)
ResponseResult newTask(@RequestBody @Valid Task task);
@GetMapping("/query")
@Operation(
summary = "查询任务",
description = "按页和搜索内容查询任务相关信息",
responses = {
@ApiResponse(
description = "返回查询到的所有任务",
content = @Content(
mediaType = "application/json",
schema = @Schema(implementation = ResponseResult.class)
)
)
},
parameters = {
@Parameter(name = "task_status", description = "任务状态0为未启动1为生成中2为运行中3为暂停中4为已停止5为已结束6为失败"),
@Parameter(name = "task_type", description = "任务类型1为静态2为实时3为研判后"),
@Parameter(name = "task_name", description = "任务名称"),
@Parameter(name = "task_creator", description = "任务创建人"),
@Parameter(name = "page", description = "页码", example = "1"),
@Parameter(name = "page_size", description = "每页查询个数", example = "10")
}
)
ResponseResult queryTasks(@RequestParam(value = "task_status", required = false) Integer taskStatus,
@RequestParam(value = "task_type", required = false) String taskType,
@RequestParam(value = "task_name", required = false) String taskName,
@RequestParam(value = "task_creator", required = false) String taskCreator,
@RequestParam("page") @Min(1) Integer page,
@RequestParam("page_size") @Min(1) Integer pageSize);
@GetMapping("/{id}/query")
@Operation(
summary = "查询单个任务",
description = "根据任务ID查询单个任务的所有详细信息",
responses = {
@ApiResponse(
description = "返回查询到的单个任务",
content = @Content(
mediaType = "application/json",
schema = @Schema(implementation = ResponseResult.class)
)
)
},
parameters = {@Parameter(name = "id", description = "任务ID", example = "38")}
)
ResponseResult queryTask(@PathVariable @Min(1) Long id) throws IllegalAccessException;
@PostMapping("/{taskId}/update")
@Operation(
summary = "更新任务",
description = "根据任务信息更新任务并返回更新结果",
responses = {
@ApiResponse(
description = "返回任务更新结果信息",
content = @Content(
mediaType = "application/json",
schema = @Schema(implementation = ResponseResult.class)
)
)
},
requestBody = @io.swagger.v3.oas.annotations.parameters.RequestBody(
description = "任务信息,必须包含任务原有的或者添加/删除部分后的static_rule_ids和dynamic_rule_ids"
)
)
ResponseResult updateTask(@PathVariable Long taskId, @RequestBody @Valid Task task);
@GetMapping("/{taskId}/audit/{auditStatus}")
@Operation(
summary = "任务审核状态修改",
description = "修改ID对应的任务的审核状态",
responses = {
@ApiResponse(
description = "返回任务审核状态修改的信息",
content = @Content(
mediaType = "application/json",
schema = @Schema(implementation = ResponseResult.class)
)
)
},
parameters = {
@Parameter(name = "taskId", description = "任务ID", example = "38"),
@Parameter(name = "auditStatus", description = "任务欲修改的审核状态0为未审核1为已退回2为审核通过", example = "2")
}
)
ResponseResult changeTaskAuditStatus(@PathVariable @NotNull @Max(10) Integer auditStatus,
@PathVariable @NotNull @Min(1) Long taskId);
@DeleteMapping("/{taskId}/delete")
@Operation(
summary = "删除单个任务",
description = "根据任务ID删除对应任务",
responses = {
@ApiResponse(
description = "返回任务删除结果信息",
content = @Content(
mediaType = "application/json",
schema = @Schema(implementation = ResponseResult.class)
)
)
},
parameters = {
@Parameter(name = "taskId", description = "任务ID")
}
)
ResponseResult deleteTask(@PathVariable @NotNull @Min(1) Long taskId);
@GetMapping("/{taskId}/running/{stateNum}")
@Operation(
summary = "修改任务运行状态",
description = "修改ID对应的任务的运行状态",
responses = {
@ApiResponse(
description = "返回任务运行状态修改结果",
content = @Content(
mediaType = "application/json",
schema = @Schema(implementation = ResponseResult.class)
)
)
},
parameters = {
@Parameter(name = "taskId", description = "任务ID"),
@Parameter(name = "stateNum", description = "任务状态编号任务状态0为未启动1为生成中2为运行中3为暂停中4为已停止5为已结束6为失败")
}
)
ResponseResult changeTaskStatus(@PathVariable @NotNull Integer stateNum,
@PathVariable @NotNull Long taskId) throws DorisStartException;
}

View File

@@ -1,5 +1,6 @@
package com.realtime.protection.server.task;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.realtime.protection.configuration.entity.task.Task;
import com.realtime.protection.configuration.entity.task.TaskCommandInfo;
import com.realtime.protection.configuration.utils.status.AuditStatusValidator;
@@ -20,8 +21,11 @@ public class TaskService {
public Long newTask(Task task) {
taskMapper.newTask(task);
taskMapper.newTaskStaticRuleConcat(task.getTaskId(), task.getStaticRuleIds());
taskMapper.newTaskDynamicRuleConcat(task.getTaskId(), task.getDynamicRuleIds());
if (task.getStaticRuleIds() != null && !task.getStaticRuleIds().isEmpty())
taskMapper.newTaskStaticRuleConcat(task.getTaskId(), task.getStaticRuleIds());
if (task.getDynamicRuleIds() != null && !task.getDynamicRuleIds().isEmpty())
taskMapper.newTaskDynamicRuleConcat(task.getTaskId(), task.getDynamicRuleIds());
return task.getTaskId();
}
@@ -70,6 +74,7 @@ public class TaskService {
return taskMapper.deleteTask(taskId);
}
@DS("mysql")
public Boolean changeTaskStatus(Long taskId, Integer stateNum) {
return taskMapper.changeTaskStatus(taskId, stateNum);
}

View File

@@ -31,6 +31,10 @@ public class StateChangeService {
State newState = StateEnum.getStateByNum(stateNum);
if (newState == null) {
return false;
}
if (!originalState.handle(newState, commandService, taskService, taskId)) {
return false;
}

View File

@@ -77,13 +77,7 @@ public class StateHandler {
throw new IllegalArgumentException("static rules are empty, need to choose at least one static rule");
}
try {
commandService.createCommands(staticTaskCommandInfos);
} catch (DorisStartException e) {
e.taskId = taskId;
throw e;
}
commandService.createCommands(staticTaskCommandInfos);
return true;
}
}

View File

@@ -0,0 +1,19 @@
package com.realtime.protection.server.task.status.states;
import com.realtime.protection.configuration.exception.DorisStartException;
import com.realtime.protection.configuration.utils.enums.StateEnum;
import com.realtime.protection.configuration.utils.status.State;
import com.realtime.protection.server.command.CommandService;
import com.realtime.protection.server.task.TaskService;
import com.realtime.protection.server.task.status.StateHandler;
public class GeneratingState extends StateHandler implements State {
@Override
public Boolean handle(State newState, CommandService commandService, TaskService taskService, Long taskId) throws DorisStartException {
return switch(StateEnum.getStateEnumByState(newState)) {
case RUNNING, GENERATING -> true;
case FAILED -> handleFailed(commandService, taskId);
default -> throw new IllegalStateException("Unexpected value: " + StateEnum.getStateEnumByState(newState));
};
}
}

View File

@@ -11,7 +11,7 @@ public class PendingState extends StateHandler implements State {
@Override
public Boolean handle(State newState, CommandService commandService, TaskService taskService, Long taskId) throws DorisStartException {
return switch (StateEnum.getStateEnumByState(newState)) {
case RUNNING -> handleStart(taskService, commandService, taskId);
case GENERATING -> handleStart(taskService, commandService, taskId);
case FAILED -> handleFailed(commandService, taskId);
default -> throw new IllegalStateException("Unexpected value: " + StateEnum.getStateEnumByState(newState));
};

View File

@@ -10,7 +10,7 @@ public class RunningState extends StateHandler implements State {
@Override
public Boolean handle(State newState, CommandService commandService, TaskService taskService, Long taskId) {
return switch(StateEnum.getStateEnumByState(newState)) {
case RUNNING -> true;
case RUNNING, GENERATING -> true;
case PAUSED -> handlePause(commandService, taskId);
case STOP -> handleStop(commandService, taskId);
case FINISHED -> handleFinish(commandService, taskId);