package com.qmth.ops.biz.service; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.qmth.ops.api.security.Permission; import com.qmth.ops.biz.dao.UserPermissionDao; import com.qmth.ops.biz.domain.*; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.List; @Service public class UserPermissionService extends ServiceImpl { @Resource private UserPermissionDao userPermissionDao; @Resource private AppService appService; @Resource private EnvService envService; @Resource private DeployService deployService; public List listByUser(User user) { return userPermissionDao .selectList(new LambdaQueryWrapper().eq(UserPermission::getUserId, user.getId())); } public UserPermission findByUserAndPermission(User user, Permission permission) { return userPermissionDao.selectOne( new LambdaQueryWrapper().eq(UserPermission::getUserId, user.getId()) .eq(UserPermission::getPermission, permission)); } @Transactional public void save(User user, Permission permission, String scope) { userPermissionDao.save(user.getId(), permission, scope); } @Transactional public void delete(User user, Permission permission) { userPermissionDao.delete(new LambdaUpdateWrapper().eq(UserPermission::getUserId, user.getId()) .eq(UserPermission::getPermission, permission)); } public boolean hasPermission(User user, Permission permission, Object data) { UserPermission up = findByUserAndPermission(user, permission); if (up == null) { return false; } if (permission.getScope() == null) { return true; } String scope = up.getScope(); if (UserPermission.UNLIMIT_SCOPE.equals(scope)) { return true; } try { switch (permission.getScope()) { case APP: App app = appService.getById((Long) data); return app != null && up.getDataSet().contains(app.getId()); case ENV: Env env = envService.getById((Long) data); return env != null && up.getDataSet().contains(env.getId()); case DEPLOY: Deploy deploy = deployService.getById((Long) data); return deploy != null && up.getDataSet().contains(deploy.getId()); } } catch (Exception ignored) { } return false; } }