package tech.powerjob.server.web.controller; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.data.domain.Page; import org.springframework.web.bind.annotation.*; import tech.powerjob.common.response.ResultDTO; import tech.powerjob.server.auth.Permission; import tech.powerjob.server.auth.RoleScope; import tech.powerjob.server.auth.common.AuthConstants; import tech.powerjob.server.auth.interceptor.ApiPermission; import tech.powerjob.server.auth.plugin.ModifyOrCreateDynamicPermission; import tech.powerjob.server.auth.plugin.SaveNamespaceGrantPermissionPlugin; import tech.powerjob.server.auth.service.WebAuthService; import tech.powerjob.server.persistence.PageResult; import tech.powerjob.server.persistence.remote.model.NamespaceDO; import tech.powerjob.server.web.converter.NamespaceConverter; import tech.powerjob.server.web.request.ComponentUserRoleInfo; import tech.powerjob.server.web.request.ModifyNamespaceRequest; import tech.powerjob.server.web.request.QueryNamespaceRequest; import tech.powerjob.server.web.response.NamespaceBaseVO; import tech.powerjob.server.web.response.NamespaceVO; import tech.powerjob.server.web.response.UserBaseVO; import tech.powerjob.server.web.service.NamespaceWebService; import tech.powerjob.server.web.service.UserWebService; import javax.annotation.Resource; import java.util.List; import java.util.stream.Collectors; /** * 命名空间 Controller * * @author tjq * @since 2023/9/3 */ @Slf4j @RestController @RequestMapping("/namespace") public class NamespaceController { @Resource private WebAuthService webAuthService; @Resource private UserWebService userWebService; @Resource private NamespaceWebService namespaceWebService; @ResponseBody @PostMapping("/save") @ApiPermission(name = "Namespace-Save", roleScope = RoleScope.NAMESPACE, dynamicPermissionPlugin = ModifyOrCreateDynamicPermission.class, grandPermissionPlugin = SaveNamespaceGrantPermissionPlugin.class) public ResultDTO save(@RequestBody ModifyNamespaceRequest req) { NamespaceDO savedNamespace = namespaceWebService.save(req); return ResultDTO.success(NamespaceConverter.do2BaseVo(savedNamespace)); } @DeleteMapping("/delete") @ApiPermission(name = "Namespace-Delete", roleScope = RoleScope.NAMESPACE, requiredPermission = Permission.SU) public ResultDTO deleteNamespace(Long id) { namespaceWebService.delete(id); return ResultDTO.success(null); } @PostMapping("/list") @ApiPermission(name = "Namespace-List", roleScope = RoleScope.NAMESPACE, requiredPermission = Permission.NONE) public ResultDTO> listNamespace(@RequestBody QueryNamespaceRequest queryNamespaceRequest) { Page namespacePageResult = namespaceWebService.list(queryNamespaceRequest); PageResult ret = new PageResult<>(namespacePageResult); ret.setData(namespacePageResult.get().map(x -> { NamespaceVO detailVo = new NamespaceVO(); NamespaceBaseVO baseVO = NamespaceConverter.do2BaseVo(x); BeanUtils.copyProperties(baseVO, detailVo); fillDetail(x, detailVo); return detailVo; }).collect(Collectors.toList())); return ResultDTO.success(ret); } @PostMapping("/listAll") @ApiPermission(name = "Namespace-ListAll", roleScope = RoleScope.NAMESPACE, requiredPermission = Permission.NONE) public ResultDTO> listAll() { // 数量应该不是很多,先简单处理,不查询精简对象 List namespaceRepositoryAll = namespaceWebService.listAll(); List namespaceBaseVOList = namespaceRepositoryAll.stream().map(nd -> { NamespaceBaseVO nv = new NamespaceBaseVO(); nv.setId(nd.getId()); nv.setCode(nd.getCode()); nv.setName(nd.getName()); nv.genShowName(); return nv; }).collect(Collectors.toList()); return ResultDTO.success(namespaceBaseVOList); } private void fillDetail(NamespaceDO namespaceDO, NamespaceVO namespaceVO) { Long namespaceId = namespaceVO.getId(); // 权限用户关系 ComponentUserRoleInfo componentUserRoleInfo = webAuthService.fetchComponentUserRoleInfo(RoleScope.NAMESPACE, namespaceId); namespaceVO.setComponentUserRoleInfo(componentUserRoleInfo); // 有权限用户填充 token boolean hasPermission = webAuthService.hasPermission(RoleScope.NAMESPACE, namespaceId, Permission.READ); namespaceVO.setToken(hasPermission ? namespaceDO.getToken() : AuthConstants.TIPS_NO_PERMISSION_TO_SEE); // 用户信息 namespaceVO.setCreatorShowName(userWebService.fetchBaseUserInfo(namespaceDO.getCreator()).map(UserBaseVO::getShowName).orElse(null)); namespaceVO.setModifierShowName(userWebService.fetchBaseUserInfo(namespaceDO.getModifier()).map(UserBaseVO::getShowName).orElse(null)); } }