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 f57305dd6f [Improvement-18563][API] Refine datasource authorization 
list APIs (#18564)
f57305dd6f is described below

commit f57305dd6f711bd60ccb66d8b21d70fa086d69f0
Author: Wenjun Ruan <[email protected]>
AuthorDate: Wed Aug 19 16:25:05 2026 +0800

    [Improvement-18563][API] Refine datasource authorization list APIs (#18564)
---
 .../api/controller/DataSourceController.java       | 17 +++---
 .../api/service/DataSourceService.java             |  9 ++--
 .../api/service/impl/DataSourceServiceImpl.java    | 22 ++++----
 .../api/vo/DataSourceSimpleInfoVO.java             | 35 ++++++++++++
 .../api/service/DataSourceServiceTest.java         | 62 ++++++++++------------
 .../dao/mapper/DataSourceMapper.xml                |  5 +-
 .../dao/mapper/DataSourceMapperTest.java           | 14 ++++-
 7 files changed, 102 insertions(+), 62 deletions(-)

diff --git 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/DataSourceController.java
 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/DataSourceController.java
index 0b9187285f..a544683843 100644
--- 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/DataSourceController.java
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/controller/DataSourceController.java
@@ -39,6 +39,7 @@ import 
org.apache.dolphinscheduler.api.exceptions.ServiceException;
 import org.apache.dolphinscheduler.api.service.DataSourceService;
 import org.apache.dolphinscheduler.api.utils.PageInfo;
 import org.apache.dolphinscheduler.api.utils.Result;
+import org.apache.dolphinscheduler.api.vo.DataSourceSimpleInfoVO;
 import org.apache.dolphinscheduler.common.constants.Constants;
 import org.apache.dolphinscheduler.dao.entity.DataSource;
 import org.apache.dolphinscheduler.dao.entity.User;
@@ -286,7 +287,7 @@ public class DataSourceController extends BaseController {
      *
      * @param loginUser login user
      * @param userId user id
-     * @return a list of unauthorized DataSource objects
+     * @return a list of unauthorized data source summaries
      */
     @Operation(summary = "unauthorizedDatasource", description = 
"UNAUTHORIZED_DATA_SOURCE_NOTES")
     @Parameters({
@@ -295,10 +296,10 @@ public class DataSourceController extends BaseController {
     @GetMapping(value = "/unauth-datasource")
     @ResponseStatus(HttpStatus.OK)
     @ApiException(UNAUTHORIZED_DATASOURCE)
-    public Result<Object> getUnauthorizedDatasourceList(@Parameter(hidden = 
true) @RequestAttribute(value = Constants.SESSION_USER) User loginUser,
-                                                        
@RequestParam("userId") Integer userId) {
+    public Result<List<DataSourceSimpleInfoVO>> 
getUnauthorizedDatasourceList(@Parameter(hidden = true) @RequestAttribute(value 
= Constants.SESSION_USER) User loginUser,
+                                                                              
@RequestParam("userId") Integer userId) {
 
-        List<DataSource> unAuthDatasourceList = 
dataSourceService.unAuthDatasource(loginUser, userId);
+        List<DataSourceSimpleInfoVO> unAuthDatasourceList = 
dataSourceService.unAuthDatasource(loginUser, userId);
         return Result.success(unAuthDatasourceList);
     }
 
@@ -307,7 +308,7 @@ public class DataSourceController extends BaseController {
      *
      * @param loginUser login user
      * @param userId user id
-     * @return a list of authorized DataSource objects
+     * @return a list of authorized data source summaries
      */
     @Operation(summary = "authedDatasource", description = 
"AUTHORIZED_DATA_SOURCE_NOTES")
     @Parameters({
@@ -316,9 +317,9 @@ public class DataSourceController extends BaseController {
     @GetMapping(value = "/authed-datasource")
     @ResponseStatus(HttpStatus.OK)
     @ApiException(AUTHORIZED_DATA_SOURCE)
-    public Result<Object> getAuthorizedDatasourceList(@Parameter(hidden = 
true) @RequestAttribute(value = Constants.SESSION_USER) User loginUser,
-                                                      @RequestParam("userId") 
Integer userId) {
-        List<DataSource> authedDatasourceList = 
dataSourceService.authedDatasource(loginUser, userId);
+    public Result<List<DataSourceSimpleInfoVO>> 
getAuthorizedDatasourceList(@Parameter(hidden = true) @RequestAttribute(value = 
Constants.SESSION_USER) User loginUser,
+                                                                            
@RequestParam("userId") Integer userId) {
+        List<DataSourceSimpleInfoVO> authedDatasourceList = 
dataSourceService.authedDatasource(loginUser, userId);
         return Result.success(authedDatasourceList);
     }
 
diff --git 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/DataSourceService.java
 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/DataSourceService.java
index 5546d91e04..308ed58791 100644
--- 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/DataSourceService.java
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/DataSourceService.java
@@ -19,6 +19,7 @@ package org.apache.dolphinscheduler.api.service;
 
 import org.apache.dolphinscheduler.api.exceptions.ServiceException;
 import org.apache.dolphinscheduler.api.utils.PageInfo;
+import org.apache.dolphinscheduler.api.vo.DataSourceSimpleInfoVO;
 import org.apache.dolphinscheduler.dao.entity.DataSource;
 import org.apache.dolphinscheduler.dao.entity.User;
 import 
org.apache.dolphinscheduler.plugin.datasource.api.datasource.BaseDataSourceParamDTO;
@@ -126,18 +127,18 @@ public interface DataSourceService {
      *
      * @param loginUser login user
      * @param userId    user id
-     * @return a list of {@link DataSource} objects that are available to be 
authorized to the target user
+     * @return a list of data sources that are available to be authorized to 
the target user
      */
-    List<DataSource> unAuthDatasource(User loginUser, Integer userId);
+    List<DataSourceSimpleInfoVO> unAuthDatasource(User loginUser, Integer 
userId);
 
     /**
      * query the list of data sources authorized for a specific user
      *
      * @param loginUser login user
      * @param userId    user id
-     * @return a list of {@link DataSource} objects that are authorized to the 
target user
+     * @return a list of data sources that are authorized to the target user
      */
-    List<DataSource> authedDatasource(User loginUser, Integer userId);
+    List<DataSourceSimpleInfoVO> authedDatasource(User loginUser, Integer 
userId);
 
     /**
      * query the list of tables from a specific database within a data source
diff --git 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/DataSourceServiceImpl.java
 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/DataSourceServiceImpl.java
index 65b7493762..5008d700a1 100644
--- 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/DataSourceServiceImpl.java
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/DataSourceServiceImpl.java
@@ -25,6 +25,7 @@ import org.apache.dolphinscheduler.api.enums.Status;
 import org.apache.dolphinscheduler.api.exceptions.ServiceException;
 import org.apache.dolphinscheduler.api.service.DataSourceService;
 import org.apache.dolphinscheduler.api.utils.PageInfo;
+import org.apache.dolphinscheduler.api.vo.DataSourceSimpleInfoVO;
 import org.apache.dolphinscheduler.common.constants.Constants;
 import org.apache.dolphinscheduler.common.enums.AuthorizationType;
 import org.apache.dolphinscheduler.common.enums.UserType;
@@ -315,15 +316,11 @@ public class DataSourceServiceImpl extends 
BaseServiceImpl implements DataSource
     }
 
     @Override
-    public List<DataSource> unAuthDatasource(User loginUser, Integer userId) {
-        List<DataSource> datasourceList;
-        if (canOperatorPermissions(loginUser, null, 
AuthorizationType.DATASOURCE, null)) {
-            // admin gets all data sources except userId
-            datasourceList = dataSourceDao.queryDatasourceExceptUserId(userId);
-        } else {
-            // non-admins users get their own data sources
-            datasourceList = dataSourceDao.queryByUserId(loginUser.getId());
+    public List<DataSourceSimpleInfoVO> unAuthDatasource(User loginUser, 
Integer userId) {
+        if (isNotAdmin(loginUser)) {
+            throw new ServiceException(Status.USER_NO_OPERATION_PERM);
         }
+        List<DataSource> datasourceList = 
dataSourceDao.queryDatasourceExceptUserId(userId);
         List<DataSource> resultList = new ArrayList<>();
         Set<DataSource> datasourceSet;
         if (datasourceList != null && !datasourceList.isEmpty()) {
@@ -338,13 +335,16 @@ public class DataSourceServiceImpl extends 
BaseServiceImpl implements DataSource
             }
             resultList = new ArrayList<>(datasourceSet);
         }
-        return resultList;
+        return 
resultList.stream().map(DataSourceSimpleInfoVO::new).collect(Collectors.toList());
     }
 
     @Override
-    public List<DataSource> authedDatasource(User loginUser, Integer userId) {
+    public List<DataSourceSimpleInfoVO> authedDatasource(User loginUser, 
Integer userId) {
+        if (isNotAdmin(loginUser)) {
+            throw new ServiceException(Status.USER_NO_OPERATION_PERM);
+        }
         List<DataSource> authedDatasourceList = 
dataSourceDao.queryAuthedDatasource(userId);
-        return authedDatasourceList;
+        return 
authedDatasourceList.stream().map(DataSourceSimpleInfoVO::new).collect(Collectors.toList());
     }
 
     @Override
diff --git 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/vo/DataSourceSimpleInfoVO.java
 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/vo/DataSourceSimpleInfoVO.java
new file mode 100644
index 0000000000..9705f8f0b2
--- /dev/null
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/vo/DataSourceSimpleInfoVO.java
@@ -0,0 +1,35 @@
+/*
+ * 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.vo;
+
+import org.apache.dolphinscheduler.dao.entity.DataSource;
+
+import lombok.Data;
+
+@Data
+public class DataSourceSimpleInfoVO {
+
+    private Integer id;
+
+    private String name;
+
+    public DataSourceSimpleInfoVO(DataSource dataSource) {
+        this.id = dataSource.getId();
+        this.name = dataSource.getName();
+    }
+}
diff --git 
a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/DataSourceServiceTest.java
 
b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/DataSourceServiceTest.java
index f6daee50b7..482279bb67 100644
--- 
a/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/DataSourceServiceTest.java
+++ 
b/dolphinscheduler-api/src/test/java/org/apache/dolphinscheduler/api/service/DataSourceServiceTest.java
@@ -27,6 +27,7 @@ import 
org.apache.dolphinscheduler.api.permission.ResourcePermissionCheckService
 import org.apache.dolphinscheduler.api.service.impl.BaseServiceImpl;
 import org.apache.dolphinscheduler.api.service.impl.DataSourceServiceImpl;
 import org.apache.dolphinscheduler.api.utils.PageInfo;
+import org.apache.dolphinscheduler.api.vo.DataSourceSimpleInfoVO;
 import org.apache.dolphinscheduler.common.enums.AuthorizationType;
 import org.apache.dolphinscheduler.common.enums.UserType;
 import org.apache.dolphinscheduler.common.utils.JSONUtils;
@@ -50,8 +51,6 @@ import 
org.apache.dolphinscheduler.spi.datasource.ConnectionParam;
 import org.apache.dolphinscheduler.spi.enums.DbConnectType;
 import org.apache.dolphinscheduler.spi.enums.DbType;
 
-import org.apache.commons.collections4.CollectionUtils;
-
 import java.nio.charset.StandardCharsets;
 import java.sql.Connection;
 import java.sql.SQLException;
@@ -320,50 +319,39 @@ public class DataSourceServiceTest {
 
     @Test
     public void testUnAuthDatasource() {
-        User loginUser = getAdminUser();
-        loginUser.setId(1);
-        loginUser.setUserType(UserType.ADMIN_USER);
         int userId = 3;
-        
when(resourcePermissionCheckService.operationPermissionCheck(AuthorizationType.DATASOURCE,
-                loginUser.getId(), null, baseServiceLogger)).thenReturn(true);
-        
when(resourcePermissionCheckService.resourcePermissionCheck(AuthorizationType.DATASOURCE,
 null, 0,
-                baseServiceLogger)).thenReturn(true);
-        // test admin user
+
+        User generalUser = getGeneralUser();
+        assertThrowsServiceException(Status.USER_NO_OPERATION_PERM,
+                () -> dataSourceService.unAuthDatasource(generalUser, userId));
+        Mockito.verifyNoInteractions(dataSourceDao);
+
+        User adminUser = getAdminUser();
         
when(dataSourceDao.queryAuthedDatasource(userId)).thenReturn(getSingleDataSourceList());
         
when(dataSourceDao.queryDatasourceExceptUserId(userId)).thenReturn(getDataSourceList());
-        List<DataSource> dataSources = 
dataSourceService.unAuthDatasource(loginUser, userId);
-        logger.info(dataSources.toString());
-        Assertions.assertTrue(CollectionUtils.isNotEmpty(dataSources));
+        List<DataSourceSimpleInfoVO> dataSources = 
dataSourceService.unAuthDatasource(adminUser, userId);
 
-        // test non-admin user
-        loginUser.setId(2);
-        loginUser.setUserType(UserType.GENERAL_USER);
-        when(dataSourceDao.queryByUserId(loginUser.getId()))
-                .thenReturn(getDataSourceList());
-        dataSources = dataSourceService.unAuthDatasource(loginUser, userId);
-        logger.info(dataSources.toString());
-        Assertions.assertTrue(CollectionUtils.isNotEmpty(dataSources));
+        Assertions.assertEquals(2, dataSources.size());
+        Assertions.assertTrue(dataSources.stream().noneMatch(dataSource -> 
dataSource.getId() == 3));
+        dataSources.forEach(this::assertDataSourceSimpleInfo);
     }
 
     @Test
     public void testAuthedDatasource() {
-        User loginUser = getAdminUser();
-        loginUser.setId(1);
-        loginUser.setUserType(UserType.ADMIN_USER);
         int userId = 3;
 
-        // test admin user
+        User generalUser = getGeneralUser();
+        assertThrowsServiceException(Status.USER_NO_OPERATION_PERM,
+                () -> dataSourceService.authedDatasource(generalUser, userId));
+        Mockito.verifyNoInteractions(dataSourceDao);
+
+        User adminUser = getAdminUser();
         
when(dataSourceDao.queryAuthedDatasource(userId)).thenReturn(getSingleDataSourceList());
-        List<DataSource> dataSources = 
dataSourceService.authedDatasource(loginUser, userId);
-        logger.info(dataSources.toString());
-        Assertions.assertTrue(CollectionUtils.isNotEmpty(dataSources));
+        List<DataSourceSimpleInfoVO> dataSources = 
dataSourceService.authedDatasource(adminUser, userId);
 
-        // test non-admin user
-        loginUser.setId(2);
-        loginUser.setUserType(UserType.GENERAL_USER);
-        dataSources = dataSourceService.authedDatasource(loginUser, userId);
-        logger.info(dataSources.toString());
-        Assertions.assertNotNull(dataSources);
+        Assertions.assertEquals(1, dataSources.size());
+        Assertions.assertEquals(3, dataSources.get(0).getId());
+        assertDataSourceSimpleInfo(dataSources.get(0));
     }
 
     @Test
@@ -444,6 +432,12 @@ public class DataSourceServiceTest {
         return Collections.singletonList(getOracleDataSource(3));
     }
 
+    private void assertDataSourceSimpleInfo(DataSourceSimpleInfoVO dataSource) 
{
+        Assertions.assertNotNull(dataSource.getId());
+        Assertions.assertEquals("test", dataSource.getName());
+        Assertions.assertEquals(2, 
JSONUtils.parseObject(JSONUtils.toJsonString(dataSource)).size());
+    }
+
     private DataSource getOracleDataSource() {
         DataSource dataSource = new DataSource();
         dataSource.setName("test");
diff --git 
a/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/DataSourceMapper.xml
 
b/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/DataSourceMapper.xml
index f5ce9bd2d6..5f85b6c2b2 100644
--- 
a/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/DataSourceMapper.xml
+++ 
b/dolphinscheduler-dao/src/main/resources/org/apache/dolphinscheduler/dao/mapper/DataSourceMapper.xml
@@ -68,13 +68,12 @@
         where name=#{name}
     </select>
     <select id="queryAuthedDatasource" 
resultType="org.apache.dolphinscheduler.dao.entity.DataSource">
-        select ds.id, ds.name, ds.note, ds.type, ds.user_id, 
ds.connection_params, ds.create_time, ds.update_time
+        select ds.id, ds.name
         from t_ds_datasource ds, t_ds_relation_datasource_user rel
         where ds.id = rel.datasource_id AND rel.user_id = #{userId}
     </select>
     <select id="queryDatasourceExceptUserId" 
resultType="org.apache.dolphinscheduler.dao.entity.DataSource">
-        select
-        <include refid="baseSql"/>
+        select id, name
         from t_ds_datasource
         where user_id <![CDATA[ <> ]]> #{userId}
     </select>
diff --git 
a/dolphinscheduler-dao/src/test/java/org/apache/dolphinscheduler/dao/mapper/DataSourceMapperTest.java
 
b/dolphinscheduler-dao/src/test/java/org/apache/dolphinscheduler/dao/mapper/DataSourceMapperTest.java
index dcf43b4f68..36b038ab08 100644
--- 
a/dolphinscheduler-dao/src/test/java/org/apache/dolphinscheduler/dao/mapper/DataSourceMapperTest.java
+++ 
b/dolphinscheduler-dao/src/test/java/org/apache/dolphinscheduler/dao/mapper/DataSourceMapperTest.java
@@ -189,7 +189,7 @@ public class DataSourceMapperTest extends BaseDaoTest {
         for (DataSource actualDataSource : actualDataSources) {
             DataSource expectedDataSource = 
expectedDataSourceMap.get(actualDataSource.getId());
             if (expectedDataSource != null) {
-                Assertions.assertEquals(expectedDataSource, actualDataSource);
+                assertDataSourceSimpleInfo(expectedDataSource, 
actualDataSource);
             }
         }
 
@@ -210,11 +210,21 @@ public class DataSourceMapperTest extends BaseDaoTest {
         for (DataSource actualDataSource : actualDataSources) {
             DataSource expectedDataSource = 
expectedDataSourceMap.get(actualDataSource.getId());
             if (expectedDataSource != null) {
-                Assertions.assertEquals(expectedDataSource, actualDataSource);
+                assertDataSourceSimpleInfo(expectedDataSource, 
actualDataSource);
             }
         }
     }
 
+    private void assertDataSourceSimpleInfo(DataSource expectedDataSource, 
DataSource actualDataSource) {
+        Assertions.assertEquals(expectedDataSource.getId(), 
actualDataSource.getId());
+        Assertions.assertEquals(expectedDataSource.getName(), 
actualDataSource.getName());
+        Assertions.assertNull(actualDataSource.getConnectionParams());
+        Assertions.assertNull(actualDataSource.getNote());
+        Assertions.assertNull(actualDataSource.getType());
+        Assertions.assertNull(actualDataSource.getCreateTime());
+        Assertions.assertNull(actualDataSource.getUpdateTime());
+    }
+
     /**
      * test list all datasource by type
      */

Reply via email to