fix(接口测试): 修复定时导入不生效的缺陷

This commit is contained in:
wxg0103 2024-04-01 19:54:58 +08:00 committed by Craftsman
parent fbdf3b1be3
commit b888024dea
10 changed files with 51 additions and 35 deletions

View File

@ -28,7 +28,7 @@ public class ApiReportShareController {
@Operation(summary = "接口测试-接口报告-生成分享链接") @Operation(summary = "接口测试-接口报告-生成分享链接")
@RequiresPermissions(PermissionConstants.PROJECT_API_REPORT_SHARE) @RequiresPermissions(PermissionConstants.PROJECT_API_REPORT_SHARE)
public ShareInfoDTO generateShareInfo(@Validated(Created.class) @RequestBody ApiReportShareRequest request) { public ShareInfoDTO generateShareInfo(@Validated(Created.class) @RequestBody ApiReportShareRequest request) {
return apiReportShareService.gen(request, Objects.requireNonNull(SessionUtils.getUser())); return apiReportShareService.gen(request, SessionUtils.getUserId());
} }
@GetMapping("/get/{id}") @GetMapping("/get/{id}")

View File

@ -217,7 +217,8 @@ public class ApiDefinitionController {
@RequiresPermissions(PermissionConstants.PROJECT_API_DEFINITION_IMPORT) @RequiresPermissions(PermissionConstants.PROJECT_API_DEFINITION_IMPORT)
@Operation(summary = "接口测试-接口管理-导入接口定义") @Operation(summary = "接口测试-接口管理-导入接口定义")
public void testCaseImport(@RequestPart(value = "file", required = false) MultipartFile file, @RequestPart("request") ImportRequest request) { public void testCaseImport(@RequestPart(value = "file", required = false) MultipartFile file, @RequestPart("request") ImportRequest request) {
apiDefinitionService.apiTestImport(file, request, SessionUtils.getUser(), SessionUtils.getCurrentProjectId()); request.setUserId(SessionUtils.getUserId());
apiDefinitionService.apiTestImport(file, request, SessionUtils.getCurrentProjectId());
} }
@PostMapping("/operation-history") @PostMapping("/operation-history")

View File

@ -4,6 +4,8 @@ import io.metersphere.api.domain.ApiReport;
import io.metersphere.api.domain.ApiScenario; import io.metersphere.api.domain.ApiScenario;
import io.metersphere.api.domain.ApiScenarioReport; import io.metersphere.api.domain.ApiScenarioReport;
import io.metersphere.api.domain.ApiTestCase; import io.metersphere.api.domain.ApiTestCase;
import io.metersphere.api.dto.share.ApiReportShareRequest;
import io.metersphere.api.dto.share.ShareInfoDTO;
import io.metersphere.api.mapper.ApiReportMapper; import io.metersphere.api.mapper.ApiReportMapper;
import io.metersphere.api.mapper.ApiScenarioMapper; import io.metersphere.api.mapper.ApiScenarioMapper;
import io.metersphere.api.mapper.ApiScenarioReportMapper; import io.metersphere.api.mapper.ApiScenarioReportMapper;
@ -51,23 +53,32 @@ public class ApiReportSendNoticeService {
@Resource @Resource
private ProjectMapper projectMapper; private ProjectMapper projectMapper;
private static final String API_SCENARIO = "API_SCENARIO"; private static final String API_SCENARIO = "API_SCENARIO";
private static final String API_CASE = "API_CASE";
public void sendNotice(ApiNoticeDTO noticeDTO) { public void sendNotice(ApiNoticeDTO noticeDTO) {
String noticeType; String noticeType;
String reportUrl;
SystemParameterService systemParameterService = CommonBeanFactory.getBean(SystemParameterService.class); SystemParameterService systemParameterService = CommonBeanFactory.getBean(SystemParameterService.class);
assert systemParameterService != null; assert systemParameterService != null;
BaseSystemConfigDTO baseSystemConfigDTO = systemParameterService.getBaseInfo(); BaseSystemConfigDTO baseSystemConfigDTO = systemParameterService.getBaseInfo();
BeanMap beanMap; BeanMap beanMap;
String event; String event;
String status; String status;
ApiReportShareService shareService = CommonBeanFactory.getBean(ApiReportShareService.class);
ApiReportShareRequest shareRequest = new ApiReportShareRequest();
shareRequest.setReportId(noticeDTO.getReportId());
shareRequest.setProjectId(noticeDTO.getProjectId());
assert shareService != null;
ShareInfoDTO url = shareService.gen(shareRequest, noticeDTO.getUserId());
Project project = projectMapper.selectByPrimaryKey(noticeDTO.getProjectId());
String reportUrl = baseSystemConfigDTO.getUrl() + "/#/api-test/report?orgId=%s&pId=%s&type=%s&reportId=%s";
String shareUrl = baseSystemConfigDTO.getUrl() + "/#/share/%s?shareId=" + url.getId();
ApiScenarioReport report = new ApiScenarioReport(); ApiScenarioReport report = new ApiScenarioReport();
if (API_SCENARIO.equals(noticeDTO.getResourceType())) { if (API_SCENARIO.equals(noticeDTO.getResourceType())) {
ApiScenario scenario = apiScenarioMapper.selectByPrimaryKey(noticeDTO.getResourceId()); ApiScenario scenario = apiScenarioMapper.selectByPrimaryKey(noticeDTO.getResourceId());
beanMap = new BeanMap(scenario); beanMap = new BeanMap(scenario);
noticeType = NoticeConstants.TaskType.API_SCENARIO_TASK; noticeType = NoticeConstants.TaskType.API_SCENARIO_TASK;
reportUrl = baseSystemConfigDTO.getUrl() + "/#/api/automation/report/view/" + noticeDTO.getReportId();
report = apiScenarioReportMapper.selectByPrimaryKey(noticeDTO.getReportId()); report = apiScenarioReportMapper.selectByPrimaryKey(noticeDTO.getReportId());
reportUrl = String.format(reportUrl, project.getOrganizationId(), project.getId(), API_SCENARIO, report.getId());
if (StringUtils.endsWithIgnoreCase(noticeDTO.getReportStatus(), ApiReportStatus.SUCCESS.name())) { if (StringUtils.endsWithIgnoreCase(noticeDTO.getReportStatus(), ApiReportStatus.SUCCESS.name())) {
event = NoticeConstants.Event.SCENARIO_EXECUTE_SUCCESSFUL; event = NoticeConstants.Event.SCENARIO_EXECUTE_SUCCESSFUL;
status = "成功"; status = "成功";
@ -78,13 +89,14 @@ public class ApiReportSendNoticeService {
event = NoticeConstants.Event.SCENARIO_EXECUTE_FAILED; event = NoticeConstants.Event.SCENARIO_EXECUTE_FAILED;
status = "失败"; status = "失败";
} }
shareUrl = String.format(shareUrl, "shareReportScenario");
} else { } else {
ApiTestCase testCase = apiTestCaseMapper.selectByPrimaryKey(noticeDTO.getResourceId()); ApiTestCase testCase = apiTestCaseMapper.selectByPrimaryKey(noticeDTO.getResourceId());
beanMap = new BeanMap(testCase); beanMap = new BeanMap(testCase);
// TODO 是否需要区分场景和用例 // TODO 是否需要区分场景和用例
noticeType = NoticeConstants.TaskType.API_DEFINITION_TASK; noticeType = NoticeConstants.TaskType.API_DEFINITION_TASK;
reportUrl = baseSystemConfigDTO.getUrl() + "/#/api/automation/report/view/" + noticeDTO.getReportId(); reportUrl = String.format(reportUrl, project.getOrganizationId(), project.getId(), API_CASE, report.getId());
ApiReport apiReport = apiReportMapper.selectByPrimaryKey(noticeDTO.getReportId()); ApiReport apiReport = apiReportMapper.selectByPrimaryKey(noticeDTO.getReportId());
BeanUtils.copyBean(report, apiReport); BeanUtils.copyBean(report, apiReport);
@ -98,6 +110,7 @@ public class ApiReportSendNoticeService {
event = NoticeConstants.Event.CASE_EXECUTE_FAILED; event = NoticeConstants.Event.CASE_EXECUTE_FAILED;
status = "失败"; status = "失败";
} }
shareUrl = String.format(shareUrl, "shareReportCase");
} }
String userId = noticeDTO.getUserId(); String userId = noticeDTO.getUserId();
@ -137,16 +150,11 @@ public class ApiReportSendNoticeService {
} }
paramMap.put("reportUrl", reportUrl); paramMap.put("reportUrl", reportUrl);
paramMap.put("scenarioShareUrl", shareUrl);
// TODO: 缺少生成分享链接
String shareUrl = null;
paramMap.put("scenarioShareUrl", baseSystemConfigDTO.getUrl() + "/api/share-api-report" + shareUrl);
String context = "${operator}执行接口测试" + status + ": ${name}"; String context = "${operator}执行接口测试" + status + ": ${name}";
NoticeModel noticeModel = NoticeModel.builder().operator(userId) NoticeModel noticeModel = NoticeModel.builder().operator(userId)
.context(context).subject("执行通知").paramMap(paramMap).event(event).build(); .context(context).subject("执行通知").paramMap(paramMap).event(event).build();
Project project = projectMapper.selectByPrimaryKey(noticeDTO.getProjectId());
noticeSendService.send(project, noticeType, noticeModel); noticeSendService.send(project, noticeType, noticeModel);
} }

View File

@ -16,7 +16,8 @@ import io.metersphere.sdk.exception.MSException;
import io.metersphere.sdk.mapper.ShareInfoMapper; import io.metersphere.sdk.mapper.ShareInfoMapper;
import io.metersphere.sdk.util.BeanUtils; import io.metersphere.sdk.util.BeanUtils;
import io.metersphere.sdk.util.Translator; import io.metersphere.sdk.util.Translator;
import io.metersphere.system.dto.sdk.SessionUser; import io.metersphere.system.dto.user.UserDTO;
import io.metersphere.system.mapper.BaseUserMapper;
import io.metersphere.system.uid.IDGenerator; import io.metersphere.system.uid.IDGenerator;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.CollectionUtils;
@ -42,6 +43,8 @@ public class ApiReportShareService {
private ProjectApplicationMapper projectApplicationMapper; private ProjectApplicationMapper projectApplicationMapper;
@Resource @Resource
private ApiScenarioReportMapper apiScenarioReportMapper; private ApiScenarioReportMapper apiScenarioReportMapper;
@Resource
private BaseUserMapper baseUserMapper;
private static final Long DEFAULT = 1000L * 60 * 60 * 24; private static final Long DEFAULT = 1000L * 60 * 60 * 24;
@ -102,12 +105,13 @@ public class ApiReportShareService {
return returnDTO; return returnDTO;
} }
public ShareInfoDTO gen(ApiReportShareRequest shareRequest, SessionUser user) { public ShareInfoDTO gen(ApiReportShareRequest shareRequest, String userId) {
String lang = user.getLanguage() == null ? LocaleContextHolder.getLocale().toString() : user.getLanguage(); UserDTO userDTO = baseUserMapper.selectById(userId);
String lang = userDTO.getLanguage() == null ? LocaleContextHolder.getLocale().toString() : userDTO.getLanguage();
ShareInfo request = new ShareInfo(); ShareInfo request = new ShareInfo();
BeanUtils.copyBean(request, shareRequest); BeanUtils.copyBean(request, shareRequest);
request.setLang(lang); request.setLang(lang);
request.setCreateUser(user.getId()); request.setCreateUser(userId);
request.setCustomData(shareRequest.getReportId().getBytes()); request.setCustomData(shareRequest.getReportId().getBytes());
request.setShareType(ShareInfoType.API_SHARE_REPORT.name()); request.setShareType(ShareInfoType.API_SHARE_REPORT.name());
ShareInfo shareInfo = createShareInfo(request); ShareInfo shareInfo = createShareInfo(request);

View File

@ -14,8 +14,8 @@ import io.metersphere.api.dto.definition.ApiDefinitionDTO;
import io.metersphere.api.dto.definition.ApiDefinitionPageRequest; import io.metersphere.api.dto.definition.ApiDefinitionPageRequest;
import io.metersphere.api.dto.definition.ApiModuleRequest; import io.metersphere.api.dto.definition.ApiModuleRequest;
import io.metersphere.api.dto.request.ImportRequest; import io.metersphere.api.dto.request.ImportRequest;
import io.metersphere.api.dto.request.http.MsHeader;
import io.metersphere.api.dto.request.http.MsHTTPElement; import io.metersphere.api.dto.request.http.MsHTTPElement;
import io.metersphere.api.dto.request.http.MsHeader;
import io.metersphere.api.dto.request.http.QueryParam; import io.metersphere.api.dto.request.http.QueryParam;
import io.metersphere.api.dto.request.http.RestParam; import io.metersphere.api.dto.request.http.RestParam;
import io.metersphere.api.dto.request.http.body.*; import io.metersphere.api.dto.request.http.body.*;
@ -34,13 +34,14 @@ import io.metersphere.sdk.exception.MSException;
import io.metersphere.sdk.util.BeanUtils; import io.metersphere.sdk.util.BeanUtils;
import io.metersphere.sdk.util.JSON; import io.metersphere.sdk.util.JSON;
import io.metersphere.sdk.util.Translator; import io.metersphere.sdk.util.Translator;
import io.metersphere.system.domain.User;
import io.metersphere.system.dto.sdk.ApiDefinitionCaseDTO; import io.metersphere.system.dto.sdk.ApiDefinitionCaseDTO;
import io.metersphere.system.dto.sdk.BaseTreeNode; import io.metersphere.system.dto.sdk.BaseTreeNode;
import io.metersphere.system.dto.sdk.SessionUser;
import io.metersphere.system.log.constants.OperationLogModule; import io.metersphere.system.log.constants.OperationLogModule;
import io.metersphere.system.log.constants.OperationLogType; import io.metersphere.system.log.constants.OperationLogType;
import io.metersphere.system.log.dto.LogDTO; import io.metersphere.system.log.dto.LogDTO;
import io.metersphere.system.log.service.OperationLogService; import io.metersphere.system.log.service.OperationLogService;
import io.metersphere.system.mapper.UserMapper;
import io.metersphere.system.notice.constants.NoticeConstants; import io.metersphere.system.notice.constants.NoticeConstants;
import io.metersphere.system.service.CommonNoticeSendService; import io.metersphere.system.service.CommonNoticeSendService;
import io.metersphere.system.uid.IDGenerator; import io.metersphere.system.uid.IDGenerator;
@ -88,6 +89,8 @@ public class ApiDefinitionImportUtilService {
private OperationLogService operationLogService; private OperationLogService operationLogService;
@Resource @Resource
private CommonNoticeSendService commonNoticeSendService; private CommonNoticeSendService commonNoticeSendService;
@Resource
private UserMapper userMapper;
private static final String FILE_JMX = "jmx"; private static final String FILE_JMX = "jmx";
private static final String FILE_HAR = "har"; private static final String FILE_HAR = "har";
@ -111,7 +114,7 @@ public class ApiDefinitionImportUtilService {
} }
} }
public void importApi(ImportRequest request, ApiDefinitionImport apiImport, SessionUser user) { public void importApi(ImportRequest request, ApiDefinitionImport apiImport) {
String defaultVersion = extBaseProjectVersionMapper.getDefaultVersion(request.getProjectId()); String defaultVersion = extBaseProjectVersionMapper.getDefaultVersion(request.getProjectId());
request.setDefaultVersion(defaultVersion); request.setDefaultVersion(defaultVersion);
if (request.getVersionId() == null) { if (request.getVersionId() == null) {
@ -133,11 +136,11 @@ public class ApiDefinitionImportUtilService {
} }
//处理数据判断数据是否重复 //处理数据判断数据是否重复
dealWithData(request, filterData, user); dealWithData(request, filterData);
} }
private void dealWithData(ImportRequest request, List<ApiDefinitionImportDetail> importData, SessionUser user) { private void dealWithData(ImportRequest request, List<ApiDefinitionImportDetail> importData) {
//查询数据库中所有的数据 用于判断是否重复 //查询数据库中所有的数据 用于判断是否重复
ApiDefinitionPageRequest pageRequest = new ApiDefinitionPageRequest(); ApiDefinitionPageRequest pageRequest = new ApiDefinitionPageRequest();
pageRequest.setProjectId(request.getProjectId()); pageRequest.setProjectId(request.getProjectId());
@ -176,7 +179,7 @@ public class ApiDefinitionImportUtilService {
getNeedUpdateData(request, apiDealWithData, apiDetailWithDataUpdate); getNeedUpdateData(request, apiDealWithData, apiDetailWithDataUpdate);
//数据入库 //数据入库
insertData(modulePathMap, idModuleMap, apiDetailWithDataUpdate, request, user); insertData(modulePathMap, idModuleMap, apiDetailWithDataUpdate, request);
} }
@ -219,7 +222,7 @@ public class ApiDefinitionImportUtilService {
public void insertData(Map<String, BaseTreeNode> modulePathMap, public void insertData(Map<String, BaseTreeNode> modulePathMap,
Map<String, BaseTreeNode> idModuleMap, Map<String, BaseTreeNode> idModuleMap,
ApiDetailWithDataUpdate apiDetailWithDataUpdate, ApiDetailWithDataUpdate apiDetailWithDataUpdate,
ImportRequest request, SessionUser user) { ImportRequest request) {
//先判断是否需要新增模块 //先判断是否需要新增模块
List<ApiDefinitionImportDetail> addModuleData = apiDetailWithDataUpdate.getAddModuleData(); List<ApiDefinitionImportDetail> addModuleData = apiDetailWithDataUpdate.getAddModuleData();
List<ApiDefinitionImportDetail> updateModuleData = apiDetailWithDataUpdate.getUpdateModuleData(); List<ApiDefinitionImportDetail> updateModuleData = apiDetailWithDataUpdate.getUpdateModuleData();
@ -387,11 +390,10 @@ public class ApiDefinitionImportUtilService {
SqlSessionUtils.closeSqlSession(sqlSession, sqlSessionFactory); SqlSessionUtils.closeSqlSession(sqlSession, sqlSessionFactory);
operationLogService.batchAdd(operationLogs); operationLogService.batchAdd(operationLogs);
//发送通知 //发送通知
List<Map> createResources = new ArrayList<>(); List<Map> createResources = new ArrayList<>(JSON.parseArray(JSON.toJSONString(createLists), Map.class));
createResources.addAll(JSON.parseArray(JSON.toJSONString(createLists), Map.class)); User user = userMapper.selectByPrimaryKey(request.getUserId());
commonNoticeSendService.sendNotice(NoticeConstants.TaskType.API_DEFINITION_TASK, NoticeConstants.Event.CREATE, createResources, user, request.getProjectId()); commonNoticeSendService.sendNotice(NoticeConstants.TaskType.API_DEFINITION_TASK, NoticeConstants.Event.CREATE, createResources, user, request.getProjectId());
List<Map> updateResources = new ArrayList<>(); List<Map> updateResources = new ArrayList<>(JSON.parseArray(JSON.toJSONString(updateLists), Map.class));
updateResources.addAll(JSON.parseArray(JSON.toJSONString(updateResources), Map.class));
commonNoticeSendService.sendNotice(NoticeConstants.TaskType.API_DEFINITION_TASK, NoticeConstants.Event.UPDATE, updateResources, user, request.getProjectId()); commonNoticeSendService.sendNotice(NoticeConstants.TaskType.API_DEFINITION_TASK, NoticeConstants.Event.UPDATE, updateResources, user, request.getProjectId());
} }

View File

@ -952,7 +952,7 @@ public class ApiDefinitionService extends MoveNodeService {
return apiDefinitionDocDTO; return apiDefinitionDocDTO;
} }
public void apiTestImport(MultipartFile file, ImportRequest request, SessionUser user, String projectId) { public void apiTestImport(MultipartFile file, ImportRequest request, String projectId) {
if (file != null) { if (file != null) {
String originalFilename = file.getOriginalFilename(); String originalFilename = file.getOriginalFilename();
if (StringUtils.isNotBlank(originalFilename)) { if (StringUtils.isNotBlank(originalFilename)) {
@ -977,7 +977,7 @@ public class ApiDefinitionService extends MoveNodeService {
} }
try { try {
apiDefinitionImportUtilService.importApi(request, apiImport, user); apiDefinitionImportUtilService.importApi(request, apiImport);
} catch (Exception e) { } catch (Exception e) {
LogUtils.error(e); LogUtils.error(e);
throw new MSException(Translator.get("user_import_format_wrong")); throw new MSException(Translator.get("user_import_format_wrong"));

View File

@ -8,11 +8,8 @@ import io.metersphere.api.service.definition.ApiDefinitionScheduleService;
import io.metersphere.api.service.definition.ApiDefinitionService; import io.metersphere.api.service.definition.ApiDefinitionService;
import io.metersphere.sdk.util.BeanUtils; import io.metersphere.sdk.util.BeanUtils;
import io.metersphere.sdk.util.CommonBeanFactory; import io.metersphere.sdk.util.CommonBeanFactory;
import io.metersphere.system.dto.sdk.SessionUser;
import io.metersphere.system.dto.user.UserDTO;
import io.metersphere.system.schedule.BaseScheduleJob; import io.metersphere.system.schedule.BaseScheduleJob;
import io.metersphere.system.service.UserService; import io.metersphere.system.service.UserService;
import io.metersphere.system.utils.SessionUtils;
import org.quartz.JobDataMap; import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext; import org.quartz.JobExecutionContext;
import org.quartz.JobKey; import org.quartz.JobKey;
@ -40,10 +37,7 @@ public class SwaggerUrlImportJob extends BaseScheduleJob {
request.setUserId(jobDataMap.getString("userId")); request.setUserId(jobDataMap.getString("userId"));
request.setType("SCHEDULE"); request.setType("SCHEDULE");
request.setResourceId(resourceId); request.setResourceId(resourceId);
apiDefinitionService.apiTestImport(null, request, request.getProjectId());
UserDTO userDTO = userService.getUserDTOByKeyword(request.getUserId());
SessionUser user = SessionUser.fromUser(userDTO, SessionUtils.getSessionId());
apiDefinitionService.apiTestImport(null, request, user, request.getProjectId());
} }
public static JobKey getJobKey(String resourceId) { public static JobKey getJobKey(String resourceId) {

View File

@ -180,6 +180,9 @@
local: false, local: false,
}; };
} }
if (innerParams.value.binaryBody.file && !innerParams.value.binaryBody.file.fileId) {
innerParams.value.binaryBody.file = undefined;
}
emit('change'); emit('change');
} catch (error) { } catch (error) {
// eslint-disable-next-line no-console // eslint-disable-next-line no-console

View File

@ -385,6 +385,9 @@
local: false, local: false,
}; };
} }
if (activeResponse.value.body.binaryBody.file && !activeResponse.value.body.binaryBody.file.fileId) {
activeResponse.value.body.binaryBody.file = undefined;
}
emit('change'); emit('change');
} catch (error) { } catch (error) {
// eslint-disable-next-line no-console // eslint-disable-next-line no-console

View File

@ -569,6 +569,7 @@
(item) => ({ (item) => ({
...item, ...item,
operationTime: dayjs(item.operationTime).format('YYYY-MM-DD HH:mm:ss'), operationTime: dayjs(item.operationTime).format('YYYY-MM-DD HH:mm:ss'),
nextTime: dayjs(item.nextTime).format('YYYY-MM-DD HH:mm:ss'),
}) })
); );
function loadTaskList() { function loadTaskList() {