diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/WorkspaceProductService.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/WorkspaceProductService.java index 7257a304..d0374a43 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/WorkspaceProductService.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/WorkspaceProductService.java @@ -20,6 +20,15 @@ public interface WorkspaceProductService { */ void storeWorkspaceProduct(StoreWorkspaceProductParam param); + /** + * 从缓存中查询项目的产品及产品的权限 + * 没有切到:listWorkspacePermissionCached,后续有测试机会的时候切到listWorkspacePermissionCached + * @param param + * @return + */ + @Deprecated + List listWorkspaceProductPermissionCached(ListWorkspaceProductPermissionCacheParam param); + /** * 从缓存中查询项目的权限 * @param param @@ -49,6 +58,35 @@ public interface WorkspaceProductService { private Set uniCodes; } + @Data + @Builder + @NoArgsConstructor + @AllArgsConstructor + class ListWorkspaceProductPermissionCacheParam { + /** + * 项目id + */ + private Set workspaceIds; + + private Set featureCodes; + + /** + * 端信息 + */ + private String terminal; + + /** + * app类型(APP:原生,H5:h5页面) + */ + private String appType; + + /** + * 项目code(H5会拉取项目下所有的元素) + * APP上每个应用的code,数据库叫itemCode,保持一致 + */ + private String itemCode; + } + @Data @Builder @NoArgsConstructor diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/TyrSaasAuthServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/TyrSaasAuthServiceImpl.java index eabb884b..02f7bb3c 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/TyrSaasAuthServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/TyrSaasAuthServiceImpl.java @@ -469,14 +469,11 @@ public class TyrSaasAuthServiceImpl implements TyrSaasAuthService { // 查询的featureCodes有可能已经被删除,但是saas_feature_code效率比较低,两个表的id不会重复,所以解析成id去过滤权限 Set featureIds = checkFeatureCodes(param); - WorkspaceProductService.ListWorkspacePermissionCacheParam listWorkspacePermissionCacheParam = WorkspaceProductService.ListWorkspacePermissionCacheParam - .builder() - .workspacePermissions(Lists.newArrayList(WorkspaceProductService.WorkspacePermission.builder() - .workspaceId(param.getWorkspaceId()) - .featureCodes(param.getFeatureCodes()) - .build())) + WorkspaceProductService.ListWorkspaceProductPermissionCacheParam listWorkspaceProductPermissionCacheParam = WorkspaceProductService.ListWorkspaceProductPermissionCacheParam.builder() + .workspaceIds(Sets.newHashSet(param.getWorkspaceId())) + .featureCodes(param.getFeatureCodes()) .build(); - List productPermissions = workspaceProductService.listWorkspacePermissionCached(listWorkspacePermissionCacheParam) + List productPermissions = workspaceProductService.listWorkspaceProductPermissionCached(listWorkspaceProductPermissionCacheParam) .stream() .map(WorkspaceProductService.WorkspaceProductPermission::getProductPermissions) .filter(e -> !CollectionUtils.isEmpty(e)) @@ -997,14 +994,11 @@ public class TyrSaasAuthServiceImpl implements TyrSaasAuthService { // find product by workspace Set workspaceId = filterRoleAuths.stream().map(FilterRoleAuth::getWorkspaceId).collect(Collectors.toSet()); - WorkspaceProductService.ListWorkspacePermissionCacheParam listWorkspacePermissionCacheParam = WorkspaceProductService.ListWorkspacePermissionCacheParam.builder() - .workspacePermissions(workspaceId.stream() - .map(e -> WorkspaceProductService.WorkspacePermission.builder() - .workspaceId(e) - .build()) - .collect(Collectors.toList())) + WorkspaceProductService.ListWorkspaceProductPermissionCacheParam listWorkspaceProductPermission = WorkspaceProductService.ListWorkspaceProductPermissionCacheParam.builder() + .workspaceIds(workspaceId) .build(); - Map> workspaceProductPermissions = workspaceProductService.listWorkspacePermissionCached(listWorkspacePermissionCacheParam) + + Map> workspaceProductPermissions = workspaceProductService.listWorkspaceProductPermissionCached(listWorkspaceProductPermission) .stream() .collect(Collectors.toMap(WorkspaceProductService.WorkspaceProductPermission::getWorkspaceId, WorkspaceProductService.WorkspaceProductPermission::getProductPermissions)); @@ -1506,15 +1500,11 @@ public class TyrSaasAuthServiceImpl implements TyrSaasAuthService { .map(IdentityAuthReq.WorkspaceOuPair::getWorkspaceId) .collect(Collectors.toSet()); // 查询项目的产品权限 - WorkspaceProductService.ListWorkspacePermissionCacheParam listProductPermisssion = WorkspaceProductService.ListWorkspacePermissionCacheParam.builder() - .workspacePermissions(workspaceIds.stream() - .map(workspaceId -> WorkspaceProductService.WorkspacePermission.builder() - .workspaceId(workspaceId) - .featureCodes(identityAuthReq.getFeatureCode()) - .build()) - .collect(Collectors.toList())) + WorkspaceProductService.ListWorkspaceProductPermissionCacheParam listProductPermisssion = WorkspaceProductService.ListWorkspaceProductPermissionCacheParam.builder() + .workspaceIds(workspaceIds) + .featureCodes(identityAuthReq.getFeatureCode()) .build(); - return workspaceProductService.listWorkspacePermissionCached(listProductPermisssion).stream() + return workspaceProductService.listWorkspaceProductPermissionCached(listProductPermisssion).stream() .collect(Collectors.toMap(WorkspaceProductService.WorkspaceProductPermission::getWorkspaceId, WorkspaceProductService.WorkspaceProductPermission::getProductPermissions)); } diff --git a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/WorkspaceProductServiceImpl.java b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/WorkspaceProductServiceImpl.java index 309ef109..ac00015c 100644 --- a/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/WorkspaceProductServiceImpl.java +++ b/tyr-server/src/main/java/cn/axzo/tyr/server/service/impl/WorkspaceProductServiceImpl.java @@ -159,6 +159,51 @@ public class WorkspaceProductServiceImpl implements WorkspaceProductService { return String.format(WORKSPACE_PRODUCT_KEY); } + @Override + public List listWorkspaceProductPermissionCached(ListWorkspaceProductPermissionCacheParam param) { + Map> workspaceProducts = listWorkspaceProduct(param.getWorkspaceIds()); + + Set productIds = workspaceProducts.values().stream() + .flatMap(Collection::stream) + .collect(Collectors.toSet()); + + if (CollectionUtils.isEmpty(productIds)) { + return Collections.emptyList(); + } + + ProductPermissionCacheService.ListProductPermissionParam listProductPermissionParam = ProductPermissionCacheService.ListProductPermissionParam.builder() + .productIds(productIds) + .featureCodes(param.getFeatureCodes()) + .appType(param.getAppType()) + .itemCode(param.getItemCode()) + .terminal(param.getTerminal()) + .build(); + Map> productPermissionMap = productPermissionCacheService.list(listProductPermissionParam); + + return workspaceProducts.entrySet().stream() + .filter(e -> CollectionUtils.isNotEmpty(e.getValue())) + .map(e -> { + List productPermissions = e.getValue().stream() + .map(productId -> { + List permissions = productPermissionMap.get(productId); + if (CollectionUtils.isEmpty(permissions)) { + return null; + } + return ProductPermission.builder() + .productId(productId) + .permissions(permissions) + .build(); + }) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + return WorkspaceProductPermission.builder() + .workspaceId(e.getKey()) + .productPermissions(productPermissions) + .build(); + }) + .collect(Collectors.toList()); + } + @Override public List listWorkspacePermissionCached(ListWorkspacePermissionCacheParam param) { if (CollectionUtils.isEmpty(param.getWorkspacePermissions())) { diff --git a/tyr-server/src/test/java/cn/axzo/tyr/server/service/impl/WorkspaceProductServiceImplTest.java b/tyr-server/src/test/java/cn/axzo/tyr/server/service/impl/WorkspaceProductServiceImplTest.java index e15fc87c..7dd1991f 100644 --- a/tyr-server/src/test/java/cn/axzo/tyr/server/service/impl/WorkspaceProductServiceImplTest.java +++ b/tyr-server/src/test/java/cn/axzo/tyr/server/service/impl/WorkspaceProductServiceImplTest.java @@ -20,6 +20,8 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; +import static org.junit.jupiter.api.Assertions.*; + class WorkspaceProductServiceImplTest extends BaseTest { @Autowired @@ -54,6 +56,124 @@ class WorkspaceProductServiceImplTest extends BaseTest { .thenReturn(CommonResponse.success(Lists.newArrayList())); } + @Test + void listWorkspaceProductPermissionCached() { + + // workspace 没有product + WorkspaceProductService.ListWorkspaceProductPermissionCacheParam param = WorkspaceProductService.ListWorkspaceProductPermissionCacheParam.builder() + .workspaceIds(Sets.newHashSet(11L)) + .build(); + List workspaceProductPermissions = workspaceProductService.listWorkspaceProductPermissionCached(param); + + Assertions.assertTrue(CollectionUtils.isEmpty(workspaceProductPermissions)); + // workspace 没有product + + // workspace 有product,featureCode + param = WorkspaceProductService.ListWorkspaceProductPermissionCacheParam.builder() + .workspaceIds(Sets.newHashSet(3L, 4L)) + .featureCodes(Sets.newHashSet("h5:cmp_user_manage_worker_labor_audit_btn", "h5:cmp_allotted_time_page")) + .build(); + Map> workspacePermissions = workspaceProductService.listWorkspaceProductPermissionCached(param).stream() + .collect(Collectors.toMap(WorkspaceProductService.WorkspaceProductPermission::getWorkspaceId, WorkspaceProductService.WorkspaceProductPermission::getProductPermissions)); + Assertions.assertEquals(workspacePermissions.get(3L).size(), 1); + Assertions.assertEquals(workspacePermissions.get(3L).get(0).getProductId(), 2L); + Assertions.assertEquals(workspacePermissions.get(3L).get(0).getPermissions().size(), 1); + Assertions.assertEquals(workspacePermissions.get(3L).get(0).getPermissions().get(0).getCooperateType(), "1"); + Assertions.assertEquals(workspacePermissions.get(3L).get(0).getPermissions().get(0).getFeatureId(), 101745L); + Assertions.assertEquals(workspacePermissions.get(3L).get(0).getPermissions().get(0).getFeatureCode(), "h5:cmp_user_manage_worker_labor_audit_btn"); + Assertions.assertEquals(workspacePermissions.get(3L).get(0).getPermissions().get(0).getFeatureType(), 4); + Assertions.assertEquals(workspacePermissions.get(3L).get(0).getPermissions().get(0).getTerminal(), "NT_CMP_APP_GENERAL"); + Assertions.assertEquals(workspacePermissions.get(3L).get(0).getPermissions().get(0).getAppType(), "H5"); + Assertions.assertEquals(workspacePermissions.get(3L).get(0).getPermissions().get(0).getItemCode(), "h5:user_manage_D9B0186"); + // workspace 有product,featureCode + + // workspace 有product,terminal + param = WorkspaceProductService.ListWorkspaceProductPermissionCacheParam.builder() + .workspaceIds(Sets.newHashSet(3L)) + .terminal("NT_CMP_APP_GENERAL") + .build(); + workspacePermissions = workspaceProductService.listWorkspaceProductPermissionCached(param).stream() + .collect(Collectors.toMap(WorkspaceProductService.WorkspaceProductPermission::getWorkspaceId, WorkspaceProductService.WorkspaceProductPermission::getProductPermissions)); + Assertions.assertEquals(workspacePermissions.get(3L).size(), 1); + Assertions.assertEquals(workspacePermissions.get(3L).get(0).getProductId(), 2L); + Assertions.assertEquals(workspacePermissions.get(3L).get(0).getPermissions().size(), 7); + + param = WorkspaceProductService.ListWorkspaceProductPermissionCacheParam.builder() + .workspaceIds(Sets.newHashSet(3L)) + .terminal("NT_CMP_APP_GENERAL_sdf") + .build(); + workspacePermissions = workspaceProductService.listWorkspaceProductPermissionCached(param).stream() + .collect(Collectors.toMap(WorkspaceProductService.WorkspaceProductPermission::getWorkspaceId, WorkspaceProductService.WorkspaceProductPermission::getProductPermissions)); + Assertions.assertEquals(workspacePermissions.get(3L).size(), 0); + // workspace 有product,terminal + + // workspace 有product,appType + param = WorkspaceProductService.ListWorkspaceProductPermissionCacheParam.builder() + .workspaceIds(Sets.newHashSet(3L)) + .appType("H5") + .build(); + workspacePermissions = workspaceProductService.listWorkspaceProductPermissionCached(param).stream() + .collect(Collectors.toMap(WorkspaceProductService.WorkspaceProductPermission::getWorkspaceId, WorkspaceProductService.WorkspaceProductPermission::getProductPermissions)); + Assertions.assertEquals(workspacePermissions.get(3L).size(), 1); + Assertions.assertEquals(workspacePermissions.get(3L).get(0).getProductId(), 2L); + Assertions.assertEquals(workspacePermissions.get(3L).get(0).getPermissions().size(), 7); + + param = WorkspaceProductService.ListWorkspaceProductPermissionCacheParam.builder() + .workspaceIds(Sets.newHashSet(3L)) + .appType("APP") + .build(); + workspacePermissions = workspaceProductService.listWorkspaceProductPermissionCached(param).stream() + .collect(Collectors.toMap(WorkspaceProductService.WorkspaceProductPermission::getWorkspaceId, WorkspaceProductService.WorkspaceProductPermission::getProductPermissions)); + Assertions.assertEquals(workspacePermissions.get(3L).size(), 0); + // workspace 有product,appType + + // workspace 有product,itemCode + param = WorkspaceProductService.ListWorkspaceProductPermissionCacheParam.builder() + .workspaceIds(Sets.newHashSet(3L)) + .itemCode("h5:user_manage_D9B0186") + .build(); + workspacePermissions = workspaceProductService.listWorkspaceProductPermissionCached(param).stream() + .collect(Collectors.toMap(WorkspaceProductService.WorkspaceProductPermission::getWorkspaceId, WorkspaceProductService.WorkspaceProductPermission::getProductPermissions)); + Assertions.assertEquals(workspacePermissions.get(3L).size(), 1); + Assertions.assertEquals(workspacePermissions.get(3L).get(0).getProductId(), 2L); + Assertions.assertEquals(workspacePermissions.get(3L).get(0).getPermissions().size(), 7); + + param = WorkspaceProductService.ListWorkspaceProductPermissionCacheParam.builder() + .workspaceIds(Sets.newHashSet(3L)) + .itemCode("h5:user_manage_D9B0186_sdf") + .build(); + workspacePermissions = workspaceProductService.listWorkspaceProductPermissionCached(param).stream() + .collect(Collectors.toMap(WorkspaceProductService.WorkspaceProductPermission::getWorkspaceId, WorkspaceProductService.WorkspaceProductPermission::getProductPermissions)); + Assertions.assertEquals(workspacePermissions.get(3L).size(), 0); + // workspace 有product,itemCode + + // workspace 有product,featureCode、terminal、appType、itemCode + param = WorkspaceProductService.ListWorkspaceProductPermissionCacheParam.builder() + .workspaceIds(Sets.newHashSet(3L)) + .featureCodes(Sets.newHashSet("h5:cmp_user_manage_worker_labor_audit_btn")) + .terminal("NT_CMP_APP_GENERAL") + .appType("H5") + .itemCode("h5:user_manage_D9B0186") + .build(); + workspacePermissions = workspaceProductService.listWorkspaceProductPermissionCached(param).stream() + .collect(Collectors.toMap(WorkspaceProductService.WorkspaceProductPermission::getWorkspaceId, WorkspaceProductService.WorkspaceProductPermission::getProductPermissions)); + Assertions.assertEquals(workspacePermissions.get(3L).size(), 1); + Assertions.assertEquals(workspacePermissions.get(3L).get(0).getProductId(), 2L); + Assertions.assertEquals(workspacePermissions.get(3L).get(0).getPermissions().size(), 1); + + param = WorkspaceProductService.ListWorkspaceProductPermissionCacheParam.builder() + .workspaceIds(Sets.newHashSet(3L)) + .featureCodes(Sets.newHashSet("h5:cmp_user_manage_worker_labor_audit_btn")) + .terminal("NT_CMP_APP_GENERAL") + .appType("APP") + .itemCode("h5:user_manage_D9B0186_sdf") + .build(); + workspacePermissions = workspaceProductService.listWorkspaceProductPermissionCached(param).stream() + .collect(Collectors.toMap(WorkspaceProductService.WorkspaceProductPermission::getWorkspaceId, WorkspaceProductService.WorkspaceProductPermission::getProductPermissions)); + Assertions.assertEquals(workspacePermissions.get(3L).size(), 0); + // workspace 有product,featureCode、terminal、appType、itemCode + } + @Test void listWorkspacePermissionCached() {