You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
176 lines
7.5 KiB
176 lines
7.5 KiB
package com.aurora.service.impl;
|
|
|
|
import com.aurora.model.dto.LabelOptionDTO;
|
|
import com.aurora.model.dto.ResourceDTO;
|
|
import com.aurora.entity.Resource;
|
|
import com.aurora.entity.RoleResource;
|
|
import com.aurora.exception.BizException;
|
|
import com.aurora.handler.FilterInvocationSecurityMetadataSourceImpl;
|
|
import com.aurora.mapper.ResourceMapper;
|
|
import com.aurora.mapper.RoleResourceMapper;
|
|
import com.aurora.service.ResourceService;
|
|
import com.aurora.util.BeanCopyUtil;
|
|
import com.aurora.model.vo.ConditionVO;
|
|
import com.aurora.model.vo.ResourceVO;
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
import org.apache.commons.lang3.StringUtils;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
import org.springframework.web.client.RestTemplate;
|
|
|
|
import java.time.LocalDateTime;
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
import java.util.Objects;
|
|
import java.util.stream.Collectors;
|
|
|
|
import static com.aurora.constant.CommonConstant.FALSE;
|
|
|
|
@Service
|
|
public class ResourceServiceImpl extends ServiceImpl<ResourceMapper, Resource> implements ResourceService {
|
|
|
|
@Autowired
|
|
private RestTemplate restTemplate;
|
|
|
|
@Autowired
|
|
private ResourceMapper resourceMapper;
|
|
|
|
@Autowired
|
|
private RoleResourceMapper roleResourceMapper;
|
|
|
|
|
|
@Autowired
|
|
private FilterInvocationSecurityMetadataSourceImpl filterInvocationSecurityMetadataSource;
|
|
|
|
@SuppressWarnings("all")
|
|
@Transactional(rollbackFor = Exception.class)
|
|
@Override
|
|
public void importSwagger() {
|
|
this.remove(null);
|
|
roleResourceMapper.delete(null);
|
|
List<Resource> resources = new ArrayList<>();
|
|
Map<String, Object> data = restTemplate.getForObject("http://localhost:8080/v2/api-docs", Map.class);
|
|
List<Map<String, String>> tagList = (List<Map<String, String>>) data.get("tags");
|
|
tagList.forEach(item -> {
|
|
Resource resource = Resource.builder()
|
|
.resourceName(item.get("name"))
|
|
.isAnonymous(FALSE)
|
|
.createTime(LocalDateTime.now())
|
|
.build();
|
|
resources.add(resource);
|
|
});
|
|
this.saveBatch(resources);
|
|
Map<String, Integer> permissionMap = resources.stream()
|
|
.collect(Collectors.toMap(Resource::getResourceName, Resource::getId));
|
|
resources.clear();
|
|
Map<String, Map<String, Map<String, Object>>> path = (Map<String, Map<String, Map<String, Object>>>) data.get("paths");
|
|
path.forEach((url, value) -> value.forEach((requestMethod, info) -> {
|
|
String permissionName = info.get("summary").toString();
|
|
List<String> tag = (List<String>) info.get("tags");
|
|
Integer parentId = permissionMap.get(tag.get(0));
|
|
Resource resource = Resource.builder()
|
|
.resourceName(permissionName)
|
|
.url(url.replaceAll("\\{[^}]*\\}", "*"))
|
|
.parentId(parentId)
|
|
.requestMethod(requestMethod.toUpperCase())
|
|
.isAnonymous(FALSE)
|
|
.createTime(LocalDateTime.now())
|
|
.build();
|
|
resources.add(resource);
|
|
}));
|
|
this.saveBatch(resources);
|
|
}
|
|
|
|
@Override
|
|
public void saveOrUpdateResource(ResourceVO resourceVO) {
|
|
Resource resource = BeanCopyUtil.copyObject(resourceVO, Resource.class);
|
|
this.saveOrUpdate(resource);
|
|
filterInvocationSecurityMetadataSource.clearDataSource();
|
|
}
|
|
|
|
@Override
|
|
public void deleteResource(Integer resourceId) {
|
|
Integer count = roleResourceMapper.selectCount(new LambdaQueryWrapper<RoleResource>()
|
|
.eq(RoleResource::getResourceId, resourceId));
|
|
if (count > 0) {
|
|
throw new BizException("该资源下存在角色");
|
|
}
|
|
List<Integer> resourceIds = resourceMapper.selectList(new LambdaQueryWrapper<Resource>()
|
|
.select(Resource::getId).
|
|
eq(Resource::getParentId, resourceId))
|
|
.stream()
|
|
.map(Resource::getId)
|
|
.collect(Collectors.toList());
|
|
resourceIds.add(resourceId);
|
|
resourceMapper.deleteBatchIds(resourceIds);
|
|
}
|
|
|
|
@Override
|
|
public List<ResourceDTO> listResources(ConditionVO conditionVO) {
|
|
List<Resource> resources = resourceMapper.selectList(new LambdaQueryWrapper<Resource>()
|
|
.like(StringUtils.isNotBlank(conditionVO.getKeywords()), Resource::getResourceName, conditionVO.getKeywords()));
|
|
List<Resource> parents = listResourceModule(resources);
|
|
Map<Integer, List<Resource>> childrenMap = listResourceChildren(resources);
|
|
List<ResourceDTO> resourceDTOs = parents.stream().map(item -> {
|
|
ResourceDTO resourceDTO = BeanCopyUtil.copyObject(item, ResourceDTO.class);
|
|
List<ResourceDTO> child = BeanCopyUtil.copyList(childrenMap.get(item.getId()), ResourceDTO.class);
|
|
resourceDTO.setChildren(child);
|
|
childrenMap.remove(item.getId());
|
|
return resourceDTO;
|
|
}).collect(Collectors.toList());
|
|
if (CollectionUtils.isNotEmpty(childrenMap)) {
|
|
List<Resource> childrenList = new ArrayList<>();
|
|
childrenMap.values().forEach(childrenList::addAll);
|
|
List<ResourceDTO> childrenDTOs = childrenList.stream()
|
|
.map(item -> BeanCopyUtil.copyObject(item, ResourceDTO.class))
|
|
.collect(Collectors.toList());
|
|
resourceDTOs.addAll(childrenDTOs);
|
|
}
|
|
return resourceDTOs;
|
|
}
|
|
|
|
@Override
|
|
public List<LabelOptionDTO> listResourceOption() {
|
|
List<Resource> resources = resourceMapper.selectList(new LambdaQueryWrapper<Resource>()
|
|
.select(Resource::getId, Resource::getResourceName, Resource::getParentId)
|
|
.eq(Resource::getIsAnonymous, FALSE));
|
|
List<Resource> parents = listResourceModule(resources);
|
|
Map<Integer, List<Resource>> childrenMap = listResourceChildren(resources);
|
|
return parents.stream().map(item -> {
|
|
List<LabelOptionDTO> list = new ArrayList<>();
|
|
List<Resource> children = childrenMap.get(item.getId());
|
|
if (CollectionUtils.isNotEmpty(children)) {
|
|
list = children.stream()
|
|
.map(resource -> LabelOptionDTO.builder()
|
|
.id(resource.getId())
|
|
.label(resource.getResourceName())
|
|
.build())
|
|
.collect(Collectors.toList());
|
|
}
|
|
return LabelOptionDTO.builder()
|
|
.id(item.getId())
|
|
.label(item.getResourceName())
|
|
.children(list)
|
|
.build();
|
|
}).collect(Collectors.toList());
|
|
}
|
|
|
|
|
|
private List<Resource> listResourceModule(List<Resource> resourceList) {
|
|
return resourceList.stream()
|
|
.filter(item -> Objects.isNull(item.getParentId()))
|
|
.collect(Collectors.toList());
|
|
}
|
|
|
|
private Map<Integer, List<Resource>> listResourceChildren(List<Resource> resourceList) {
|
|
return resourceList.stream()
|
|
.filter(item -> Objects.nonNull(item.getParentId()))
|
|
.collect(Collectors.groupingBy(Resource::getParentId));
|
|
}
|
|
|
|
}
|