diff --git a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/ListRoleReq.java b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/ListRoleReq.java index 71e01fbd..26f0d37c 100644 --- a/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/ListRoleReq.java +++ b/tyr-api/src/main/java/cn/axzo/tyr/client/model/req/ListRoleReq.java @@ -44,15 +44,21 @@ public class ListRoleReq { private String roleCode; /** - * 租户id + * 项目id + * 因为原来每一个workspace都有一个superAdmin角色,现在同一个workspaceType只有一个superAdmin角色, + * 为了兼容历史代码,传入了workspaceId时, + * 需要自动补充sql,(workspaceId = #workspaceId# or (workspaceId = 0 and workspaceType = #workspaceType#)) */ - @CriteriaField(field = "workspaceId", operator = Operator.IN) + @CriteriaField(ignore = true) private List workspaceIds; /** * 单位id + * 因为原来每一个workspace都有一个superAdmin角色,现在同一个workspaceType只有一个superAdmin角色, + * 为了兼容历史代码,传入了ouId时,因为不会单独给ouIds查询 + * 需要自动补充sql,(ouId = #ouId# or (ouId = 0 )) */ - @CriteriaField(field = "ownerOuId", operator = Operator.IN) + @CriteriaField(ignore = true) private List ouIds; /** @@ -140,15 +146,32 @@ public class ListRoleReq { @CriteriaField(ignore = true) private String terminal; - @CriteriaField(field = "workspaceId", operator = Operator.EQ) + /** + * 因为原来每一个workspace都有一个superAdmin角色,现在同一个workspaceType只有一个superAdmin角色, + * 为了兼容历史代码,传入了workspaceId时, + * 需要自动补充sql,(workspaceId = #workspaceId# or (workspaceId = 0 and workspaceType = #workspaceType#)) + */ + @CriteriaField(ignore = true) private Long workspaceId; - @CriteriaField(field = "ownerOuId", operator = Operator.EQ) + /** + * 单位id + * 因为原来每一个workspace都有一个superAdmin角色,现在同一个workspaceType只有一个superAdmin角色, + * 为了兼容历史代码,传入了ouId时,因为不会单独给ouIds查询 + * 需要自动补充sql,(ouId = #ouId# or (ouId = 0 )) + */ + @CriteriaField(ignore = true) private Long ouId; /** * workspaceId和ouId配对查询 * 例如:((workspaceId = ## and ouId = ##) or (workspaceId = ## and ouId = ##)) + * + * 因为原来每一个workspace都有一个superAdmin角色,现在同一个workspaceType只有一个superAdmin角色, + * 为了兼容历史代码,传入了workspaceId时, + * 需要自动补充sql, + * ((workspaceId = ## and ouId = ##) or (workspaceId = ## and ouId = ##) or (ouId = 0 and workspaceId = 0 and workspaceType = #workspaceType#)) + * */ @CriteriaField(ignore = true) private List workspaceOuPairs; diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java index 993f3f89..06398f8b 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/RoleServiceImpl.java @@ -1404,23 +1404,6 @@ public class RoleServiceImpl extends ServiceImpl public cn.axzo.foundation.page.PageResp page(PageRoleReq param) { QueryWrapper wrapper = QueryWrapperHelper.fromBean(param, SaasRole.class); wrapper.eq("is_delete", 0); - List workspaceOuPairs = Lists.newArrayList(); - if (Boolean.TRUE.equals(param.getNeedPresetRole())) { - workspaceOuPairs.add(PRESET_WORKSPACE_OU_PAIR); - } - CollectionUtils.addAll(workspaceOuPairs, Optional.ofNullable(param.getWorkspaceOuPairs()) - .map(List::listIterator) - .orElseGet(Collections::emptyListIterator)); - if (CollectionUtils.isNotEmpty(workspaceOuPairs)) { - wrapper.and(j -> { - for (ListRoleUserRelationParam.WorkspaceOuPair workspaceOuPair : workspaceOuPairs) { - j.or(k -> { - k.eq(Objects.nonNull(workspaceOuPair.getOuId()), "owner_ou_id", workspaceOuPair.getOuId()); - k.eq(Objects.nonNull(workspaceOuPair.getWorkspaceId()), "workspace_id", workspaceOuPair.getWorkspaceId()); - }); - } - }); - } if (CollectionUtils.isNotEmpty(param.getRoleGroupCodes())) { Set roleIds = resolveRoleGroupCodes(param); @@ -1430,9 +1413,13 @@ public class RoleServiceImpl extends ServiceImpl wrapper.in(CollectionUtils.isNotEmpty(roleIds), "id", roleIds); } - // 因为历史是每一个workspaceId一个超管角色,现在是一个workspaceType一个超管角色, - // 为了兼容历史情况,入参有workspaceId,且roleType为空或者roleType包含superAdmin的,需要组装superAdmin的查询条件 - assembleSuperAdminWrapper(param, wrapper); + // 因为历史是每一个workspaceId一个超管角色,现在是一个workspaceType一个超管角色 + // 入参有workspaceId的时候,需要组装workspaceId = 0 and workspaceType = #workspaceType# + resolveWorkspaceOuPairWrapper(param, wrapper); + resolveWorkspaceIdWrapper(param, wrapper); + resolveWorkspaceIdsWrapper(param, wrapper); + resolveOuIdWrapper(param, wrapper); + resolveOuIdsWrapper(param, wrapper); IPage page = this.page(PageConverter.toMybatis(param, SaasRole.class), wrapper); @@ -1453,53 +1440,110 @@ public class RoleServiceImpl extends ServiceImpl permissionRelations)); } - /** - * 因为历史是每一个workspaceId一个超管角色,现在是一个workspaceType一个超管角色, - * 为了兼容历史情况,入参有workspaceId,且roleType为空或者roleType包含superAdmin的,需要组装superAdmin的查询条件 - * @param param - * @param wrapper - */ - private void assembleSuperAdminWrapper(PageRoleReq param, QueryWrapper wrapper) { - if (Objects.isNull(param.getWorkspaceId()) - && CollectionUtils.isEmpty(param.getWorkspaceIds()) - && CollectionUtils.isEmpty(param.getWorkspaceOuPairs())) { + private void resolveWorkspaceOuPairWrapper(PageRoleReq param, QueryWrapper wrapper) { + + if (BooleanUtils.isNotTrue(param.getNeedPresetRole()) && CollectionUtils.isEmpty(param.getWorkspaceOuPairs())) { return; } - if (CollectionUtils.isEmpty(param.getRoleTypes()) - || !param.getRoleTypes().contains(RoleTypeEnum.SUPER_ADMIN.getValue())) { + List workspaceOuPairs = Optional.ofNullable(param.getWorkspaceOuPairs()) + .orElseGet(Lists::newArrayList); + + List workspaceIds = workspaceOuPairs.stream() + .map(ListRoleUserRelationParam.WorkspaceOuPair::getWorkspaceId) + .collect(Collectors.toList()); + + Set workspaceTypes = listWorkspaceType(workspaceIds); + + if (BooleanUtils.isTrue(param.getNeedPresetRole())) { + workspaceOuPairs.add(PRESET_WORKSPACE_OU_PAIR); + } + + wrapper.and(j -> { + for (ListRoleUserRelationParam.WorkspaceOuPair workspaceOuPair : workspaceOuPairs) { + j.or(k -> { + k.eq(Objects.nonNull(workspaceOuPair.getOuId()), "owner_ou_id", workspaceOuPair.getOuId()); + k.eq(Objects.nonNull(workspaceOuPair.getWorkspaceId()), "workspace_id", workspaceOuPair.getWorkspaceId()); + }); + } + + j.or(CollectionUtils.isNotEmpty(workspaceTypes), k -> { + k.eq("workspace_id", 0L); + k.in("workspace_type", workspaceTypes); + }); + }); + } + + private void resolveWorkspaceIdWrapper(PageRoleReq param, QueryWrapper wrapper) { + if (Objects.isNull(param.getWorkspaceId())) { return; } - List workspaceIds = Lists.newArrayList(); - if (Objects.nonNull(param.getWorkspaceId())) { - workspaceIds.add(param.getWorkspaceId()); - } - if (CollectionUtils.isNotEmpty(param.getWorkspaceIds())) { - workspaceIds.addAll(param.getWorkspaceIds()); + Set workspaceTypes = listWorkspaceType(Lists.newArrayList(param.getWorkspaceId())); + + wrapper.and(j -> { + j.or(k -> k.eq("workspace_id", param.getWorkspaceId())); + + j.or(CollectionUtils.isNotEmpty(workspaceTypes), k -> { + k.eq("workspace_id", 0L); + k.in("workspace_type", workspaceTypes); + }); + }); + } + + private void resolveOuIdWrapper(PageRoleReq param, QueryWrapper wrapper) { + if (Objects.isNull(param.getOuId())) { + return; } - if (CollectionUtils.isNotEmpty(param.getWorkspaceOuPairs())) { - workspaceIds.addAll(param.getWorkspaceOuPairs().stream() - .map(ListRoleUserRelationParam.WorkspaceOuPair::getWorkspaceId) - .collect(Collectors.toList())); + wrapper.and(j -> { + j.or(k -> k.eq("owner_ou_id", param.getOuId())); + j.or(k -> k.eq("owner_ou_id", 0L)); + }); + } + + private void resolveOuIdsWrapper(PageRoleReq param, QueryWrapper wrapper) { + if (CollectionUtils.isEmpty(param.getOuIds())) { + return; + } + + wrapper.and(j -> { + j.or(k -> k.in("owner_ou_id", param.getOuIds())); + j.or(k -> k.eq("owner_ou_id", 0L)); + }); + } + + private void resolveWorkspaceIdsWrapper(PageRoleReq param, QueryWrapper wrapper) { + if (CollectionUtils.isEmpty(param.getWorkspaceIds())) { + return; + } + + Set workspaceTypes = listWorkspaceType(param.getWorkspaceIds()); + + wrapper.and(j -> { + j.or(k -> k.in("workspace_id", param.getWorkspaceIds())); + + j.or(CollectionUtils.isNotEmpty(workspaceTypes), k -> { + k.eq("workspace_id", 0L); + k.in("workspace_type", workspaceTypes); + }); + }); + } + + + private Set listWorkspaceType(List workspaceIds) { + if (CollectionUtils.isEmpty(workspaceIds)) { + return Collections.emptySet(); } GetSimpleWorkspaceReqV2 build = GetSimpleWorkspaceReqV2.builder() .ids(workspaceIds) .build(); - List workspaces = RpcExternalUtil.rpcApolloProcessor(() -> workspaceApi.getListV2(build), - "查询项目信息", build); - if (CollectionUtils.isEmpty(workspaces)) { - return; - } - - wrapper.or(j -> { - j.in("workspace_type", Lists.transform(workspaces, SimpleWorkspaceRes::getType)); - j.eq("owner_ou_id", 0L); - j.eq("workspace_id", 0L); - j.eq("role_type", RoleTypeEnum.SUPER_ADMIN.getValue()); - }); + return RpcExternalUtil.rpcApolloProcessor(() -> workspaceApi.getListV2(build), + "查询项目信息", build) + .stream() + .map(SimpleWorkspaceRes::getType) + .collect(Collectors.toSet()); } private Set resolveRoleGroupCodes(PageRoleReq param) { diff --git a/tyr-server/src/test/java/cn/axzo/tyr/server/service/RoleServiceTest.java b/tyr-server/src/test/java/cn/axzo/tyr/server/service/RoleServiceTest.java index b3cb0a42..609509d1 100644 --- a/tyr-server/src/test/java/cn/axzo/tyr/server/service/RoleServiceTest.java +++ b/tyr-server/src/test/java/cn/axzo/tyr/server/service/RoleServiceTest.java @@ -311,5 +311,42 @@ class RoleServiceTest extends BaseTest { .build()); Assertions.assertEquals(roles.size(), 1); // 直接查询超管角色 + + roles = roleService.list(ListRoleReq.builder() + .roleIds(Lists.newArrayList(101101L)) + .workspaceId(3L) + .build()); + Assertions.assertEquals(roles.size(), 1); + + roles = roleService.list(ListRoleReq.builder() + .workspaceOuPairs(Lists.newArrayList( + ListRoleUserRelationParam.WorkspaceOuPair.builder().workspaceId(3L) + .ouId(4L).build() + )) + .needPresetRole(true) + .build()); + Assertions.assertEquals(roles.size(), 6); + + roles = roleService.list(ListRoleReq.builder() + .roleIds(Lists.newArrayList(101101L, 3416L)) + .workspaceId(3L) + .ouId(4L) + .build()); + Assertions.assertEquals(roles.size(), 2); + + roles = roleService.list(ListRoleReq.builder() + .roleIds(Lists.newArrayList(101101L, 3416L)) + .roleTypes(Lists.newArrayList("super_admin")) + .workspaceId(3L) + .ouId(4L) + .build()); + Assertions.assertEquals(roles.size(), 1); + + roles = roleService.list(ListRoleReq.builder() + .roleIds(Lists.newArrayList(101101L, 3416L)) + .workspaceId(3L) + .ouIds(Lists.newArrayList(4L)) + .build()); + Assertions.assertEquals(roles.size(), 2); } } \ No newline at end of file