fix(项目设置): 报告分享链接超出有效时间仍可以打开链接
--bug=1018857 --user=李玉号 【项目设置】应用管理-设置报告分享链接-超出有效时间仍可以打开链接 https://www.tapd.cn/55049933/s/1276941
This commit is contained in:
parent
8c645523f2
commit
37905774ce
|
@ -1,7 +1,7 @@
|
||||||
package io.metersphere.controller.plan;
|
package io.metersphere.controller.plan;
|
||||||
|
|
||||||
import io.metersphere.api.dto.automation.TestPlanFailureApiDTO;
|
import io.metersphere.api.dto.automation.TestPlanFailureApiDTO;
|
||||||
import io.metersphere.service.BaseShareInfoService;
|
import io.metersphere.service.ShareInfoService;
|
||||||
import io.metersphere.service.plan.TestPlanApiCaseService;
|
import io.metersphere.service.plan.TestPlanApiCaseService;
|
||||||
import org.springframework.web.bind.annotation.GetMapping;
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
import org.springframework.web.bind.annotation.PathVariable;
|
import org.springframework.web.bind.annotation.PathVariable;
|
||||||
|
@ -16,31 +16,31 @@ import java.util.List;
|
||||||
public class ShareTestPlanApiCaseController {
|
public class ShareTestPlanApiCaseController {
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
BaseShareInfoService baseShareInfoService;
|
ShareInfoService shareInfoService;
|
||||||
@Resource
|
@Resource
|
||||||
TestPlanApiCaseService testPlanApiCaseService;
|
TestPlanApiCaseService testPlanApiCaseService;
|
||||||
|
|
||||||
@GetMapping("/list/failure/{shareId}/{planId}")
|
@GetMapping("/list/failure/{shareId}/{planId}")
|
||||||
public List<TestPlanFailureApiDTO> getApiFailureList(@PathVariable String shareId, @PathVariable String planId) {
|
public List<TestPlanFailureApiDTO> getApiFailureList(@PathVariable String shareId, @PathVariable String planId) {
|
||||||
baseShareInfoService.validate(shareId, planId);
|
shareInfoService.validate(shareId, planId);
|
||||||
return testPlanApiCaseService.getFailureCases(planId);
|
return testPlanApiCaseService.getFailureCases(planId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/list/errorReport/{shareId}/{planId}")
|
@GetMapping("/list/errorReport/{shareId}/{planId}")
|
||||||
public List<TestPlanFailureApiDTO> getErrorReportApiCaseList(@PathVariable String shareId, @PathVariable String planId) {
|
public List<TestPlanFailureApiDTO> getErrorReportApiCaseList(@PathVariable String shareId, @PathVariable String planId) {
|
||||||
baseShareInfoService.validate(shareId, planId);
|
shareInfoService.validate(shareId, planId);
|
||||||
return testPlanApiCaseService.getErrorReportCases(planId);
|
return testPlanApiCaseService.getErrorReportCases(planId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/list/unExecute/{shareId}/{planId}")
|
@GetMapping("/list/unExecute/{shareId}/{planId}")
|
||||||
public List<TestPlanFailureApiDTO> getUnExecuteCases(@PathVariable String shareId, @PathVariable String planId) {
|
public List<TestPlanFailureApiDTO> getUnExecuteCases(@PathVariable String shareId, @PathVariable String planId) {
|
||||||
baseShareInfoService.validate(shareId, planId);
|
shareInfoService.validate(shareId, planId);
|
||||||
return testPlanApiCaseService.getUnExecuteCases(planId);
|
return testPlanApiCaseService.getUnExecuteCases(planId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/list/all/{shareId}/{planId}")
|
@GetMapping("/list/all/{shareId}/{planId}")
|
||||||
public List<TestPlanFailureApiDTO> getApiAllList(@PathVariable String shareId, @PathVariable String planId) {
|
public List<TestPlanFailureApiDTO> getApiAllList(@PathVariable String shareId, @PathVariable String planId) {
|
||||||
baseShareInfoService.validate(shareId, planId);
|
shareInfoService.validate(shareId, planId);
|
||||||
return testPlanApiCaseService.getAllCases(planId);
|
return testPlanApiCaseService.getAllCases(planId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
package io.metersphere.controller.plan;
|
package io.metersphere.controller.plan;
|
||||||
|
|
||||||
import io.metersphere.api.dto.ApiReportResult;
|
import io.metersphere.api.dto.ApiReportResult;
|
||||||
import io.metersphere.service.BaseShareInfoService;
|
import io.metersphere.service.ShareInfoService;
|
||||||
import io.metersphere.service.definition.ApiDefinitionService;
|
import io.metersphere.service.definition.ApiDefinitionService;
|
||||||
import org.springframework.web.bind.annotation.GetMapping;
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
import org.springframework.web.bind.annotation.PathVariable;
|
import org.springframework.web.bind.annotation.PathVariable;
|
||||||
|
@ -17,11 +17,11 @@ public class ShareTestPlanApiReportController {
|
||||||
@Resource
|
@Resource
|
||||||
ApiDefinitionService apiDefinitionService;
|
ApiDefinitionService apiDefinitionService;
|
||||||
@Resource
|
@Resource
|
||||||
BaseShareInfoService baseShareInfoService;
|
ShareInfoService shareInfoService;
|
||||||
|
|
||||||
@GetMapping("/api/definition/report/getReport/{shareId}/{testId}")
|
@GetMapping("/api/definition/report/getReport/{shareId}/{testId}")
|
||||||
public ApiReportResult getApiReport(@PathVariable String shareId, @PathVariable String testId) {
|
public ApiReportResult getApiReport(@PathVariable String shareId, @PathVariable String testId) {
|
||||||
baseShareInfoService.validateExpired(shareId);
|
shareInfoService.validateExpired(shareId);
|
||||||
return apiDefinitionService.getDbResult(testId);
|
return apiDefinitionService.getDbResult(testId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
package io.metersphere.controller.plan;
|
package io.metersphere.controller.plan;
|
||||||
|
|
||||||
import io.metersphere.api.dto.automation.TestPlanFailureScenarioDTO;
|
import io.metersphere.api.dto.automation.TestPlanFailureScenarioDTO;
|
||||||
import io.metersphere.service.BaseShareInfoService;
|
import io.metersphere.service.ShareInfoService;
|
||||||
import io.metersphere.service.plan.TestPlanScenarioCaseService;
|
import io.metersphere.service.plan.TestPlanScenarioCaseService;
|
||||||
import org.springframework.web.bind.annotation.GetMapping;
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
import org.springframework.web.bind.annotation.PathVariable;
|
import org.springframework.web.bind.annotation.PathVariable;
|
||||||
|
@ -16,31 +16,31 @@ import java.util.List;
|
||||||
public class ShareTestPlanScenarioCaseController {
|
public class ShareTestPlanScenarioCaseController {
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
BaseShareInfoService baseShareInfoService;
|
ShareInfoService shareInfoService;
|
||||||
@Resource
|
@Resource
|
||||||
TestPlanScenarioCaseService testPlanScenarioCaseService;
|
TestPlanScenarioCaseService testPlanScenarioCaseService;
|
||||||
|
|
||||||
@GetMapping("/list/failure/{shareId}/{planId}")
|
@GetMapping("/list/failure/{shareId}/{planId}")
|
||||||
public List<TestPlanFailureScenarioDTO> getScenarioFailureList(@PathVariable String shareId, @PathVariable String planId) {
|
public List<TestPlanFailureScenarioDTO> getScenarioFailureList(@PathVariable String shareId, @PathVariable String planId) {
|
||||||
baseShareInfoService.validate(shareId, planId);
|
shareInfoService.validate(shareId, planId);
|
||||||
return testPlanScenarioCaseService.getFailureCases(planId);
|
return testPlanScenarioCaseService.getFailureCases(planId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/list/all/{shareId}/{planId}")
|
@GetMapping("/list/all/{shareId}/{planId}")
|
||||||
public List<TestPlanFailureScenarioDTO> getScenarioAllList(@PathVariable String shareId, @PathVariable String planId) {
|
public List<TestPlanFailureScenarioDTO> getScenarioAllList(@PathVariable String shareId, @PathVariable String planId) {
|
||||||
baseShareInfoService.validate(shareId, planId);
|
shareInfoService.validate(shareId, planId);
|
||||||
return testPlanScenarioCaseService.getAllCases(planId);
|
return testPlanScenarioCaseService.getAllCases(planId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/list/errorReport/{shareId}/{planId}")
|
@GetMapping("/list/errorReport/{shareId}/{planId}")
|
||||||
public List<TestPlanFailureScenarioDTO> getScenarioErrorReportList(@PathVariable String shareId, @PathVariable String planId) {
|
public List<TestPlanFailureScenarioDTO> getScenarioErrorReportList(@PathVariable String shareId, @PathVariable String planId) {
|
||||||
baseShareInfoService.validate(shareId, planId);
|
shareInfoService.validate(shareId, planId);
|
||||||
return testPlanScenarioCaseService.getErrorReportCases(planId);
|
return testPlanScenarioCaseService.getErrorReportCases(planId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/list/unExecute/{shareId}/{planId}")
|
@GetMapping("/list/unExecute/{shareId}/{planId}")
|
||||||
public List<TestPlanFailureScenarioDTO> getUnExecuteScenarioCases(@PathVariable String shareId, @PathVariable String planId) {
|
public List<TestPlanFailureScenarioDTO> getUnExecuteScenarioCases(@PathVariable String shareId, @PathVariable String planId) {
|
||||||
baseShareInfoService.validate(shareId, planId);
|
shareInfoService.validate(shareId, planId);
|
||||||
return testPlanScenarioCaseService.getUnExecuteCases(planId);
|
return testPlanScenarioCaseService.getUnExecuteCases(planId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,14 +17,9 @@ import io.metersphere.dto.PlanReportCaseDTO;
|
||||||
import io.metersphere.dto.RequestResult;
|
import io.metersphere.dto.RequestResult;
|
||||||
import io.metersphere.log.annotation.MsAuditLog;
|
import io.metersphere.log.annotation.MsAuditLog;
|
||||||
import io.metersphere.notice.annotation.SendNotice;
|
import io.metersphere.notice.annotation.SendNotice;
|
||||||
import io.metersphere.service.BaseShareInfoService;
|
import io.metersphere.service.ShareInfoService;
|
||||||
import io.metersphere.service.scenario.ApiScenarioReportService;
|
import io.metersphere.service.scenario.ApiScenarioReportService;
|
||||||
import org.springframework.web.bind.annotation.GetMapping;
|
import org.springframework.web.bind.annotation.*;
|
||||||
import org.springframework.web.bind.annotation.PathVariable;
|
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
|
||||||
import org.springframework.web.bind.annotation.RequestBody;
|
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -37,7 +32,7 @@ public class ApiScenarioReportController {
|
||||||
@Resource
|
@Resource
|
||||||
private ApiScenarioReportService apiReportService;
|
private ApiScenarioReportService apiReportService;
|
||||||
@Resource
|
@Resource
|
||||||
private BaseShareInfoService baseShareInfoService;
|
private ShareInfoService shareInfoService;
|
||||||
|
|
||||||
@GetMapping("/get/{reportId}")
|
@GetMapping("/get/{reportId}")
|
||||||
public ApiScenarioReportResult get(@PathVariable String reportId) {
|
public ApiScenarioReportResult get(@PathVariable String reportId) {
|
||||||
|
@ -46,7 +41,7 @@ public class ApiScenarioReportController {
|
||||||
|
|
||||||
@GetMapping("/get/{shareId}/{reportId}")
|
@GetMapping("/get/{shareId}/{reportId}")
|
||||||
public ApiScenarioReportResult get(@PathVariable String shareId, @PathVariable String reportId) {
|
public ApiScenarioReportResult get(@PathVariable String shareId, @PathVariable String reportId) {
|
||||||
baseShareInfoService.validateExpired(shareId);
|
shareInfoService.validateExpired(shareId);
|
||||||
return apiReportService.get(reportId, true);
|
return apiReportService.get(reportId, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -5,29 +5,36 @@ import com.fasterxml.jackson.databind.node.ArrayNode;
|
||||||
import com.fasterxml.jackson.databind.node.ObjectNode;
|
import com.fasterxml.jackson.databind.node.ObjectNode;
|
||||||
import com.github.pagehelper.Page;
|
import com.github.pagehelper.Page;
|
||||||
import com.github.pagehelper.PageHelper;
|
import com.github.pagehelper.PageHelper;
|
||||||
|
import io.metersphere.api.dto.automation.ApiScenarioReportResult;
|
||||||
import io.metersphere.api.dto.share.*;
|
import io.metersphere.api.dto.share.*;
|
||||||
import io.metersphere.api.exec.generator.JSONSchemaGenerator;
|
import io.metersphere.api.exec.generator.JSONSchemaGenerator;
|
||||||
import io.metersphere.base.domain.ApiDefinitionWithBLOBs;
|
import io.metersphere.base.domain.*;
|
||||||
import io.metersphere.base.domain.ShareInfo;
|
|
||||||
import io.metersphere.base.domain.User;
|
|
||||||
import io.metersphere.base.domain.UserExample;
|
|
||||||
import io.metersphere.base.mapper.ShareInfoMapper;
|
import io.metersphere.base.mapper.ShareInfoMapper;
|
||||||
import io.metersphere.base.mapper.UserMapper;
|
import io.metersphere.base.mapper.UserMapper;
|
||||||
|
import io.metersphere.base.mapper.ext.ExtApiScenarioReportMapper;
|
||||||
import io.metersphere.base.mapper.ext.ExtShareInfoMapper;
|
import io.metersphere.base.mapper.ext.ExtShareInfoMapper;
|
||||||
|
import io.metersphere.commons.constants.ProjectApplicationType;
|
||||||
import io.metersphere.commons.constants.PropertyConstant;
|
import io.metersphere.commons.constants.PropertyConstant;
|
||||||
import io.metersphere.commons.constants.ShareType;
|
import io.metersphere.commons.constants.ShareType;
|
||||||
|
import io.metersphere.commons.exception.MSException;
|
||||||
import io.metersphere.commons.utils.*;
|
import io.metersphere.commons.utils.*;
|
||||||
|
import io.metersphere.i18n.Translator;
|
||||||
import io.metersphere.service.definition.ApiModuleService;
|
import io.metersphere.service.definition.ApiModuleService;
|
||||||
|
import io.metersphere.service.scenario.ApiScenarioReportService;
|
||||||
import org.apache.commons.collections.CollectionUtils;
|
import org.apache.commons.collections.CollectionUtils;
|
||||||
import org.apache.commons.collections.MapUtils;
|
import org.apache.commons.collections.MapUtils;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.apache.logging.log4j.util.Strings;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.transaction.annotation.Propagation;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import static io.metersphere.commons.user.ShareUtil.getTimeMills;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author song.tianyang
|
* @author song.tianyang
|
||||||
* @Date 2021/2/7 10:37 上午
|
* @Date 2021/2/7 10:37 上午
|
||||||
|
@ -45,6 +52,12 @@ public class ShareInfoService extends BaseShareInfoService {
|
||||||
ApiModuleService apiModuleService;
|
ApiModuleService apiModuleService;
|
||||||
@Resource
|
@Resource
|
||||||
private UserMapper userMapper;
|
private UserMapper userMapper;
|
||||||
|
@Resource
|
||||||
|
private ExtApiScenarioReportMapper extApiScenarioReportMapper;
|
||||||
|
@Resource
|
||||||
|
private ApiScenarioReportService apiScenarioReportService;
|
||||||
|
@Resource
|
||||||
|
private BaseProjectApplicationService baseProjectApplicationService;
|
||||||
|
|
||||||
public Pager<List<ApiDocumentInfoDTO>> selectApiInfoByParam(ApiDocumentRequest apiDocumentRequest, int goPage, int pageSize) {
|
public Pager<List<ApiDocumentInfoDTO>> selectApiInfoByParam(ApiDocumentRequest apiDocumentRequest, int goPage, int pageSize) {
|
||||||
this.iniApiDocumentRequest(apiDocumentRequest);
|
this.iniApiDocumentRequest(apiDocumentRequest);
|
||||||
|
@ -547,4 +560,71 @@ public class ShareInfoService extends BaseShareInfoService {
|
||||||
private boolean isObjectHasKey(JsonNode object, String key) {
|
private boolean isObjectHasKey(JsonNode object, String key) {
|
||||||
return object != null && object.has(key);
|
return object != null && object.has(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void validateExpired(String shareId) {
|
||||||
|
ShareInfo shareInfo = shareInfoMapper.selectByPrimaryKey(shareId);
|
||||||
|
this.validateExpired(shareInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 不加入事务,抛出异常不回滚
|
||||||
|
* 若在当前类中调用请使用如下方式调用,否则该方法的事务注解不生效
|
||||||
|
* ShareInfoService shareInfoService = CommonBeanFactory.getBean(ShareInfoService.class);
|
||||||
|
* shareInfoService.validateExpired(shareInfo);
|
||||||
|
*
|
||||||
|
* @param shareInfo
|
||||||
|
*/
|
||||||
|
@Transactional(propagation = Propagation.NOT_SUPPORTED)
|
||||||
|
public void validateExpired(ShareInfo shareInfo) {
|
||||||
|
// 有效期根据类型从ProjectApplication中获取
|
||||||
|
|
||||||
|
if (shareInfo == null) {
|
||||||
|
MSException.throwException(Translator.get("connection_expired"));
|
||||||
|
}
|
||||||
|
String type = ProjectApplicationType.API_SHARE_REPORT_TIME.toString();
|
||||||
|
String projectId = "";
|
||||||
|
ApiScenarioReportResult reportResult = extApiScenarioReportMapper.get(shareInfo.getCustomData());
|
||||||
|
if (reportResult != null) {
|
||||||
|
projectId = reportResult.getProjectId();
|
||||||
|
} else {
|
||||||
|
// case 集成报告
|
||||||
|
ApiScenarioReportResult result = apiScenarioReportService.getApiIntegrated(shareInfo.getCustomData());
|
||||||
|
if (result != null) {
|
||||||
|
projectId = result.getProjectId();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (StringUtils.isBlank(type) || Strings.isBlank(projectId)) {
|
||||||
|
millisCheck(System.currentTimeMillis() - shareInfo.getUpdateTime(), 1000 * 60 * 60 * 24, shareInfo.getId());
|
||||||
|
} else {
|
||||||
|
ProjectApplication projectApplication = baseProjectApplicationService.getProjectApplication(projectId, type);
|
||||||
|
if (projectApplication.getTypeValue() == null) {
|
||||||
|
millisCheck(System.currentTimeMillis() - shareInfo.getUpdateTime(), 1000 * 60 * 60 * 24, shareInfo.getId());
|
||||||
|
} else {
|
||||||
|
String expr = projectApplication.getTypeValue();
|
||||||
|
long timeMills = getTimeMills(shareInfo.getUpdateTime(), expr);
|
||||||
|
millisCheck(System.currentTimeMillis(), timeMills, shareInfo.getId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void millisCheck(long compareMillis, long millis, String shareInfoId) {
|
||||||
|
if (compareMillis > millis) {
|
||||||
|
shareInfoMapper.deleteByPrimaryKey(shareInfoId);
|
||||||
|
MSException.throwException(Translator.get("connection_expired"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void validate(String shareId, String customData) {
|
||||||
|
ShareInfo shareInfo = shareInfoMapper.selectByPrimaryKey(shareId);
|
||||||
|
validateExpired(shareInfo);
|
||||||
|
if (shareInfo == null) {
|
||||||
|
MSException.throwException("ShareInfo not exist!");
|
||||||
|
} else {
|
||||||
|
if (!StringUtils.equals(customData, shareInfo.getCustomData())) {
|
||||||
|
MSException.throwException("ShareInfo validate failure!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,12 +3,9 @@ package io.metersphere.service;
|
||||||
import io.metersphere.base.domain.ShareInfo;
|
import io.metersphere.base.domain.ShareInfo;
|
||||||
import io.metersphere.base.mapper.ShareInfoMapper;
|
import io.metersphere.base.mapper.ShareInfoMapper;
|
||||||
import io.metersphere.base.mapper.ext.BaseShareInfoMapper;
|
import io.metersphere.base.mapper.ext.BaseShareInfoMapper;
|
||||||
import io.metersphere.commons.exception.MSException;
|
|
||||||
import io.metersphere.dto.ShareInfoDTO;
|
import io.metersphere.dto.ShareInfoDTO;
|
||||||
import io.metersphere.i18n.Translator;
|
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Propagation;
|
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
|
@ -63,47 +60,4 @@ public class BaseShareInfoService {
|
||||||
public ShareInfo get(String id) {
|
public ShareInfo get(String id) {
|
||||||
return shareInfoMapper.selectByPrimaryKey(id);
|
return shareInfoMapper.selectByPrimaryKey(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void validate(String shareId, String customData) {
|
|
||||||
ShareInfo shareInfo = shareInfoMapper.selectByPrimaryKey(shareId);
|
|
||||||
validateExpired(shareInfo);
|
|
||||||
if (shareInfo == null) {
|
|
||||||
MSException.throwException("ShareInfo not exist!");
|
|
||||||
} else {
|
|
||||||
if (!StringUtils.equals(customData, shareInfo.getCustomData())) {
|
|
||||||
MSException.throwException("ShareInfo validate failure!");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void validateExpired(String shareId) {
|
|
||||||
ShareInfo shareInfo = shareInfoMapper.selectByPrimaryKey(shareId);
|
|
||||||
this.validateExpired(shareInfo);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 不加入事务,抛出异常不回滚
|
|
||||||
* 若在当前类中调用请使用如下方式调用,否则该方法的事务注解不生效
|
|
||||||
* ShareInfoService shareInfoService = CommonBeanFactory.getBean(ShareInfoService.class);
|
|
||||||
* shareInfoService.validateExpired(shareInfo);
|
|
||||||
*
|
|
||||||
* @param shareInfo
|
|
||||||
*/
|
|
||||||
@Transactional(propagation = Propagation.NOT_SUPPORTED)
|
|
||||||
public void validateExpired(ShareInfo shareInfo) {
|
|
||||||
// 有效期根据类型从ProjectApplication中获取
|
|
||||||
if (shareInfo == null) {
|
|
||||||
MSException.throwException(Translator.get("connection_expired"));
|
|
||||||
}
|
|
||||||
// todo check
|
|
||||||
millisCheck(System.currentTimeMillis() - shareInfo.getUpdateTime(), 1000 * 60 * 60 * 24, shareInfo.getId());
|
|
||||||
}
|
|
||||||
|
|
||||||
private void millisCheck(long compareMillis, long millis, String shareInfoId) {
|
|
||||||
if (compareMillis > millis) {
|
|
||||||
shareInfoMapper.deleteByPrimaryKey(shareInfoId);
|
|
||||||
MSException.throwException(Translator.get("connection_expired"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,7 +24,7 @@ import java.util.List;
|
||||||
public class ShareController {
|
public class ShareController {
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
BaseShareInfoService baseShareInfoService;
|
ShareInfoService shareInfoService;
|
||||||
@Resource
|
@Resource
|
||||||
PerformanceReportService performanceReportService;
|
PerformanceReportService performanceReportService;
|
||||||
@Resource
|
@Resource
|
||||||
|
@ -37,20 +37,20 @@ public class ShareController {
|
||||||
|
|
||||||
@GetMapping("/performance/report/{shareId}/{reportId}")
|
@GetMapping("/performance/report/{shareId}/{reportId}")
|
||||||
public ReportDTO getLoadTestReport(@PathVariable String shareId, @PathVariable String reportId) {
|
public ReportDTO getLoadTestReport(@PathVariable String shareId, @PathVariable String reportId) {
|
||||||
baseShareInfoService.validateExpired(shareId);
|
shareInfoService.validateExpired(shareId);
|
||||||
return performanceReportService.getReportTestAndProInfo(reportId);
|
return performanceReportService.getReportTestAndProInfo(reportId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/performance/report/content/report_time/{shareId}/{reportId}")
|
@GetMapping("/performance/report/content/report_time/{shareId}/{reportId}")
|
||||||
public ReportTimeInfo getReportTimeInfo(@PathVariable String shareId, @PathVariable String reportId) {
|
public ReportTimeInfo getReportTimeInfo(@PathVariable String shareId, @PathVariable String reportId) {
|
||||||
baseShareInfoService.validateExpired(shareId);
|
shareInfoService.validateExpired(shareId);
|
||||||
return performanceReportService.getReportTimeInfo(reportId);
|
return performanceReportService.getReportTimeInfo(reportId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@GetMapping("/performance/report/get-advanced-config/{shareId}/{reportId}")
|
@GetMapping("/performance/report/get-advanced-config/{shareId}/{reportId}")
|
||||||
public String getAdvancedConfig(@PathVariable String shareId, @PathVariable String reportId) {
|
public String getAdvancedConfig(@PathVariable String shareId, @PathVariable String reportId) {
|
||||||
baseShareInfoService.validateExpired(shareId);
|
shareInfoService.validateExpired(shareId);
|
||||||
return performanceReportService.getAdvancedConfiguration(reportId);
|
return performanceReportService.getAdvancedConfiguration(reportId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -61,74 +61,74 @@ public class ShareController {
|
||||||
|
|
||||||
@GetMapping("/performance/report/get-jmx-content/{shareId}/{reportId}")
|
@GetMapping("/performance/report/get-jmx-content/{shareId}/{reportId}")
|
||||||
public LoadTestExportJmx getJmxContent(@PathVariable String shareId, @PathVariable String reportId) {
|
public LoadTestExportJmx getJmxContent(@PathVariable String shareId, @PathVariable String reportId) {
|
||||||
baseShareInfoService.validateExpired(shareId);
|
shareInfoService.validateExpired(shareId);
|
||||||
return performanceReportService.getJmxContent(reportId).get(0);
|
return performanceReportService.getJmxContent(reportId).get(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/performance/get-jmx-content/{shareId}/{testId}")
|
@GetMapping("/performance/get-jmx-content/{shareId}/{testId}")
|
||||||
public List<LoadTestExportJmx> getOldJmxContent(@PathVariable String shareId, @PathVariable String testId) {
|
public List<LoadTestExportJmx> getOldJmxContent(@PathVariable String shareId, @PathVariable String testId) {
|
||||||
baseShareInfoService.validateExpired(shareId);
|
shareInfoService.validateExpired(shareId);
|
||||||
return performanceTestService.getJmxContent(testId);
|
return performanceTestService.getJmxContent(testId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@GetMapping("/performance/report/content/testoverview/{shareId}/{reportId}")
|
@GetMapping("/performance/report/content/testoverview/{shareId}/{reportId}")
|
||||||
public TestOverview getTestOverview(@PathVariable String shareId, @PathVariable String reportId) {
|
public TestOverview getTestOverview(@PathVariable String shareId, @PathVariable String reportId) {
|
||||||
baseShareInfoService.validateExpired(shareId);
|
shareInfoService.validateExpired(shareId);
|
||||||
return performanceReportService.getTestOverview(reportId);
|
return performanceReportService.getTestOverview(reportId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/performance/report/content/load_chart/{shareId}/{reportId}")
|
@GetMapping("/performance/report/content/load_chart/{shareId}/{reportId}")
|
||||||
public List<ChartsData> getLoadChartData(@PathVariable String shareId, @PathVariable String reportId) {
|
public List<ChartsData> getLoadChartData(@PathVariable String shareId, @PathVariable String reportId) {
|
||||||
baseShareInfoService.validateExpired(shareId);
|
shareInfoService.validateExpired(shareId);
|
||||||
return performanceReportService.getLoadChartData(reportId);
|
return performanceReportService.getLoadChartData(reportId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/performance/report/content/res_chart/{shareId}/{reportId}")
|
@GetMapping("/performance/report/content/res_chart/{shareId}/{reportId}")
|
||||||
public List<ChartsData> getResponseTimeChartData(@PathVariable String shareId, @PathVariable String reportId) {
|
public List<ChartsData> getResponseTimeChartData(@PathVariable String shareId, @PathVariable String reportId) {
|
||||||
baseShareInfoService.validateExpired(shareId);
|
shareInfoService.validateExpired(shareId);
|
||||||
return performanceReportService.getResponseTimeChartData(reportId);
|
return performanceReportService.getResponseTimeChartData(reportId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/performance/report/content/error_chart/{shareId}/{reportId}")
|
@GetMapping("/performance/report/content/error_chart/{shareId}/{reportId}")
|
||||||
public List<ChartsData> getErrorChartData(@PathVariable String shareId, @PathVariable String reportId) {
|
public List<ChartsData> getErrorChartData(@PathVariable String shareId, @PathVariable String reportId) {
|
||||||
baseShareInfoService.validateExpired(shareId);
|
shareInfoService.validateExpired(shareId);
|
||||||
return performanceReportService.getErrorChartData(reportId);
|
return performanceReportService.getErrorChartData(reportId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/performance/report/content/response_code_chart/{shareId}/{reportId}")
|
@GetMapping("/performance/report/content/response_code_chart/{shareId}/{reportId}")
|
||||||
public List<ChartsData> getResponseCodeChartData(@PathVariable String shareId, @PathVariable String reportId) {
|
public List<ChartsData> getResponseCodeChartData(@PathVariable String shareId, @PathVariable String reportId) {
|
||||||
baseShareInfoService.validateExpired(shareId);
|
shareInfoService.validateExpired(shareId);
|
||||||
return performanceReportService.getResponseCodeChartData(reportId);
|
return performanceReportService.getResponseCodeChartData(reportId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/performance/report/content/{shareId}/{reportKey}/{reportId}")
|
@GetMapping("/performance/report/content/{shareId}/{reportKey}/{reportId}")
|
||||||
public List<ChartsData> getReportChart(@PathVariable String shareId, @PathVariable String reportKey, @PathVariable String reportId) {
|
public List<ChartsData> getReportChart(@PathVariable String shareId, @PathVariable String reportKey, @PathVariable String reportId) {
|
||||||
baseShareInfoService.validateExpired(shareId);
|
shareInfoService.validateExpired(shareId);
|
||||||
return performanceReportService.getReportChart(reportKey, reportId);
|
return performanceReportService.getReportChart(reportKey, reportId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/performance/report/content/{shareId}/{reportId}")
|
@GetMapping("/performance/report/content/{shareId}/{reportId}")
|
||||||
public List<Statistics> getReportContent(@PathVariable String shareId, @PathVariable String reportId) {
|
public List<Statistics> getReportContent(@PathVariable String shareId, @PathVariable String reportId) {
|
||||||
baseShareInfoService.validateExpired(shareId);
|
shareInfoService.validateExpired(shareId);
|
||||||
return performanceReportService.getReportStatistics(reportId);
|
return performanceReportService.getReportStatistics(reportId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/performance/report/content/errors/{shareId}/{reportId}")
|
@GetMapping("/performance/report/content/errors/{shareId}/{reportId}")
|
||||||
public List<Errors> getReportErrors(@PathVariable String shareId, @PathVariable String reportId) {
|
public List<Errors> getReportErrors(@PathVariable String shareId, @PathVariable String reportId) {
|
||||||
baseShareInfoService.validateExpired(shareId);
|
shareInfoService.validateExpired(shareId);
|
||||||
return performanceReportService.getReportErrors(reportId);
|
return performanceReportService.getReportErrors(reportId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/performance/report/content/errors_top5/{shareId}/{reportId}")
|
@GetMapping("/performance/report/content/errors_top5/{shareId}/{reportId}")
|
||||||
public List<ErrorsTop5> getReportErrorsTop5(@PathVariable String shareId, @PathVariable String reportId) {
|
public List<ErrorsTop5> getReportErrorsTop5(@PathVariable String shareId, @PathVariable String reportId) {
|
||||||
baseShareInfoService.validateExpired(shareId);
|
shareInfoService.validateExpired(shareId);
|
||||||
return performanceReportService.getReportErrorsTOP5(reportId);
|
return performanceReportService.getReportErrorsTOP5(reportId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/performance/report/log/resource/{shareId}/{reportId}")
|
@GetMapping("/performance/report/log/resource/{shareId}/{reportId}")
|
||||||
public List<LogDetailDTO> getResourceIds(@PathVariable String shareId, @PathVariable String reportId) {
|
public List<LogDetailDTO> getResourceIds(@PathVariable String shareId, @PathVariable String reportId) {
|
||||||
baseShareInfoService.validateExpired(shareId);
|
shareInfoService.validateExpired(shareId);
|
||||||
return performanceReportService.getReportLogResource(reportId);
|
return performanceReportService.getReportLogResource(reportId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -139,26 +139,26 @@ public class ShareController {
|
||||||
|
|
||||||
@GetMapping("/performance/report/log/{shareId}/{reportId}/{resourceId}/{goPage}")
|
@GetMapping("/performance/report/log/{shareId}/{reportId}/{resourceId}/{goPage}")
|
||||||
public Pager<List<LoadTestReportLog>> logs(@PathVariable String shareId, @PathVariable String reportId, @PathVariable String resourceId, @PathVariable int goPage) {
|
public Pager<List<LoadTestReportLog>> logs(@PathVariable String shareId, @PathVariable String reportId, @PathVariable String resourceId, @PathVariable int goPage) {
|
||||||
baseShareInfoService.validateExpired(shareId);
|
shareInfoService.validateExpired(shareId);
|
||||||
Page<Object> page = PageHelper.startPage(goPage, 1, true);
|
Page<Object> page = PageHelper.startPage(goPage, 1, true);
|
||||||
return PageUtils.setPageInfo(page, performanceReportService.getReportLogs(reportId, resourceId));
|
return PageUtils.setPageInfo(page, performanceReportService.getReportLogs(reportId, resourceId));
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/metric/query/{shareId}/{id}")
|
@GetMapping("/metric/query/{shareId}/{id}")
|
||||||
public List<MetricData> queryMetric(@PathVariable String shareId, @PathVariable("id") String reportId) {
|
public List<MetricData> queryMetric(@PathVariable String shareId, @PathVariable("id") String reportId) {
|
||||||
baseShareInfoService.validateExpired(shareId);
|
shareInfoService.validateExpired(shareId);
|
||||||
return metricService.queryMetric(reportId);
|
return metricService.queryMetric(reportId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/metric/query/resource/{shareId}/{id}")
|
@GetMapping("/metric/query/resource/{shareId}/{id}")
|
||||||
public List<Monitor> queryReportResource(@PathVariable String shareId, @PathVariable("id") String reportId) {
|
public List<Monitor> queryReportResource(@PathVariable String shareId, @PathVariable("id") String reportId) {
|
||||||
baseShareInfoService.validateExpired(shareId);
|
shareInfoService.validateExpired(shareId);
|
||||||
return metricService.queryReportResource(reportId);
|
return metricService.queryReportResource(reportId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/performance/report/get-load-config/{shareId}/{testId}")
|
@GetMapping("/performance/report/get-load-config/{shareId}/{testId}")
|
||||||
public String getLoadConfiguration(@PathVariable String shareId, @PathVariable String testId) {
|
public String getLoadConfiguration(@PathVariable String shareId, @PathVariable String testId) {
|
||||||
baseShareInfoService.validateExpired(shareId);
|
shareInfoService.validateExpired(shareId);
|
||||||
return performanceTestService.getLoadConfiguration(testId);
|
return performanceTestService.getLoadConfiguration(testId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@ package io.metersphere.plan.controller;
|
||||||
import io.metersphere.plan.dto.TestPlanLoadCaseDTO;
|
import io.metersphere.plan.dto.TestPlanLoadCaseDTO;
|
||||||
import io.metersphere.plan.request.LoadCaseReportRequest;
|
import io.metersphere.plan.request.LoadCaseReportRequest;
|
||||||
import io.metersphere.plan.service.TestPlanLoadCaseService;
|
import io.metersphere.plan.service.TestPlanLoadCaseService;
|
||||||
import io.metersphere.service.BaseShareInfoService;
|
import io.metersphere.service.ShareInfoService;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
|
@ -14,25 +14,25 @@ import java.util.List;
|
||||||
public class ShareTestPlanLoadCaseController {
|
public class ShareTestPlanLoadCaseController {
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
BaseShareInfoService baseShareInfoService;
|
ShareInfoService shareInfoService;
|
||||||
@Resource
|
@Resource
|
||||||
TestPlanLoadCaseService testPlanLoadCaseService;
|
TestPlanLoadCaseService testPlanLoadCaseService;
|
||||||
|
|
||||||
@GetMapping("/list/failure/{shareId}/{planId}")
|
@GetMapping("/list/failure/{shareId}/{planId}")
|
||||||
public List<TestPlanLoadCaseDTO> getLoadFailureCases(@PathVariable String shareId, @PathVariable String planId) {
|
public List<TestPlanLoadCaseDTO> getLoadFailureCases(@PathVariable String shareId, @PathVariable String planId) {
|
||||||
baseShareInfoService.validate(shareId, planId);
|
shareInfoService.validate(shareId, planId);
|
||||||
return testPlanLoadCaseService.getFailureCases(planId);
|
return testPlanLoadCaseService.getFailureCases(planId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/list/all/{shareId}/{planId}")
|
@GetMapping("/list/all/{shareId}/{planId}")
|
||||||
public List<TestPlanLoadCaseDTO> getLoadAllCases(@PathVariable String shareId, @PathVariable String planId) {
|
public List<TestPlanLoadCaseDTO> getLoadAllCases(@PathVariable String shareId, @PathVariable String planId) {
|
||||||
baseShareInfoService.validate(shareId, planId);
|
shareInfoService.validate(shareId, planId);
|
||||||
return testPlanLoadCaseService.getAllCases(planId);
|
return testPlanLoadCaseService.getAllCases(planId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@PostMapping("/report/exist/{shareId}")
|
@PostMapping("/report/exist/{shareId}")
|
||||||
public Boolean isExistReport(@PathVariable String shareId, @RequestBody LoadCaseReportRequest request) {
|
public Boolean isExistReport(@PathVariable String shareId, @RequestBody LoadCaseReportRequest request) {
|
||||||
baseShareInfoService.validateExpired(shareId);
|
shareInfoService.validateExpired(shareId);
|
||||||
return testPlanLoadCaseService.isExistReport(request);
|
return testPlanLoadCaseService.isExistReport(request);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,88 @@
|
||||||
|
package io.metersphere.service;
|
||||||
|
|
||||||
|
import io.metersphere.base.domain.LoadTestReportWithBLOBs;
|
||||||
|
import io.metersphere.base.domain.ProjectApplication;
|
||||||
|
import io.metersphere.base.domain.ShareInfo;
|
||||||
|
import io.metersphere.base.mapper.LoadTestReportMapper;
|
||||||
|
import io.metersphere.base.mapper.ShareInfoMapper;
|
||||||
|
import io.metersphere.commons.constants.ProjectApplicationType;
|
||||||
|
import io.metersphere.commons.exception.MSException;
|
||||||
|
import io.metersphere.i18n.Translator;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.apache.logging.log4j.util.Strings;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.transaction.annotation.Propagation;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
|
||||||
|
import static io.metersphere.commons.user.ShareUtil.getTimeMills;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class ShareInfoService {
|
||||||
|
@Resource
|
||||||
|
private ShareInfoMapper shareInfoMapper;
|
||||||
|
@Resource
|
||||||
|
private BaseProjectApplicationService baseProjectApplicationService;
|
||||||
|
@Resource
|
||||||
|
private LoadTestReportMapper loadTestReportMapper;
|
||||||
|
|
||||||
|
public void validateExpired(String shareId) {
|
||||||
|
ShareInfo shareInfo = shareInfoMapper.selectByPrimaryKey(shareId);
|
||||||
|
this.validateExpired(shareInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void validate(String shareId, String customData) {
|
||||||
|
ShareInfo shareInfo = shareInfoMapper.selectByPrimaryKey(shareId);
|
||||||
|
validateExpired(shareInfo);
|
||||||
|
if (shareInfo == null) {
|
||||||
|
MSException.throwException("ShareInfo not exist!");
|
||||||
|
} else {
|
||||||
|
if (!StringUtils.equals(customData, shareInfo.getCustomData())) {
|
||||||
|
MSException.throwException("ShareInfo validate failure!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 不加入事务,抛出异常不回滚
|
||||||
|
* 若在当前类中调用请使用如下方式调用,否则该方法的事务注解不生效
|
||||||
|
* ShareInfoService shareInfoService = CommonBeanFactory.getBean(ShareInfoService.class);
|
||||||
|
* shareInfoService.validateExpired(shareInfo);
|
||||||
|
*
|
||||||
|
* @param shareInfo
|
||||||
|
*/
|
||||||
|
@Transactional(propagation = Propagation.NOT_SUPPORTED)
|
||||||
|
public void validateExpired(ShareInfo shareInfo) {
|
||||||
|
// 有效期根据类型从ProjectApplication中获取
|
||||||
|
|
||||||
|
if (shareInfo == null) {
|
||||||
|
MSException.throwException(Translator.get("connection_expired"));
|
||||||
|
}
|
||||||
|
String type = ProjectApplicationType.PERFORMANCE_SHARE_REPORT_TIME.toString();
|
||||||
|
String projectId = "";
|
||||||
|
LoadTestReportWithBLOBs loadTestReportWithBLOBs = loadTestReportMapper.selectByPrimaryKey(shareInfo.getCustomData());
|
||||||
|
if (loadTestReportWithBLOBs != null) {
|
||||||
|
projectId = loadTestReportWithBLOBs.getProjectId();
|
||||||
|
}
|
||||||
|
if (StringUtils.isBlank(type) || Strings.isBlank(projectId)) {
|
||||||
|
millisCheck(System.currentTimeMillis() - shareInfo.getUpdateTime(), 1000 * 60 * 60 * 24, shareInfo.getId());
|
||||||
|
} else {
|
||||||
|
ProjectApplication projectApplication = baseProjectApplicationService.getProjectApplication(projectId, type);
|
||||||
|
if (projectApplication.getTypeValue() == null) {
|
||||||
|
millisCheck(System.currentTimeMillis() - shareInfo.getUpdateTime(), 1000 * 60 * 60 * 24, shareInfo.getId());
|
||||||
|
} else {
|
||||||
|
String expr = projectApplication.getTypeValue();
|
||||||
|
long timeMills = getTimeMills(shareInfo.getUpdateTime(), expr);
|
||||||
|
millisCheck(System.currentTimeMillis(), timeMills, shareInfo.getId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void millisCheck(long compareMillis, long millis, String shareInfoId) {
|
||||||
|
if (compareMillis > millis) {
|
||||||
|
shareInfoMapper.deleteByPrimaryKey(shareInfoId);
|
||||||
|
MSException.throwException(Translator.get("connection_expired"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,13 +1,13 @@
|
||||||
package io.metersphere.controller;
|
package io.metersphere.controller;
|
||||||
|
|
||||||
import io.metersphere.xpack.track.dto.IssuesDao;
|
|
||||||
import io.metersphere.dto.TestPlanCaseDTO;
|
import io.metersphere.dto.TestPlanCaseDTO;
|
||||||
import io.metersphere.plan.dto.TestPlanSimpleReportDTO;
|
import io.metersphere.plan.dto.TestPlanSimpleReportDTO;
|
||||||
import io.metersphere.plan.service.TestPlanReportService;
|
import io.metersphere.plan.service.TestPlanReportService;
|
||||||
import io.metersphere.plan.service.TestPlanService;
|
import io.metersphere.plan.service.TestPlanService;
|
||||||
import io.metersphere.plan.service.TestPlanTestCaseService;
|
import io.metersphere.plan.service.TestPlanTestCaseService;
|
||||||
import io.metersphere.service.BaseShareInfoService;
|
|
||||||
import io.metersphere.service.IssuesService;
|
import io.metersphere.service.IssuesService;
|
||||||
|
import io.metersphere.service.ShareInfoService;
|
||||||
|
import io.metersphere.xpack.track.dto.IssuesDao;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
|
@ -20,7 +20,7 @@ import java.util.List;
|
||||||
public class ShareController {
|
public class ShareController {
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
BaseShareInfoService baseShareInfoService;
|
ShareInfoService shareInfoService;
|
||||||
@Resource
|
@Resource
|
||||||
IssuesService issuesService;
|
IssuesService issuesService;
|
||||||
@Resource
|
@Resource
|
||||||
|
@ -32,33 +32,33 @@ public class ShareController {
|
||||||
|
|
||||||
@GetMapping("/issues/plan/get/{shareId}/{planId}")
|
@GetMapping("/issues/plan/get/{shareId}/{planId}")
|
||||||
public List<IssuesDao> getIssuesByPlanoId(@PathVariable String shareId, @PathVariable String planId) {
|
public List<IssuesDao> getIssuesByPlanoId(@PathVariable String shareId, @PathVariable String planId) {
|
||||||
baseShareInfoService.validate(shareId, planId);
|
shareInfoService.validate(shareId, planId);
|
||||||
return issuesService.getIssuesByPlanId(planId);
|
return issuesService.getIssuesByPlanId(planId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/test/plan/report/{shareId}/{planId}")
|
@GetMapping("/test/plan/report/{shareId}/{planId}")
|
||||||
public TestPlanSimpleReportDTO getReport(@PathVariable String shareId, @PathVariable String planId) {
|
public TestPlanSimpleReportDTO getReport(@PathVariable String shareId, @PathVariable String planId) {
|
||||||
baseShareInfoService.validate(shareId, planId);
|
shareInfoService.validate(shareId, planId);
|
||||||
return testPlanService.getShareReport(baseShareInfoService.get(shareId), planId);
|
return testPlanService.getShareReport(shareInfoService.get(shareId), planId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/report/export/{shareId}/{planId}/{lang}")
|
@GetMapping("/report/export/{shareId}/{planId}/{lang}")
|
||||||
public void exportHtmlReport(@PathVariable String shareId, @PathVariable String planId,
|
public void exportHtmlReport(@PathVariable String shareId, @PathVariable String planId,
|
||||||
@PathVariable(required = false) String lang, HttpServletResponse response) throws UnsupportedEncodingException {
|
@PathVariable(required = false) String lang, HttpServletResponse response) throws UnsupportedEncodingException {
|
||||||
baseShareInfoService.validate(shareId, planId);
|
shareInfoService.validate(shareId, planId);
|
||||||
testPlanService.exportPlanReport(planId, lang, response);
|
testPlanService.exportPlanReport(planId, lang, response);
|
||||||
}
|
}
|
||||||
|
|
||||||
@PostMapping("/test/plan/case/list/all/{shareId}/{planId}")
|
@PostMapping("/test/plan/case/list/all/{shareId}/{planId}")
|
||||||
public List<TestPlanCaseDTO> getAllCases(@PathVariable String shareId, @PathVariable String planId,
|
public List<TestPlanCaseDTO> getAllCases(@PathVariable String shareId, @PathVariable String planId,
|
||||||
@RequestBody(required = false) List<String> statusList) {
|
@RequestBody(required = false) List<String> statusList) {
|
||||||
baseShareInfoService.validate(shareId, planId);
|
shareInfoService.validate(shareId, planId);
|
||||||
return testPlanTestCaseService.getAllCasesByStatusList(planId, statusList);
|
return testPlanTestCaseService.getAllCasesByStatusList(planId, statusList);
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/test/plan/report/db/{shareId}/{reportId}")
|
@GetMapping("/test/plan/report/db/{shareId}/{reportId}")
|
||||||
public TestPlanSimpleReportDTO getTestPlanDbReport(@PathVariable String shareId, @PathVariable String reportId) {
|
public TestPlanSimpleReportDTO getTestPlanDbReport(@PathVariable String shareId, @PathVariable String reportId) {
|
||||||
baseShareInfoService.validate(shareId, reportId);
|
shareInfoService.validate(shareId, reportId);
|
||||||
return testPlanReportService.getShareDbReport(baseShareInfoService.get(shareId), reportId);
|
return testPlanReportService.getShareDbReport(shareInfoService.get(shareId), reportId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,117 @@
|
||||||
|
package io.metersphere.service;
|
||||||
|
|
||||||
|
import io.metersphere.base.domain.*;
|
||||||
|
import io.metersphere.base.mapper.ShareInfoMapper;
|
||||||
|
import io.metersphere.base.mapper.TestPlanMapper;
|
||||||
|
import io.metersphere.base.mapper.TestPlanReportContentMapper;
|
||||||
|
import io.metersphere.base.mapper.TestPlanReportMapper;
|
||||||
|
import io.metersphere.commons.constants.ProjectApplicationType;
|
||||||
|
import io.metersphere.commons.exception.MSException;
|
||||||
|
import io.metersphere.i18n.Translator;
|
||||||
|
import org.apache.commons.collections.CollectionUtils;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.apache.logging.log4j.util.Strings;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.transaction.annotation.Propagation;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import static io.metersphere.commons.user.ShareUtil.getTimeMills;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class ShareInfoService {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private ShareInfoMapper shareInfoMapper;
|
||||||
|
@Resource
|
||||||
|
private BaseProjectApplicationService baseProjectApplicationService;
|
||||||
|
@Resource
|
||||||
|
private TestPlanReportContentMapper testPlanReportContentMapper;
|
||||||
|
@Resource
|
||||||
|
private TestPlanReportMapper testPlanReportMapper;
|
||||||
|
@Resource
|
||||||
|
private TestPlanMapper testPlanMapper;
|
||||||
|
|
||||||
|
public void validate(String shareId, String customData) {
|
||||||
|
ShareInfo shareInfo = shareInfoMapper.selectByPrimaryKey(shareId);
|
||||||
|
validateExpired(shareInfo);
|
||||||
|
if (shareInfo == null) {
|
||||||
|
MSException.throwException("ShareInfo not exist!");
|
||||||
|
} else {
|
||||||
|
if (!StringUtils.equals(customData, shareInfo.getCustomData())) {
|
||||||
|
MSException.throwException("ShareInfo validate failure!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public ShareInfo get(String id) {
|
||||||
|
return shareInfoMapper.selectByPrimaryKey(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void validateExpired(String shareId) {
|
||||||
|
ShareInfo shareInfo = shareInfoMapper.selectByPrimaryKey(shareId);
|
||||||
|
this.validateExpired(shareInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 不加入事务,抛出异常不回滚
|
||||||
|
* 若在当前类中调用请使用如下方式调用,否则该方法的事务注解不生效
|
||||||
|
* ShareInfoService shareInfoService = CommonBeanFactory.getBean(ShareInfoService.class);
|
||||||
|
* shareInfoService.validateExpired(shareInfo);
|
||||||
|
*
|
||||||
|
* @param shareInfo
|
||||||
|
*/
|
||||||
|
@Transactional(propagation = Propagation.NOT_SUPPORTED)
|
||||||
|
public void validateExpired(ShareInfo shareInfo) {
|
||||||
|
// 有效期根据类型从ProjectApplication中获取
|
||||||
|
|
||||||
|
if (shareInfo == null) {
|
||||||
|
MSException.throwException(Translator.get("connection_expired"));
|
||||||
|
}
|
||||||
|
String type = ProjectApplicationType.TRACK_SHARE_REPORT_TIME.toString();
|
||||||
|
String projectId = "";
|
||||||
|
TestPlanWithBLOBs testPlan = getTestPlan(shareInfo);
|
||||||
|
if (testPlan != null) {
|
||||||
|
projectId = testPlan.getProjectId();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (StringUtils.isBlank(type) || Strings.isBlank(projectId)) {
|
||||||
|
millisCheck(System.currentTimeMillis() - shareInfo.getUpdateTime(), 1000 * 60 * 60 * 24, shareInfo.getId());
|
||||||
|
} else {
|
||||||
|
ProjectApplication projectApplication = baseProjectApplicationService.getProjectApplication(projectId, type);
|
||||||
|
if (projectApplication.getTypeValue() == null) {
|
||||||
|
millisCheck(System.currentTimeMillis() - shareInfo.getUpdateTime(), 1000 * 60 * 60 * 24, shareInfo.getId());
|
||||||
|
} else {
|
||||||
|
String expr = projectApplication.getTypeValue();
|
||||||
|
long timeMills = getTimeMills(shareInfo.getUpdateTime(), expr);
|
||||||
|
millisCheck(System.currentTimeMillis(), timeMills, shareInfo.getId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void millisCheck(long compareMillis, long millis, String shareInfoId) {
|
||||||
|
if (compareMillis > millis) {
|
||||||
|
shareInfoMapper.deleteByPrimaryKey(shareInfoId);
|
||||||
|
MSException.throwException(Translator.get("connection_expired"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private TestPlanWithBLOBs getTestPlan(ShareInfo shareInfo) {
|
||||||
|
TestPlanReportContentExample example = new TestPlanReportContentExample();
|
||||||
|
example.createCriteria().andTestPlanReportIdEqualTo(shareInfo.getCustomData());
|
||||||
|
List<TestPlanReportContentWithBLOBs> testPlanReportContents = testPlanReportContentMapper.selectByExampleWithBLOBs(example);
|
||||||
|
if (!CollectionUtils.isEmpty(testPlanReportContents)) {
|
||||||
|
TestPlanReportContentWithBLOBs testPlanReportContent = testPlanReportContents.get(0);
|
||||||
|
if (testPlanReportContent != null) {
|
||||||
|
TestPlanReport testPlanReport = testPlanReportMapper.selectByPrimaryKey(testPlanReportContent.getTestPlanReportId());
|
||||||
|
if (testPlanReport != null) {
|
||||||
|
return testPlanMapper.selectByPrimaryKey(testPlanReport.getTestPlanId());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
|
@ -5,5 +5,5 @@ const BASE_URL = "/project_application/";
|
||||||
|
|
||||||
export function getProjectApplicationConfig(type) {
|
export function getProjectApplicationConfig(type) {
|
||||||
let projectId = getCurrentProjectID();
|
let projectId = getCurrentProjectID();
|
||||||
return get(BASE_URL + `get/config/${projectId}/${type}`);
|
return get(BASE_URL + `get/${projectId}/${type}`);
|
||||||
}
|
}
|
||||||
|
|
|
@ -143,35 +143,27 @@ export default {
|
||||||
} else if (this.isDb) {
|
} else if (this.isDb) {
|
||||||
if (this.isShare) {
|
if (this.isShare) {
|
||||||
//持久化的报告分享
|
//持久化的报告分享
|
||||||
this.loading = true;
|
this.loading = getShareTestPlanReportContent(this.shareId, this.reportId)
|
||||||
getShareTestPlanReportContent(this.shareId, this.reportId)
|
|
||||||
.then((r) => {
|
.then((r) => {
|
||||||
this.loading = false;
|
|
||||||
this.report = r.data;
|
this.report = r.data;
|
||||||
this.report.config = this.getDefaultConfig(this.report);
|
this.report.config = this.getDefaultConfig(this.report);
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
this.loading = true;
|
this.loading = getTestPlanReportContent(this.reportId)
|
||||||
getTestPlanReportContent(this.reportId)
|
|
||||||
.then((r) => {
|
.then((r) => {
|
||||||
this.loading = false;
|
|
||||||
this.report = r.data;
|
this.report = r.data;
|
||||||
this.report.config = this.getDefaultConfig(this.report);
|
this.report.config = this.getDefaultConfig(this.report);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
} else if (this.isShare) {
|
} else if (this.isShare) {
|
||||||
this.loading = true;
|
this.loading = getShareTestPlanReport(this.shareId, this.planId)
|
||||||
getShareTestPlanReport(this.shareId, this.planId)
|
|
||||||
.then((r) => {
|
.then((r) => {
|
||||||
this.loading = false;
|
|
||||||
this.report = r.data;
|
this.report = r.data;
|
||||||
this.report.config = this.getDefaultConfig(this.report);
|
this.report.config = this.getDefaultConfig(this.report);
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
this.loading = true;
|
this.loading = getTestPlanReport(this.planId)
|
||||||
getTestPlanReport(this.planId)
|
|
||||||
.then((r) => {
|
.then((r) => {
|
||||||
this.loading = false;
|
|
||||||
this.report = r.data;
|
this.report = r.data;
|
||||||
this.report.config = this.getDefaultConfig(this.report);
|
this.report.config = this.getDefaultConfig(this.report);
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in New Issue