diff --git a/modules/module-ci-process-api/src/main/java/cd/casic/ci/api/SastController.java b/modules/module-ci-process-api/src/main/java/cd/casic/ci/api/SastController.java new file mode 100644 index 00000000..6709ba64 --- /dev/null +++ b/modules/module-ci-process-api/src/main/java/cd/casic/ci/api/SastController.java @@ -0,0 +1,66 @@ +package cd.casic.ci.api; + +import cd.casic.ci.process.dto.req.sast.SastApplicationCreateReq; +import cd.casic.ci.process.dto.req.sast.SastEngineConfigReq; +import cd.casic.ci.process.dto.req.sast.SastIdentifiedLanguageTaskReq; +import cd.casic.ci.process.dto.resp.sast.*; +import cd.casic.ci.process.process.service.sast.SastService; +import cd.casic.framework.commons.exception.enums.GlobalErrorCodeConstants; +import cd.casic.framework.commons.pojo.CommonResult; +import jakarta.annotation.Resource; +import jakarta.validation.constraints.Negative; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; +import java.util.List; + +@RestController +@RequestMapping("/sast") +public class SastController { + @Resource + private SastService sastService; + @GetMapping("/applicationExist") + public CommonResult applicationExist(@RequestParam String applicationName){ + Boolean b = sastService.applicationExist(applicationName); + return CommonResult.success(b); + } + @PostMapping("/uploadFile") + public CommonResult uploadFile(MultipartFile multipartFile){ + try { + return CommonResult.success(sastService.uploadFile(multipartFile.getResource().getFile())); + } catch (IOException e) { + return CommonResult.error(GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR); + } + } + @PostMapping("/createIdentifiedLanguageTask") + public CommonResult createIdentifiedLanguageTask(@RequestBody SastIdentifiedLanguageTaskReq req){ + SastIdentifiedLanguageTaskResp identifiedLanguageTask = sastService.createIdentifiedLanguageTask(req); + return CommonResult.success(identifiedLanguageTask); + } + @GetMapping("/getIdentifiedLanguageTaskStatus/{taskId}") + public CommonResult getIdentifiedLanguageTaskStatus(@PathVariable String taskId){ + SastIdentifiedLanguageTaskResp identifiedLanguageTaskStatus = sastService.getIdentifiedLanguageTaskStatus(taskId); + return CommonResult.success(identifiedLanguageTaskStatus); + } + @PostMapping("/engineConfig") + public CommonResult> engineConfig(@RequestBody SastEngineConfigReq req){ + return CommonResult.success(sastService.engineConfig(req.getLanguageIdList())); + } + @GetMapping("/detectionConfig/{languageId}") + public CommonResult detectionConfig(@PathVariable String languageId){ + SastDetectionConfigResp sastDetectionConfigResp = sastService.detectionConfig(languageId); + return CommonResult.success(sastDetectionConfigResp); + } + @PostMapping("/applicationCreateOrUpdate") + public CommonResult applicationCreateOrUpdate(@RequestBody SastApplicationCreateReq req){ + SastApplicationCreateResp sastApplicationCreateResp = sastService.applicationCreate(req); + return CommonResult.success(sastApplicationCreateResp); + } + @GetMapping("/getApplicationEcho/{applicationId}") + public CommonResult getApplicationEcho(@PathVariable String applicationId){ + SastApplicationEchoResp applicationEcho = sastService.getApplicationEcho(applicationId); + return CommonResult.success(applicationEcho); + } +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/constant/SastUrlConstant.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/constant/SastUrlConstant.java index 7a616a9b..f28de3b6 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/constant/SastUrlConstant.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/constant/SastUrlConstant.java @@ -13,4 +13,6 @@ public class SastUrlConstant { public static final String getIdentifiedLanguageTaskStatus = "/invoke/file/getIdentifiedLanguageTaskStatus"; public static final String engineConfig = "/invoke/engine/config"; public static final String detectionConfig = "/invoke/project/setting/getDetectionConfig"; + public static final String applicationCreate = "/invoke/application/create"; + public static final String getApplicationEcho = "/invoke/application/getApplicationEcho"; } diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/dto/req/sast/SastApplicationCreateReq.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/dto/req/sast/SastApplicationCreateReq.java new file mode 100644 index 00000000..4ab8a4b0 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/dto/req/sast/SastApplicationCreateReq.java @@ -0,0 +1,63 @@ +package cd.casic.ci.process.dto.req.sast; + +import lombok.Data; + +import java.util.List; +@Data +public class SastApplicationCreateReq { + /** + * 项目Id + * */ + private String projectId; + /** + * 应用名称 + * */ + private String applicationName; + /** + * 源代码ONLINE 或者字节码COMPRESS_FILE + * */ + private String codeSourceFrom; + /** + * GITLAB,GITEE,GITHUB,LOCAL (本地) + * */ + private String codeRepoType; + /** + * git连接状态 目前不用git 固定传false + * */ + private Boolean connectionStatus; + /** + * 语言和模板配置,是否开启编译模式(目前不开启传false) + * */ + private List config; + /** + * 传接口获取到的引擎id + * */ + private List openEngine; + /** + * 传上传文件接口返回的文件id + * */ + private List fileId; + /** + * 编辑时使用 applicationId + * */ + private String applicationId; + /** + * 是否开启缺陷自动研判 + * */ + private Boolean autoAudit; + /** + * 函数过滤内容 + * */ + private String functionFilter; + + @Data + public static class SastApplicationConfig{ + private String languageId; + private String templateId; + private String version; + private String compileTool; + private String compileCommand; + private boolean compile; + private boolean isCompile; + } +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/dto/req/sast/SastEngineConfigReq.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/dto/req/sast/SastEngineConfigReq.java new file mode 100644 index 00000000..a033b0b7 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/dto/req/sast/SastEngineConfigReq.java @@ -0,0 +1,9 @@ +package cd.casic.ci.process.dto.req.sast; + +import lombok.Data; + +import java.util.List; +@Data +public class SastEngineConfigReq { + private List languageIdList; +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/dto/resp/sast/SastApplicationCreateResp.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/dto/resp/sast/SastApplicationCreateResp.java new file mode 100644 index 00000000..691ba323 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/dto/resp/sast/SastApplicationCreateResp.java @@ -0,0 +1,19 @@ +package cd.casic.ci.process.dto.resp.sast; + +import lombok.Data; + +@Data +public class SastApplicationCreateResp { + private String applicationId; + private String applicationName; + private String taskId; + private String fileId; + private String jobAddBy; + private String jobStatus; + private String checkStartTime; + private String checkEndTime; + private String codeQualityMetric; + private String engineType; + private String progress; + private String type; +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/dto/resp/sast/SastApplicationEchoResp.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/dto/resp/sast/SastApplicationEchoResp.java new file mode 100644 index 00000000..a62c3d08 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/dto/resp/sast/SastApplicationEchoResp.java @@ -0,0 +1,33 @@ +package cd.casic.ci.process.dto.resp.sast; + +import cd.casic.ci.process.dto.req.sast.SastApplicationCreateReq; +import lombok.Data; + +import java.util.List; + +@Data +public class SastApplicationEchoResp { + private String projectId; + private List lodeFiles; + private String applicationName; + private String applicationId; + private String codeSourceFrom; + private String codeRepoType; + private String codeRepoUrl; + private boolean selfCodeRepo; + private String codeRepoCertId; + private boolean connectionStatus; + private String branchName; + private String branchKey; + private List config; + private List openEngine; + private boolean autoAudit; + private String functionFilter; // 如有具体结构可进一步细化 + + @Data + public static class LodeFile { + private String fileId; + private String fileName; + } + +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/converter/SastConverter.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/converter/SastConverter.java new file mode 100644 index 00000000..1378e789 --- /dev/null +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/converter/SastConverter.java @@ -0,0 +1,13 @@ +package cd.casic.ci.process.process.converter; + +import cd.casic.ci.process.dto.req.sast.SastApplicationCreateReq; +import cd.casic.ci.process.dto.resp.sast.SastApplicationEchoResp; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +@Mapper(componentModel = "spring") +public interface SastConverter { + SastConverter INSTANCE = Mappers.getMapper(SastConverter.class); + SastApplicationCreateReq converter(SastApplicationEchoResp echoResp); + +} diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/sast/SastService.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/sast/SastService.java index f6cb7e8c..af669e15 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/sast/SastService.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/sast/SastService.java @@ -1,10 +1,8 @@ package cd.casic.ci.process.process.service.sast; +import cd.casic.ci.process.dto.req.sast.SastApplicationCreateReq; import cd.casic.ci.process.dto.req.sast.SastIdentifiedLanguageTaskReq; -import cd.casic.ci.process.dto.resp.sast.SastDetectionConfigResp; -import cd.casic.ci.process.dto.resp.sast.SastEngineConfigResp; -import cd.casic.ci.process.dto.resp.sast.SastFileUploadResp; -import cd.casic.ci.process.dto.resp.sast.SastIdentifiedLanguageTaskResp; +import cd.casic.ci.process.dto.resp.sast.*; import java.io.File; import java.util.List; @@ -17,4 +15,6 @@ public interface SastService { public SastIdentifiedLanguageTaskResp getIdentifiedLanguageTaskStatus(String taskId); List engineConfig(List languageIdList); SastDetectionConfigResp detectionConfig(String languageId); + SastApplicationCreateResp applicationCreate(SastApplicationCreateReq req); + SastApplicationEchoResp getApplicationEcho(String applicationId); } diff --git a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/sast/impl/SastServiceImpl.java b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/sast/impl/SastServiceImpl.java index c292843d..ad4b9ab0 100644 --- a/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/sast/impl/SastServiceImpl.java +++ b/modules/module-ci-process-biz/src/main/java/cd/casic/ci/process/process/service/sast/impl/SastServiceImpl.java @@ -1,5 +1,6 @@ package cd.casic.ci.process.process.service.sast.impl; +import cd.casic.ci.process.dto.req.sast.SastApplicationCreateReq; import cd.casic.ci.process.dto.req.sast.SastIdentifiedLanguageTaskReq; import cd.casic.ci.process.dto.resp.sast.*; import cd.casic.ci.process.process.service.sast.SastService; @@ -110,6 +111,7 @@ public class SastServiceImpl implements SastService { ResponseEntity exchange = restTemplate.exchange(baseUrl+createIdentifiedLanguageTask, HttpMethod.POST,entity,SastIdentifiedLanguageTaskResp.class,new HashMap<>()); return exchange.getBody(); } + @Override public SastIdentifiedLanguageTaskResp getIdentifiedLanguageTaskStatus(String taskId){ HttpHeaders httpHeaders = getHeaders(); @@ -122,18 +124,17 @@ public class SastServiceImpl implements SastService { ResponseEntity exchange = restTemplate.exchange(uriString, HttpMethod.GET,entity,SastIdentifiedLanguageTaskResp.class,new HashMap<>()); return exchange.getBody(); } + @Override public List engineConfig(List languageIdList){ HttpHeaders httpHeaders = getHeaders(); Map entityMap = new HashMap<>(); HttpEntity> entity = new HttpEntity<>(entityMap,httpHeaders); String uriString = UriComponentsBuilder.fromHttpUrl(baseUrl + engineConfig).queryParam("languageIds", StringUtils.joinWith(",", languageIdList.toArray())).toUriString(); - // 别问我为啥要解码。坑爹的不支持Uri encode识别 - String decode = URLDecoder.decode(uriString, StandardCharsets.UTF_8); - System.out.println(decode); - ResponseEntity exchange = restTemplate.exchange(decode, HttpMethod.GET,entity, String.class,new HashMap<>()); + ResponseEntity exchange = restTemplate.exchange(uriString, HttpMethod.GET,entity, String.class,new HashMap<>()); return JSON.parseArray(exchange.getBody(), SastEngineConfigResp.class); } + @Override public SastDetectionConfigResp detectionConfig(String languageId){ HttpHeaders httpHeaders = getHeaders(); Map entityMap = new HashMap<>(); @@ -145,6 +146,26 @@ public class SastServiceImpl implements SastService { return exchange.getBody(); } + @Override + public SastApplicationCreateResp applicationCreate(SastApplicationCreateReq req) { + HttpHeaders httpHeaders = getHeaders(); + HttpEntity entity = new HttpEntity<>(req,httpHeaders); + httpHeaders.setContentType(MediaType.APPLICATION_JSON); + ResponseEntity exchange = restTemplate.exchange(baseUrl+applicationCreate, HttpMethod.POST,entity,SastApplicationCreateResp.class,new HashMap<>()); + SastApplicationCreateResp body = exchange.getBody(); + return body; + } + @Override + public SastApplicationEchoResp getApplicationEcho(String applicationId){ + HttpHeaders httpHeaders = getHeaders(); + Map entityMap = new HashMap<>(); + HttpEntity> entity = new HttpEntity<>(entityMap,httpHeaders); + String uriString = UriComponentsBuilder.fromHttpUrl(baseUrl + getApplicationEcho).queryParam("applicationId", applicationId).toUriString(); + System.out.println(uriString); + ResponseEntity exchange = restTemplate.exchange(uriString, HttpMethod.GET,entity,SastApplicationEchoResp.class,new HashMap<>()); + return exchange.getBody(); + } + private HttpHeaders getHeaders(){ HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.set(TOKEN_HEADER_KEY,TOKEN_PREFIX+getToken()); diff --git a/ops-server/src/test/java/cd/casic/server/SastTest.java b/ops-server/src/test/java/cd/casic/server/SastTest.java index 62547f7a..3426232c 100644 --- a/ops-server/src/test/java/cd/casic/server/SastTest.java +++ b/ops-server/src/test/java/cd/casic/server/SastTest.java @@ -1,9 +1,9 @@ package cd.casic.server; +import cd.casic.ci.process.dto.req.sast.SastApplicationCreateReq; import cd.casic.ci.process.dto.req.sast.SastIdentifiedLanguageTaskReq; -import cd.casic.ci.process.dto.resp.sast.SastDetectionConfigResp; -import cd.casic.ci.process.dto.resp.sast.SastEngineConfigResp; -import cd.casic.ci.process.dto.resp.sast.SastIdentifiedLanguageTaskResp; +import cd.casic.ci.process.dto.resp.sast.*; +import cd.casic.ci.process.process.converter.SastConverter; import cd.casic.ci.process.process.service.sast.SastService; import cd.casic.ci.process.properties.SastProperties; import cd.casic.framework.redis.core.RedisTemplateUtils; @@ -11,6 +11,8 @@ import com.alibaba.fastjson.JSON; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.BeanFactoryUtils; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.test.context.ActiveProfiles; @@ -111,4 +113,23 @@ public class SastTest { SastDetectionConfigResp resp = sastService.detectionConfig("17417989-2c50-11ee-a171-e2d048d4b7ce"); System.out.println(resp); } + @Test + public void applicationEcho(){ + System.out.println(sastService.getApplicationEcho("98776c27-0f8b-4884-abed-26b384008968")); + } + @Resource + private SastConverter converter; + @Test + public void applicationCreate(){ + SastApplicationEchoResp applicationEcho = sastService.getApplicationEcho("98776c27-0f8b-4884-abed-26b384008968"); + System.out.println(JSON.toJSONString(applicationEcho)); + + SastApplicationCreateReq sastApplicationCreateReq = converter.converter(applicationEcho); + List list = applicationEcho.getLodeFiles().stream().map(SastApplicationEchoResp.LodeFile::getFileId).toList(); + sastApplicationCreateReq.setFileId(list); + sastApplicationCreateReq.setApplicationId("98776c27-0f8b-4884-abed-26b384008968"); + System.out.println(JSON.toJSONString(sastApplicationCreateReq)); + SastApplicationCreateResp sastApplicationCreateResp = sastService.applicationCreate(sastApplicationCreateReq); + System.out.println(JSON.toJSONString(sastApplicationCreateResp)); + } }