package tech.powerjob.server.web.service.impl; import com.google.common.collect.Lists; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Service; import tech.powerjob.common.exception.PowerJobException; import tech.powerjob.server.auth.LoginUserHolder; import tech.powerjob.server.auth.RoleScope; import tech.powerjob.server.auth.service.WebAuthService; import tech.powerjob.server.common.SJ; import tech.powerjob.common.enums.SwitchableStatus; import tech.powerjob.server.persistence.QueryConvertUtils; import tech.powerjob.server.persistence.remote.model.AppInfoDO; import tech.powerjob.server.persistence.remote.model.NamespaceDO; import tech.powerjob.server.persistence.remote.repository.AppInfoRepository; import tech.powerjob.server.persistence.remote.repository.NamespaceRepository; import tech.powerjob.server.web.request.ModifyNamespaceRequest; import tech.powerjob.server.web.request.QueryNamespaceRequest; import tech.powerjob.server.web.service.NamespaceWebService; import javax.annotation.Resource; import javax.persistence.criteria.Predicate; import java.util.Date; import java.util.List; import java.util.Optional; import java.util.UUID; import java.util.stream.Collectors; /** * NamespaceWebService * * @author tjq * @since 2024/2/15 */ @Service public class NamespaceWebServiceImpl implements NamespaceWebService { @Resource private WebAuthService webAuthService; @Resource private AppInfoRepository appInfoRepository; @Resource private NamespaceRepository namespaceRepository; @Override public NamespaceDO save(ModifyNamespaceRequest req) { req.valid(); Long id = req.getId(); NamespaceDO namespaceDO; boolean isCreate = id == null; if (isCreate) { namespaceDO = new NamespaceDO(); namespaceDO.setGmtCreate(new Date()); // code 单独拷贝 namespaceDO.setCode(req.getCode()); // 创建时生成 token namespaceDO.setToken(UUID.randomUUID().toString()); namespaceDO.setCreator(LoginUserHolder.getUserId()); } else { namespaceDO = fetchById(id); namespaceDO.setModifier(LoginUserHolder.getUserId()); if (!namespaceDO.getCode().equalsIgnoreCase(req.getCode())) { throw new IllegalArgumentException("NOT_ALLOW_CHANGE_THE_NAMESPACE_CODE"); } } // 拷贝通用变更属性(code 不允许更改) namespaceDO.setTags(req.getTags()); namespaceDO.setName(req.getName()); namespaceDO.setExtra(req.getExtra()); namespaceDO.setStatus(Optional.ofNullable(req.getStatus()).orElse(SwitchableStatus.ENABLE.getV())); namespaceDO.setGmtModified(new Date()); NamespaceDO savedNamespace = namespaceRepository.save(namespaceDO); // 授权 webAuthService.processPermissionOnSave(RoleScope.NAMESPACE, savedNamespace.getId(), req.getComponentUserRoleInfo()); return savedNamespace; } @Override public void delete(Long id) { List appInfosInNamespace = appInfoRepository.findAllByNamespaceId(id); if (CollectionUtils.isNotEmpty(appInfosInNamespace)) { List relatedApps = appInfosInNamespace.stream().map(AppInfoDO::getAppName).collect(Collectors.toList()); throw new PowerJobException("Unable to delete due to associated apps: " + SJ.COMMA_JOINER.join(relatedApps)); } namespaceRepository.deleteById(id); } @Override public Optional findById(Long id) { if (id == null) { return Optional.empty(); } return namespaceRepository.findById(id); } @Override public Page list(QueryNamespaceRequest queryNamespaceRequest) { String codeLike = queryNamespaceRequest.getCodeLike(); String nameLike = queryNamespaceRequest.getNameLike(); String tagLike = queryNamespaceRequest.getTagLike(); Pageable pageable = PageRequest.of(queryNamespaceRequest.getIndex(), queryNamespaceRequest.getPageSize()); Specification specification = (root, query, cb) -> { List predicates = Lists.newArrayList(); if (StringUtils.isNotEmpty(codeLike)) { predicates.add(cb.like(root.get("code"), QueryConvertUtils.convertLikeParams(codeLike))); } if (StringUtils.isNotEmpty(nameLike)) { predicates.add(cb.like(root.get("name"), QueryConvertUtils.convertLikeParams(nameLike))); } if (StringUtils.isNotEmpty(tagLike)) { predicates.add(cb.like(root.get("tags"), QueryConvertUtils.convertLikeParams(tagLike))); } if (predicates.isEmpty()) { return null; } return query.where(predicates.toArray(new Predicate[0])).getRestriction(); }; return namespaceRepository.findAll(specification, pageable); } @Override public List listAll() { return namespaceRepository.findAll(); } private NamespaceDO fetchById(Long id) { Optional namespaceDoOpt = namespaceRepository.findById(id); if (!namespaceDoOpt.isPresent()) { throw new IllegalArgumentException("can't find namespace by id: " + id); } return namespaceDoOpt.get(); } }