曹聚阳
4 years ago
13 changed files with 799 additions and 533 deletions
@ -0,0 +1,443 @@ |
|||||||
|
/* |
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more |
||||||
|
* contributor license agreements. See the NOTICE file distributed with |
||||||
|
* this work for additional information regarding copyright ownership. |
||||||
|
* The ASF licenses this file to You under the Apache License, Version 2.0 |
||||||
|
* (the "License"); you may not use this file except in compliance with |
||||||
|
* the License. You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
package org.apache.dolphinscheduler.api.service.impl; |
||||||
|
|
||||||
|
import static org.apache.dolphinscheduler.api.utils.CheckUtils.checkDesc; |
||||||
|
|
||||||
|
import org.apache.dolphinscheduler.api.enums.Status; |
||||||
|
import org.apache.dolphinscheduler.api.service.BaseService; |
||||||
|
import org.apache.dolphinscheduler.api.service.ProjectService; |
||||||
|
import org.apache.dolphinscheduler.api.utils.PageInfo; |
||||||
|
import org.apache.dolphinscheduler.common.Constants; |
||||||
|
import org.apache.dolphinscheduler.common.enums.UserType; |
||||||
|
import org.apache.dolphinscheduler.dao.entity.ProcessDefinition; |
||||||
|
import org.apache.dolphinscheduler.dao.entity.Project; |
||||||
|
import org.apache.dolphinscheduler.dao.entity.ProjectUser; |
||||||
|
import org.apache.dolphinscheduler.dao.entity.User; |
||||||
|
import org.apache.dolphinscheduler.dao.mapper.ProcessDefinitionMapper; |
||||||
|
import org.apache.dolphinscheduler.dao.mapper.ProjectMapper; |
||||||
|
import org.apache.dolphinscheduler.dao.mapper.ProjectUserMapper; |
||||||
|
|
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.Date; |
||||||
|
import java.util.HashMap; |
||||||
|
import java.util.HashSet; |
||||||
|
import java.util.List; |
||||||
|
import java.util.Map; |
||||||
|
import java.util.Set; |
||||||
|
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||||
|
import org.springframework.stereotype.Service; |
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.metadata.IPage; |
||||||
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
||||||
|
|
||||||
|
/** |
||||||
|
* project service implement |
||||||
|
**/ |
||||||
|
@Service |
||||||
|
public class ProjectServiceImpl extends BaseService implements ProjectService { |
||||||
|
|
||||||
|
@Autowired |
||||||
|
private ProjectMapper projectMapper; |
||||||
|
|
||||||
|
@Autowired |
||||||
|
private ProjectUserMapper projectUserMapper; |
||||||
|
|
||||||
|
@Autowired |
||||||
|
private ProcessDefinitionMapper processDefinitionMapper; |
||||||
|
|
||||||
|
/** |
||||||
|
* create project |
||||||
|
* |
||||||
|
* @param loginUser login user |
||||||
|
* @param name project name |
||||||
|
* @param desc description |
||||||
|
* @return returns an error if it exists |
||||||
|
*/ |
||||||
|
public Map<String, Object> createProject(User loginUser, String name, String desc) { |
||||||
|
|
||||||
|
Map<String, Object> result = new HashMap<>(); |
||||||
|
Map<String, Object> descCheck = checkDesc(desc); |
||||||
|
if (descCheck.get(Constants.STATUS) != Status.SUCCESS) { |
||||||
|
return descCheck; |
||||||
|
} |
||||||
|
|
||||||
|
Project project = projectMapper.queryByName(name); |
||||||
|
if (project != null) { |
||||||
|
putMsg(result, Status.PROJECT_ALREADY_EXISTS, name); |
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
Date now = new Date(); |
||||||
|
|
||||||
|
project = Project |
||||||
|
.newBuilder() |
||||||
|
.name(name) |
||||||
|
.description(desc) |
||||||
|
.userId(loginUser.getId()) |
||||||
|
.userName(loginUser.getUserName()) |
||||||
|
.createTime(now) |
||||||
|
.updateTime(now) |
||||||
|
.build(); |
||||||
|
|
||||||
|
if (projectMapper.insert(project) > 0) { |
||||||
|
Project insertedProject = projectMapper.queryByName(name); |
||||||
|
result.put(Constants.DATA_LIST, insertedProject); |
||||||
|
putMsg(result, Status.SUCCESS); |
||||||
|
} else { |
||||||
|
putMsg(result, Status.CREATE_PROJECT_ERROR); |
||||||
|
} |
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* query project details by id |
||||||
|
* |
||||||
|
* @param projectId project id |
||||||
|
* @return project detail information |
||||||
|
*/ |
||||||
|
public Map<String, Object> queryById(Integer projectId) { |
||||||
|
|
||||||
|
Map<String, Object> result = new HashMap<>(); |
||||||
|
Project project = projectMapper.selectById(projectId); |
||||||
|
|
||||||
|
if (project != null) { |
||||||
|
result.put(Constants.DATA_LIST, project); |
||||||
|
putMsg(result, Status.SUCCESS); |
||||||
|
} else { |
||||||
|
putMsg(result, Status.PROJECT_NOT_FOUNT, projectId); |
||||||
|
} |
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* check project and authorization |
||||||
|
* |
||||||
|
* @param loginUser login user |
||||||
|
* @param project project |
||||||
|
* @param projectName project name |
||||||
|
* @return true if the login user have permission to see the project |
||||||
|
*/ |
||||||
|
public Map<String, Object> checkProjectAndAuth(User loginUser, Project project, String projectName) { |
||||||
|
Map<String, Object> result = new HashMap<>(); |
||||||
|
if (project == null) { |
||||||
|
putMsg(result, Status.PROJECT_NOT_FOUNT, projectName); |
||||||
|
} else if (!checkReadPermission(loginUser, project)) { |
||||||
|
// check read permission
|
||||||
|
putMsg(result, Status.USER_NO_OPERATION_PROJECT_PERM, loginUser.getUserName(), projectName); |
||||||
|
} else { |
||||||
|
putMsg(result, Status.SUCCESS); |
||||||
|
} |
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
public boolean hasProjectAndPerm(User loginUser, Project project, Map<String, Object> result) { |
||||||
|
boolean checkResult = false; |
||||||
|
if (project == null) { |
||||||
|
putMsg(result, Status.PROJECT_NOT_FOUNT, ""); |
||||||
|
} else if (!checkReadPermission(loginUser, project)) { |
||||||
|
putMsg(result, Status.USER_NO_OPERATION_PROJECT_PERM, loginUser.getUserName(), project.getName()); |
||||||
|
} else { |
||||||
|
checkResult = true; |
||||||
|
} |
||||||
|
return checkResult; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* admin can view all projects |
||||||
|
* |
||||||
|
* @param loginUser login user |
||||||
|
* @param searchVal search value |
||||||
|
* @param pageSize page size |
||||||
|
* @param pageNo page number |
||||||
|
* @return project list which the login user have permission to see |
||||||
|
*/ |
||||||
|
public Map<String, Object> queryProjectListPaging(User loginUser, Integer pageSize, Integer pageNo, String searchVal) { |
||||||
|
Map<String, Object> result = new HashMap<>(); |
||||||
|
PageInfo<Project> pageInfo = new PageInfo<>(pageNo, pageSize); |
||||||
|
|
||||||
|
Page<Project> page = new Page<>(pageNo, pageSize); |
||||||
|
|
||||||
|
int userId = loginUser.getUserType() == UserType.ADMIN_USER ? 0 : loginUser.getId(); |
||||||
|
IPage<Project> projectIPage = projectMapper.queryProjectListPaging(page, userId, searchVal); |
||||||
|
|
||||||
|
List<Project> projectList = projectIPage.getRecords(); |
||||||
|
if (userId != 0) { |
||||||
|
for (Project project : projectList) { |
||||||
|
project.setPerm(Constants.DEFAULT_ADMIN_PERMISSION); |
||||||
|
} |
||||||
|
} |
||||||
|
pageInfo.setTotalCount((int) projectIPage.getTotal()); |
||||||
|
pageInfo.setLists(projectList); |
||||||
|
result.put(Constants.COUNT, (int) projectIPage.getTotal()); |
||||||
|
result.put(Constants.DATA_LIST, pageInfo); |
||||||
|
putMsg(result, Status.SUCCESS); |
||||||
|
|
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* delete project by id |
||||||
|
* |
||||||
|
* @param loginUser login user |
||||||
|
* @param projectId project id |
||||||
|
* @return delete result code |
||||||
|
*/ |
||||||
|
public Map<String, Object> deleteProject(User loginUser, Integer projectId) { |
||||||
|
Map<String, Object> result = new HashMap<>(); |
||||||
|
Project project = projectMapper.selectById(projectId); |
||||||
|
Map<String, Object> checkResult = getCheckResult(loginUser, project); |
||||||
|
if (checkResult != null) { |
||||||
|
return checkResult; |
||||||
|
} |
||||||
|
|
||||||
|
if (!hasPerm(loginUser, project.getUserId())) { |
||||||
|
putMsg(result, Status.USER_NO_OPERATION_PERM); |
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
List<ProcessDefinition> processDefinitionList = processDefinitionMapper.queryAllDefinitionList(projectId); |
||||||
|
|
||||||
|
if (!processDefinitionList.isEmpty()) { |
||||||
|
putMsg(result, Status.DELETE_PROJECT_ERROR_DEFINES_NOT_NULL); |
||||||
|
return result; |
||||||
|
} |
||||||
|
int delete = projectMapper.deleteById(projectId); |
||||||
|
if (delete > 0) { |
||||||
|
putMsg(result, Status.SUCCESS); |
||||||
|
} else { |
||||||
|
putMsg(result, Status.DELETE_PROJECT_ERROR); |
||||||
|
} |
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* get check result |
||||||
|
* |
||||||
|
* @param loginUser login user |
||||||
|
* @param project project |
||||||
|
* @return check result |
||||||
|
*/ |
||||||
|
private Map<String, Object> getCheckResult(User loginUser, Project project) { |
||||||
|
String projectName = project == null ? null : project.getName(); |
||||||
|
Map<String, Object> checkResult = checkProjectAndAuth(loginUser, project, projectName); |
||||||
|
Status status = (Status) checkResult.get(Constants.STATUS); |
||||||
|
if (status != Status.SUCCESS) { |
||||||
|
return checkResult; |
||||||
|
} |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* updateProcessInstance project |
||||||
|
* |
||||||
|
* @param loginUser login user |
||||||
|
* @param projectId project id |
||||||
|
* @param projectName project name |
||||||
|
* @param desc description |
||||||
|
* @return update result code |
||||||
|
*/ |
||||||
|
public Map<String, Object> update(User loginUser, Integer projectId, String projectName, String desc) { |
||||||
|
Map<String, Object> result = new HashMap<>(); |
||||||
|
|
||||||
|
Map<String, Object> descCheck = checkDesc(desc); |
||||||
|
if (descCheck.get(Constants.STATUS) != Status.SUCCESS) { |
||||||
|
return descCheck; |
||||||
|
} |
||||||
|
|
||||||
|
Project project = projectMapper.selectById(projectId); |
||||||
|
boolean hasProjectAndPerm = hasProjectAndPerm(loginUser, project, result); |
||||||
|
if (!hasProjectAndPerm) { |
||||||
|
return result; |
||||||
|
} |
||||||
|
Project tempProject = projectMapper.queryByName(projectName); |
||||||
|
if (tempProject != null && tempProject.getId() != projectId) { |
||||||
|
putMsg(result, Status.PROJECT_ALREADY_EXISTS, projectName); |
||||||
|
return result; |
||||||
|
} |
||||||
|
project.setName(projectName); |
||||||
|
project.setDescription(desc); |
||||||
|
project.setUpdateTime(new Date()); |
||||||
|
|
||||||
|
int update = projectMapper.updateById(project); |
||||||
|
if (update > 0) { |
||||||
|
putMsg(result, Status.SUCCESS); |
||||||
|
} else { |
||||||
|
putMsg(result, Status.UPDATE_PROJECT_ERROR); |
||||||
|
} |
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* query unauthorized project |
||||||
|
* |
||||||
|
* @param loginUser login user |
||||||
|
* @param userId user id |
||||||
|
* @return the projects which user have not permission to see |
||||||
|
*/ |
||||||
|
public Map<String, Object> queryUnauthorizedProject(User loginUser, Integer userId) { |
||||||
|
Map<String, Object> result = new HashMap<>(); |
||||||
|
if (checkAdmin(loginUser, result)) { |
||||||
|
return result; |
||||||
|
} |
||||||
|
/** |
||||||
|
* query all project list except specified userId |
||||||
|
*/ |
||||||
|
List<Project> projectList = projectMapper.queryProjectExceptUserId(userId); |
||||||
|
List<Project> resultList = new ArrayList<>(); |
||||||
|
Set<Project> projectSet = null; |
||||||
|
if (projectList != null && !projectList.isEmpty()) { |
||||||
|
projectSet = new HashSet<>(projectList); |
||||||
|
|
||||||
|
List<Project> authedProjectList = projectMapper.queryAuthedProjectListByUserId(userId); |
||||||
|
|
||||||
|
resultList = getUnauthorizedProjects(projectSet, authedProjectList); |
||||||
|
} |
||||||
|
result.put(Constants.DATA_LIST, resultList); |
||||||
|
putMsg(result, Status.SUCCESS); |
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* get unauthorized project |
||||||
|
* |
||||||
|
* @param projectSet project set |
||||||
|
* @param authedProjectList authed project list |
||||||
|
* @return project list that authorization |
||||||
|
*/ |
||||||
|
private List<Project> getUnauthorizedProjects(Set<Project> projectSet, List<Project> authedProjectList) { |
||||||
|
List<Project> resultList; |
||||||
|
Set<Project> authedProjectSet = null; |
||||||
|
if (authedProjectList != null && !authedProjectList.isEmpty()) { |
||||||
|
authedProjectSet = new HashSet<>(authedProjectList); |
||||||
|
projectSet.removeAll(authedProjectSet); |
||||||
|
|
||||||
|
} |
||||||
|
resultList = new ArrayList<>(projectSet); |
||||||
|
return resultList; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* query authorized project |
||||||
|
* |
||||||
|
* @param loginUser login user |
||||||
|
* @param userId user id |
||||||
|
* @return projects which the user have permission to see, Except for items created by this user |
||||||
|
*/ |
||||||
|
public Map<String, Object> queryAuthorizedProject(User loginUser, Integer userId) { |
||||||
|
Map<String, Object> result = new HashMap<>(); |
||||||
|
|
||||||
|
if (checkAdmin(loginUser, result)) { |
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
List<Project> projects = projectMapper.queryAuthedProjectListByUserId(userId); |
||||||
|
result.put(Constants.DATA_LIST, projects); |
||||||
|
putMsg(result, Status.SUCCESS); |
||||||
|
|
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* query authorized project |
||||||
|
* |
||||||
|
* @param loginUser login user |
||||||
|
* @return projects which the user have permission to see, Except for items created by this user |
||||||
|
*/ |
||||||
|
public Map<String, Object> queryProjectCreatedByUser(User loginUser) { |
||||||
|
Map<String, Object> result = new HashMap<>(); |
||||||
|
|
||||||
|
if (checkAdmin(loginUser, result)) { |
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
List<Project> projects = projectMapper.queryProjectCreatedByUser(loginUser.getId()); |
||||||
|
result.put(Constants.DATA_LIST, projects); |
||||||
|
putMsg(result, Status.SUCCESS); |
||||||
|
|
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* check whether have read permission |
||||||
|
* |
||||||
|
* @param user user |
||||||
|
* @param project project |
||||||
|
* @return true if the user have permission to see the project, otherwise return false |
||||||
|
*/ |
||||||
|
private boolean checkReadPermission(User user, Project project) { |
||||||
|
int permissionId = queryPermission(user, project); |
||||||
|
return (permissionId & Constants.READ_PERMISSION) != 0; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* query permission id |
||||||
|
* |
||||||
|
* @param user user |
||||||
|
* @param project project |
||||||
|
* @return permission |
||||||
|
*/ |
||||||
|
private int queryPermission(User user, Project project) { |
||||||
|
if (user.getUserType() == UserType.ADMIN_USER) { |
||||||
|
return Constants.READ_PERMISSION; |
||||||
|
} |
||||||
|
|
||||||
|
if (project.getUserId() == user.getId()) { |
||||||
|
return Constants.ALL_PERMISSIONS; |
||||||
|
} |
||||||
|
|
||||||
|
ProjectUser projectUser = projectUserMapper.queryProjectRelation(project.getId(), user.getId()); |
||||||
|
|
||||||
|
if (projectUser == null) { |
||||||
|
return 0; |
||||||
|
} |
||||||
|
|
||||||
|
return projectUser.getPerm(); |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* query all project list that have one or more process definitions. |
||||||
|
* |
||||||
|
* @return project list |
||||||
|
*/ |
||||||
|
public Map<String, Object> queryAllProjectList() { |
||||||
|
Map<String, Object> result = new HashMap<>(); |
||||||
|
List<Project> projects = projectMapper.selectList(null); |
||||||
|
List<ProcessDefinition> processDefinitions = processDefinitionMapper.selectList(null); |
||||||
|
if (projects != null) { |
||||||
|
Set<Integer> set = new HashSet<>(); |
||||||
|
for (ProcessDefinition processDefinition : processDefinitions) { |
||||||
|
set.add(processDefinition.getProjectId()); |
||||||
|
} |
||||||
|
List<Project> tempDeletelist = new ArrayList<>(); |
||||||
|
for (Project project : projects) { |
||||||
|
if (!set.contains(project.getId())) { |
||||||
|
tempDeletelist.add(project); |
||||||
|
} |
||||||
|
} |
||||||
|
projects.removeAll(tempDeletelist); |
||||||
|
} |
||||||
|
result.put(Constants.DATA_LIST, projects); |
||||||
|
putMsg(result, Status.SUCCESS); |
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
} |
Loading…
Reference in new issue