This is an automated email from the ASF dual-hosted git repository.
SbloodyS pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/dolphinscheduler.git
The following commit(s) were added to refs/heads/dev by this push:
new 3f90d20db0 [Fix-18283][API] Add project permission check on workflow
lineage and workflow-definition list endpoints (#18284)
3f90d20db0 is described below
commit 3f90d20db0d2b057857bc70b91451a73c79cbe43
Author: Wenjun Ruan <[email protected]>
AuthorDate: Sun May 24 10:10:05 2026 +0800
[Fix-18283][API] Add project permission check on workflow lineage and
workflow-definition list endpoints (#18284)
---
.../controller/WorkflowDefinitionController.java | 5 ++-
.../api/controller/WorkflowLineageController.java | 12 +++---
.../api/service/WorkflowDefinitionService.java | 4 +-
.../api/service/WorkflowLineageService.java | 13 ++++---
.../impl/WorkflowDefinitionServiceImpl.java | 25 +++++++-----
.../service/impl/WorkflowLineageServiceImpl.java | 30 ++++++++++++---
.../WorkflowTaskLineageControllerTest.java | 2 +-
.../api/service/WorkflowDefinitionServiceTest.java | 8 ++--
.../service/WorkflowTaskLineageServiceTest.java | 45 +++++++++++++++++++---
9 files changed, 106 insertions(+), 38 deletions(-)
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 925921ead3..29885ed4ac 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 class WorkflowDefinitionController extends
BaseController {
@ApiException(GET_TASKS_LIST_BY_WORKFLOW_DEFINITION_CODE_ERROR)
public Result<List<DependentSimplifyDefinition>>
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 class WorkflowDefinitionController extends
BaseController {
@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 c5e87baa4e..1d56abbbc1 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 class WorkflowLineageController extends BaseController
{
@RequestParam(value = "workflowDefinitionName", required = false) String
workflowDefinitionName) {
workflowDefinitionName =
ParameterUtils.handleEscapes(workflowDefinitionName);
List<WorkFlowRelationDetail> workFlowLineages =
- workflowLineageService.queryWorkFlowLineageByName(projectCode,
workflowDefinitionName);
+ workflowLineageService.queryWorkFlowLineageByName(loginUser,
projectCode, workflowDefinitionName);
return Result.success(workFlowLineages);
}
@@ -86,7 +86,8 @@ public class WorkflowLineageController extends BaseController
{
public Result<Map<String, Object>>
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<String, Object> result = new HashMap<>();
result.put(Constants.DATA_LIST, workFlowLineage);
return Result.success(result);
@@ -100,7 +101,7 @@ public class WorkflowLineageController extends
BaseController {
@Parameter(name =
"projectCode", description = "PROJECT_CODE", required = true) @PathVariable
long projectCode) {
try {
Map<String, Object> 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 class WorkflowLineageController extends
BaseController {
@RequestParam(value
= "taskCode") long taskCode) {
Result<Map<String, Object>> result = new Result<>();
Optional<String> 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 class WorkflowLineageController extends
BaseController {
@RequestParam(value
= "taskCode", required = false) Long taskCode) {
Map<String, Object> result = new HashMap<>();
List<DependentLineageTask> 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 7113f806eb..5f404e75ae 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 @@ public interface WorkflowDefinitionService {
/**
* query workflow definition list by project code (simplified records used
for dependent task picker)
*/
- List<DependentSimplifyDefinition>
queryWorkflowDefinitionListByProjectCode(long projectCode);
+ List<DependentSimplifyDefinition>
queryWorkflowDefinitionListByProjectCode(User loginUser, long projectCode);
/**
* query task definition list (simplified records) by workflow definition
code
*/
- List<DependentSimplifyDefinition>
queryTaskDefinitionListByWorkflowDefinitionCode(long projectCode,
+ List<DependentSimplifyDefinition>
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 676c78863e..64629118ce 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 @@ package org.apache.dolphinscheduler.api.service;
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 @@ import java.util.Optional;
public interface WorkflowLineageService {
- List<WorkFlowRelationDetail> queryWorkFlowLineageByName(long projectCode,
String workflowDefinitionName);
+ List<WorkFlowRelationDetail> 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 @@ public interface WorkflowLineageService {
* @param taskCode Task code want to query tasks dependence
* @return dependent workflow definition
*/
- Optional<String> taskDependentMsg(long projectCode, long
workflowDefinitionCode, long taskCode);
+ Optional<String> taskDependentMsg(User loginUser, long projectCode, long
workflowDefinitionCode, long taskCode);
- List<DependentLineageTask> queryDependentWorkflowDefinitions(long
projectCode, long workflowDefinitionCode,
+ List<DependentLineageTask> 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 8609057f87..fecf8ec406 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 class WorkflowDefinitionServiceImpl extends
BaseServiceImpl implements Wo
* @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<WorkflowTaskRelationLog>
taskRelationList) {
List<WorkflowTaskRelation> oldWorkflowTaskRelationList =
workflowTaskRelationDao.queryByWorkflowDefinitionCode(workflowDefinition.getCode());
@@ -677,7 +677,8 @@ public class WorkflowDefinitionServiceImpl extends
BaseServiceImpl implements Wo
.anyMatch(relation ->
oldWorkflowTaskRelation.getPostTaskCode() == relation.getPostTaskCode());
if (!oldTaskExists) {
Optional<String> taskDepMsg =
workflowLineageService.taskDependentMsg(
- workflowDefinition.getProjectCode(),
oldWorkflowTaskRelation.getWorkflowDefinitionCode(),
+ loginUser, workflowDefinition.getProjectCode(),
+ oldWorkflowTaskRelation.getWorkflowDefinitionCode(),
oldWorkflowTaskRelation.getPostTaskCode());
taskDepMsg.ifPresent(sb::append);
}
@@ -745,7 +746,7 @@ public class WorkflowDefinitionServiceImpl extends
BaseServiceImpl implements Wo
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 class WorkflowDefinitionServiceImpl extends
BaseServiceImpl implements Wo
*
* @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 @@ public class WorkflowDefinitionServiceImpl extends
BaseServiceImpl implements Wo
}
// check workflow used by other task, including sub workflow and
dependent task type
- Optional<String> taskDepMsg =
workflowLineageService.taskDependentMsg(workflowDefinition.getProjectCode(),
- workflowDefinition.getCode(), 0);
+ Optional<String> 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 class WorkflowDefinitionServiceImpl extends
BaseServiceImpl implements Wo
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 class WorkflowDefinitionServiceImpl extends
BaseServiceImpl implements Wo
* @return workflow definition list in the project
*/
@Override
- public List<DependentSimplifyDefinition>
queryWorkflowDefinitionListByProjectCode(long projectCode) {
+ public List<DependentSimplifyDefinition>
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 class WorkflowDefinitionServiceImpl extends
BaseServiceImpl implements Wo
* @return task definition list in the workflow definition
*/
@Override
- public List<DependentSimplifyDefinition>
queryTaskDefinitionListByWorkflowDefinitionCode(long projectCode,
+ public List<DependentSimplifyDefinition>
queryTaskDefinitionListByWorkflowDefinitionCode(User loginUser,
+
long projectCode,
Long workflowDefinitionCode) {
+ Project project = projectDao.queryByCode(projectCode);
+ projectService.checkProjectAndAuthThrowException(loginUser, project,
WORKFLOW_DEFINITION);
Set<Long> definitionCodesSet = new HashSet<>();
definitionCodesSet.add(workflowDefinitionCode);
List<DependentSimplifyDefinition> 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 44241590d0..3df93b3dfa 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.DependentLineageTask;
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<WorkFlowRelationDetail> queryWorkFlowLineageByName(long
projectCode, String workflowDefinitionName) {
+ public List<WorkFlowRelationDetail> 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<WorkflowTaskLineage> upstreamWorkflowTaskLineageList =
workflowTaskLineageDao.queryByWorkflowDefinitionCode(workflowDefinitionCode);
List<WorkflowTaskLineage> downstreamWorkflowTaskLineageList =
@@ -117,11 +128,12 @@ public class WorkflowLineageServiceImpl extends
BaseServiceImpl implements Workf
}
@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<WorkflowTaskLineage> workflowTaskLineageList =
workflowTaskLineageDao.queryByProjectCode(projectCode);
List<WorkFlowRelation> workFlowRelationList =
getWorkFlowRelations(workflowTaskLineageList);
List<WorkFlowRelationDetail> workFlowRelationDetailList =
@@ -174,7 +186,13 @@ public class WorkflowLineageServiceImpl extends
BaseServiceImpl implements Workf
* @return Optional of formatter message
*/
@Override
- public Optional<String> taskDependentMsg(long projectCode, long
workflowDefinitionCode, long taskCode) {
+ public Optional<String> 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 class WorkflowLineageServiceImpl extends
BaseServiceImpl implements Workf
}
@Override
- public List<DependentLineageTask> queryDependentWorkflowDefinitions(long
projectCode, long workflowDefinitionCode,
+ public List<DependentLineageTask> 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<DependentLineageTask> dependentLineageTaskList = new
ArrayList<>();
List<WorkflowTaskLineage> 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 4d637c5675..5884d508ac 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 @@ public class WorkflowTaskLineageControllerTest {
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 f3d129d8d3..3ea6da8fb3 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 class WorkflowDefinitionServiceTest extends
BaseServiceTestTool {
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 class WorkflowDefinitionServiceTest extends
BaseServiceTestTool {
// 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 class WorkflowDefinitionServiceTest extends
BaseServiceTestTool {
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 class WorkflowDefinitionServiceTest extends
BaseServiceTestTool {
// 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 f391360f4a..32ed1703b9 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.exceptions.ServiceException;
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 @@ public class WorkflowTaskLineageServiceTest {
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<WorkFlowRelationDetail> workFlowLineages =
workflowLineageService.queryWorkFlowLineageByName(1L, name);
+ List<WorkFlowRelationDetail> 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 class WorkflowTaskLineageServiceTest {
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<WorkFlowRelationDetail> workFlowLineageList =
workFlowLineage.getWorkFlowRelationDetailList();
@@ -146,6 +175,7 @@ public class WorkflowTaskLineageServiceTest {
long projectCode = 1L;
long workflowDefinitionCode = 100L;
long taskCode = 200L;
+ User loginUser = getLoginUser();
// Create orphaned lineage record (taskDefinitionCode exists but
taskDefinition is null)
List<WorkflowTaskLineage> dependentWorkflowList = new ArrayList<>();
@@ -159,6 +189,7 @@ public class WorkflowTaskLineageServiceTest {
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 class WorkflowTaskLineageServiceTest {
// Should return Optional.empty() because all records are orphaned
Optional<String> result =
- workflowLineageService.taskDependentMsg(projectCode,
workflowDefinitionCode, taskCode);
+ workflowLineageService.taskDependentMsg(loginUser,
projectCode, workflowDefinitionCode, taskCode);
Assertions.assertFalse(result.isPresent());
}
@@ -176,6 +207,7 @@ public class WorkflowTaskLineageServiceTest {
long projectCode = 1L;
long workflowDefinitionCode = 100L;
long taskCode = 200L;
+ User loginUser = getLoginUser();
List<WorkflowTaskLineage> dependentWorkflowList = new ArrayList<>();
@@ -205,6 +237,7 @@ public class WorkflowTaskLineageServiceTest {
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 class WorkflowTaskLineageServiceTest {
// Should return a message with only the valid record, skipping the
orphaned one
Optional<String> 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 class WorkflowTaskLineageServiceTest {
long projectCode = 1L;
long workflowDefinitionCode = 100L;
long taskCode = 0L; // No specific task code
+ User loginUser = getLoginUser();
List<WorkflowTaskLineage> dependentWorkflowList = new ArrayList<>();
WorkflowTaskLineage orphanedLineage = new WorkflowTaskLineage();
@@ -246,6 +280,7 @@ public class WorkflowTaskLineageServiceTest {
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 class WorkflowTaskLineageServiceTest {
// Should return Optional.empty() because all records are orphaned
Optional<String> result =
- workflowLineageService.taskDependentMsg(projectCode,
workflowDefinitionCode, taskCode);
+ workflowLineageService.taskDependentMsg(loginUser,
projectCode, workflowDefinitionCode, taskCode);
Assertions.assertFalse(result.isPresent());
}