sast接口

This commit is contained in:
even 2025-06-12 17:09:51 +08:00
parent 0ffda43a67
commit 36174afe65
10 changed files with 258 additions and 11 deletions

View File

@ -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<Boolean> applicationExist(@RequestParam String applicationName){
Boolean b = sastService.applicationExist(applicationName);
return CommonResult.success(b);
}
@PostMapping("/uploadFile")
public CommonResult<SastFileUploadResp> 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<SastIdentifiedLanguageTaskResp> createIdentifiedLanguageTask(@RequestBody SastIdentifiedLanguageTaskReq req){
SastIdentifiedLanguageTaskResp identifiedLanguageTask = sastService.createIdentifiedLanguageTask(req);
return CommonResult.success(identifiedLanguageTask);
}
@GetMapping("/getIdentifiedLanguageTaskStatus/{taskId}")
public CommonResult<SastIdentifiedLanguageTaskResp> getIdentifiedLanguageTaskStatus(@PathVariable String taskId){
SastIdentifiedLanguageTaskResp identifiedLanguageTaskStatus = sastService.getIdentifiedLanguageTaskStatus(taskId);
return CommonResult.success(identifiedLanguageTaskStatus);
}
@PostMapping("/engineConfig")
public CommonResult<List<SastEngineConfigResp>> engineConfig(@RequestBody SastEngineConfigReq req){
return CommonResult.success(sastService.engineConfig(req.getLanguageIdList()));
}
@GetMapping("/detectionConfig/{languageId}")
public CommonResult<SastDetectionConfigResp> detectionConfig(@PathVariable String languageId){
SastDetectionConfigResp sastDetectionConfigResp = sastService.detectionConfig(languageId);
return CommonResult.success(sastDetectionConfigResp);
}
@PostMapping("/applicationCreateOrUpdate")
public CommonResult<SastApplicationCreateResp> applicationCreateOrUpdate(@RequestBody SastApplicationCreateReq req){
SastApplicationCreateResp sastApplicationCreateResp = sastService.applicationCreate(req);
return CommonResult.success(sastApplicationCreateResp);
}
@GetMapping("/getApplicationEcho/{applicationId}")
public CommonResult<SastApplicationEchoResp> getApplicationEcho(@PathVariable String applicationId){
SastApplicationEchoResp applicationEcho = sastService.getApplicationEcho(applicationId);
return CommonResult.success(applicationEcho);
}
}

View File

@ -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";
}

View File

@ -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;
/**
* GITLABGITEEGITHUBLOCAL (本地)
* */
private String codeRepoType;
/**
* git连接状态 目前不用git 固定传false
* */
private Boolean connectionStatus;
/**
* 语言和模板配置是否开启编译模式目前不开启传false
* */
private List<SastApplicationConfig> config;
/**
* 传接口获取到的引擎id
* */
private List<String> openEngine;
/**
* 传上传文件接口返回的文件id
* */
private List<String> 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;
}
}

View File

@ -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<String> languageIdList;
}

View File

@ -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;
}

View File

@ -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<LodeFile> 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<SastApplicationCreateReq.SastApplicationConfig> config;
private List<String> openEngine;
private boolean autoAudit;
private String functionFilter; // 如有具体结构可进一步细化
@Data
public static class LodeFile {
private String fileId;
private String fileName;
}
}

View File

@ -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);
}

View File

@ -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<SastEngineConfigResp> engineConfig(List<String> languageIdList);
SastDetectionConfigResp detectionConfig(String languageId);
SastApplicationCreateResp applicationCreate(SastApplicationCreateReq req);
SastApplicationEchoResp getApplicationEcho(String applicationId);
}

View File

@ -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<SastIdentifiedLanguageTaskResp> 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<SastIdentifiedLanguageTaskResp> exchange = restTemplate.exchange(uriString, HttpMethod.GET,entity,SastIdentifiedLanguageTaskResp.class,new HashMap<>());
return exchange.getBody();
}
@Override
public List<SastEngineConfigResp> engineConfig(List<String> languageIdList){
HttpHeaders httpHeaders = getHeaders();
Map<String, String> entityMap = new HashMap<>();
HttpEntity<Map<String, String>> 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<String> exchange = restTemplate.exchange(decode, HttpMethod.GET,entity, String.class,new HashMap<>());
ResponseEntity<String> 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<String, String> 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<SastApplicationCreateReq> entity = new HttpEntity<>(req,httpHeaders);
httpHeaders.setContentType(MediaType.APPLICATION_JSON);
ResponseEntity<SastApplicationCreateResp> 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<String, String> entityMap = new HashMap<>();
HttpEntity<Map<String, String>> entity = new HttpEntity<>(entityMap,httpHeaders);
String uriString = UriComponentsBuilder.fromHttpUrl(baseUrl + getApplicationEcho).queryParam("applicationId", applicationId).toUriString();
System.out.println(uriString);
ResponseEntity<SastApplicationEchoResp> 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());

View File

@ -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<String> 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));
}
}