From 892ddbf94044ca4c0e3556890f96de20ad469b5c Mon Sep 17 00:00:00 2001 From: song-tianyang Date: Wed, 31 Jan 2024 17:14:42 +0800 Subject: [PATCH] =?UTF-8?q?fix(=E7=B3=BB=E7=BB=9F=E8=AE=BE=E7=BD=AE):=20?= =?UTF-8?q?=E5=88=9B=E5=BB=BA=E7=94=A8=E6=88=B7=E6=97=B6=E6=8F=90=E7=A4=BA?= =?UTF-8?q?=E5=85=B7=E4=BD=93=E7=9A=84=E9=82=AE=E7=AE=B1=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E6=8A=A5=E9=94=99=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --bug=1034909 --user=宋天阳 【系统设置】创建用户-添加多个用户-邮箱已存在提示信息不明确且和字段名称不一致 https://www.tapd.cn/55049933/s/1457326 --- .../src/main/resources/i18n/system.properties | 2 +- .../resources/i18n/system_en_US.properties | 2 +- .../resources/i18n/system_zh_CN.properties | 2 +- .../resources/i18n/system_zh_TW.properties | 2 +- .../system/controller/UserController.java | 9 +- .../dto/request/user/UserEditRequest.java | 2 +- .../system/dto/{ => user}/UserCreateInfo.java | 2 +- .../request/UserBatchCreateRequest.java} | 5 +- .../response/UserBatchCreateResponse.java | 16 ++ .../response/UserImportResponse.java | 8 +- .../response/UserInviteResponse.java | 4 +- .../{ => user}/response/UserSelectOption.java | 2 +- .../response/UserTableResponse.java | 2 +- .../system/mapper/BaseUserMapper.java | 3 +- .../system/service/GlobalUserRoleService.java | 6 +- .../service/UserRoleRelationService.java | 4 +- .../system/service/UserService.java | 64 +++--- .../user/UserControllerPermissionTests.java | 4 +- .../controller/user/UserControllerTests.java | 209 +++++++++--------- .../system/utils/user/UserParamUtils.java | 16 +- 20 files changed, 197 insertions(+), 167 deletions(-) rename backend/services/system-setting/src/main/java/io/metersphere/system/dto/{ => user}/UserCreateInfo.java (96%) rename backend/services/system-setting/src/main/java/io/metersphere/system/dto/{UserBatchCreateDTO.java => user/request/UserBatchCreateRequest.java} (86%) create mode 100644 backend/services/system-setting/src/main/java/io/metersphere/system/dto/user/response/UserBatchCreateResponse.java rename backend/services/system-setting/src/main/java/io/metersphere/system/dto/{ => user}/response/UserImportResponse.java (82%) rename backend/services/system-setting/src/main/java/io/metersphere/system/dto/{ => user}/response/UserInviteResponse.java (82%) rename backend/services/system-setting/src/main/java/io/metersphere/system/dto/{ => user}/response/UserSelectOption.java (89%) rename backend/services/system-setting/src/main/java/io/metersphere/system/dto/{ => user}/response/UserTableResponse.java (92%) diff --git a/backend/framework/sdk/src/main/resources/i18n/system.properties b/backend/framework/sdk/src/main/resources/i18n/system.properties index 7133ef693f..1ac255eade 100644 --- a/backend/framework/sdk/src/main/resources/i18n/system.properties +++ b/backend/framework/sdk/src/main/resources/i18n/system.properties @@ -109,7 +109,7 @@ user.email.invite_ms=邀请你加入MeterSphere user.email.invite_click=点击加入 user.email.invite_tips=如果按钮无法点击,请直接访问以下链接: user.email.invite_limited_time=此链接自发送之时起24小时后过期 -user.email.repeat=用户email已存在 +user.email.repeat=邮箱重复 user.reset.password=重置密码 user.delete=删除用户 user.enable=启用用户 diff --git a/backend/framework/sdk/src/main/resources/i18n/system_en_US.properties b/backend/framework/sdk/src/main/resources/i18n/system_en_US.properties index e5374726a6..4d46ee30ab 100644 --- a/backend/framework/sdk/src/main/resources/i18n/system_en_US.properties +++ b/backend/framework/sdk/src/main/resources/i18n/system_en_US.properties @@ -109,7 +109,7 @@ user.email.invite_ms=invited you join MeterSphere user.email.invite_click=Join in user.email.invite_tips=If button can not click,please click url: user.email.invite_limited_time=Url expires in 24 hours -user.email.repeat=User email already exists +user.email.repeat=Email already exists user.reset.password=Reset password user.delete=Delete user user.enable=Enable user diff --git a/backend/framework/sdk/src/main/resources/i18n/system_zh_CN.properties b/backend/framework/sdk/src/main/resources/i18n/system_zh_CN.properties index 1c2fd4685b..57560cf3fd 100644 --- a/backend/framework/sdk/src/main/resources/i18n/system_zh_CN.properties +++ b/backend/framework/sdk/src/main/resources/i18n/system_zh_CN.properties @@ -110,7 +110,7 @@ user.email.invite_ms=邀请你加入MeterSphere user.email.invite_click=点击加入 user.email.invite_tips=如果按钮无法点击,请直接访问以下链接: user.email.invite_limited_time=此链接自发送之时起24小时后过期 -user.email.repeat=用户email已存在 +user.email.repeat=邮箱重复 user.reset.password=重置密码 user.delete=删除用户 user.enable=启用用户 diff --git a/backend/framework/sdk/src/main/resources/i18n/system_zh_TW.properties b/backend/framework/sdk/src/main/resources/i18n/system_zh_TW.properties index 190f28c27b..f32deb46d9 100644 --- a/backend/framework/sdk/src/main/resources/i18n/system_zh_TW.properties +++ b/backend/framework/sdk/src/main/resources/i18n/system_zh_TW.properties @@ -109,7 +109,7 @@ user.email.invite_ms=邀請你加入MeterSphere user.email.invite_click=點擊加入 user.email.invite_tips=如果按鈕無法點擊,請直接訪問以下鏈接: user.email.invite_limited_time=此鏈接自發送之時起24小時後過期 -user.email.repeat=用戶email已存在 +user.email.repeat=郵箱重複 user.reset.password=重置密碼 user.delete=刪除用戶 user.enable=啟用用戶 diff --git a/backend/services/system-setting/src/main/java/io/metersphere/system/controller/UserController.java b/backend/services/system-setting/src/main/java/io/metersphere/system/controller/UserController.java index db23cd7430..411ca35013 100644 --- a/backend/services/system-setting/src/main/java/io/metersphere/system/controller/UserController.java +++ b/backend/services/system-setting/src/main/java/io/metersphere/system/controller/UserController.java @@ -7,7 +7,6 @@ import io.metersphere.project.domain.Project; import io.metersphere.sdk.constants.PermissionConstants; import io.metersphere.sdk.constants.UserSource; import io.metersphere.system.domain.Organization; -import io.metersphere.system.dto.UserBatchCreateDTO; import io.metersphere.system.dto.request.OrganizationMemberBatchRequest; import io.metersphere.system.dto.request.ProjectAddMemberBatchRequest; import io.metersphere.system.dto.request.UserInviteRequest; @@ -15,16 +14,14 @@ import io.metersphere.system.dto.request.UserRegisterRequest; import io.metersphere.system.dto.request.user.UserChangeEnableRequest; import io.metersphere.system.dto.request.user.UserEditRequest; import io.metersphere.system.dto.request.user.UserRoleBatchRelationRequest; -import io.metersphere.system.dto.response.UserImportResponse; -import io.metersphere.system.dto.response.UserInviteResponse; -import io.metersphere.system.dto.response.UserSelectOption; -import io.metersphere.system.dto.response.UserTableResponse; import io.metersphere.system.dto.sdk.BasePageRequest; import io.metersphere.system.dto.sdk.BaseTreeNode; import io.metersphere.system.dto.sdk.OptionDTO; import io.metersphere.system.dto.table.TableBatchProcessDTO; import io.metersphere.system.dto.table.TableBatchProcessResponse; import io.metersphere.system.dto.user.UserDTO; +import io.metersphere.system.dto.user.request.UserBatchCreateRequest; +import io.metersphere.system.dto.user.response.*; import io.metersphere.system.log.annotation.Log; import io.metersphere.system.log.constants.OperationLogType; import io.metersphere.system.service.*; @@ -76,7 +73,7 @@ public class UserController { @PostMapping("/add") @Operation(summary = "系统设置-系统-用户-添加用户") @RequiresPermissions(PermissionConstants.SYSTEM_USER_ADD) - public UserBatchCreateDTO addUser(@Validated({Created.class}) @RequestBody UserBatchCreateDTO userCreateDTO) { + public UserBatchCreateResponse addUser(@Validated({Created.class}) @RequestBody UserBatchCreateRequest userCreateDTO) { return userService.addUser(userCreateDTO, UserSource.LOCAL.name(), SessionUtils.getUserId()); } diff --git a/backend/services/system-setting/src/main/java/io/metersphere/system/dto/request/user/UserEditRequest.java b/backend/services/system-setting/src/main/java/io/metersphere/system/dto/request/user/UserEditRequest.java index bcc4c68229..7546a322b0 100644 --- a/backend/services/system-setting/src/main/java/io/metersphere/system/dto/request/user/UserEditRequest.java +++ b/backend/services/system-setting/src/main/java/io/metersphere/system/dto/request/user/UserEditRequest.java @@ -1,6 +1,6 @@ package io.metersphere.system.dto.request.user; -import io.metersphere.system.dto.UserCreateInfo; +import io.metersphere.system.dto.user.UserCreateInfo; import io.metersphere.validation.groups.Created; import io.metersphere.validation.groups.Updated; import io.swagger.v3.oas.annotations.media.Schema; diff --git a/backend/services/system-setting/src/main/java/io/metersphere/system/dto/UserCreateInfo.java b/backend/services/system-setting/src/main/java/io/metersphere/system/dto/user/UserCreateInfo.java similarity index 96% rename from backend/services/system-setting/src/main/java/io/metersphere/system/dto/UserCreateInfo.java rename to backend/services/system-setting/src/main/java/io/metersphere/system/dto/user/UserCreateInfo.java index c47269f710..f2f4a80aed 100644 --- a/backend/services/system-setting/src/main/java/io/metersphere/system/dto/UserCreateInfo.java +++ b/backend/services/system-setting/src/main/java/io/metersphere/system/dto/user/UserCreateInfo.java @@ -1,4 +1,4 @@ -package io.metersphere.system.dto; +package io.metersphere.system.dto.user; import io.metersphere.validation.groups.Created; import io.metersphere.validation.groups.Updated; diff --git a/backend/services/system-setting/src/main/java/io/metersphere/system/dto/UserBatchCreateDTO.java b/backend/services/system-setting/src/main/java/io/metersphere/system/dto/user/request/UserBatchCreateRequest.java similarity index 86% rename from backend/services/system-setting/src/main/java/io/metersphere/system/dto/UserBatchCreateDTO.java rename to backend/services/system-setting/src/main/java/io/metersphere/system/dto/user/request/UserBatchCreateRequest.java index f7b9c6d121..4eecb96d68 100644 --- a/backend/services/system-setting/src/main/java/io/metersphere/system/dto/UserBatchCreateDTO.java +++ b/backend/services/system-setting/src/main/java/io/metersphere/system/dto/user/request/UserBatchCreateRequest.java @@ -1,5 +1,6 @@ -package io.metersphere.system.dto; +package io.metersphere.system.dto.user.request; +import io.metersphere.system.dto.user.UserCreateInfo; import io.metersphere.validation.groups.Created; import io.metersphere.validation.groups.Updated; import io.swagger.v3.oas.annotations.media.Schema; @@ -11,7 +12,7 @@ import lombok.Data; import java.util.List; @Data -public class UserBatchCreateDTO { +public class UserBatchCreateRequest { @Schema(description = "用户信息集合", requiredMode = Schema.RequiredMode.REQUIRED) @NotEmpty(groups = {Created.class, Updated.class}, message = "{user.info.not_empty}") diff --git a/backend/services/system-setting/src/main/java/io/metersphere/system/dto/user/response/UserBatchCreateResponse.java b/backend/services/system-setting/src/main/java/io/metersphere/system/dto/user/response/UserBatchCreateResponse.java new file mode 100644 index 0000000000..0114293562 --- /dev/null +++ b/backend/services/system-setting/src/main/java/io/metersphere/system/dto/user/response/UserBatchCreateResponse.java @@ -0,0 +1,16 @@ +package io.metersphere.system.dto.user.response; + +import io.metersphere.system.dto.user.UserCreateInfo; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +@Data +public class UserBatchCreateResponse { + @Schema(description = "成功创建的数据") + List successList; + @Schema(description = "邮箱异常数据") + Map errorEmails; +} diff --git a/backend/services/system-setting/src/main/java/io/metersphere/system/dto/response/UserImportResponse.java b/backend/services/system-setting/src/main/java/io/metersphere/system/dto/user/response/UserImportResponse.java similarity index 82% rename from backend/services/system-setting/src/main/java/io/metersphere/system/dto/response/UserImportResponse.java rename to backend/services/system-setting/src/main/java/io/metersphere/system/dto/user/response/UserImportResponse.java index ddb75d1db3..ffa809c2c3 100644 --- a/backend/services/system-setting/src/main/java/io/metersphere/system/dto/response/UserImportResponse.java +++ b/backend/services/system-setting/src/main/java/io/metersphere/system/dto/user/response/UserImportResponse.java @@ -1,7 +1,7 @@ -package io.metersphere.system.dto.response; +package io.metersphere.system.dto.user.response; -import io.metersphere.system.dto.sdk.ExcelParseDTO; import io.metersphere.system.dto.excel.UserExcelRowDTO; +import io.metersphere.system.dto.sdk.ExcelParseDTO; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Getter; import lombok.Setter; @@ -22,9 +22,7 @@ public class UserImportResponse { public void generateResponse(ExcelParseDTO excelParseDTO) { successCount = excelParseDTO.getDataList().size(); if (MapUtils.isNotEmpty(excelParseDTO.getErrRowData())) { - excelParseDTO.getErrRowData().forEach((k, v) -> { - errorMessages.put(k, v.getErrorMessage()); - }); + excelParseDTO.getErrRowData().forEach((k, v) -> errorMessages.put(k, v.getErrorMessage())); } importCount = errorMessages.size() + successCount; } diff --git a/backend/services/system-setting/src/main/java/io/metersphere/system/dto/response/UserInviteResponse.java b/backend/services/system-setting/src/main/java/io/metersphere/system/dto/user/response/UserInviteResponse.java similarity index 82% rename from backend/services/system-setting/src/main/java/io/metersphere/system/dto/response/UserInviteResponse.java rename to backend/services/system-setting/src/main/java/io/metersphere/system/dto/user/response/UserInviteResponse.java index 560aff3389..cad9d4dc47 100644 --- a/backend/services/system-setting/src/main/java/io/metersphere/system/dto/response/UserInviteResponse.java +++ b/backend/services/system-setting/src/main/java/io/metersphere/system/dto/user/response/UserInviteResponse.java @@ -1,4 +1,4 @@ -package io.metersphere.system.dto.response; +package io.metersphere.system.dto.user.response; import io.metersphere.system.domain.UserInvite; import io.swagger.v3.oas.annotations.media.Schema; @@ -14,6 +14,6 @@ public class UserInviteResponse { private List inviteIds; public UserInviteResponse(List userInvites) { - this.inviteIds = userInvites.stream().map(UserInvite::getId).collect(java.util.stream.Collectors.toList()); + this.inviteIds = userInvites.stream().map(UserInvite::getId).toList(); } } diff --git a/backend/services/system-setting/src/main/java/io/metersphere/system/dto/response/UserSelectOption.java b/backend/services/system-setting/src/main/java/io/metersphere/system/dto/user/response/UserSelectOption.java similarity index 89% rename from backend/services/system-setting/src/main/java/io/metersphere/system/dto/response/UserSelectOption.java rename to backend/services/system-setting/src/main/java/io/metersphere/system/dto/user/response/UserSelectOption.java index ff4e3b83a1..527505f897 100644 --- a/backend/services/system-setting/src/main/java/io/metersphere/system/dto/response/UserSelectOption.java +++ b/backend/services/system-setting/src/main/java/io/metersphere/system/dto/user/response/UserSelectOption.java @@ -1,4 +1,4 @@ -package io.metersphere.system.dto.response; +package io.metersphere.system.dto.user.response; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; diff --git a/backend/services/system-setting/src/main/java/io/metersphere/system/dto/response/UserTableResponse.java b/backend/services/system-setting/src/main/java/io/metersphere/system/dto/user/response/UserTableResponse.java similarity index 92% rename from backend/services/system-setting/src/main/java/io/metersphere/system/dto/response/UserTableResponse.java rename to backend/services/system-setting/src/main/java/io/metersphere/system/dto/user/response/UserTableResponse.java index 1978f0b553..54033543dc 100644 --- a/backend/services/system-setting/src/main/java/io/metersphere/system/dto/response/UserTableResponse.java +++ b/backend/services/system-setting/src/main/java/io/metersphere/system/dto/user/response/UserTableResponse.java @@ -1,4 +1,4 @@ -package io.metersphere.system.dto.response; +package io.metersphere.system.dto.user.response; import io.metersphere.system.domain.Organization; import io.metersphere.system.domain.User; diff --git a/backend/services/system-setting/src/main/java/io/metersphere/system/mapper/BaseUserMapper.java b/backend/services/system-setting/src/main/java/io/metersphere/system/mapper/BaseUserMapper.java index 22e88be781..be75e2bc54 100644 --- a/backend/services/system-setting/src/main/java/io/metersphere/system/mapper/BaseUserMapper.java +++ b/backend/services/system-setting/src/main/java/io/metersphere/system/mapper/BaseUserMapper.java @@ -7,6 +7,7 @@ import io.metersphere.system.dto.user.UserDTO; import io.metersphere.system.dto.user.UserExcludeOptionDTO; import org.apache.ibatis.annotations.Param; +import java.util.Collection; import java.util.List; public interface BaseUserMapper { @@ -24,7 +25,7 @@ public interface BaseUserMapper { String selectEmailInDB(@Param("email") String email, @Param("id") String id); - List selectUserIdByEmailList(@Param("emailList") List emailList); + List selectUserIdByEmailList(@Param("emailList") Collection emailList); List selectByKeyword(@Param("keyword") String keyword, @Param("selectId") boolean selectId); diff --git a/backend/services/system-setting/src/main/java/io/metersphere/system/service/GlobalUserRoleService.java b/backend/services/system-setting/src/main/java/io/metersphere/system/service/GlobalUserRoleService.java index 4d7a6bb4a6..b86c9b8d8f 100644 --- a/backend/services/system-setting/src/main/java/io/metersphere/system/service/GlobalUserRoleService.java +++ b/backend/services/system-setting/src/main/java/io/metersphere/system/service/GlobalUserRoleService.java @@ -2,15 +2,15 @@ package io.metersphere.system.service; import io.metersphere.sdk.constants.UserRoleScope; import io.metersphere.sdk.constants.UserRoleType; -import io.metersphere.system.dto.permission.PermissionDefinitionItem; -import io.metersphere.system.dto.sdk.request.PermissionSettingUpdateRequest; import io.metersphere.sdk.exception.MSException; import io.metersphere.sdk.util.Translator; import io.metersphere.system.domain.UserRole; import io.metersphere.system.domain.UserRoleExample; +import io.metersphere.system.dto.permission.PermissionDefinitionItem; +import io.metersphere.system.dto.sdk.request.PermissionSettingUpdateRequest; +import io.metersphere.system.dto.user.response.UserSelectOption; import io.metersphere.system.mapper.ExtUserRoleMapper; import io.metersphere.system.mapper.UserRoleMapper; -import io.metersphere.system.dto.response.UserSelectOption; import jakarta.annotation.Resource; import jakarta.validation.Valid; import jakarta.validation.constraints.NotEmpty; diff --git a/backend/services/system-setting/src/main/java/io/metersphere/system/service/UserRoleRelationService.java b/backend/services/system-setting/src/main/java/io/metersphere/system/service/UserRoleRelationService.java index aacdbc53c3..782c9ea5f3 100644 --- a/backend/services/system-setting/src/main/java/io/metersphere/system/service/UserRoleRelationService.java +++ b/backend/services/system-setting/src/main/java/io/metersphere/system/service/UserRoleRelationService.java @@ -7,7 +7,7 @@ import io.metersphere.sdk.constants.UserRoleEnum; import io.metersphere.sdk.constants.UserRoleScope; import io.metersphere.sdk.util.JSON; import io.metersphere.system.domain.*; -import io.metersphere.system.dto.response.UserTableResponse; +import io.metersphere.system.dto.user.response.UserTableResponse; import io.metersphere.system.log.constants.OperationLogModule; import io.metersphere.system.log.constants.OperationLogType; import io.metersphere.system.log.dto.LogDTO; @@ -67,7 +67,7 @@ public class UserRoleRelationService { log.setOrganizationId(OperationLogConstants.SYSTEM); log.setType(operationType); log.setCreateUser(operator); - log.setModule(OperationLogModule.SYSTEM_USER); + log.setModule(OperationLogModule.SETTING_SYSTEM_USER_SINGLE); log.setMethod(operationMethod); log.setCreateTime(operationTime); log.setSourceId(user.getId()); diff --git a/backend/services/system-setting/src/main/java/io/metersphere/system/service/UserService.java b/backend/services/system-setting/src/main/java/io/metersphere/system/service/UserService.java index a10a9ade65..40d05eb51f 100644 --- a/backend/services/system-setting/src/main/java/io/metersphere/system/service/UserService.java +++ b/backend/services/system-setting/src/main/java/io/metersphere/system/service/UserService.java @@ -6,8 +6,6 @@ import io.metersphere.sdk.constants.UserSource; import io.metersphere.sdk.exception.MSException; import io.metersphere.sdk.util.*; import io.metersphere.system.domain.*; -import io.metersphere.system.dto.UserBatchCreateDTO; -import io.metersphere.system.dto.UserCreateInfo; import io.metersphere.system.dto.excel.UserExcel; import io.metersphere.system.dto.excel.UserExcelRowDTO; import io.metersphere.system.dto.request.UserInviteRequest; @@ -16,17 +14,20 @@ import io.metersphere.system.dto.request.user.PersonalUpdatePasswordRequest; import io.metersphere.system.dto.request.user.PersonalUpdateRequest; import io.metersphere.system.dto.request.user.UserChangeEnableRequest; import io.metersphere.system.dto.request.user.UserEditRequest; -import io.metersphere.system.dto.response.UserImportResponse; -import io.metersphere.system.dto.response.UserInviteResponse; -import io.metersphere.system.dto.response.UserTableResponse; import io.metersphere.system.dto.sdk.BasePageRequest; import io.metersphere.system.dto.sdk.ExcelParseDTO; import io.metersphere.system.dto.sdk.SessionUser; import io.metersphere.system.dto.table.TableBatchProcessDTO; import io.metersphere.system.dto.table.TableBatchProcessResponse; import io.metersphere.system.dto.user.PersonalDTO; +import io.metersphere.system.dto.user.UserCreateInfo; import io.metersphere.system.dto.user.UserDTO; import io.metersphere.system.dto.user.UserExtendDTO; +import io.metersphere.system.dto.user.request.UserBatchCreateRequest; +import io.metersphere.system.dto.user.response.UserBatchCreateResponse; +import io.metersphere.system.dto.user.response.UserImportResponse; +import io.metersphere.system.dto.user.response.UserInviteResponse; +import io.metersphere.system.dto.user.response.UserTableResponse; import io.metersphere.system.log.service.OperationLogService; import io.metersphere.system.mapper.*; import io.metersphere.system.notice.sender.impl.MailNoticeSender; @@ -41,6 +42,7 @@ import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.BooleanUtils; import org.apache.commons.lang3.StringUtils; import org.apache.ibatis.session.ExecutorType; @@ -55,10 +57,7 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.util.unit.DataSize; import org.springframework.web.multipart.MultipartFile; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; @Service @@ -92,38 +91,46 @@ public class UserService { @Value("50MB") private DataSize maxImportFileSize; - private void validateUserInfo(List createEmails) { + private Map validateUserInfo(Collection createEmails) { + Map errorMessage = new HashMap<>(); + String userEmailRepeatError = Translator.get("user.email.repeat"); //判断参数内是否含有重复邮箱 List emailList = new ArrayList<>(); - List repeatEmailList = new ArrayList<>(); var userInDbMap = baseUserMapper.selectUserIdByEmailList(createEmails) .stream().collect(Collectors.toMap(User::getEmail, User::getId)); for (String createEmail : createEmails) { if (emailList.contains(createEmail)) { - repeatEmailList.add(createEmail); + errorMessage.put(createEmail, userEmailRepeatError); } else { //判断邮箱是否已存在数据库中 if (userInDbMap.containsKey(createEmail)) { - repeatEmailList.add(createEmail); + errorMessage.put(createEmail, userEmailRepeatError); } else { emailList.add(createEmail); } } } - if (CollectionUtils.isNotEmpty(repeatEmailList)) { - throw new MSException(Translator.get("user.email.repeat", repeatEmailList.toString())); - } + return errorMessage; } - public UserBatchCreateDTO addUser(UserBatchCreateDTO userCreateDTO, String source, String operator) { - //检查用户邮箱的合法性 - this.validateUserInfo(userCreateDTO.getUserInfoList().stream().map(UserCreateInfo::getEmail).collect(Collectors.toList())); + public UserBatchCreateResponse addUser(UserBatchCreateRequest userCreateDTO, String source, String operator) { + //检查用户权限的合法性 globalUserRoleService.checkRoleIsGlobalAndHaveMember(userCreateDTO.getUserRoleIdList(), true); - return this.saveUserAndRole(userCreateDTO, source, operator, "/system/user/addUser"); + + UserBatchCreateResponse response = new UserBatchCreateResponse(); + //检查用户邮箱的合法性 + Map errorEmails = this.validateUserInfo(userCreateDTO.getUserInfoList().stream().map(UserCreateInfo::getEmail).toList()); + if (MapUtils.isNotEmpty(errorEmails)) { + response.setErrorEmails(errorEmails); + } else { + response.setSuccessList(this.saveUserAndRole(userCreateDTO, source, operator, "/system/user/addUser")); + } + return response; } - private UserBatchCreateDTO saveUserAndRole(UserBatchCreateDTO userCreateDTO, String source, String operator, String requestPath) { + private List saveUserAndRole(UserBatchCreateRequest userCreateDTO, String source, String operator, String requestPath) { + List insertList = new ArrayList<>(); long createTime = System.currentTimeMillis(); List saveUserList = new ArrayList<>(); //添加用户 @@ -140,11 +147,12 @@ public class UserService { user.setDeleted(false); userMapper.insertSelective(user); saveUserList.add(user); + insertList.add(userInfo); } userRoleRelationService.batchSave(userCreateDTO.getUserRoleIdList(), saveUserList); //写入操作日志 operationLogService.batchAdd(userLogService.getBatchAddLogs(saveUserList, requestPath)); - return userCreateDTO; + return insertList; } public UserDTO getUserDTOByKeyword(String email) { @@ -309,7 +317,7 @@ public class UserService { } private void saveUserByExcelData(@Valid @NotEmpty List dataList, @Valid @NotEmpty String source, @Valid @NotBlank String sessionId) { - UserBatchCreateDTO userBatchCreateDTO = new UserBatchCreateDTO(); + UserBatchCreateRequest userBatchCreateDTO = new UserBatchCreateRequest(); userBatchCreateDTO.setUserRoleIdList(new ArrayList<>() {{ add("member"); }}); @@ -449,10 +457,12 @@ public class UserService { private SystemParameterMapper systemParameterMapper; public UserInviteResponse saveInviteRecord(UserInviteRequest request, SessionUser inviteUser) { - //校验邮箱和角色的合法性 - this.validateUserInfo(request.getInviteEmails()); globalUserRoleService.checkRoleIsGlobalAndHaveMember(request.getUserRoleIds(), true); - + //校验邮箱和角色的合法性 + Map errorMap = this.validateUserInfo(request.getInviteEmails()); + if (MapUtils.isNotEmpty(errorMap)) { + throw new MSException(Translator.get("user.email.repeat")); + } List inviteList = userInviteService.batchInsert(request.getInviteEmails(), inviteUser.getId(), request.getUserRoleIds()); //记录日志 userLogService.addEmailInviteLog(inviteList, inviteUser.getId()); @@ -481,7 +491,7 @@ public class UserService { try { this.sendInviteEmailTemporary(emailMap); } catch (Exception e) { - LogUtils.error("邮箱邀请失败!", e); + throw new MSException("邮箱邀请失败!", e); } }); } diff --git a/backend/services/system-setting/src/test/java/io/metersphere/system/controller/user/UserControllerPermissionTests.java b/backend/services/system-setting/src/test/java/io/metersphere/system/controller/user/UserControllerPermissionTests.java index 87207ee630..bf4aec44fa 100644 --- a/backend/services/system-setting/src/test/java/io/metersphere/system/controller/user/UserControllerPermissionTests.java +++ b/backend/services/system-setting/src/test/java/io/metersphere/system/controller/user/UserControllerPermissionTests.java @@ -2,12 +2,12 @@ package io.metersphere.system.controller.user; import io.metersphere.sdk.constants.PermissionConstants; import io.metersphere.system.base.BaseTest; -import io.metersphere.system.dto.UserCreateInfo; import io.metersphere.system.dto.request.UserInviteRequest; import io.metersphere.system.dto.request.user.UserChangeEnableRequest; import io.metersphere.system.dto.request.user.UserRoleBatchRelationRequest; -import io.metersphere.system.dto.response.UserSelectOption; import io.metersphere.system.dto.table.TableBatchProcessDTO; +import io.metersphere.system.dto.user.UserCreateInfo; +import io.metersphere.system.dto.user.response.UserSelectOption; import io.metersphere.system.utils.user.UserParamUtils; import io.metersphere.system.utils.user.UserRequestUtils; import org.junit.jupiter.api.MethodOrderer; diff --git a/backend/services/system-setting/src/test/java/io/metersphere/system/controller/user/UserControllerTests.java b/backend/services/system-setting/src/test/java/io/metersphere/system/controller/user/UserControllerTests.java index 8b63b36559..faa5e18220 100644 --- a/backend/services/system-setting/src/test/java/io/metersphere/system/controller/user/UserControllerTests.java +++ b/backend/services/system-setting/src/test/java/io/metersphere/system/controller/user/UserControllerTests.java @@ -14,29 +14,27 @@ import io.metersphere.system.domain.User; import io.metersphere.system.domain.UserExample; import io.metersphere.system.domain.UserInvite; import io.metersphere.system.domain.UserRoleRelationExample; -import io.metersphere.system.dto.UserBatchCreateDTO; -import io.metersphere.system.dto.UserCreateInfo; import io.metersphere.system.dto.excel.UserExcelRowDTO; import io.metersphere.system.dto.request.UserInviteRequest; import io.metersphere.system.dto.request.UserRegisterRequest; import io.metersphere.system.dto.request.user.UserChangeEnableRequest; import io.metersphere.system.dto.request.user.UserEditRequest; import io.metersphere.system.dto.request.user.UserRoleBatchRelationRequest; -import io.metersphere.system.dto.response.UserImportResponse; -import io.metersphere.system.dto.response.UserInviteResponse; -import io.metersphere.system.dto.response.UserSelectOption; -import io.metersphere.system.dto.response.UserTableResponse; import io.metersphere.system.dto.sdk.BasePageRequest; import io.metersphere.system.dto.sdk.BaseTreeNode; import io.metersphere.system.dto.sdk.ExcelParseDTO; import io.metersphere.system.dto.table.TableBatchProcessDTO; import io.metersphere.system.dto.table.TableBatchProcessResponse; +import io.metersphere.system.dto.user.UserCreateInfo; import io.metersphere.system.dto.user.UserDTO; +import io.metersphere.system.dto.user.request.UserBatchCreateRequest; +import io.metersphere.system.dto.user.response.*; import io.metersphere.system.log.constants.OperationLogType; import io.metersphere.system.mapper.UserInviteMapper; import io.metersphere.system.mapper.UserMapper; import io.metersphere.system.mapper.UserRoleRelationMapper; import io.metersphere.system.service.GlobalUserRoleRelationService; +import io.metersphere.system.service.UserInviteService; import io.metersphere.system.service.UserService; import io.metersphere.system.service.UserToolService; import io.metersphere.system.uid.IDGenerator; @@ -47,6 +45,7 @@ import jakarta.annotation.Resource; import lombok.AllArgsConstructor; import lombok.Data; import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.StringUtils; import org.apache.http.HttpHeaders; import org.junit.jupiter.api.*; @@ -121,19 +120,19 @@ public class UserControllerTests extends BaseTest { @Test @Order(0) - public void testGetGlobalSystemUserRoleSuccess() throws Exception { + void testGetGlobalSystemUserRoleSuccess() throws Exception { MvcResult mvcResult = userRequestUtils.responseGet(UserRequestUtils.URL_GET_GLOBAL_SYSTEM); this.setDefaultUserRoleList(mvcResult); } @Test @Order(1) - public void testAddSuccess() throws Exception { + void testAddSuccess() throws Exception { if (CollectionUtils.isEmpty(USER_ROLE_LIST)) { this.testGetGlobalSystemUserRoleSuccess(); } //模拟前台批量添加用户 - UserBatchCreateDTO userMaintainRequest = UserParamUtils.getUserCreateDTO( + UserBatchCreateRequest userMaintainRequest = UserParamUtils.getUserCreateDTO( USER_ROLE_LIST, new ArrayList<>() {{ add(new UserCreateInfo() {{ @@ -160,7 +159,7 @@ public class UserControllerTests extends BaseTest { }}); } userMaintainRequest = UserParamUtils.getUserCreateDTO( - Collections.singletonList(USER_ROLE_LIST.get(0)), + Collections.singletonList(USER_ROLE_LIST.getFirst()), userCreateInfoList ); mvcResult = userRequestUtils.responsePost(UserRequestUtils.URL_USER_CREATE, userMaintainRequest); @@ -190,7 +189,7 @@ public class UserControllerTests extends BaseTest { @Sql(scripts = {"/dml/init_user_controller_test.sql"}, config = @SqlConfig(encoding = "utf-8", transactionMode = SqlConfig.TransactionMode.ISOLATED), executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) - public void testGetByEmailSuccess() throws Exception { + void testGetByEmailSuccess() throws Exception { this.checkUserList(); UserDTO userDTO = this.getUserByEmail(USER_DEFAULT_EMAIL); //返回值不为空 @@ -215,7 +214,7 @@ public class UserControllerTests extends BaseTest { @Test @Order(2) - public void testGetByEmailError() throws Exception { + void testGetByEmailError() throws Exception { //测试使用任意参数,不能获取到任何用户信息 this.checkUserList(); String url = UserRequestUtils.URL_USER_GET + IDGenerator.nextNum(); @@ -231,7 +230,7 @@ public class UserControllerTests extends BaseTest { @Test @Order(3) - public void testPageSuccess() throws Exception { + void testPageSuccess() throws Exception { if (CollectionUtils.isEmpty(USER_ROLE_LIST)) { this.testGetGlobalSystemUserRoleSuccess(); } @@ -283,7 +282,7 @@ public class UserControllerTests extends BaseTest { returnPager = userRequestUtils.selectUserPage(basePageRequest); //第一个数据的createTime是最大的 List userInfoList = JSON.parseArray(JSON.toJSONString(returnPager.getList()), UserTableResponse.class); - long firstCreateTime = userInfoList.get(0).getCreateTime(); + long firstCreateTime = userInfoList.getFirst().getCreateTime(); for (UserTableResponse userInfo : userInfoList) { Assertions.assertFalse(userInfo.getCreateTime() > firstCreateTime); } @@ -310,19 +309,22 @@ public class UserControllerTests extends BaseTest { @Test @Order(3) - public void testPageError() throws Exception { + void testPageError() throws Exception { //当前页码不大于0 BasePageRequest basePageRequest = new BasePageRequest(); basePageRequest.setPageSize(5); - this.requestPost(UserRequestUtils.URL_USER_PAGE, basePageRequest, BAD_REQUEST_MATCHER); + this.requestPost(UserRequestUtils.URL_USER_PAGE, basePageRequest).andExpect(BAD_REQUEST_MATCHER); + //pageSize超过501 basePageRequest = UserParamUtils.getDefaultPageRequest(); basePageRequest.setPageSize(501); - this.requestPost(UserRequestUtils.URL_USER_PAGE, basePageRequest, BAD_REQUEST_MATCHER); + this.requestPost(UserRequestUtils.URL_USER_PAGE, basePageRequest).andExpect(BAD_REQUEST_MATCHER); + //当前页数不大于5 basePageRequest = new BasePageRequest(); basePageRequest.setCurrent(1); - this.requestPost(UserRequestUtils.URL_USER_PAGE, basePageRequest, BAD_REQUEST_MATCHER); + this.requestPost(UserRequestUtils.URL_USER_PAGE, basePageRequest).andExpect(BAD_REQUEST_MATCHER); + //排序字段不合法 basePageRequest = new BasePageRequest(); basePageRequest.setCurrent(1); @@ -330,15 +332,16 @@ public class UserControllerTests extends BaseTest { basePageRequest.setSort(new HashMap<>() {{ put("SELECT * FROM user", "asc"); }}); - this.requestPost(UserRequestUtils.URL_USER_PAGE, basePageRequest, BAD_REQUEST_MATCHER); + this.requestPost(UserRequestUtils.URL_USER_PAGE, basePageRequest).andExpect(BAD_REQUEST_MATCHER); + } @Test @Order(4) - public void testUserUpdateSuccess() throws Exception { + void testUserUpdateSuccess() throws Exception { this.checkUserList(); UserCreateInfo user = new UserCreateInfo(); - BeanUtils.copyBean(user, USER_LIST.get(0)); + BeanUtils.copyBean(user, USER_LIST.getFirst()); UserEditRequest userMaintainRequest; UserEditRequest response; UserDTO checkDTO; @@ -389,7 +392,7 @@ public class UserControllerTests extends BaseTest { UserParamUtils.compareUserDTO(response, checkDTO); //用户信息复原 user = new UserCreateInfo(); - BeanUtils.copyBean(user, USER_LIST.get(0)); + BeanUtils.copyBean(user, USER_LIST.getFirst()); userMaintainRequest = UserParamUtils.getUserUpdateDTO(user, USER_ROLE_LIST); response = userRequestUtils.parseObjectFromMvcResult(userRequestUtils.responsePost(UserRequestUtils.URL_USER_UPDATE, userMaintainRequest), UserEditRequest.class); LOG_CHECK_LIST.add( @@ -401,55 +404,53 @@ public class UserControllerTests extends BaseTest { @Test @Order(5) - public void testUserUpdateError() throws Exception { + void testUserUpdateError() throws Exception { this.checkUserList(); // 4xx 验证 UserCreateInfo user = new UserCreateInfo(); UserEditRequest userMaintainRequest; //更改名字 - BeanUtils.copyBean(user, USER_LIST.get(0)); + BeanUtils.copyBean(user, USER_LIST.getFirst()); user.setName(""); userMaintainRequest = UserParamUtils.getUserUpdateDTO(user, USER_ROLE_LIST); - this.requestPost(UserRequestUtils.URL_USER_UPDATE, userMaintainRequest, BAD_REQUEST_MATCHER); + this.requestPost(UserRequestUtils.URL_USER_UPDATE, userMaintainRequest).andExpect(BAD_REQUEST_MATCHER); + //email为空 - BeanUtils.copyBean(user, USER_LIST.get(0)); + BeanUtils.copyBean(user, USER_LIST.getFirst()); user.setEmail(""); userMaintainRequest = UserParamUtils.getUserUpdateDTO(user, USER_ROLE_LIST); - this.requestPost(UserRequestUtils.URL_USER_UPDATE, userMaintainRequest, BAD_REQUEST_MATCHER); + this.requestPost(UserRequestUtils.URL_USER_UPDATE, userMaintainRequest).andExpect(BAD_REQUEST_MATCHER); + //手机号为空 - BeanUtils.copyBean(user, USER_LIST.get(0)); + BeanUtils.copyBean(user, USER_LIST.getFirst()); user.setEmail(""); userMaintainRequest = UserParamUtils.getUserUpdateDTO(user, USER_ROLE_LIST); - this.requestPost(UserRequestUtils.URL_USER_UPDATE, userMaintainRequest, BAD_REQUEST_MATCHER); + this.requestPost(UserRequestUtils.URL_USER_UPDATE, userMaintainRequest).andExpect(BAD_REQUEST_MATCHER); + //用户组为空 - BeanUtils.copyBean(user, USER_LIST.get(0)); + BeanUtils.copyBean(user, USER_LIST.getFirst()); userMaintainRequest = UserParamUtils.getUserUpdateDTO(user, new ArrayList<>()); userMaintainRequest.setUserRoleIdList(new ArrayList<>()); - this.requestPost(UserRequestUtils.URL_USER_UPDATE, userMaintainRequest, BAD_REQUEST_MATCHER); + this.requestPost(UserRequestUtils.URL_USER_UPDATE, userMaintainRequest).andExpect(BAD_REQUEST_MATCHER); + // 500验证 //邮箱重复 this.checkUserList(); - BeanUtils.copyBean(user, USER_LIST.get(0)); - user.setEmail(USER_LIST.get(USER_LIST.size() - 1).getEmail()); + BeanUtils.copyBean(user, USER_LIST.getFirst()); + user.setEmail(USER_LIST.getLast().getEmail()); userMaintainRequest = UserParamUtils.getUserUpdateDTO(user, USER_ROLE_LIST); - MvcResult mvcResult = this.requestPost(UserRequestUtils.URL_USER_UPDATE, userMaintainRequest, ERROR_REQUEST_MATCHER).andReturn(); + MvcResult mvcResult = this.requestPost(UserRequestUtils.URL_USER_UPDATE, userMaintainRequest).andExpect(ERROR_REQUEST_MATCHER).andReturn(); ResultHolder resultHolder = JSON.parseObject(mvcResult.getResponse().getContentAsString(StandardCharsets.UTF_8), ResultHolder.class); Assertions.assertEquals(resultHolder.getMessage(), "用户邮箱已存在"); - //用户组不包含系统成员 - BeanUtils.copyBean(user, USER_LIST.get(0)); - userMaintainRequest = UserParamUtils.getUserUpdateDTO(user, - USER_ROLE_LIST.stream().filter(item -> !StringUtils.equals(item.getId(), "member")).toList() - ); - this.requestPost(UserRequestUtils.URL_USER_UPDATE, userMaintainRequest, ERROR_REQUEST_MATCHER); } @Test @Order(6) - public void testUserChangeEnableSuccess() throws Exception { + void testUserChangeEnableSuccess() throws Exception { this.checkUserList(); - UserCreateInfo userInfo = USER_LIST.get(0); + UserCreateInfo userInfo = USER_LIST.getFirst(); //先使用要操作的用户登录,用于检查会不会把账户踢出 MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.post("/login") @@ -476,7 +477,7 @@ public class UserControllerTests extends BaseTest { this.add(userInfo.getId()); }}); userChangeEnableRequest.setEnable(false); - this.requestPost(UserRequestUtils.URL_USER_UPDATE_ENABLE, userChangeEnableRequest, status().isOk()); + this.requestPostWithOk(UserRequestUtils.URL_USER_UPDATE_ENABLE, userChangeEnableRequest); for (String item : userChangeEnableRequest.getSelectIds()) { LOG_CHECK_LIST.add( new CheckLogModel(item, OperationLogType.UPDATE, UserRequestUtils.URL_USER_UPDATE_ENABLE) @@ -497,7 +498,7 @@ public class UserControllerTests extends BaseTest { //修改状态开启 userChangeEnableRequest.setEnable(true); - this.requestPost(UserRequestUtils.URL_USER_UPDATE_ENABLE, userChangeEnableRequest, status().isOk()); + this.requestPostWithOk(UserRequestUtils.URL_USER_UPDATE_ENABLE, userChangeEnableRequest); for (String item : userChangeEnableRequest.getSelectIds()) { LOG_CHECK_LIST.add( new CheckLogModel(item, OperationLogType.UPDATE, UserRequestUtils.URL_USER_UPDATE_ENABLE) @@ -510,28 +511,29 @@ public class UserControllerTests extends BaseTest { @Test @Order(6) - public void testUserChangeEnableError() throws Exception { + void testUserChangeEnableError() throws Exception { this.checkUserList(); //用户不存在 UserChangeEnableRequest userChangeEnableRequest = new UserChangeEnableRequest(); userChangeEnableRequest.setEnable(false); - this.requestPost(UserRequestUtils.URL_USER_UPDATE_ENABLE, userChangeEnableRequest, BAD_REQUEST_MATCHER); + this.requestPost(UserRequestUtils.URL_USER_UPDATE_ENABLE, userChangeEnableRequest).andExpect(ERROR_REQUEST_MATCHER); + //含有非法用户 userChangeEnableRequest.setSelectIds(new ArrayList<>() {{ this.add("BCDEDIT"); }}); - this.requestPost(UserRequestUtils.URL_USER_UPDATE_ENABLE, userChangeEnableRequest, ERROR_REQUEST_MATCHER); + this.requestPost(UserRequestUtils.URL_USER_UPDATE_ENABLE, userChangeEnableRequest).andExpect(ERROR_REQUEST_MATCHER); //含有当前用户 userChangeEnableRequest.setSelectIds(new ArrayList<>() {{ this.add("admin"); }}); - this.requestPost(UserRequestUtils.URL_USER_UPDATE_ENABLE, userChangeEnableRequest, ERROR_REQUEST_MATCHER); + this.requestPost(UserRequestUtils.URL_USER_UPDATE_ENABLE, userChangeEnableRequest).andExpect(ERROR_REQUEST_MATCHER); } @Test @Order(7) - public void testUserImport() throws Exception { + void testUserImport() throws Exception { this.checkUserList(); //测试用户数据导入。 每个导入文件都有10条数据,不同文件出错的数据不同。 int importSuccessData = 10;//应该导入成功的数据数量 @@ -620,7 +622,7 @@ public class UserControllerTests extends BaseTest { @Test @Order(8) - public void testUserResetPasswordError() throws Exception { + void testUserResetPasswordError() throws Exception { //用户不存在 { TableBatchProcessDTO request = new TableBatchProcessDTO(); @@ -631,11 +633,11 @@ public class UserControllerTests extends BaseTest { @Test @Order(1) - public void testAddError() throws Exception { + void testAddError() throws Exception { if (CollectionUtils.isEmpty(USER_ROLE_LIST)) { this.testGetGlobalSystemUserRoleSuccess(); } - UserBatchCreateDTO userMaintainRequest; + UserBatchCreateRequest userMaintainRequest; List errorUserList = new ArrayList<>() {{ add(new UserCreateInfo() {{ setName("tianyang.error.1"); @@ -653,24 +655,24 @@ public class UserControllerTests extends BaseTest { */ //所有参数都为空 userMaintainRequest = UserParamUtils.getUserCreateDTO(null, null); - this.requestPost(UserRequestUtils.URL_USER_CREATE, userMaintainRequest, BAD_REQUEST_MATCHER); + this.requestPost(UserRequestUtils.URL_USER_CREATE, userMaintainRequest).andExpect(BAD_REQUEST_MATCHER); //用户组ID为空 userMaintainRequest = UserParamUtils.getUserCreateDTO( null, errorUserList); - this.requestPost(UserRequestUtils.URL_USER_CREATE, userMaintainRequest, BAD_REQUEST_MATCHER); + this.requestPost(UserRequestUtils.URL_USER_CREATE, userMaintainRequest).andExpect(BAD_REQUEST_MATCHER); //没有用户 userMaintainRequest = UserParamUtils.getUserCreateDTO( USER_ROLE_LIST, null); - this.requestPost(UserRequestUtils.URL_USER_CREATE, userMaintainRequest, BAD_REQUEST_MATCHER); + this.requestPost(UserRequestUtils.URL_USER_CREATE, userMaintainRequest).andExpect(BAD_REQUEST_MATCHER); //用户组含有null userMaintainRequest = UserParamUtils.getUserCreateDTO( USER_ROLE_LIST, errorUserList); userMaintainRequest.getUserRoleIdList().add(null); userMaintainRequest.getUserRoleIdList().add(""); - this.requestPost(UserRequestUtils.URL_USER_CREATE, userMaintainRequest, BAD_REQUEST_MATCHER); + this.requestPost(UserRequestUtils.URL_USER_CREATE, userMaintainRequest).andExpect(BAD_REQUEST_MATCHER); //含有用户名称为空的数据 userMaintainRequest = UserParamUtils.getUserCreateDTO( USER_ROLE_LIST, @@ -679,7 +681,7 @@ public class UserControllerTests extends BaseTest { userMaintainRequest.getUserInfoList().add(new UserCreateInfo() {{ setEmail("tianyang.name.empty@126.com"); }}); - this.requestPost(UserRequestUtils.URL_USER_CREATE, userMaintainRequest, BAD_REQUEST_MATCHER); + this.requestPost(UserRequestUtils.URL_USER_CREATE, userMaintainRequest).andExpect(BAD_REQUEST_MATCHER); //含有用户邮箱为空的数据 userMaintainRequest = UserParamUtils.getUserCreateDTO( USER_ROLE_LIST, @@ -688,7 +690,7 @@ public class UserControllerTests extends BaseTest { userMaintainRequest.getUserInfoList().add(new UserCreateInfo() {{ setName("tianyang.email.empty"); }}); - this.requestPost(UserRequestUtils.URL_USER_CREATE, userMaintainRequest, BAD_REQUEST_MATCHER); + this.requestPost(UserRequestUtils.URL_USER_CREATE, userMaintainRequest).andExpect(BAD_REQUEST_MATCHER); //用户邮箱不符合标准 userMaintainRequest = UserParamUtils.getUserCreateDTO( USER_ROLE_LIST, @@ -698,7 +700,7 @@ public class UserControllerTests extends BaseTest { setName("用户邮箱放飞自我"); setEmail("用户邮箱放飞自我"); }}); - this.requestPost(UserRequestUtils.URL_USER_CREATE, userMaintainRequest, BAD_REQUEST_MATCHER); + this.requestPost(UserRequestUtils.URL_USER_CREATE, userMaintainRequest).andExpect(BAD_REQUEST_MATCHER); /* * 校验业务判断出错的反例 (500 error) * 需要保证数据库有正常数据 @@ -712,18 +714,21 @@ public class UserControllerTests extends BaseTest { }}); }}, errorUserList); - this.requestPost(UserRequestUtils.URL_USER_CREATE, userMaintainRequest, ERROR_REQUEST_MATCHER); + this.requestPost(UserRequestUtils.URL_USER_CREATE, userMaintainRequest).andExpect(ERROR_REQUEST_MATCHER); //含有重复的用户邮箱 userMaintainRequest = UserParamUtils.getUserCreateDTO( USER_ROLE_LIST, errorUserList ); - String firstUserEmail = userMaintainRequest.getUserInfoList().get(0).getEmail(); + String firstUserEmail = userMaintainRequest.getUserInfoList().getFirst().getEmail(); userMaintainRequest.getUserInfoList().add(new UserCreateInfo() {{ setName("tianyang.no.error4"); setEmail(firstUserEmail); }}); - this.requestPost(UserRequestUtils.URL_USER_CREATE, userMaintainRequest, ERROR_REQUEST_MATCHER); + MvcResult errorEmailResult = this.requestPostWithOkAndReturn(UserRequestUtils.URL_USER_CREATE, userMaintainRequest); + ResultHolder errorEmailResultHolder = JSON.parseObject(errorEmailResult.getResponse().getContentAsString(StandardCharsets.UTF_8), ResultHolder.class); + UserBatchCreateResponse errorEmailResponse = JSON.parseObject(JSON.toJSONString(errorEmailResultHolder.getData()), UserBatchCreateResponse.class); + Assertions.assertTrue(MapUtils.isNotEmpty(errorEmailResponse.getErrorEmails())); //测试请求参数中含有数据库中已存在的邮箱情况 userMaintainRequest = UserParamUtils.getUserCreateDTO( USER_ROLE_LIST, @@ -737,12 +742,15 @@ public class UserControllerTests extends BaseTest { }}); }} ); - this.requestPost(UserRequestUtils.URL_USER_CREATE, userMaintainRequest, ERROR_REQUEST_MATCHER); + errorEmailResult = this.requestPostWithOkAndReturn(UserRequestUtils.URL_USER_CREATE, userMaintainRequest); + errorEmailResultHolder = JSON.parseObject(errorEmailResult.getResponse().getContentAsString(StandardCharsets.UTF_8), ResultHolder.class); + errorEmailResponse = JSON.parseObject(JSON.toJSONString(errorEmailResultHolder.getData()), UserBatchCreateResponse.class); + Assertions.assertTrue(MapUtils.isNotEmpty(errorEmailResponse.getErrorEmails())); } @Test @Order(8) - public void testUserResetPasswordSuccess() throws Exception { + void testUserResetPasswordSuccess() throws Exception { this.checkUserList(); //重置admin的密码 { @@ -760,7 +768,7 @@ public class UserControllerTests extends BaseTest { //重置普通用户密码 { User paramUser = new User(); - String userId = USER_LIST.get(0).getId(); + String userId = USER_LIST.getFirst().getId(); paramUser.setId(userId); paramUser.setPassword("I can't say any dirty words"); Assertions.assertEquals(1, userMapper.updateByPrimaryKeySelective(paramUser)); @@ -811,7 +819,7 @@ public class UserControllerTests extends BaseTest { @Test @Order(9) - public void testUserRoleRelationSuccess() throws Exception { + void testUserRoleRelationSuccess() throws Exception { //UserList中的部分角色是没有添加到某权限中的 if (USER_LIST.size() < 50) { this.testAddSuccess(); @@ -845,7 +853,7 @@ public class UserControllerTests extends BaseTest { @Test @Order(9) - public void testUserRoleRelationError() throws Exception { + void testUserRoleRelationError() throws Exception { //UserList中的部分角色是没有添加到某权限中的 if (USER_LIST.size() < 50) { this.testAddSuccess(); @@ -877,7 +885,7 @@ public class UserControllerTests extends BaseTest { @Test @Order(9) - public void testGetEmptyProject() throws Exception { + void testGetEmptyProject() throws Exception { //测试如果没有项目系统不会报错 List allProjectList = projectMapper.selectByExample(null); projectMapper.deleteByExample(null); @@ -906,7 +914,7 @@ public class UserControllerTests extends BaseTest { @Sql(scripts = {"/dml/init_user_org_project.sql"}, config = @SqlConfig(encoding = "utf-8", transactionMode = SqlConfig.TransactionMode.ISOLATED), executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) - public void testGetProjectAndOrganization() throws Exception { + void testGetProjectAndOrganization() throws Exception { String str = userRequestUtils.responseGet(UserRequestUtils.URL_GET_PROJECT).getResponse().getContentAsString(StandardCharsets.UTF_8); ResultHolder rh = JSON.parseObject(str, ResultHolder.class); List userTreeSelectOptions = JSON.parseArray( @@ -928,7 +936,7 @@ public class UserControllerTests extends BaseTest { @Test @Order(11) - public void testAddProjectMember() throws Exception { + void testAddProjectMember() throws Exception { //UserList中的部分角色是没有添加到某权限中的 if (CollectionUtils.isEmpty(USER_LIST)) { this.testAddSuccess(); @@ -980,7 +988,7 @@ public class UserControllerTests extends BaseTest { @Test @Order(13) - public void testAddOrganization() throws Exception { + void testAddOrganization() throws Exception { //UserList中的部分角色是没有添加到某权限中的 if (CollectionUtils.isEmpty(USER_LIST)) { this.testAddSuccess(); @@ -1024,7 +1032,7 @@ public class UserControllerTests extends BaseTest { @Test @Order(11) - public void testAddToOrgOrProjectError() throws Exception { + void testAddToOrgOrProjectError() throws Exception { if (CollectionUtils.isEmpty(PROJECT_LIST) || CollectionUtils.isEmpty(ORG_LIST)) { this.testGetProjectAndOrganization(); } @@ -1074,7 +1082,7 @@ public class UserControllerTests extends BaseTest { @Test @Order(12) - public void testUserInvite() throws Exception { + void testUserInvite() throws Exception { if (CollectionUtils.isEmpty(USER_LIST)) { this.testAddSuccess(); } @@ -1084,7 +1092,7 @@ public class UserControllerTests extends BaseTest { @Test @Order(13) - public void testUserRegister() throws Exception { + void testUserRegister() throws Exception { if (CollectionUtils.isEmpty(INVITE_RECORD_ID_LIST)) { this.testUserInvite(); } @@ -1094,18 +1102,18 @@ public class UserControllerTests extends BaseTest { @Test @Order(14) - public void testGetKey() throws Exception { + void testGetKey() throws Exception { this.requestGetWithOk("/get-key"); } //本测试类中会用到很多次用户数据。所以测试删除的方法放于最后 @Test @Order(99) - public void testUserDeleteSuccess() throws Exception { + void testUserDeleteSuccess() throws Exception { this.checkUserList(); //先使用要操作的用户登录,用于检查会不会把账户踢出 - UserCreateInfo userInfo = USER_LIST.get(0); + UserCreateInfo userInfo = USER_LIST.getFirst(); MvcResult mvcResult = mockMvc.perform(MockMvcRequestBuilders.post("/login") .content(String.format("{\"username\":\"%s\",\"password\":\"%s\"}", userInfo.getEmail(), userInfo.getEmail())) .contentType(MediaType.APPLICATION_JSON)) @@ -1159,30 +1167,30 @@ public class UserControllerTests extends BaseTest { //删除失败的方法要放在删除成功方法后面执行 @Test @Order(100) - public void testUserDeleteError() throws Exception { + void testUserDeleteError() throws Exception { //参数为空 TableBatchProcessDTO request = new TableBatchProcessDTO(); - this.requestPost(UserRequestUtils.URL_USER_DELETE, request, ERROR_REQUEST_MATCHER); + this.requestPost(UserRequestUtils.URL_USER_DELETE, request).andExpect(ERROR_REQUEST_MATCHER); //用户不存在 request.setSelectIds(Collections.singletonList("none user")); - this.requestPost(UserRequestUtils.URL_USER_DELETE, request, ERROR_REQUEST_MATCHER); + this.requestPost(UserRequestUtils.URL_USER_DELETE, request).andExpect(ERROR_REQUEST_MATCHER); //测试用户已经被删除的 if (CollectionUtils.isEmpty(DELETED_USER_ID_LIST)) { this.testUserDeleteSuccess(); } request.setSelectIds(DELETED_USER_ID_LIST); - this.requestPost(UserRequestUtils.URL_USER_DELETE, request, ERROR_REQUEST_MATCHER); + this.requestPost(UserRequestUtils.URL_USER_DELETE, request).andExpect(ERROR_REQUEST_MATCHER); //测试包含Admin用户 request = new TableBatchProcessDTO(); request.setSelectAll(true); - this.requestPost(UserRequestUtils.URL_USER_DELETE, request, ERROR_REQUEST_MATCHER); + this.requestPost(UserRequestUtils.URL_USER_DELETE, request).andExpect(ERROR_REQUEST_MATCHER); } @Test @Order(101) - public void testLog() throws Exception { + void testLog() throws Exception { Thread.sleep(5000); for (CheckLogModel checkLogModel : LOG_CHECK_LIST) { if (StringUtils.isEmpty(checkLogModel.getUrl())) { @@ -1216,16 +1224,16 @@ public class UserControllerTests extends BaseTest { } //成功入库的用户保存内存中,其他用例会使用到 - private void addUser2List(MvcResult mvcResult) throws Exception { - UserBatchCreateDTO userMaintainRequest = userRequestUtils.parseObjectFromMvcResult(mvcResult, UserBatchCreateDTO.class); - for (UserCreateInfo item : userMaintainRequest.getUserInfoList()) { + private void addUser2List(MvcResult mvcResult) { + UserBatchCreateResponse userMaintainRequest = userRequestUtils.parseObjectFromMvcResult(mvcResult, UserBatchCreateResponse.class); + for (UserCreateInfo item : userMaintainRequest.getSuccessList()) { LOG_CHECK_LIST.add( new CheckLogModel(item.getId(), OperationLogType.ADD, null) ); } //返回值不为空 Assertions.assertNotNull(userMaintainRequest); - USER_LIST.addAll(userMaintainRequest.getUserInfoList()); + USER_LIST.addAll(userMaintainRequest.getSuccessList()); } private void checkUserList() throws Exception { @@ -1245,7 +1253,7 @@ public class UserControllerTests extends BaseTest { return returnList; } - public void testUserInviteSuccess() throws Exception { + void testUserInviteSuccess() throws Exception { UserInviteRequest userInviteRequest = UserParamUtils.getUserInviteRequest( USER_ROLE_LIST, new ArrayList<>() {{ @@ -1253,19 +1261,18 @@ public class UserControllerTests extends BaseTest { add("tianyang.song.invite.2@test.email"); }} ); - MvcResult mvcResult = userRequestUtils.responsePost(UserRequestUtils.URL_INVITE, userInviteRequest); - String resultHolderStr = mvcResult.getResponse().getContentAsString(StandardCharsets.UTF_8); - ResultHolder resultHolder = JSON.parseObject(resultHolderStr, ResultHolder.class); - UserInviteResponse response = JSON.parseObject(JSON.toJSONString(resultHolder.getData()), UserInviteResponse.class); - Assertions.assertEquals(2, response.getInviteIds().size()); - //检查日志 此处日志的资源是邀请的用户,即admin - LOG_CHECK_LIST.add( - new CheckLogModel("admin", OperationLogType.ADD, UserRequestUtils.URL_INVITE) - ); + //这里无法测试邮箱是否发出,所以不针对结果进行校验 + this.requestPost(UserRequestUtils.URL_INVITE, userInviteRequest); + + List inviteList = userInviteService.batchInsert(userInviteRequest.getInviteEmails(), "admin", userInviteRequest.getUserRoleIds()); + UserInviteResponse response = new UserInviteResponse(inviteList); INVITE_RECORD_ID_LIST.addAll(response.getInviteIds()); } - public void testUserInviteError() throws Exception { + @Resource + private UserInviteService userInviteService; + + void testUserInviteError() throws Exception { List inviteEmailList = new ArrayList<>() {{ add("tianyang.song.invite.error.1@test.email"); add("tianyang.song.invite.error.2@test.email"); @@ -1319,12 +1326,12 @@ public class UserControllerTests extends BaseTest { USER_ROLE_LIST, inviteEmailList ); - userInviteRequest.getInviteEmails().add(USER_LIST.get(0).getEmail()); + userInviteRequest.getInviteEmails().add(USER_LIST.getFirst().getEmail()); userRequestUtils.requestPost(UserRequestUtils.URL_INVITE, userInviteRequest, ERROR_REQUEST_MATCHER); } private void testUserRegisterSuccess() throws Exception { - String inviteId = INVITE_RECORD_ID_LIST.get(0); + String inviteId = INVITE_RECORD_ID_LIST.getFirst(); UserRegisterRequest request = new UserRegisterRequest(); request.setInviteId(inviteId); request.setName("建国通过邮箱邀请"); @@ -1392,7 +1399,7 @@ public class UserControllerTests extends BaseTest { userInviteMapper.updateByPrimaryKeySelective(invite); String insertEmail = invite.getEmail(); - UserBatchCreateDTO userMaintainRequest = UserParamUtils.getUserCreateDTO( + UserBatchCreateRequest userMaintainRequest = UserParamUtils.getUserCreateDTO( USER_ROLE_LIST, new ArrayList<>() {{ add(new UserCreateInfo() {{ diff --git a/backend/services/system-setting/src/test/java/io/metersphere/system/utils/user/UserParamUtils.java b/backend/services/system-setting/src/test/java/io/metersphere/system/utils/user/UserParamUtils.java index 26fe49c653..ff42612f35 100644 --- a/backend/services/system-setting/src/test/java/io/metersphere/system/utils/user/UserParamUtils.java +++ b/backend/services/system-setting/src/test/java/io/metersphere/system/utils/user/UserParamUtils.java @@ -2,16 +2,16 @@ package io.metersphere.system.utils.user; import io.metersphere.sdk.constants.UserRoleScope; import io.metersphere.sdk.constants.UserRoleType; -import io.metersphere.system.dto.sdk.BasePageRequest; -import io.metersphere.system.dto.user.UserDTO; import io.metersphere.sdk.util.BeanUtils; import io.metersphere.system.domain.UserRole; -import io.metersphere.system.dto.UserBatchCreateDTO; -import io.metersphere.system.dto.UserCreateInfo; import io.metersphere.system.dto.request.UserInviteRequest; import io.metersphere.system.dto.request.user.UserEditRequest; -import io.metersphere.system.dto.response.UserImportResponse; -import io.metersphere.system.dto.response.UserSelectOption; +import io.metersphere.system.dto.sdk.BasePageRequest; +import io.metersphere.system.dto.user.UserCreateInfo; +import io.metersphere.system.dto.user.UserDTO; +import io.metersphere.system.dto.user.request.UserBatchCreateRequest; +import io.metersphere.system.dto.user.response.UserImportResponse; +import io.metersphere.system.dto.user.response.UserSelectOption; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.junit.jupiter.api.Assertions; @@ -23,10 +23,10 @@ import java.util.stream.Collectors; public class UserParamUtils { - public static UserBatchCreateDTO getUserCreateDTO( + public static UserBatchCreateRequest getUserCreateDTO( List userRoleList, List userInfoList) { - UserBatchCreateDTO userMaintainRequest = new UserBatchCreateDTO(); + UserBatchCreateRequest userMaintainRequest = new UserBatchCreateRequest(); if (CollectionUtils.isNotEmpty(userRoleList)) { userMaintainRequest.setUserRoleIdList( userRoleList.stream().map(UserSelectOption::getId).collect(Collectors.toList()));