diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/WorkflowDefinitionController.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/WorkflowDefinitionController.java index 925921ead3b3..29885ed4ac4e 100644 --- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/WorkflowDefinitionController.java +++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/WorkflowDefinitionController.java @@ -568,7 +568,8 @@ public Result>> getNodeListMapByDefinitionCodes(@ @ApiException(GET_TASKS_LIST_BY_WORKFLOW_DEFINITION_CODE_ERROR) public Result> getWorkflowListByProjectCode(@Parameter(hidden = true) @RequestAttribute(value = Constants.SESSION_USER) User loginUser, @Parameter(name = "projectCode", description = "PROJECT_CODE", required = true) @PathVariable long projectCode) { - return Result.success(workflowDefinitionService.queryWorkflowDefinitionListByProjectCode(projectCode)); + return Result.success( + workflowDefinitionService.queryWorkflowDefinitionListByProjectCode(loginUser, projectCode)); } /** @@ -590,7 +591,7 @@ public Result> getTaskListByWorkflowDefinition @Parameter(name = "projectCode", description = "PROJECT_CODE", required = true) @PathVariable long projectCode, @RequestParam(value = "workflowDefinitionCode") Long workflowDefinitionCode) { return Result.success(workflowDefinitionService - .queryTaskDefinitionListByWorkflowDefinitionCode(projectCode, workflowDefinitionCode)); + .queryTaskDefinitionListByWorkflowDefinitionCode(loginUser, projectCode, workflowDefinitionCode)); } @Operation(summary = "deleteByWorkflowDefinitionCode", description = "DELETE_WORKFLOW_DEFINITION_BY_ID_NOTES") diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/WorkflowLineageController.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/WorkflowLineageController.java index c5e87baa4eee..1d56abbbc1a7 100644 --- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/WorkflowLineageController.java +++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/WorkflowLineageController.java @@ -75,7 +75,7 @@ public Result> queryWorkFlowLineageByName(@Paramete @RequestParam(value = "workflowDefinitionName", required = false) String workflowDefinitionName) { workflowDefinitionName = ParameterUtils.handleEscapes(workflowDefinitionName); List workFlowLineages = - workflowLineageService.queryWorkFlowLineageByName(projectCode, workflowDefinitionName); + workflowLineageService.queryWorkFlowLineageByName(loginUser, projectCode, workflowDefinitionName); return Result.success(workFlowLineages); } @@ -86,7 +86,8 @@ public Result> queryWorkFlowLineageByName(@Paramete public Result> queryWorkFlowLineageByCode(@Parameter(hidden = true) @RequestAttribute(value = SESSION_USER) User loginUser, @Parameter(name = "projectCode", description = "PROJECT_CODE", required = true) @PathVariable long projectCode, @PathVariable(value = "workFlowCode") long workFlowCode) { - WorkFlowLineage workFlowLineage = workflowLineageService.queryWorkFlowLineageByCode(projectCode, workFlowCode); + WorkFlowLineage workFlowLineage = + workflowLineageService.queryWorkFlowLineageByCode(loginUser, projectCode, workFlowCode); Map result = new HashMap<>(); result.put(Constants.DATA_LIST, workFlowLineage); return Result.success(result); @@ -100,7 +101,7 @@ public Result> queryWorkFlowLineage(@Parameter(hidden = true @Parameter(name = "projectCode", description = "PROJECT_CODE", required = true) @PathVariable long projectCode) { try { Map result = new HashMap<>(); - WorkFlowLineage workFlowLineage = workflowLineageService.queryWorkFlowLineage(projectCode); + WorkFlowLineage workFlowLineage = workflowLineageService.queryWorkFlowLineage(loginUser, projectCode); result.put(Constants.DATA_LIST, workFlowLineage); return Result.success(result); } catch (Exception e) { @@ -133,7 +134,7 @@ public Result> verifyTaskCanDelete(@Parameter(hidden = true) @RequestParam(value = "taskCode") long taskCode) { Result> result = new Result<>(); Optional taskDepMsg = - workflowLineageService.taskDependentMsg(projectCode, workflowDefinitionCode, taskCode); + workflowLineageService.taskDependentMsg(loginUser, projectCode, workflowDefinitionCode, taskCode); if (taskDepMsg.isPresent()) { throw new ServiceException(taskDepMsg.get()); } @@ -158,7 +159,8 @@ public Result> queryDependentTasks(@Parameter(hidden = true) @RequestParam(value = "taskCode", required = false) Long taskCode) { Map result = new HashMap<>(); List dependentLineageTaskList = - workflowLineageService.queryDependentWorkflowDefinitions(projectCode, workFlowCode, taskCode); + workflowLineageService.queryDependentWorkflowDefinitions(loginUser, projectCode, workFlowCode, + taskCode); result.put(Constants.DATA_LIST, dependentLineageTaskList); return Result.success(result); } diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/WorkflowDefinitionService.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/WorkflowDefinitionService.java index 7113f806ebf4..5f404e75ae42 100644 --- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/WorkflowDefinitionService.java +++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/WorkflowDefinitionService.java @@ -171,12 +171,12 @@ Map> getNodeListMapByDefinitionCodes(User loginUser, /** * query workflow definition list by project code (simplified records used for dependent task picker) */ - List queryWorkflowDefinitionListByProjectCode(long projectCode); + List queryWorkflowDefinitionListByProjectCode(User loginUser, long projectCode); /** * query task definition list (simplified records) by workflow definition code */ - List queryTaskDefinitionListByWorkflowDefinitionCode(long projectCode, + List queryTaskDefinitionListByWorkflowDefinitionCode(User loginUser, long projectCode, Long workflowDefinitionCode); /** diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/WorkflowLineageService.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/WorkflowLineageService.java index 676c78863e47..64629118ceaf 100644 --- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/WorkflowLineageService.java +++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/WorkflowLineageService.java @@ -19,6 +19,7 @@ import org.apache.dolphinscheduler.dao.entity.DependentLineageTask; import org.apache.dolphinscheduler.dao.entity.DependentWorkflowDefinition; +import org.apache.dolphinscheduler.dao.entity.User; import org.apache.dolphinscheduler.dao.entity.WorkFlowLineage; import org.apache.dolphinscheduler.dao.entity.WorkFlowRelationDetail; import org.apache.dolphinscheduler.dao.entity.WorkflowDefinition; @@ -29,11 +30,12 @@ public interface WorkflowLineageService { - List queryWorkFlowLineageByName(long projectCode, String workflowDefinitionName); + List queryWorkFlowLineageByName(User loginUser, long projectCode, + String workflowDefinitionName); - WorkFlowLineage queryWorkFlowLineageByCode(long projectCode, long workflowDefinitionCode); + WorkFlowLineage queryWorkFlowLineageByCode(User loginUser, long projectCode, long workflowDefinitionCode); - WorkFlowLineage queryWorkFlowLineage(long projectCode); + WorkFlowLineage queryWorkFlowLineage(User loginUser, long projectCode); /** * Query downstream tasks depend on a workflow definition or a task @@ -70,9 +72,10 @@ List resolveDownstreamWorkflowDefinitionCodes(long rootWorkf * @param taskCode Task code want to query tasks dependence * @return dependent workflow definition */ - Optional taskDependentMsg(long projectCode, long workflowDefinitionCode, long taskCode); + Optional taskDependentMsg(User loginUser, long projectCode, long workflowDefinitionCode, long taskCode); - List queryDependentWorkflowDefinitions(long projectCode, long workflowDefinitionCode, + List queryDependentWorkflowDefinitions(User loginUser, long projectCode, + long workflowDefinitionCode, Long taskCode); /** diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/WorkflowDefinitionServiceImpl.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/WorkflowDefinitionServiceImpl.java index 8609057f8738..fecf8ec40641 100644 --- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/WorkflowDefinitionServiceImpl.java +++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/WorkflowDefinitionServiceImpl.java @@ -665,7 +665,7 @@ public WorkflowDefinition updateWorkflowDefinition(User loginUser, * @param workflowDefinition WorkflowDefinition you change task definition and task relation * @param taskRelationList All the latest task relation list from workflow definition */ - private void taskUsedInOtherTaskValid(WorkflowDefinition workflowDefinition, + private void taskUsedInOtherTaskValid(User loginUser, WorkflowDefinition workflowDefinition, List taskRelationList) { List oldWorkflowTaskRelationList = workflowTaskRelationDao.queryByWorkflowDefinitionCode(workflowDefinition.getCode()); @@ -677,7 +677,8 @@ private void taskUsedInOtherTaskValid(WorkflowDefinition workflowDefinition, .anyMatch(relation -> oldWorkflowTaskRelation.getPostTaskCode() == relation.getPostTaskCode()); if (!oldTaskExists) { Optional taskDepMsg = workflowLineageService.taskDependentMsg( - workflowDefinition.getProjectCode(), oldWorkflowTaskRelation.getWorkflowDefinitionCode(), + loginUser, workflowDefinition.getProjectCode(), + oldWorkflowTaskRelation.getWorkflowDefinitionCode(), oldWorkflowTaskRelation.getPostTaskCode()); taskDepMsg.ifPresent(sb::append); } @@ -745,7 +746,7 @@ protected WorkflowDefinition updateDagDefine(User loginUser, workflowDefinition.getCode(), insertVersion); workflowDefinition.setVersion(insertVersion); - taskUsedInOtherTaskValid(workflowDefinition, taskRelationList); + taskUsedInOtherTaskValid(loginUser, workflowDefinition, taskRelationList); int insertResult = processService.saveTaskRelation(loginUser, workflowDefinition.getProjectCode(), workflowDefinition.getCode(), insertVersion, taskRelationList, taskDefinitionLogs, Boolean.TRUE); if (insertResult != Constants.EXIT_CODE_SUCCESS) { @@ -833,7 +834,7 @@ public void batchDeleteWorkflowDefinitionByCodes(User loginUser, long projectCod * * @param workflowDefinition WorkflowDefinition you change task definition and task relation */ - private void workflowDefinitionUsedInOtherTaskValid(WorkflowDefinition workflowDefinition) { + private void workflowDefinitionUsedInOtherTaskValid(User loginUser, WorkflowDefinition workflowDefinition) { // check workflow definition is already online if (workflowDefinition.getReleaseState() == ReleaseState.ONLINE) { throw new ServiceException(Status.WORKFLOW_DEFINE_STATE_ONLINE, workflowDefinition.getName()); @@ -847,8 +848,8 @@ private void workflowDefinitionUsedInOtherTaskValid(WorkflowDefinition workflowD } // check workflow used by other task, including sub workflow and dependent task type - Optional taskDepMsg = workflowLineageService.taskDependentMsg(workflowDefinition.getProjectCode(), - workflowDefinition.getCode(), 0); + Optional taskDepMsg = workflowLineageService.taskDependentMsg(loginUser, + workflowDefinition.getProjectCode(), workflowDefinition.getCode(), 0); if (taskDepMsg.isPresent()) { String errorMeg = "workflow definition cannot be deleted because it has dependent, " + taskDepMsg.get(); @@ -870,7 +871,7 @@ public void deleteWorkflowDefinitionByCode(User loginUser, long code) { throw new ServiceException(Status.USER_NO_OPERATION_PERM); } - workflowDefinitionUsedInOtherTaskValid(workflowDefinition); + workflowDefinitionUsedInOtherTaskValid(loginUser, workflowDefinition); // get the timing according to the workflow definition Schedule scheduleObj = scheduleDao.queryByWorkflowDefinitionCode(code); @@ -1050,7 +1051,10 @@ public List queryAllWorkflowDefinitionByProjectCode(User loginUser, lon * @return workflow definition list in the project */ @Override - public List queryWorkflowDefinitionListByProjectCode(long projectCode) { + public List queryWorkflowDefinitionListByProjectCode(User loginUser, + long projectCode) { + Project project = projectDao.queryByCode(projectCode); + projectService.checkProjectAndAuthThrowException(loginUser, project, WORKFLOW_DEFINITION); return workflowDefinitionDao.queryDefinitionListByProjectCodeAndWorkflowDefinitionCodes(projectCode, null); } @@ -1062,8 +1066,11 @@ public List queryWorkflowDefinitionListByProjectCod * @return task definition list in the workflow definition */ @Override - public List queryTaskDefinitionListByWorkflowDefinitionCode(long projectCode, + public List queryTaskDefinitionListByWorkflowDefinitionCode(User loginUser, + long projectCode, Long workflowDefinitionCode) { + Project project = projectDao.queryByCode(projectCode); + projectService.checkProjectAndAuthThrowException(loginUser, project, WORKFLOW_DEFINITION); Set definitionCodesSet = new HashSet<>(); definitionCodesSet.add(workflowDefinitionCode); List workflowDefinitions = workflowDefinitionDao diff --git a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/WorkflowLineageServiceImpl.java b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/WorkflowLineageServiceImpl.java index 44241590d0b8..3df93b3dfa9e 100644 --- a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/WorkflowLineageServiceImpl.java +++ b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/WorkflowLineageServiceImpl.java @@ -17,8 +17,11 @@ package org.apache.dolphinscheduler.api.service.impl; +import static org.apache.dolphinscheduler.api.constants.ApiFuncIdentificationConstant.WORKFLOW_DEFINITION; + import org.apache.dolphinscheduler.api.enums.Status; import org.apache.dolphinscheduler.api.exceptions.ServiceException; +import org.apache.dolphinscheduler.api.service.ProjectService; import org.apache.dolphinscheduler.api.service.WorkflowLineageService; import org.apache.dolphinscheduler.common.constants.Constants; import org.apache.dolphinscheduler.common.enums.ReleaseState; @@ -26,6 +29,7 @@ import org.apache.dolphinscheduler.dao.entity.DependentWorkflowDefinition; import org.apache.dolphinscheduler.dao.entity.Project; import org.apache.dolphinscheduler.dao.entity.TaskDefinition; +import org.apache.dolphinscheduler.dao.entity.User; import org.apache.dolphinscheduler.dao.entity.WorkFlowLineage; import org.apache.dolphinscheduler.dao.entity.WorkFlowRelation; import org.apache.dolphinscheduler.dao.entity.WorkFlowRelationDetail; @@ -75,21 +79,28 @@ public class WorkflowLineageServiceImpl extends BaseServiceImpl implements Workf @Autowired private WorkflowDefinitionDao workflowDefinitionDao; + @Autowired + private ProjectService projectService; + @Override - public List queryWorkFlowLineageByName(long projectCode, String workflowDefinitionName) { + public List queryWorkFlowLineageByName(User loginUser, long projectCode, + String workflowDefinitionName) { Project project = projectDao.queryByCode(projectCode); if (project == null) { throw new ServiceException(Status.PROJECT_NOT_FOUND, projectCode); } + projectService.checkProjectAndAuthThrowException(loginUser, project, WORKFLOW_DEFINITION); return workflowTaskLineageDao.queryWorkFlowLineageByName(projectCode, workflowDefinitionName); } @Override - public WorkFlowLineage queryWorkFlowLineageByCode(long projectCode, long workflowDefinitionCode) { + public WorkFlowLineage queryWorkFlowLineageByCode(User loginUser, long projectCode, + long workflowDefinitionCode) { Project project = projectDao.queryByCode(projectCode); if (project == null) { throw new ServiceException(Status.PROJECT_NOT_FOUND, projectCode); } + projectService.checkProjectAndAuthThrowException(loginUser, project, WORKFLOW_DEFINITION); List upstreamWorkflowTaskLineageList = workflowTaskLineageDao.queryByWorkflowDefinitionCode(workflowDefinitionCode); List downstreamWorkflowTaskLineageList = @@ -117,11 +128,12 @@ public WorkFlowLineage queryWorkFlowLineageByCode(long projectCode, long workflo } @Override - public WorkFlowLineage queryWorkFlowLineage(long projectCode) { + public WorkFlowLineage queryWorkFlowLineage(User loginUser, long projectCode) { Project project = projectDao.queryByCode(projectCode); if (project == null) { throw new ServiceException(Status.PROJECT_NOT_FOUND, projectCode); } + projectService.checkProjectAndAuthThrowException(loginUser, project, WORKFLOW_DEFINITION); List workflowTaskLineageList = workflowTaskLineageDao.queryByProjectCode(projectCode); List workFlowRelationList = getWorkFlowRelations(workflowTaskLineageList); List workFlowRelationDetailList = @@ -174,7 +186,13 @@ private List getWorkflowRelationDetails(List workf * @return Optional of formatter message */ @Override - public Optional taskDependentMsg(long projectCode, long workflowDefinitionCode, long taskCode) { + public Optional taskDependentMsg(User loginUser, long projectCode, long workflowDefinitionCode, + long taskCode) { + Project project = projectDao.queryByCode(projectCode); + if (project == null) { + throw new ServiceException(Status.PROJECT_NOT_FOUND, projectCode); + } + projectService.checkProjectAndAuthThrowException(loginUser, project, WORKFLOW_DEFINITION); long queryTaskCode = 0; if (taskCode != 0) { queryTaskCode = taskCode; @@ -285,12 +303,14 @@ public List queryDownstreamDependentWorkflowDefinit } @Override - public List queryDependentWorkflowDefinitions(long projectCode, long workflowDefinitionCode, + public List queryDependentWorkflowDefinitions(User loginUser, long projectCode, + long workflowDefinitionCode, Long taskCode) { Project project = projectDao.queryByCode(projectCode); if (project == null) { throw new ServiceException(Status.PROJECT_NOT_FOUND, projectCode); } + projectService.checkProjectAndAuthThrowException(loginUser, project, WORKFLOW_DEFINITION); List dependentLineageTaskList = new ArrayList<>(); List workflowTaskLineageList = workflowTaskLineageDao.queryWorkFlowLineageByDept(projectCode, diff --git a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/WorkflowTaskLineageControllerTest.java b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/WorkflowTaskLineageControllerTest.java index 4d637c567581..5884d508ac99 100644 --- a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/WorkflowTaskLineageControllerTest.java +++ b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/controller/WorkflowTaskLineageControllerTest.java @@ -73,7 +73,7 @@ private void putMsg(Map result, Status status, Object... statusP public void testQueryWorkFlowLineageByName() { long projectCode = 1L; String searchVal = "test"; - Mockito.when(workFlowLineageService.queryWorkFlowLineageByName(projectCode, searchVal)) + Mockito.when(workFlowLineageService.queryWorkFlowLineageByName(user, projectCode, searchVal)) .thenReturn(Collections.emptyList()); assertDoesNotThrow(() -> workflowLineageController.queryWorkFlowLineageByName(user, projectCode, searchVal)); } diff --git a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/WorkflowDefinitionServiceTest.java b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/WorkflowDefinitionServiceTest.java index f3d129d8d3a0..3ea6da8fb3a9 100644 --- a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/WorkflowDefinitionServiceTest.java +++ b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/WorkflowDefinitionServiceTest.java @@ -581,7 +581,7 @@ public void deleteWorkflowDefinitionByCodeTest() { when(workflowDefinitionDao.queryByCode(46L)).thenReturn(Optional.of(workflowDefinition)); when(scheduleDao.queryByWorkflowDefinitionCode(46L)).thenReturn(getSchedule()); when(scheduleDao.deleteById(46)).thenReturn(true); - when(workflowLineageService.taskDependentMsg(project.getCode(), workflowDefinition.getCode(), 0)) + when(workflowLineageService.taskDependentMsg(user, project.getCode(), workflowDefinition.getCode(), 0)) .thenReturn(Optional.empty()); when(workflowLineageService.deleteWorkflowLineage(anyList())).thenReturn(1); workflowDefinitionService.deleteWorkflowDefinitionByCode(user, 46L); @@ -597,7 +597,7 @@ public void deleteWorkflowDefinitionByCodeTest() { // process used by other task, sub process user.setUserType(UserType.ADMIN_USER); TaskMainInfo taskMainInfo = getTaskMainInfo().get(0); - when(workflowLineageService.taskDependentMsg(project.getCode(), workflowDefinition.getCode(), 0)) + when(workflowLineageService.taskDependentMsg(user, project.getCode(), workflowDefinition.getCode(), 0)) .thenReturn(Optional.of(taskMainInfo.getTaskName())); exception = Assertions.assertThrows(ServiceException.class, () -> workflowDefinitionService.deleteWorkflowDefinitionByCode(user, 46L)); @@ -606,7 +606,7 @@ public void deleteWorkflowDefinitionByCodeTest() { schedule.setReleaseState(ReleaseState.OFFLINE); when(scheduleDao.queryByWorkflowDefinitionCode(46L)).thenReturn(getSchedule()); when(scheduleDao.deleteById(schedule.getId())).thenReturn(true); - when(workflowLineageService.taskDependentMsg(project.getCode(), workflowDefinition.getCode(), 0)) + when(workflowLineageService.taskDependentMsg(user, project.getCode(), workflowDefinition.getCode(), 0)) .thenReturn(Optional.empty()); when(workflowLineageService.deleteWorkflowLineage(anyList())).thenReturn(1); Assertions.assertDoesNotThrow(() -> workflowDefinitionService.deleteWorkflowDefinitionByCode(user, 46L)); @@ -661,7 +661,7 @@ public void batchDeleteWorkflowDefinitionByCodeTest() { // delete success process.setReleaseState(ReleaseState.OFFLINE); when(workflowDefinitionDao.queryByCode(processDefinitionCode)).thenReturn(Optional.of(process)); - when(workflowLineageService.taskDependentMsg(project.getCode(), process.getCode(), 0)) + when(workflowLineageService.taskDependentMsg(user, project.getCode(), process.getCode(), 0)) .thenReturn(Optional.empty()); Assertions.assertDoesNotThrow( () -> workflowDefinitionService.batchDeleteWorkflowDefinitionByCodes(user, projectCode, singleCodes)); diff --git a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/WorkflowTaskLineageServiceTest.java b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/WorkflowTaskLineageServiceTest.java index f391360f4a2a..32ed1703b9e6 100644 --- a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/WorkflowTaskLineageServiceTest.java +++ b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/WorkflowTaskLineageServiceTest.java @@ -27,6 +27,7 @@ import org.apache.dolphinscheduler.api.service.impl.WorkflowLineageServiceImpl; import org.apache.dolphinscheduler.dao.entity.Project; import org.apache.dolphinscheduler.dao.entity.TaskDefinition; +import org.apache.dolphinscheduler.dao.entity.User; import org.apache.dolphinscheduler.dao.entity.WorkFlowLineage; import org.apache.dolphinscheduler.dao.entity.WorkFlowRelation; import org.apache.dolphinscheduler.dao.entity.WorkFlowRelationDetail; @@ -69,6 +70,9 @@ public class WorkflowTaskLineageServiceTest { @Mock private WorkflowDefinitionDao workflowDefinitionDao; + @Mock + private ProjectService projectService; + /** * get mock Project * @@ -84,17 +88,41 @@ private Project getProject(String projectName) { return project; } + private User getLoginUser() { + User user = new User(); + user.setId(1); + user.setUserName("admin"); + return user; + } + @Test public void testQueryWorkFlowLineageByName() { Project project = getProject("test"); + User loginUser = getLoginUser(); String name = "test"; when(projectDao.queryByCode(1L)).thenReturn(project); when(workflowTaskLineageDao.queryWorkFlowLineageByName(Mockito.anyLong(), Mockito.any())) .thenReturn(getWorkFlowLineages()); - List workFlowLineages = workflowLineageService.queryWorkFlowLineageByName(1L, name); + List workFlowLineages = + workflowLineageService.queryWorkFlowLineageByName(loginUser, 1L, name); Assertions.assertTrue(CollectionUtils.isNotEmpty(workFlowLineages)); } + @Test + public void testQueryWorkFlowLineageByNameWithoutProjectPerm() { + Project project = getProject("test"); + User loginUser = getLoginUser(); + when(projectDao.queryByCode(1L)).thenReturn(project); + Mockito.doThrow(new ServiceException(Status.USER_NO_OPERATION_PROJECT_PERM, loginUser.getUserName(), + project.getCode())).when(projectService) + .checkProjectAndAuthThrowException(Mockito.eq(loginUser), Mockito.eq(project), Mockito.anyString()); + ServiceException exception = Assertions.assertThrows(ServiceException.class, + () -> workflowLineageService.queryWorkFlowLineageByName(loginUser, 1L, "test")); + Assertions.assertEquals(Status.USER_NO_OPERATION_PROJECT_PERM.getCode(), exception.getCode()); + Mockito.verify(workflowTaskLineageDao, Mockito.never()) + .queryWorkFlowLineageByName(Mockito.anyLong(), Mockito.any()); + } + @Test public void testQueryWorkFlowLineage() { Project project = getProject("test"); @@ -116,12 +144,13 @@ public void testQueryWorkFlowLineage() { workFlowRelationDetail.setWorkFlowName("testProcessDefinitionName"); workFlowRelationDetailList.add(workFlowRelationDetail); + User loginUser = getLoginUser(); when(projectDao.queryByCode(1L)).thenReturn(project); when(workflowTaskLineageDao.queryByProjectCode(project.getCode())).thenReturn(workflowTaskLineages); when(workflowTaskLineageDao.queryWorkFlowLineageByCode(workflowTaskLineage.getWorkflowDefinitionCode())) .thenReturn(workFlowRelationDetailList); - WorkFlowLineage workFlowLineage = workflowLineageService.queryWorkFlowLineage(1L); + WorkFlowLineage workFlowLineage = workflowLineageService.queryWorkFlowLineage(loginUser, 1L); List workFlowLineageList = workFlowLineage.getWorkFlowRelationDetailList(); @@ -146,6 +175,7 @@ public void testTaskDependentMsgWithOrphanedLineageRecord() { long projectCode = 1L; long workflowDefinitionCode = 100L; long taskCode = 200L; + User loginUser = getLoginUser(); // Create orphaned lineage record (taskDefinitionCode exists but taskDefinition is null) List dependentWorkflowList = new ArrayList<>(); @@ -159,6 +189,7 @@ public void testTaskDependentMsgWithOrphanedLineageRecord() { workflowDefinition.setCode(50L); workflowDefinition.setName("TestWorkflow"); + when(projectDao.queryByCode(projectCode)).thenReturn(getProject("test")); when(workflowTaskLineageDao.queryWorkFlowLineageByDept(projectCode, workflowDefinitionCode, taskCode)) .thenReturn(dependentWorkflowList); when(workflowDefinitionDao.queryByCode(50L)).thenReturn(Optional.of(workflowDefinition)); @@ -166,7 +197,7 @@ public void testTaskDependentMsgWithOrphanedLineageRecord() { // Should return Optional.empty() because all records are orphaned Optional result = - workflowLineageService.taskDependentMsg(projectCode, workflowDefinitionCode, taskCode); + workflowLineageService.taskDependentMsg(loginUser, projectCode, workflowDefinitionCode, taskCode); Assertions.assertFalse(result.isPresent()); } @@ -176,6 +207,7 @@ public void testTaskDependentMsgWithMixedValidAndOrphanedRecords() { long projectCode = 1L; long workflowDefinitionCode = 100L; long taskCode = 200L; + User loginUser = getLoginUser(); List dependentWorkflowList = new ArrayList<>(); @@ -205,6 +237,7 @@ public void testTaskDependentMsgWithMixedValidAndOrphanedRecords() { validTaskDefinition.setCode(300L); validTaskDefinition.setName("ValidTask"); + when(projectDao.queryByCode(projectCode)).thenReturn(getProject("test")); when(workflowTaskLineageDao.queryWorkFlowLineageByDept(projectCode, workflowDefinitionCode, taskCode)) .thenReturn(dependentWorkflowList); when(workflowDefinitionDao.queryByCode(50L)).thenReturn(Optional.of(workflowDefinition1)); @@ -219,7 +252,7 @@ public void testTaskDependentMsgWithMixedValidAndOrphanedRecords() { // Should return a message with only the valid record, skipping the orphaned one Optional result = - workflowLineageService.taskDependentMsg(projectCode, workflowDefinitionCode, taskCode); + workflowLineageService.taskDependentMsg(loginUser, projectCode, workflowDefinitionCode, taskCode); Assertions.assertTrue(result.isPresent()); String message = result.get(); Assertions.assertTrue(message.contains("ValidWorkflow")); @@ -234,6 +267,7 @@ public void testTaskDependentMsgWithEmptyListAfterFilteringOrphanedRecords() { long projectCode = 1L; long workflowDefinitionCode = 100L; long taskCode = 0L; // No specific task code + User loginUser = getLoginUser(); List dependentWorkflowList = new ArrayList<>(); WorkflowTaskLineage orphanedLineage = new WorkflowTaskLineage(); @@ -246,6 +280,7 @@ public void testTaskDependentMsgWithEmptyListAfterFilteringOrphanedRecords() { workflowDefinition.setCode(50L); workflowDefinition.setName("TestWorkflow"); + when(projectDao.queryByCode(projectCode)).thenReturn(getProject("test")); when(workflowTaskLineageDao.queryWorkFlowLineageByDept(projectCode, workflowDefinitionCode, 0L)) .thenReturn(dependentWorkflowList); when(workflowDefinitionDao.queryByCode(50L)).thenReturn(Optional.of(workflowDefinition)); @@ -253,7 +288,7 @@ public void testTaskDependentMsgWithEmptyListAfterFilteringOrphanedRecords() { // Should return Optional.empty() because all records are orphaned Optional result = - workflowLineageService.taskDependentMsg(projectCode, workflowDefinitionCode, taskCode); + workflowLineageService.taskDependentMsg(loginUser, projectCode, workflowDefinitionCode, taskCode); Assertions.assertFalse(result.isPresent()); }