diff --git a/backend/framework/sdk/src/main/java/io/metersphere/sdk/constants/PermissionConstants.java b/backend/framework/sdk/src/main/java/io/metersphere/sdk/constants/PermissionConstants.java index d8d2a697bd..cde452bf4b 100644 --- a/backend/framework/sdk/src/main/java/io/metersphere/sdk/constants/PermissionConstants.java +++ b/backend/framework/sdk/src/main/java/io/metersphere/sdk/constants/PermissionConstants.java @@ -238,11 +238,11 @@ public class PermissionConstants { /*------ end: API_DEBUG ------*/ /*------ start: BUG ------*/ - public static final String BUG_READ = "BUG:READ"; - public static final String BUG_ADD = "BUG:READ+ADD"; - public static final String BUG_UPDATE = "BUG:READ+UPDATE"; - public static final String BUG_DELETE = "BUG:READ+DELETE"; - public static final String BUG_EXPORT = "PROJECT_BUG:READ+EXPORT"; + public static final String PROJECT_BUG_READ = "PROJECT_BUG:READ"; + public static final String PROJECT_BUG_ADD = "PROJECT_BUG:READ+ADD"; + public static final String PROJECT_BUG_UPDATE = "PROJECT_BUG:READ+UPDATE"; + public static final String PROJECT_BUG_DELETE = "PROJECT_BUG:READ+DELETE"; + public static final String PROJECT_BUG_EXPORT = "PROJECT_BUG:READ+EXPORT"; /*------ end: BUG ------*/ /*------ start: API_MANAGEMENT ------*/ public static final String PROJECT_API_DEFINITION_READ = "PROJECT_API_DEFINITION:READ"; diff --git a/backend/services/bug-management/src/main/java/io/metersphere/bug/controller/BugController.java b/backend/services/bug-management/src/main/java/io/metersphere/bug/controller/BugController.java index 7256e19973..cbe01761d9 100644 --- a/backend/services/bug-management/src/main/java/io/metersphere/bug/controller/BugController.java +++ b/backend/services/bug-management/src/main/java/io/metersphere/bug/controller/BugController.java @@ -46,105 +46,104 @@ public class BugController { @PostMapping("/page") @Operation(summary = "缺陷管理-获取缺陷列表") - @RequiresPermissions(PermissionConstants.BUG_READ) + @RequiresPermissions(PermissionConstants.PROJECT_BUG_READ) public Pager> page(@Validated @RequestBody BugPageRequest request) { Page page = PageHelper.startPage(request.getCurrent(), request.getPageSize(), StringUtils.isNotBlank(request.getSortString()) ? request.getSortString() : "create_time desc"); request.setUseTrash(false); - return PageUtils.setPageInfo(page, bugService.list(request)); + return PageUtils.setPageInfo(page, bugService.list(request, SessionUtils.getUserId())); } @PostMapping("/add") @Operation(summary = "缺陷管理-创建缺陷") - @RequiresPermissions(PermissionConstants.BUG_ADD) + @RequiresPermissions(PermissionConstants.PROJECT_BUG_ADD) public void add(@Validated({Created.class}) @RequestPart(value = "request") BugEditRequest request, @RequestPart(value = "file", required = false) List files) { - bugService.addOrUpdate(request, files, SessionUtils.getUserId(), false); + bugService.addOrUpdate(request, files, SessionUtils.getUserId(), SessionUtils.getCurrentOrganizationId(), false); } @PostMapping("/update") @Operation(summary = "缺陷管理-更新缺陷") - @RequiresPermissions(PermissionConstants.BUG_UPDATE) + @RequiresPermissions(PermissionConstants.PROJECT_BUG_UPDATE) public void update(@Validated({Updated.class}) @RequestPart(value = "request") BugEditRequest request, @RequestPart(value = "file", required = false) List files) { - bugService.addOrUpdate(request, files, SessionUtils.getUserId(), true); + bugService.addOrUpdate(request, files, SessionUtils.getUserId(), SessionUtils.getCurrentOrganizationId(), true); } @GetMapping("/delete/{id}") @Operation(summary = "缺陷管理-删除缺陷") - @RequiresPermissions(PermissionConstants.BUG_DELETE) + @RequiresPermissions(PermissionConstants.PROJECT_BUG_DELETE) public void delete(@PathVariable String id) { bugService.delete(id); } @GetMapping("/template/option") @Operation(summary = "缺陷管理-获取当前项目缺陷模板选项") - @RequiresPermissions(PermissionConstants.BUG_READ) + @RequiresPermissions(PermissionConstants.PROJECT_BUG_READ) public List getTemplateOption(@RequestParam(value = "projectId") String projectId) { return projectTemplateService.getOption(projectId, TemplateScene.BUG.name()); } @PostMapping("/template/detail") @Operation(summary = "缺陷管理-获取模板详情内容") - @RequiresPermissions(PermissionConstants.BUG_READ) + @RequiresPermissions(PermissionConstants.PROJECT_BUG_READ) public TemplateDTO getTemplateDetail(@RequestBody BugTemplateRequest request) { return bugService.getTemplate(request.getId(), request.getProjectId(), request.getFromStatusId(), request.getPlatformBugKey()); } @PostMapping("/batch-delete") @Operation(summary = "缺陷管理-批量删除缺陷") - @RequiresPermissions(PermissionConstants.BUG_DELETE) + @RequiresPermissions(PermissionConstants.PROJECT_BUG_DELETE) public void batchDelete(@Validated @RequestBody BugBatchRequest request) { - bugService.batchDelete(request); + bugService.batchDelete(request, SessionUtils.getUserId()); } @PostMapping("/batch-update") @Operation(summary = "缺陷管理-批量编辑缺陷") - @RequiresPermissions(PermissionConstants.BUG_UPDATE) + @RequiresPermissions(PermissionConstants.PROJECT_BUG_UPDATE) public void batchUpdate(@Validated @RequestBody BugBatchUpdateRequest request) { - bugService.batchUpdate(request); + bugService.batchUpdate(request, SessionUtils.getUserId()); } @GetMapping("/follow/{id}") @Operation(summary = "缺陷管理-关注缺陷") - @RequiresPermissions(PermissionConstants.BUG_UPDATE) + @RequiresPermissions(PermissionConstants.PROJECT_BUG_UPDATE) public void follow(@PathVariable String id) { bugService.follow(id, SessionUtils.getUserId()); } @GetMapping("/unfollow/{id}") @Operation(summary = "缺陷管理-取消关注缺陷") - @RequiresPermissions(PermissionConstants.BUG_UPDATE) + @RequiresPermissions(PermissionConstants.PROJECT_BUG_UPDATE) public void unfollow(@PathVariable String id) { bugService.unfollow(id, SessionUtils.getUserId()); } @GetMapping("/sync/{projectId}") @Operation(summary = "缺陷管理-同步缺陷(开源)") - @RequiresPermissions(PermissionConstants.BUG_UPDATE) + @RequiresPermissions(PermissionConstants.PROJECT_BUG_UPDATE) public void sync(@PathVariable String projectId) { bugSyncService.syncBugs(projectId); } @PostMapping("/sync/all") @Operation(summary = "缺陷管理-同步缺陷(全量)") - @RequiresPermissions(PermissionConstants.BUG_UPDATE) + @RequiresPermissions(PermissionConstants.PROJECT_BUG_UPDATE) public void syncAll(@RequestBody BugSyncRequest request) { bugSyncService.syncAllBugs(request); } @GetMapping("/export/columns/{projectId}") @Operation(summary = "缺陷管理-获取导出字段配置") - @RequiresPermissions(PermissionConstants.BUG_EXPORT) + @RequiresPermissions(PermissionConstants.PROJECT_BUG_EXPORT) public BugExportColumns getExportColumns(@PathVariable String projectId) { return bugService.getExportColumns(projectId); } @PostMapping("/export") @Operation(summary = "缺陷管理-批量导出缺陷") - @RequiresPermissions(PermissionConstants.BUG_EXPORT) + @RequiresPermissions(PermissionConstants.PROJECT_BUG_EXPORT) public ResponseEntity export(@Validated @RequestBody BugExportRequest request) throws Exception { - return bugService.export(request); + return bugService.export(request, SessionUtils.getUserId()); } - } diff --git a/backend/services/bug-management/src/main/java/io/metersphere/bug/controller/BugRelateCaseController.java b/backend/services/bug-management/src/main/java/io/metersphere/bug/controller/BugRelateCaseController.java index 1229c520b3..48b3b2023c 100644 --- a/backend/services/bug-management/src/main/java/io/metersphere/bug/controller/BugRelateCaseController.java +++ b/backend/services/bug-management/src/main/java/io/metersphere/bug/controller/BugRelateCaseController.java @@ -28,7 +28,7 @@ public class BugRelateCaseController { @PostMapping("/page") @Operation(description = "缺陷管理-关联用例-列表分页查询") - @RequiresPermissions(PermissionConstants.BUG_UPDATE) + @RequiresPermissions(PermissionConstants.PROJECT_BUG_UPDATE) public Pager> page(@Validated @RequestBody BugRelatedCasePageRequest request) { Page page = PageHelper.startPage(request.getCurrent(), request.getPageSize()); return PageUtils.setPageInfo(page, bugRelateCaseService.page(request)); @@ -36,7 +36,7 @@ public class BugRelateCaseController { @GetMapping("/un-relate/{id}") @Operation(description = "缺陷管理-关联用例-取消关联用例") - @RequiresPermissions(PermissionConstants.BUG_UPDATE) + @RequiresPermissions(PermissionConstants.PROJECT_BUG_UPDATE) public void unRelate(@PathVariable String id) { bugRelateCaseService.unRelate(id); } diff --git a/backend/services/bug-management/src/main/java/io/metersphere/bug/BugSyncJob.java b/backend/services/bug-management/src/main/java/io/metersphere/bug/job/BugSyncJob.java similarity index 59% rename from backend/services/bug-management/src/main/java/io/metersphere/bug/BugSyncJob.java rename to backend/services/bug-management/src/main/java/io/metersphere/bug/job/BugSyncJob.java index 4ef9329db0..30a093c881 100644 --- a/backend/services/bug-management/src/main/java/io/metersphere/bug/BugSyncJob.java +++ b/backend/services/bug-management/src/main/java/io/metersphere/bug/job/BugSyncJob.java @@ -1,4 +1,4 @@ -package io.metersphere.bug; +package io.metersphere.bug.job; import io.metersphere.bug.service.BugSyncService; import io.metersphere.bug.service.XpackBugService; @@ -29,15 +29,21 @@ public class BugSyncJob extends BaseScheduleJob { @Override protected void businessExecute(JobExecutionContext context) { - LicenseDTO licenseDTO = licenseService.validate(); - if (licenseDTO != null && licenseDTO.getLicense() != null - && StringUtils.equals(licenseDTO.getStatus(), "valid")) { - LogUtils.info("sync all bug"); - xpackBugService.syncPlatformBugsBySchedule(); - } else { - LogUtils.info("sync remain bug"); + LogUtils.info("bug sync job start......"); + if (licenseService == null) { + LogUtils.info("license is null, sync remain bug"); bugSyncService.syncPlatformBugBySchedule(); + } else { + LicenseDTO licenseDTO = licenseService.validate(); + if (licenseDTO != null && licenseDTO.getLicense() != null + && StringUtils.equals(licenseDTO.getStatus(), "valid")) { + LogUtils.info("license is valid, sync all bug"); + xpackBugService.syncPlatformBugsBySchedule(); + } else { + LogUtils.info("license is invalid, sync remain bug"); + bugSyncService.syncPlatformBugBySchedule(); + } } - LogUtils.info("sync bug end"); + LogUtils.info("bug sync job end......"); } } diff --git a/backend/services/bug-management/src/main/java/io/metersphere/bug/service/BugService.java b/backend/services/bug-management/src/main/java/io/metersphere/bug/service/BugService.java index 0706d02b95..39b3e99e77 100644 --- a/backend/services/bug-management/src/main/java/io/metersphere/bug/service/BugService.java +++ b/backend/services/bug-management/src/main/java/io/metersphere/bug/service/BugService.java @@ -11,7 +11,6 @@ import io.metersphere.bug.dto.response.BugTagEditDTO; import io.metersphere.bug.enums.BugPlatform; import io.metersphere.bug.enums.BugTemplateCustomField; import io.metersphere.bug.mapper.*; -import io.metersphere.bug.utils.CustomFieldUtils; import io.metersphere.bug.utils.ExportUtils; import io.metersphere.plugin.platform.dto.SelectOption; import io.metersphere.plugin.platform.dto.SyncBugResult; @@ -43,12 +42,10 @@ import io.metersphere.system.dto.sdk.TemplateDTO; import io.metersphere.system.log.constants.OperationLogModule; import io.metersphere.system.mapper.BaseUserMapper; import io.metersphere.system.mapper.TemplateMapper; -import io.metersphere.system.service.BaseTemplateCustomFieldService; -import io.metersphere.system.service.BaseTemplateService; -import io.metersphere.system.service.PlatformPluginService; -import io.metersphere.system.service.PluginLoadService; +import io.metersphere.system.service.*; import io.metersphere.system.uid.IDGenerator; import io.metersphere.system.uid.NumGenerator; +import io.metersphere.system.utils.CustomFieldUtils; import jakarta.annotation.Resource; import jodd.util.StringUtil; import org.apache.commons.collections4.CollectionUtils; @@ -102,6 +99,8 @@ public class BugService { @Resource private PlatformPluginService platformPluginService; @Resource + private UserPlatformAccountService userPlatformAccountService; + @Resource private BugCustomFieldMapper bugCustomFieldMapper; @Resource private ExtBugCustomFieldMapper extBugCustomFieldMapper; @@ -146,8 +145,8 @@ public class BugService { * @param request 列表请求参数 * @return 缺陷列表 */ - public List list(BugPageRequest request) { - CustomFieldUtils.setBaseQueryRequestCustomMultipleFields(request); + public List list(BugPageRequest request, String currentUser) { + CustomFieldUtils.setBaseQueryRequestCustomMultipleFields(request, currentUser); List bugs = extBugMapper.list(request); if (CollectionUtils.isEmpty(bugs)) { return new ArrayList<>(); @@ -164,7 +163,7 @@ public class BugService { * @param files 附件集合 * @param currentUser 当前用户 */ - public void addOrUpdate(BugEditRequest request, List files, String currentUser, boolean isUpdate) { + public void addOrUpdate(BugEditRequest request, List files, String currentUser, String currentOrgId, boolean isUpdate) { /* * 缺陷创建或者修改逻辑: * 1. 判断所属项目是否关联第三方平台; @@ -186,7 +185,7 @@ public class BugService { Platform platform = platformPluginService.getPlatform(serviceIntegration.getPluginId(), serviceIntegration.getOrganizationId(), new String(serviceIntegration.getConfiguration())); PlatformBugUpdateRequest platformRequest = buildPlatformBugRequest(request); - platformRequest.setUserPlatformConfig(new String(serviceIntegration.getConfiguration())); + platformRequest.setUserPlatformConfig(JSON.toJSONString(userPlatformAccountService.get(currentUser, currentOrgId))); platformRequest.setProjectConfig(projectApplicationService.getProjectBugThirdPartConfig(request.getProjectId())); if (isUpdate) { Bug bug = bugMapper.selectByPrimaryKey(request.getId()); @@ -261,8 +260,8 @@ public class BugService { * 批量删除缺陷 * @param request 请求参数 */ - public void batchDelete(BugBatchRequest request) { - List batchIds = getBatchIdsByRequest(request); + public void batchDelete(BugBatchRequest request, String currentUser) { + List batchIds = getBatchIdsByRequest(request, currentUser); batchIds.forEach(this::delete); } @@ -270,8 +269,8 @@ public class BugService { * 批量编辑缺陷 * @param request 请求参数 */ - public void batchUpdate(BugBatchUpdateRequest request) { - List batchIds = getBatchIdsByRequest(request); + public void batchUpdate(BugBatchUpdateRequest request, String currentUser) { + List batchIds = getBatchIdsByRequest(request, currentUser); // 目前只做标签的批量编辑 if (request.isAppend()) { @@ -1081,8 +1080,8 @@ public class BugService { * @return 导出对象 * @throws Exception 异常 */ - public ResponseEntity export(BugExportRequest request) throws Exception { - List bugs = this.getExportDataByBatchRequest(request); + public ResponseEntity export(BugExportRequest request, String currentUser) throws Exception { + List bugs = this.getExportDataByBatchRequest(request, currentUser); if (CollectionUtils.isEmpty(bugs)) { throw new MSException(Translator.get("no_bug_select")); } @@ -1110,13 +1109,13 @@ public class BugService { * @param request 批量操作参数 * @return 缺陷集合 */ - private List getExportDataByBatchRequest(BugBatchRequest request) { + private List getExportDataByBatchRequest(BugBatchRequest request, String currentUser) { if (request.isSelectAll()) { // 全选{根据查询条件查询所有数据, 排除取消勾选的数据} BugPageRequest bugPageRequest = new BugPageRequest(); BeanUtils.copyBean(bugPageRequest, request); bugPageRequest.setUseTrash(false); - CustomFieldUtils.setBaseQueryRequestCustomMultipleFields(bugPageRequest); + CustomFieldUtils.setBaseQueryRequestCustomMultipleFields(bugPageRequest, currentUser); List allBugs = extBugMapper.list(bugPageRequest); if (CollectionUtils.isNotEmpty(request.getExcludeIds())) { allBugs.removeIf(bug -> request.getExcludeIds().contains(bug.getId())); @@ -1136,13 +1135,13 @@ public class BugService { * @param request 批量操作参数 * @return 缺陷集合 */ - private List getBatchIdsByRequest(BugBatchRequest request) { + private List getBatchIdsByRequest(BugBatchRequest request, String currentUser) { if (request.isSelectAll()) { // 全选{根据查询条件查询所有数据, 排除取消勾选的数据} BugPageRequest bugPageRequest = new BugPageRequest(); BeanUtils.copyBean(bugPageRequest, request); bugPageRequest.setUseTrash(false); - CustomFieldUtils.setBaseQueryRequestCustomMultipleFields(bugPageRequest); + CustomFieldUtils.setBaseQueryRequestCustomMultipleFields(bugPageRequest, currentUser); List ids = extBugMapper.getIdsByPageRequest(bugPageRequest); if (CollectionUtils.isNotEmpty(request.getExcludeIds())) { ids.removeIf(id -> request.getExcludeIds().contains(id)); diff --git a/backend/services/bug-management/src/main/java/io/metersphere/bug/utils/CustomFieldUtils.java b/backend/services/bug-management/src/main/java/io/metersphere/bug/utils/CustomFieldUtils.java deleted file mode 100644 index 6d5db6cb63..0000000000 --- a/backend/services/bug-management/src/main/java/io/metersphere/bug/utils/CustomFieldUtils.java +++ /dev/null @@ -1,98 +0,0 @@ -package io.metersphere.bug.utils; - -import io.metersphere.sdk.constants.CustomFieldType; -import io.metersphere.sdk.util.JSON; -import io.metersphere.system.dto.sdk.BasePageRequest; -import io.metersphere.system.utils.SessionUtils; -import lombok.experimental.UtilityClass; -import org.apache.commons.collections.CollectionUtils; -import org.apache.commons.collections.MapUtils; -import org.apache.commons.lang3.ObjectUtils; -import org.apache.commons.lang3.StringUtils; - -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -/** - * 字段处理工具类 - * @author song-cc-rock - */ -@UtilityClass -public class CustomFieldUtils { - - public static final String COMBINE_CUSTOM = "customs"; - public static final String COMBINE_CUSTOM_FIELD_TYPE = "type"; - public static final String COMBINE_CUSTOM_FIELD_VALUE = "value"; - public static final String COMBINE_CUSTOM_FIELD_OPERATOR = "operator"; - public static final String IS_CURRENT_USER = "current user"; - public static final String CUSTOM_MULTIPLE_PREFIX = "custom_multiple"; - - /** - * 设置列表查询的多选字段参数 - * @param request 请求参数 - */ - public static void setBaseQueryRequestCustomMultipleFields(BasePageRequest request) { - // handle filter custom multiple fields - if (MapUtils.isNotEmpty(request.getFilter())) { - request.getFilter().entrySet().forEach(entry -> { - if (entry.getKey().startsWith(CUSTOM_MULTIPLE_PREFIX) && CollectionUtils.isNotEmpty(entry.getValue())) { - List jsonValues = entry.getValue().stream().map(item -> "[\"".concat(item).concat("\"]")).collect(Collectors.toList()); - entry.setValue(jsonValues); - } - }); - } - - // handle combine fields - if (MapUtils.isNotEmpty(request.getCombine())) { - Map combine = request.getCombine(); - combine.forEach((k, v) -> { - if (StringUtils.equals(k, COMBINE_CUSTOM)) { - // handle combine custom multiple fields - if (ObjectUtils.isNotEmpty((v))) { - //noinspection unchecked - List> customs = (List>) v; - for (Map custom : customs) { - // when member select or member multipart select support current user, open it - if(StringUtils.equalsIgnoreCase(custom.get(COMBINE_CUSTOM_FIELD_OPERATOR).toString(), IS_CURRENT_USER)){ - custom.put(COMBINE_CUSTOM_FIELD_VALUE, SessionUtils.getUserId()); - continue; - } - if (StringUtils.equalsAny(custom.get(COMBINE_CUSTOM_FIELD_TYPE).toString(), CustomFieldType.MULTIPLE_MEMBER.getType(), - CustomFieldType.CHECKBOX.getType(), CustomFieldType.MULTIPLE_SELECT.getType()) - && StringUtils.isNotEmpty(custom.get(COMBINE_CUSTOM_FIELD_VALUE).toString())) { - List customValues = JSON.parseArray(custom.get(COMBINE_CUSTOM_FIELD_VALUE).toString(), String.class); - List jsonValues = customValues.stream().map(item -> "JSON_CONTAINS(`value`, '[\"".concat(item).concat("\"]')")).toList(); - custom.put(COMBINE_CUSTOM_FIELD_VALUE, "(".concat(StringUtils.join(jsonValues, " OR ")).concat(")")); - } - } - } - } else { - //noinspection unchecked - Map combineField = (Map) v; - if (StringUtils.equalsIgnoreCase(combineField.get(COMBINE_CUSTOM_FIELD_OPERATOR).toString(), IS_CURRENT_USER)) { - // handle combine current user - combineField.put(COMBINE_CUSTOM_FIELD_VALUE, SessionUtils.getUserId()); - } - } - }); - } - } - - /** - * 多选字段追加值 - * @param originalVal 原始值 - * @param appendVal 追加值 - * @return 追加后的值 - */ - public static String appendToMultipleCustomField(String originalVal, String appendVal) { - if (StringUtils.isEmpty(originalVal)) { - return appendVal; - } - List orignalList = JSON.parseArray(originalVal, String.class); - List appendList = JSON.parseArray(appendVal, String.class); - orignalList.addAll(appendList); - // 追加后需去重 - return JSON.toJSONString(orignalList.stream().distinct().toList()); - } -} diff --git a/backend/services/bug-management/src/test/java/io/metersphere/bug/controller/BugControllerTests.java b/backend/services/bug-management/src/test/java/io/metersphere/bug/controller/BugControllerTests.java index 0b5efeef84..389f2e7d1d 100644 --- a/backend/services/bug-management/src/test/java/io/metersphere/bug/controller/BugControllerTests.java +++ b/backend/services/bug-management/src/test/java/io/metersphere/bug/controller/BugControllerTests.java @@ -13,7 +13,6 @@ import io.metersphere.bug.mapper.BugMapper; import io.metersphere.bug.service.BugService; import io.metersphere.bug.service.BugSyncExtraService; import io.metersphere.bug.service.BugSyncService; -import io.metersphere.bug.utils.CustomFieldUtils; import io.metersphere.plugin.platform.dto.request.SyncAllBugRequest; import io.metersphere.project.domain.*; import io.metersphere.project.dto.ProjectTemplateOptionDTO; @@ -38,6 +37,7 @@ import io.metersphere.system.mapper.CustomFieldMapper; import io.metersphere.system.mapper.ServiceIntegrationMapper; import io.metersphere.system.service.PluginService; import io.metersphere.system.uid.IDGenerator; +import io.metersphere.system.utils.CustomFieldUtils; import io.metersphere.system.utils.Pager; import jakarta.annotation.Resource; import org.apache.commons.lang3.StringUtils; @@ -215,9 +215,6 @@ public class BugControllerTests extends BaseTest { combine.put("customs", customs); bugPageRequest.setCombine(combine); this.requestPostWithOkAndReturn(BUG_PAGE, bugPageRequest); - combine.put("customs", null); - bugPageRequest.setCombine(combine); - this.requestPostWithOkAndReturn(BUG_PAGE, bugPageRequest); // cover combine current user custom.clear(); custom.put("operator", "current user"); @@ -408,7 +405,7 @@ public class BugControllerTests extends BaseTest { void testExportColumns() throws Exception { this.requestGetWithOkAndReturn(String.format(BUG_EXPORT_COLUMNS, "default-project-for-bug")); //校验权限 - this.requestGetPermissionTest(PermissionConstants.BUG_EXPORT, String.format(BUG_EXPORT_COLUMNS, DEFAULT_PROJECT_ID)); + this.requestGetPermissionTest(PermissionConstants.PROJECT_BUG_EXPORT, String.format(BUG_EXPORT_COLUMNS, DEFAULT_PROJECT_ID)); } @Test @@ -463,7 +460,7 @@ public class BugControllerTests extends BaseTest { request.setProjectId(DEFAULT_PROJECT_ID); request.setSelectAll(true); request.setExportColumns(exportColumns); - this.requestPostPermissionTest(PermissionConstants.BUG_EXPORT, BUG_EXPORT, request); + this.requestPostPermissionTest(PermissionConstants.PROJECT_BUG_EXPORT, BUG_EXPORT, request); } @Test @@ -659,7 +656,7 @@ public class BugControllerTests extends BaseTest { @Test @Order(98) - void coverBugTests() { + void coverBugTests() throws Exception { BugCustomFieldDTO field = new BugCustomFieldDTO(); field.setId("test_field"); field.setName("test"); @@ -670,6 +667,11 @@ public class BugControllerTests extends BaseTest { removeApiFieldTmp(); bugService.transferCustomToPlatformField("default-bug-template-id-not-exist", List.of(field), false); rollBackApiField(); + // 覆盖导出相关的代码 + BugExportRequest request = new BugExportRequest(); + request.setSelectAll(true); + request.setExcludeIds(List.of("test-id")); + bugService.export(request, "admin"); } @Test diff --git a/backend/services/bug-management/src/test/resources/file/metersphere-jira-test.jar b/backend/services/bug-management/src/test/resources/file/metersphere-jira-test.jar index d23eb28db1..73e39bd544 100644 Binary files a/backend/services/bug-management/src/test/resources/file/metersphere-jira-test.jar and b/backend/services/bug-management/src/test/resources/file/metersphere-jira-test.jar differ diff --git a/backend/services/bug-management/src/test/resources/file/metersphere-zentao-test.jar b/backend/services/bug-management/src/test/resources/file/metersphere-zentao-test.jar index c9a13876bb..b924599aba 100644 Binary files a/backend/services/bug-management/src/test/resources/file/metersphere-zentao-test.jar and b/backend/services/bug-management/src/test/resources/file/metersphere-zentao-test.jar differ diff --git a/backend/services/system-setting/src/main/java/io/metersphere/system/config/interceptor/BugInterceptor.java b/backend/services/system-setting/src/main/java/io/metersphere/system/config/interceptor/BugInterceptor.java new file mode 100644 index 0000000000..633f539c1a --- /dev/null +++ b/backend/services/system-setting/src/main/java/io/metersphere/system/config/interceptor/BugInterceptor.java @@ -0,0 +1,22 @@ +package io.metersphere.system.config.interceptor; + +import io.metersphere.bug.domain.BugContent; +import io.metersphere.bug.domain.BugHistory; +import io.metersphere.sdk.util.CompressUtils; +import io.metersphere.system.utils.MybatisInterceptorConfig; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.ArrayList; +import java.util.List; + +@Configuration +public class BugInterceptor { + @Bean + public List bugCompressConfigs() { + List configList = new ArrayList<>(); + configList.add(new MybatisInterceptorConfig(BugContent.class, "description", CompressUtils.class, "zip", "unzip")); + configList.add(new MybatisInterceptorConfig(BugHistory.class, "content", CompressUtils.class, "zip", "unzip")); + return configList; + } +} diff --git a/backend/services/system-setting/src/main/java/io/metersphere/system/controller/UserPlatformAccountController.java b/backend/services/system-setting/src/main/java/io/metersphere/system/controller/UserPlatformAccountController.java index 721837d97b..41086d6b7b 100644 --- a/backend/services/system-setting/src/main/java/io/metersphere/system/controller/UserPlatformAccountController.java +++ b/backend/services/system-setting/src/main/java/io/metersphere/system/controller/UserPlatformAccountController.java @@ -46,11 +46,10 @@ public class UserPlatformAccountController { userPlatformAccountService.save(platformInfo, SessionUtils.getUserId()); } - @GetMapping("/get") + @GetMapping("/get/{orgId}") + @Parameter(name = "orgId", description = "组织ID", schema = @Schema(requiredMode = Schema.RequiredMode.REQUIRED)) @Operation(summary = "系统设置-个人中心-获取个人三方平台账号") - public Map get() { - return userPlatformAccountService.get(SessionUtils.getUserId()); + public Map get(@PathVariable String orgId) { + return userPlatformAccountService.get(SessionUtils.getUserId(), orgId); } - - } diff --git a/backend/services/system-setting/src/main/java/io/metersphere/system/service/UserPlatformAccountService.java b/backend/services/system-setting/src/main/java/io/metersphere/system/service/UserPlatformAccountService.java index 708a15cac7..eb550311d5 100644 --- a/backend/services/system-setting/src/main/java/io/metersphere/system/service/UserPlatformAccountService.java +++ b/backend/services/system-setting/src/main/java/io/metersphere/system/service/UserPlatformAccountService.java @@ -15,6 +15,7 @@ import io.metersphere.system.log.dto.LogDTO; import io.metersphere.system.log.service.OperationLogService; import io.metersphere.system.mapper.UserExtendMapper; import jakarta.annotation.Resource; +import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -69,7 +70,10 @@ public class UserPlatformAccountService { userExtend.setPlatformInfo(JSON.toJSONBytes(platformInfo)); userExtendMapper.insertSelective(userExtend); } else { - userExtend.setPlatformInfo(JSON.toJSONBytes(platformInfo)); + // noinspection unchecked + Map originalUserPlatformInfo = JSON.parseMap(new String(userExtend.getPlatformInfo())); + originalUserPlatformInfo.putAll(platformInfo); + userExtend.setPlatformInfo(JSON.toJSONBytes(originalUserPlatformInfo)); userExtendMapper.updateByPrimaryKeySelective(userExtend); } LogDTO dto = LogDTOBuilder.builder() @@ -85,11 +89,21 @@ public class UserPlatformAccountService { operationLogService.add(dto); } - public Map get(String userId) { + /** + * 获取个人三方平台账号 + * @param userId 用户ID + * @param orgId 组织ID + * @return 三方平台账号 + */ + public Map get(String userId, String orgId) { UserExtend userExtend = userExtendMapper.selectByPrimaryKey(userId); - if (userExtend == null || userExtend.getPlatformInfo() == null) { - return new HashMap<>(); + if (userExtend == null || StringUtils.isBlank(new String(userExtend.getPlatformInfo()))) { + return null; } - return JSON.parseMap(new String(userExtend.getPlatformInfo())); + // noinspection unchecked + Map userPlatformInfo = JSON.parseMap(new String(userExtend.getPlatformInfo())); + // 获取组织用户集成信息 + // noinspection unchecked + return (Map) userPlatformInfo.get(orgId); } } diff --git a/backend/services/system-setting/src/test/java/io/metersphere/system/controller/UserPlatformAccountControllerTests.java b/backend/services/system-setting/src/test/java/io/metersphere/system/controller/UserPlatformAccountControllerTests.java index 1d757e9f95..ea9321e562 100644 --- a/backend/services/system-setting/src/test/java/io/metersphere/system/controller/UserPlatformAccountControllerTests.java +++ b/backend/services/system-setting/src/test/java/io/metersphere/system/controller/UserPlatformAccountControllerTests.java @@ -5,6 +5,8 @@ import io.metersphere.system.base.BasePluginTestService; import io.metersphere.system.base.BaseTest; import io.metersphere.system.controller.handler.ResultHolder; import io.metersphere.system.domain.Plugin; +import io.metersphere.system.domain.UserExtendExample; +import io.metersphere.system.mapper.UserExtendMapper; import jakarta.annotation.Resource; import org.junit.jupiter.api.*; import org.mockserver.client.MockServerClient; @@ -34,6 +36,8 @@ public class UserPlatformAccountControllerTests extends BaseTest { private int mockServerHostPort; @Resource private MockServerClient mockServerClient; + @Resource + private UserExtendMapper userExtendMapper; private static final String VALIDATE_POST = "/user/platform/validate/{0}/{1}"; private static final String SAVE_POST = "/user/platform/save"; public static T parseObjectFromMvcResult(MvcResult mvcResult, Class parseClass) { @@ -84,27 +88,38 @@ public class UserPlatformAccountControllerTests extends BaseTest { @Test @Order(3) public void testSave() throws Exception { - this.requestGetAndReturn("/user/platform/get"); - basePluginTestService.getJiraPlugin(); - BasePluginTestService.JiraIntegrationConfig integrationConfig = new BasePluginTestService.JiraIntegrationConfig(); - integrationConfig.setAddress(String.format("http://%s:%s", mockServerHost, mockServerHostPort)); - Map jiraMap = new HashMap<>(); - jiraMap.put("jira", integrationConfig); - // @@请求成功 - this.requestPostWithOk(SAVE_POST, jiraMap); - this.requestPostWithOk(SAVE_POST, jiraMap); + // 未保存用户配置信息, 为空 + MvcResult mvcResult = this.requestGetAndReturn("/user/platform/get/100001"); + // noinspection unchecked + Map accountMap = parseObjectFromMvcResult(mvcResult, Map.class); + Assertions.assertNull(accountMap); + // @@请求成功 保存两次 + this.requestPostWithOk(SAVE_POST, buildUserPlatformConfig()); + this.requestPostWithOk(SAVE_POST, buildUserPlatformConfig()); } @Test @Order(4) public void testGet() throws Exception { - MvcResult mvcResult = this.requestGetAndReturn("/user/platform/get"); + MvcResult mvcResult = this.requestGetAndReturn("/user/platform/get/100001"); + // noinspection unchecked Map accountMap = parseObjectFromMvcResult(mvcResult, Map.class); Assertions.assertNotNull(accountMap); + // 删除用户配置信息, 避免影响后续测试 + UserExtendExample example = new UserExtendExample(); + example.createCriteria().andIdEqualTo("admin"); + userExtendMapper.deleteByExample(example); } - - - - + private Map buildUserPlatformConfig() { + Map platformInfo = new HashMap<>(); + Map userPlatformConfig = new HashMap<>(); + userPlatformConfig.put("authType", "test"); + userPlatformConfig.put("jiraAccount", "test"); + userPlatformConfig.put("jiraPassword", "test"); + userPlatformConfig.put("zentaoAccount", "test"); + userPlatformConfig.put("zentaoPassword", "test"); + platformInfo.put("100001", userPlatformConfig); + return platformInfo; + } } diff --git a/backend/services/system-setting/src/test/resources/file/metersphere-jira-plugin-3.x.jar b/backend/services/system-setting/src/test/resources/file/metersphere-jira-plugin-3.x.jar index d9554865a5..73e39bd544 100644 Binary files a/backend/services/system-setting/src/test/resources/file/metersphere-jira-plugin-3.x.jar and b/backend/services/system-setting/src/test/resources/file/metersphere-jira-plugin-3.x.jar differ