use of com.diboot.iam.entity.IamResourcePermission in project diboot by dibo-software.
the class IamResourcePermissionServiceImpl method updateMenuAndPermissions.
@Override
@Transactional(rollbackFor = Exception.class)
public void updateMenuAndPermissions(IamResourcePermissionDTO iamResourcePermissionDTO) {
// 检查是否设置了自身id为parentId,如果设置parentId与自身id相同,将会导致非常严重的潜在隐患
if (V.equals(iamResourcePermissionDTO.getId(), iamResourcePermissionDTO.getParentId())) {
throw new BusinessException(Status.FAIL_OPERATION, "不可设置父级菜单资源为自身");
}
// 设置menu的接口列表
if (V.notEmpty(iamResourcePermissionDTO.getApiSetList())) {
iamResourcePermissionDTO.setApiSet(S.join(iamResourcePermissionDTO.getApiSetList(), ","));
}
// 更新menu
this.updateEntity(iamResourcePermissionDTO);
List<IamResourcePermissionDTO> permissionList = iamResourcePermissionDTO.getPermissionList();
permissionList.forEach(p -> {
p.setParentId(iamResourcePermissionDTO.getId());
p.setDisplayType(Cons.RESOURCE_PERMISSION_DISPLAY_TYPE.PERMISSION.name());
});
// 需要更新的列表
List<IamResourcePermissionDTO> updatePermissionList = permissionList.stream().filter(p -> V.notEmpty(p.getId())).collect(Collectors.toList());
// 需要新建的列表
List<IamResourcePermissionDTO> createPermissionDTOList = permissionList.stream().filter(p -> V.isEmpty(p.getId())).collect(Collectors.toList());
List<Long> updatePermissionIdList = updatePermissionList.stream().map(IamResourcePermission::getId).collect(Collectors.toList());
// 批量删除不存在的按钮/权限列表
List<IamResourcePermission> oldPermissionList = this.getEntityList(Wrappers.<IamResourcePermission>lambdaQuery().eq(IamResourcePermission::getParentId, iamResourcePermissionDTO.getId()).eq(IamResourcePermission::getDisplayType, Cons.RESOURCE_PERMISSION_DISPLAY_TYPE.PERMISSION));
if (V.notEmpty(oldPermissionList)) {
LambdaQueryWrapper<IamResourcePermission> deleteWrapper = Wrappers.<IamResourcePermission>lambdaQuery().eq(IamResourcePermission::getParentId, iamResourcePermissionDTO.getId()).eq(IamResourcePermission::getDisplayType, Cons.RESOURCE_PERMISSION_DISPLAY_TYPE.PERMISSION);
if (V.notEmpty(updatePermissionIdList)) {
deleteWrapper.notIn(IamResourcePermission::getId, updatePermissionIdList);
}
this.deleteEntities(deleteWrapper);
}
// 批量新建按钮/权限列表
if (V.notEmpty(createPermissionDTOList)) {
List<IamResourcePermission> createPermissionList = BeanUtils.convertList(createPermissionDTOList, IamResourcePermission.class);
this.createEntities(createPermissionList);
}
// 批量更新按钮/权限列表
if (V.notEmpty(updatePermissionList)) {
for (IamResourcePermissionDTO updatePermission : updatePermissionList) {
this.updateEntity(updatePermission);
}
}
// 检测是否有脏数据存在
if (hasDirtyData()) {
throw new BusinessException(Status.FAIL_OPERATION, "父级节点不可设置在自己的子节点上");
}
// 清理脏数据
// this.clearDirtyData();
}
use of com.diboot.iam.entity.IamResourcePermission in project diboot by dibo-software.
the class IamResourcePermissionServiceImpl method sortList.
@Override
public void sortList(List<IamResourcePermission> permissionList) {
if (V.isEmpty(permissionList)) {
throw new BusinessException(Status.FAIL_OPERATION, "排序列表不能为空");
}
List<Long> sortIdList = new ArrayList();
// 先将所有序号重新设置为自身当前id
for (IamResourcePermission item : permissionList) {
item.setSortId(item.getId());
sortIdList.add(item.getSortId());
}
// 将序号列表倒序排序
sortIdList = sortIdList.stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList());
// 整理需要更新的列表
List<IamResourcePermission> updateList = new ArrayList<>();
for (int i = 0; i < permissionList.size(); i++) {
IamResourcePermission item = permissionList.get(i);
IamResourcePermission updateItem = new IamResourcePermission();
updateItem.setId(item.getId());
updateItem.setSortId(sortIdList.get(i));
updateList.add(updateItem);
}
if (updateList.size() > 0) {
super.updateBatchById(updateList);
}
}
use of com.diboot.iam.entity.IamResourcePermission in project diboot by dibo-software.
the class IamResourcePermissionServiceImpl method hasTopRootNode.
/**
* 是否拥有顶级节点
* @param idObjectMap
* @param item
* @return
*/
private boolean hasTopRootNode(Map<String, IamResourcePermission> idObjectMap, IamResourcePermission item, List<Long> existIdList) {
if (V.equals(item.getParentId(), 0L)) {
return true;
}
if (existIdList == null) {
existIdList = new ArrayList<Long>();
}
if (existIdList.contains(item.getId())) {
return false;
}
// 如果不是顶级节点,则以此向上查找顶级节点,如果没有找到父级节点,则认为没有顶级节点,如果找到,则继续查找父级节点是否具有顶级节点
IamResourcePermission parentItem = idObjectMap.get(String.valueOf(item.getParentId()));
if (parentItem == null) {
return false;
}
// 记录下当前检查的id,以免循环调用
existIdList.add(item.getId());
return hasTopRootNode(idObjectMap, parentItem, existIdList);
}
use of com.diboot.iam.entity.IamResourcePermission in project diboot by dibo-software.
the class IamResourcePermissionServiceImpl method extractCodeDiffDbPermissions.
@Override
public Map<String, Object> extractCodeDiffDbPermissions(String application) {
List<IamResourcePermission> allResourcePermissions = getEntityList(Wrappers.<IamResourcePermission>lambdaQuery().orderByDesc(IamResourcePermission::getSortId, IamResourcePermission::getId));
if (V.isEmpty(allResourcePermissions)) {
return Collections.emptyMap();
}
List<InvalidResourcePermissionVO> voList = RelationsBinder.convertAndBind(allResourcePermissions, InvalidResourcePermissionVO.class);
Map<Long, InvalidResourcePermissionVO> resultMap = new HashMap<>(32);
for (InvalidResourcePermissionVO invalidIamResourcePermission : voList) {
if (V.isEmpty(invalidIamResourcePermission.getApiSet())) {
continue;
}
for (String uri : invalidIamResourcePermission.getApiSetList()) {
// 根据uri获取code
String permissionCode = IamCacheManager.getPermissionCode(uri);
// code存在,表示该URI有效,否则无效
if (V.isEmpty(permissionCode)) {
invalidIamResourcePermission.addInvalidApiSet(uri);
resultMap.put(invalidIamResourcePermission.getId(), invalidIamResourcePermission);
}
}
}
if (V.isEmpty(resultMap)) {
return Collections.emptyMap();
}
List<InvalidResourcePermissionVO> outerPermissionList = new ArrayList<>();
for (Map.Entry<Long, InvalidResourcePermissionVO> invalidResourcePermissionVOEntry : resultMap.entrySet()) {
InvalidResourcePermissionVO invalidResourcePermissionVO = invalidResourcePermissionVOEntry.getValue();
// 获取当前权限的上级元素
Long parentId = invalidResourcePermissionVO.getParentId();
InvalidResourcePermissionVO parentInvalidResourcePermissionVO = resultMap.get(parentId);
// 如果上级元素不存在,表示,当前对象为最外层元素
if (V.isEmpty(parentInvalidResourcePermissionVO)) {
outerPermissionList.add(invalidResourcePermissionVO);
}
}
List<InvalidResourcePermissionVO> result = new ArrayList<>(resultMap.values());
List<Long> diffDataIdList = new ArrayList<>();
for (InvalidResourcePermissionVO value : result) {
List<InvalidResourcePermissionVO> childNodeChildren = BeanUtils.buildTreeChildren(value.getId(), result, Cons.FieldName.parentId.name(), Cons.FieldName.children.name());
if (childNodeChildren == null) {
childNodeChildren = new ArrayList<>();
}
BeanUtils.setProperty(value, Cons.FieldName.children.name(), childNodeChildren);
diffDataIdList.add(value.getId());
}
return new HashMap<String, Object>() {
{
put("diffDataList", outerPermissionList);
put("diffDataIdList", diffDataIdList);
}
};
}
use of com.diboot.iam.entity.IamResourcePermission in project diboot by dibo-software.
the class IamResourcePermissionServiceImpl method deepCreatePermissionAndChildren.
@Override
@Transactional(rollbackFor = Exception.class)
public void deepCreatePermissionAndChildren(IamResourcePermissionListVO iamResourcePermissionListVO) {
if (iamResourcePermissionListVO == null) {
return;
}
IamResourcePermission iamResourcePermission = (IamResourcePermission) iamResourcePermissionListVO;
if (!super.createEntity(iamResourcePermission)) {
log.warn("新建资源权限失败,displayType=" + iamResourcePermission.getDisplayType());
throw new BusinessException(Status.FAIL_OPERATION, "新建资源权限失败");
}
List<IamResourcePermissionListVO> children = iamResourcePermissionListVO.getChildren();
if (V.notEmpty(children)) {
for (IamResourcePermissionListVO vo : children) {
vo.setParentId(iamResourcePermission.getId());
this.deepCreatePermissionAndChildren(vo);
}
}
}
Aggregations