feat(系统设置): 补充系统视图

--task=1016128 --user=陈建星 高级搜索-视图增删改查-后端 https://www.tapd.cn/55049933/s/1573254
This commit is contained in:
AgAngle 2024-09-04 11:25:06 +08:00 committed by Craftsman
parent 7d48b46e71
commit 141d5304bb
9 changed files with 93 additions and 12 deletions

View File

@ -556,4 +556,6 @@ test_plan=测试计划 ID
internal_user_view_permission_error=系统视图无法删除! internal_user_view_permission_error=系统视图无法删除!
user_view.all_data=全部数据 user_view.all_data=全部数据
user_view.my_follow=我关注的 user_view.my_follow=我关注的
user_view.my_create=我创建的 user_view.my_create=我创建的
user_view.my_review=我评审的
user_view_exist=视图已存在

View File

@ -594,4 +594,6 @@ test_plan=Test Plan ID
internal_user_view_permission_error=System views cannot be deleted! internal_user_view_permission_error=System views cannot be deleted!
user_view.all_data=All data user_view.all_data=All data
user_view.my_follow=I followed user_view.my_follow=I followed
user_view.my_create=I created user_view.my_create=I created
user_view.my_review=I review
user_view_exist=The view already exists

View File

@ -589,4 +589,6 @@ test_plan=测试计划 ID
internal_user_view_permission_error=系统视图无法删除! internal_user_view_permission_error=系统视图无法删除!
user_view.all_data=全部数据 user_view.all_data=全部数据
user_view.my_follow=我关注的 user_view.my_follow=我关注的
user_view.my_create=我创建的 user_view.my_create=我创建的
user_view.my_review=我评审的
user_view_exist=视图已存在

View File

@ -589,4 +589,6 @@ test_plan=測試計劃 ID
internal_user_view_permission_error=系統視圖無法刪除! internal_user_view_permission_error=系統視圖無法刪除!
user_view.all_data=全部數據 user_view.all_data=全部數據
user_view.my_follow=我關注的 user_view.my_follow=我關注的
user_view.my_create=我創建的 user_view.my_create=我創建的
user_view.my_review=我評審的
user_view_exist=視圖已存在

View File

@ -22,7 +22,7 @@ public enum InternalUserView {
CombineCondition condition = new CombineCondition(); CombineCondition condition = new CombineCondition();
condition.setName("follower"); condition.setName("follower");
condition.setValue(getCurrentUserValue()); condition.setValue(getCurrentUserValue());
condition.setOperator(CombineCondition.CombineConditionOperator.EQUALS.name()); condition.setOperator(CombineCondition.CombineConditionOperator.IN.name());
userViewDTO.setConditions(List.of(condition)); userViewDTO.setConditions(List.of(condition));
return userViewDTO; return userViewDTO;
}), }),
@ -31,7 +31,16 @@ public enum InternalUserView {
CombineCondition condition = new CombineCondition(); CombineCondition condition = new CombineCondition();
condition.setName("create_user"); condition.setName("create_user");
condition.setValue(getCurrentUserValue()); condition.setValue(getCurrentUserValue());
condition.setOperator(CombineCondition.CombineConditionOperator.EQUALS.name()); condition.setOperator(CombineCondition.CombineConditionOperator.IN.name());
userViewDTO.setConditions(List.of(condition));
return userViewDTO;
}),
MY_REVIEW(() -> {
UserViewDTO userViewDTO = getUserViewDTO("my_review");
CombineCondition condition = new CombineCondition();
condition.setName("review_user");
condition.setValue(getCurrentUserValue());
condition.setOperator(CombineCondition.CombineConditionOperator.IN.name());
userViewDTO.setConditions(List.of(condition)); userViewDTO.setConditions(List.of(condition));
return userViewDTO; return userViewDTO;
}); });

View File

@ -8,11 +8,19 @@ import java.util.List;
/** /**
* @Author: jianxing * @Author: jianxing
* @CreateTime: 2024-09-02 10:47 * @CreateTime: 2024-09-02 10:47
*
* 视图的类型
* 例如功能用例视图
*
*/ */
public enum UserViewType implements ValueEnum { public enum UserViewType implements ValueEnum {
FUNCTIONAL_CASE("functional-case", FUNCTIONAL_CASE("functional-case",
List.of(InternalUserView.ALL_DATA, InternalUserView.MY_FOLLOW, InternalUserView.MY_CREATE)), List.of(InternalUserView.ALL_DATA, InternalUserView.MY_FOLLOW, InternalUserView.MY_CREATE)),
REVIEW_FUNCTIONAL_CASE("review-functional-case",
List.of(InternalUserView.ALL_DATA, InternalUserView.MY_REVIEW, InternalUserView.MY_CREATE)),
API_DEFINITION("api-definition",
List.of(InternalUserView.ALL_DATA, InternalUserView.MY_FOLLOW, InternalUserView.MY_CREATE)),
; ;
private String value; private String value;

View File

@ -32,7 +32,8 @@ public enum SystemResultCode implements IResultCode {
PLUGIN_SCRIPT_FORMAT(101011, "plugin.script.format"), PLUGIN_SCRIPT_FORMAT(101011, "plugin.script.format"),
NO_PROJECT_USER_ROLE_PERMISSION(101012, "project_user_role_permission_error"), NO_PROJECT_USER_ROLE_PERMISSION(101012, "project_user_role_permission_error"),
NO_GLOBAL_USER_ROLE_PERMISSION(101013, "no_global_user_role_permission_error"), NO_GLOBAL_USER_ROLE_PERMISSION(101013, "no_global_user_role_permission_error"),
PLUGIN_PARSE_ERROR(101014, "plugin.parse.error"); PLUGIN_PARSE_ERROR(101014, "plugin.parse.error"),
USER_VIEW_EXIST(101015, "user_view_exist"),;
private final int code; private final int code;
private final String message; private final String message;

View File

@ -23,6 +23,7 @@ import io.metersphere.system.mapper.UserViewConditionMapper;
import io.metersphere.system.mapper.UserViewMapper; import io.metersphere.system.mapper.UserViewMapper;
import io.metersphere.system.uid.IDGenerator; import io.metersphere.system.uid.IDGenerator;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@ -31,6 +32,8 @@ import java.util.Comparator;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static io.metersphere.system.controller.result.SystemResultCode.USER_VIEW_EXIST;
/** /**
* @Author: jianxing * @Author: jianxing
* @CreateTime: 2024-08-30 14:30 * @CreateTime: 2024-08-30 14:30
@ -90,6 +93,7 @@ public class UserViewService {
} }
public UserViewDTO add(UserViewAddRequest request, String viewType, String userId) { public UserViewDTO add(UserViewAddRequest request, String viewType, String userId) {
checkAddExist(request, viewType, userId);
Long nextPos = getNextPos(request.getScopeId(), userId, viewType); Long nextPos = getNextPos(request.getScopeId(), userId, viewType);
UserView userView = BeanUtils.copyBean(new UserView(), request); UserView userView = BeanUtils.copyBean(new UserView(), request);
userView.setCreateTime(System.currentTimeMillis()); userView.setCreateTime(System.currentTimeMillis());
@ -113,6 +117,33 @@ public class UserViewService {
return userViewDTO; return userViewDTO;
} }
private void checkAddExist(UserViewAddRequest request, String viewType, String userId) {
UserViewExample example = new UserViewExample();
example.createCriteria()
.andUserIdEqualTo(userId)
.andScopeIdEqualTo(request.getScopeId())
.andViewTypeEqualTo(viewType)
.andNameEqualTo(request.getName());
if (userViewMapper.countByExample(example) > 0) {
throw new MSException(USER_VIEW_EXIST);
}
}
private void checkUpdateExist(String name, String scopeId, String viewType, String userId) {
if (StringUtils.isBlank(name)) {
return;
}
UserViewExample example = new UserViewExample();
example.createCriteria()
.andUserIdEqualTo(userId)
.andScopeIdEqualTo(scopeId)
.andViewTypeEqualTo(viewType)
.andNameEqualTo(name);
if (userViewMapper.countByExample(example) > 0) {
throw new MSException(USER_VIEW_EXIST);
}
}
public Long getNextPos(String scopeId, String userId, String viewType) { public Long getNextPos(String scopeId, String userId, String viewType) {
Long pos = extUserViewMapper.getLastPos(scopeId, userId, viewType, null); Long pos = extUserViewMapper.getLastPos(scopeId, userId, viewType, null);
return (pos == null ? 0 : pos) + POS_STEP; return (pos == null ? 0 : pos) + POS_STEP;
@ -133,6 +164,9 @@ public class UserViewService {
} }
private void addUserViewConditions(List<CombineCondition> conditions, UserView userView) { private void addUserViewConditions(List<CombineCondition> conditions, UserView userView) {
if (CollectionUtils.isEmpty(conditions)) {
return;
}
List<UserViewCondition> insertConditions = conditions.stream().map(condition -> { List<UserViewCondition> insertConditions = conditions.stream().map(condition -> {
UserViewCondition userViewCondition = BeanUtils.copyBean(new UserViewCondition(), condition); UserViewCondition userViewCondition = BeanUtils.copyBean(new UserViewCondition(), condition);
userViewCondition.setId(IDGenerator.nextStr()); userViewCondition.setId(IDGenerator.nextStr());
@ -187,16 +221,19 @@ public class UserViewService {
UserView originUserView = userViewMapper.selectByPrimaryKey(request.getId()); UserView originUserView = userViewMapper.selectByPrimaryKey(request.getId());
// 校验权限只能修改自己的视图 // 校验权限只能修改自己的视图
checkOwner(userId, originUserView); checkOwner(userId, originUserView);
checkUpdateExist(request.getName(), originUserView.getScopeId(), viewType, userId);
UserView userView = BeanUtils.copyBean(new UserView(), request); UserView userView = BeanUtils.copyBean(new UserView(), request);
userView.setViewType(viewType); userView.setViewType(viewType);
userView.setUpdateTime(System.currentTimeMillis()); userView.setUpdateTime(System.currentTimeMillis());
userViewMapper.updateByPrimaryKeySelective(userView); userViewMapper.updateByPrimaryKeySelective(userView);
// 先删除 if (request.getConditions() != null) {
deleteConditionsByViewId(originUserView.getId()); // 先删除
// 再新增 deleteConditionsByViewId(originUserView.getId());
addUserViewConditions(request.getConditions(), userView); // 再新增
addUserViewConditions(request.getConditions(), userView);
}
UserViewDTO userViewDTO = BeanUtils.copyBean(new UserViewDTO(), request); UserViewDTO userViewDTO = BeanUtils.copyBean(new UserViewDTO(), request);
userViewDTO.setId(originUserView.getId()); userViewDTO.setId(originUserView.getId());

View File

@ -23,6 +23,8 @@ import org.springframework.test.web.servlet.MvcResult;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
import static io.metersphere.system.controller.result.SystemResultCode.USER_VIEW_EXIST;
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureMockMvc @AutoConfigureMockMvc
@TestMethodOrder(MethodOrderer.OrderAnnotation.class) @TestMethodOrder(MethodOrderer.OrderAnnotation.class)
@ -33,6 +35,7 @@ public class UserViewControllerTests extends BaseTest {
private final String GROUPED_LIST = "grouped/list?scopeId={0}"; private final String GROUPED_LIST = "grouped/list?scopeId={0}";
private static UserViewDTO addUserViewDTO; private static UserViewDTO addUserViewDTO;
private static UserViewDTO anotherAddUserViewDTO;
@Resource @Resource
private UserViewService userViewService; private UserViewService userViewService;
@ -117,6 +120,14 @@ public class UserViewControllerTests extends BaseTest {
UserViewDTO userViewDTO = userViewService.get(addUserViewDTO.getId(), UserViewType.FUNCTIONAL_CASE, InternalUser.ADMIN.getValue()); UserViewDTO userViewDTO = userViewService.get(addUserViewDTO.getId(), UserViewType.FUNCTIONAL_CASE, InternalUser.ADMIN.getValue());
Assertions.assertEquals(request, BeanUtils.copyBean(new UserViewAddRequest(), userViewDTO)); Assertions.assertEquals(request, BeanUtils.copyBean(new UserViewAddRequest(), userViewDTO));
Assertions.assertEquals(request.getConditions(), userViewDTO.getConditions()); Assertions.assertEquals(request.getConditions(), userViewDTO.getConditions());
// @@重名校验异常
assertErrorCode(this.requestPost(DEFAULT_ADD, request), USER_VIEW_EXIST);
request.setName(UUID.randomUUID().toString());
request.setConditions(null);
mvcResult = this.requestPostWithOkAndReturn(DEFAULT_ADD, request);
anotherAddUserViewDTO = getResultData(mvcResult, UserViewDTO.class);
} }
@Test @Test
@ -134,6 +145,13 @@ public class UserViewControllerTests extends BaseTest {
UserViewDTO userViewDTO = userViewService.get(addUserViewDTO.getId(), UserViewType.FUNCTIONAL_CASE, InternalUser.ADMIN.getValue()); UserViewDTO userViewDTO = userViewService.get(addUserViewDTO.getId(), UserViewType.FUNCTIONAL_CASE, InternalUser.ADMIN.getValue());
Assertions.assertEquals(request, BeanUtils.copyBean(new UserViewUpdateRequest(), userViewDTO)); Assertions.assertEquals(request, BeanUtils.copyBean(new UserViewUpdateRequest(), userViewDTO));
Assertions.assertEquals(request.getConditions(), userViewDTO.getConditions()); Assertions.assertEquals(request.getConditions(), userViewDTO.getConditions());
// @@ Conditions null
request.setId(anotherAddUserViewDTO.getId());
assertErrorCode(this.requestPost(DEFAULT_UPDATE, request), USER_VIEW_EXIST);
request.setName(UUID.randomUUID().toString());
request.setConditions(null);
this.requestPostWithOkAndReturn(DEFAULT_UPDATE, request);
} }
@Test @Test
@ -160,7 +178,7 @@ public class UserViewControllerTests extends BaseTest {
MvcResult mvcResult = this.requestGetWithOkAndReturn(GROUPED_LIST, DEFAULT_PROJECT_ID); MvcResult mvcResult = this.requestGetWithOkAndReturn(GROUPED_LIST, DEFAULT_PROJECT_ID);
UserViewListGroupedDTO result = getResultData(mvcResult, UserViewListGroupedDTO.class); UserViewListGroupedDTO result = getResultData(mvcResult, UserViewListGroupedDTO.class);
Assertions.assertEquals(result.getInternalViews().size(), 3); Assertions.assertEquals(result.getInternalViews().size(), 3);
Assertions.assertEquals(result.getCustomViews().size(), 1); Assertions.assertEquals(result.getCustomViews().size(), 2);
Assertions.assertEquals(result.getCustomViews().get(0), BeanUtils.copyBean(new UserViewListDTO(), addUserViewDTO)); Assertions.assertEquals(result.getCustomViews().get(0), BeanUtils.copyBean(new UserViewListDTO(), addUserViewDTO));
} }