This is an automated email from the ASF dual-hosted git repository.
arshad pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/seatunnel-web.git
The following commit(s) were added to refs/heads/main by this push:
new 0e8c3b60 [Feature] Add APIs to get resource names. (#286)
0e8c3b60 is described below
commit 0e8c3b606a9d3187a6624d7ff35639eed565a2f3
Author: Mohammad Arshad <[email protected]>
AuthorDate: Fri Apr 11 15:37:42 2025 +0530
[Feature] Add APIs to get resource names. (#286)
---
.../controller/ResourceNameProviderController.java | 82 ++++++
.../seatunnel/app/dal/dao/IDatasourceDao.java | 2 +
.../seatunnel/app/dal/dao/IJobDefinitionDao.java | 2 +
.../org/apache/seatunnel/app/dal/dao/IUserDao.java | 2 +
.../seatunnel/app/dal/dao/IVirtualTableDao.java | 2 +
.../seatunnel/app/dal/dao/IWorkspaceDao.java | 2 +
.../app/dal/dao/impl/DatasourceDaoImpl.java | 13 +
.../app/dal/dao/impl/JobDefinitionDaoImpl.java | 14 +
.../seatunnel/app/dal/dao/impl/UserDaoImpl.java | 5 +
.../app/dal/dao/impl/VirtualTableDaoImpl.java | 14 +
.../app/dal/dao/impl/WorkspaceDaoImpl.java | 5 +
.../seatunnel/app/dal/mapper/WorkspaceMapper.java | 4 -
.../seatunnel/app/service/IDatasourceService.java | 2 +
.../app/service/IJobDefinitionService.java | 2 +
.../apache/seatunnel/app/service/IUserService.java | 4 +
.../app/service/IVirtualTableService.java | 2 +
.../seatunnel/app/service/WorkspaceService.java | 2 +
.../app/service/impl/DatasourceServiceImpl.java | 9 +
.../app/service/impl/JobDefinitionServiceImpl.java | 9 +
.../app/service/impl/UserServiceImpl.java | 5 +
.../app/service/impl/VirtualTableServiceImpl.java | 7 +
.../app/service/impl/WorkspaceServiceImpl.java | 5 +
.../apache/seatunnel/app/dal/mapper/UserMapper.xml | 5 +
.../ResourceNameProviderControllerWrapper.java | 70 +++++
.../test/ResourceNameProviderControllerTest.java | 294 +++++++++++++++++++++
25 files changed, 559 insertions(+), 4 deletions(-)
diff --git
a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/controller/ResourceNameProviderController.java
b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/controller/ResourceNameProviderController.java
new file mode 100644
index 00000000..bd26130b
--- /dev/null
+++
b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/controller/ResourceNameProviderController.java
@@ -0,0 +1,82 @@
+/*
+ * 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.seatunnel.app.controller;
+
+import org.apache.seatunnel.app.common.Result;
+import org.apache.seatunnel.app.service.IDatasourceService;
+import org.apache.seatunnel.app.service.IJobDefinitionService;
+import org.apache.seatunnel.app.service.IUserService;
+import org.apache.seatunnel.app.service.IVirtualTableService;
+import org.apache.seatunnel.app.service.WorkspaceService;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@RestController
+@RequestMapping("/seatunnel/api/v1/resources")
+public class ResourceNameProviderController {
+
+ @Autowired private WorkspaceService workspaceService;
+
+ @Autowired private IDatasourceService datasourceService;
+
+ @Autowired private IJobDefinitionService jobDefinitionService;
+
+ @Autowired private IVirtualTableService virtualTableService;
+
+ @Autowired private IUserService userService;
+
+ @GetMapping("/workspace")
+ public Result<List<String>> getWorkspaces(
+ @RequestParam(value = "searchName", required = false) String
searchName) {
+ return Result.success(workspaceService.getWorkspaceNames(searchName));
+ }
+
+ @GetMapping("/datasource")
+ public Result<List<String>> getDatasources(
+ @RequestParam(value = "workspaceName", required = false) String
workspaceName,
+ @RequestParam(value = "searchName", required = false) String
searchName) {
+ return
Result.success(datasourceService.getDatasourceNames(workspaceName, searchName));
+ }
+
+ @GetMapping("/job_definition")
+ public Result<List<String>> getJobDefinitions(
+ @RequestParam(value = "workspaceName", required = false) String
workspaceName,
+ @RequestParam(value = "searchName", required = false) String
searchName) {
+ return Result.success(
+ jobDefinitionService.getJobDefinitionNames(workspaceName,
searchName));
+ }
+
+ @GetMapping("/virtual_table")
+ public Result<List<String>> getVirtualTables(
+ @RequestParam(value = "workspaceName", required = false) String
workspaceName,
+ @RequestParam(value = "searchName", required = false) String
searchName) {
+ return Result.success(
+
virtualTableService.getVirtualTableNamesWithinWorkspace(workspaceName,
searchName));
+ }
+
+ @GetMapping("/user")
+ public Result<List<String>> getUserNames(
+ @RequestParam(value = "searchName", required = false) String
searchName) {
+ return Result.success(userService.getUserNames(searchName));
+ }
+}
diff --git
a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IDatasourceDao.java
b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IDatasourceDao.java
index 206f63f2..58091da9 100644
---
a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IDatasourceDao.java
+++
b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IDatasourceDao.java
@@ -57,4 +57,6 @@ public interface IDatasourceDao {
List<Datasource> selectByIds(List<Long> ids);
List<Datasource> selectDatasourceByUserId(int userId);
+
+ List<String> getDatasourceNames(Long workspaceId, String searchName);
}
diff --git
a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IJobDefinitionDao.java
b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IJobDefinitionDao.java
index 8ff36100..1701b157 100644
---
a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IJobDefinitionDao.java
+++
b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IJobDefinitionDao.java
@@ -41,4 +41,6 @@ public interface IJobDefinitionDao {
JobDefinition getJobByName(@NonNull String name);
void delete(long id);
+
+ List<String> getJobDefinitionNames(Long workspaceIdOrCurrent, String
searchName);
}
diff --git
a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
index a8dafe7b..1cd4fd49 100644
---
a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
+++
b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IUserDao.java
@@ -59,4 +59,6 @@ public interface IUserDao {
* @return
*/
List<User> queryEnabledUsers();
+
+ List<String> getUserNames(String searchName);
}
diff --git
a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IVirtualTableDao.java
b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IVirtualTableDao.java
index 9c4225d2..4f0b1b4e 100644
---
a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IVirtualTableDao.java
+++
b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IVirtualTableDao.java
@@ -48,4 +48,6 @@ public interface IVirtualTableDao {
List<String> getVirtualDatabaseNames(Long datasourceId);
boolean checkHasVirtualTable(Long datasourceId);
+
+ List<String> getDatasourceNames(Long workspaceId, String searchName);
}
diff --git
a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IWorkspaceDao.java
b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IWorkspaceDao.java
index 5458ea36..76dd9468 100644
---
a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IWorkspaceDao.java
+++
b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/IWorkspaceDao.java
@@ -33,4 +33,6 @@ public interface IWorkspaceDao {
boolean deleteWorkspaceById(Long id);
List<Workspace> selectAllWorkspaces();
+
+ List<String> getWorkspaceNames(String searchName);
}
diff --git
a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/impl/DatasourceDaoImpl.java
b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/impl/DatasourceDaoImpl.java
index e6c4180c..3b27c807 100644
---
a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/impl/DatasourceDaoImpl.java
+++
b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/impl/DatasourceDaoImpl.java
@@ -30,6 +30,7 @@ import
com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import javax.annotation.Resource;
import java.util.List;
+import java.util.stream.Collectors;
import static
org.apache.seatunnel.app.utils.ServletUtils.getCurrentWorkspaceId;
@@ -174,4 +175,16 @@ public class DatasourceDaoImpl implements IDatasourceDao {
.eq("create_user_id", userId)
.eq("workspace_id", getCurrentWorkspaceId()));
}
+
+ @Override
+ public List<String> getDatasourceNames(Long workspaceId, String
searchName) {
+ QueryWrapper<Datasource> queryWrapper = new QueryWrapper<>();
+ queryWrapper.eq("workspace_id", workspaceId);
+ if (searchName != null) {
+ queryWrapper.like("datasource_name", "%" + searchName + "%");
+ }
+ return datasourceMapper.selectList(queryWrapper).stream()
+ .map(Datasource::getDatasourceName)
+ .collect(Collectors.toList());
+ }
}
diff --git
a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/impl/JobDefinitionDaoImpl.java
b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/impl/JobDefinitionDaoImpl.java
index cad87acf..076934da 100644
---
a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/impl/JobDefinitionDaoImpl.java
+++
b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/impl/JobDefinitionDaoImpl.java
@@ -27,6 +27,7 @@ import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Repository;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -35,6 +36,7 @@ import lombok.NonNull;
import javax.annotation.Resource;
import java.util.List;
+import java.util.stream.Collectors;
import static
org.apache.seatunnel.app.utils.ServletUtils.getCurrentWorkspaceId;
@@ -107,4 +109,16 @@ public class JobDefinitionDaoImpl implements
IJobDefinitionDao {
.eq(JobDefinition::getId, id)
.eq(JobDefinition::getWorkspaceId,
getCurrentWorkspaceId()));
}
+
+ @Override
+ public List<String> getJobDefinitionNames(Long workspaceId, String
searchName) {
+ LambdaQueryWrapper<JobDefinition> query =
Wrappers.<JobDefinition>lambdaQuery();
+ query.eq(JobDefinition::getWorkspaceId, workspaceId);
+ if (StringUtils.isNotEmpty(searchName)) {
+ query.like(JobDefinition::getName, "%" + searchName + "%");
+ }
+ return jobMapper.selectList(query).stream()
+ .map(JobDefinition::getName)
+ .collect(Collectors.toList());
+ }
}
diff --git
a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/impl/UserDaoImpl.java
b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/impl/UserDaoImpl.java
index 9ed4a45b..2c666214 100644
---
a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/impl/UserDaoImpl.java
+++
b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/impl/UserDaoImpl.java
@@ -147,4 +147,9 @@ public class UserDaoImpl implements IUserDao {
public List<User> queryEnabledUsers() {
return userMapper.queryEnabledUsers();
}
+
+ @Override
+ public List<String> getUserNames(String searchName) {
+ return userMapper.queryUserNames(searchName);
+ }
}
diff --git
a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/impl/VirtualTableDaoImpl.java
b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/impl/VirtualTableDaoImpl.java
index 80ba3105..0c9ede19 100644
---
a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/impl/VirtualTableDaoImpl.java
+++
b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/impl/VirtualTableDaoImpl.java
@@ -26,8 +26,10 @@ import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Repository;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.slf4j.Slf4j;
@@ -159,4 +161,16 @@ public class VirtualTableDaoImpl implements
IVirtualTableDao {
.eq("workspace_id", getCurrentWorkspaceId()))
> 0;
}
+
+ @Override
+ public List<String> getDatasourceNames(Long workspaceId, String
searchName) {
+ LambdaQueryWrapper<VirtualTable> query =
Wrappers.<VirtualTable>lambdaQuery();
+ query.eq(VirtualTable::getWorkspaceId, workspaceId);
+ if (StringUtils.isNotEmpty(searchName)) {
+ query.like(VirtualTable::getVirtualDatabaseName, "%" + searchName
+ "%");
+ }
+ return virtualTableMapper.selectList(query).stream()
+ .map(VirtualTable::getVirtualDatabaseName)
+ .collect(Collectors.toList());
+ }
}
diff --git
a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/impl/WorkspaceDaoImpl.java
b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/impl/WorkspaceDaoImpl.java
index 26c21da8..83afe0cf 100644
---
a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/impl/WorkspaceDaoImpl.java
+++
b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/dao/impl/WorkspaceDaoImpl.java
@@ -62,4 +62,9 @@ public class WorkspaceDaoImpl implements IWorkspaceDao {
public List<Workspace> selectAllWorkspaces() {
return workspaceMapper.selectList(new QueryWrapper<>());
}
+
+ @Override
+ public List<String> getWorkspaceNames(String searchName) {
+ return workspaceMapper.getWorkspaceNames(searchName);
+ }
}
diff --git
a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/mapper/WorkspaceMapper.java
b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/mapper/WorkspaceMapper.java
index 552f166a..af138653 100644
---
a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/mapper/WorkspaceMapper.java
+++
b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/dal/mapper/WorkspaceMapper.java
@@ -19,14 +19,10 @@ package org.apache.seatunnel.app.dal.mapper;
import org.apache.seatunnel.app.dal.entity.Workspace;
-import org.apache.ibatis.annotations.Param;
-
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import java.util.List;
public interface WorkspaceMapper extends BaseMapper<Workspace> {
- List<Workspace> getWorkspaceByName(@Param("workspaceName") String
workspaceName);
-
List<String> getWorkspaceNames(String searchName);
}
diff --git
a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/IDatasourceService.java
b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/IDatasourceService.java
index afac531e..3359936a 100644
---
a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/IDatasourceService.java
+++
b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/IDatasourceService.java
@@ -247,4 +247,6 @@ public interface IDatasourceService {
String datasourceName, String databaseName, String filterName,
Integer size) {
return new ArrayList<>();
}
+
+ List<String> getDatasourceNames(String workspaceName, String searchName);
}
diff --git
a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/IJobDefinitionService.java
b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/IJobDefinitionService.java
index 416b210b..ddc8e730 100644
---
a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/IJobDefinitionService.java
+++
b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/IJobDefinitionService.java
@@ -47,4 +47,6 @@ public interface IJobDefinitionService {
boolean getUsedByDataSourceIdAndVirtualTable(long datasourceId, String
tableName);
void deleteJob(long id);
+
+ List<String> getJobDefinitionNames(String workspaceName, String
searchName);
}
diff --git
a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/IUserService.java
b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/IUserService.java
index 1b84559a..4ce130ef 100644
---
a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/IUserService.java
+++
b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/IUserService.java
@@ -25,6 +25,8 @@ import org.apache.seatunnel.app.domain.response.PageInfo;
import org.apache.seatunnel.app.domain.response.user.AddUserRes;
import org.apache.seatunnel.app.domain.response.user.UserSimpleInfoRes;
+import java.util.List;
+
public interface IUserService {
AddUserRes add(AddUserReq addReq);
@@ -40,4 +42,6 @@ public interface IUserService {
void disable(int id);
UserSimpleInfoRes login(UserLoginReq req, String authType);
+
+ List<String> getUserNames(String searchName);
}
diff --git
a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/IVirtualTableService.java
b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/IVirtualTableService.java
index 87c8b999..0c46d11a 100644
---
a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/IVirtualTableService.java
+++
b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/IVirtualTableService.java
@@ -50,4 +50,6 @@ public interface IVirtualTableService {
List<String> getVirtualTableNames(String databaseName, String
datasourceId);
List<String> getVirtualDatabaseNames(String datasourceId);
+
+ List<String> getVirtualTableNamesWithinWorkspace(String workspaceName,
String searchName);
}
diff --git
a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/WorkspaceService.java
b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/WorkspaceService.java
index b8f5b385..8ac94283 100644
---
a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/WorkspaceService.java
+++
b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/WorkspaceService.java
@@ -38,4 +38,6 @@ public interface WorkspaceService {
Workspace getDefaultWorkspace();
Long getWorkspaceIdOrCurrent(String workspaceName);
+
+ List<String> getWorkspaceNames(String searchName);
}
diff --git
a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/impl/DatasourceServiceImpl.java
b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/impl/DatasourceServiceImpl.java
index a55bcded..6ea3a956 100644
---
a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/impl/DatasourceServiceImpl.java
+++
b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/impl/DatasourceServiceImpl.java
@@ -35,6 +35,7 @@ import org.apache.seatunnel.app.security.UserContextHolder;
import org.apache.seatunnel.app.service.IDatasourceService;
import org.apache.seatunnel.app.service.IJobDefinitionService;
import org.apache.seatunnel.app.service.ITableSchemaService;
+import org.apache.seatunnel.app.service.WorkspaceService;
import org.apache.seatunnel.app.thirdparty.datasource.DataSourceClientFactory;
import
org.apache.seatunnel.app.thirdparty.framework.SeaTunnelOptionRuleWrapper;
import org.apache.seatunnel.app.utils.ConfigShadeUtil;
@@ -99,6 +100,8 @@ public class DatasourceServiceImpl extends
SeatunnelBaseServiceImpl
@Autowired private ConfigShadeUtil configShadeUtil;
+ @Resource private WorkspaceService workspaceService;
+
@Override
public String createDatasource(
String datasourceName,
@@ -607,6 +610,12 @@ public class DatasourceServiceImpl extends
SeatunnelBaseServiceImpl
this.applicationContext = applicationContext;
}
+ @Override
+ public List<String> getDatasourceNames(String workspaceName, String
searchName) {
+ return datasourceDao.getDatasourceNames(
+ workspaceService.getWorkspaceIdOrCurrent(workspaceName),
searchName);
+ }
+
private void permCheck(String resourceName, AccessType accessType) {
permissionCheck(
resourceName,
diff --git
a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/impl/JobDefinitionServiceImpl.java
b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/impl/JobDefinitionServiceImpl.java
index 915193a0..734434ff 100644
---
a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/impl/JobDefinitionServiceImpl.java
+++
b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/impl/JobDefinitionServiceImpl.java
@@ -31,6 +31,7 @@ import org.apache.seatunnel.app.domain.response.PageInfo;
import org.apache.seatunnel.app.domain.response.job.JobDefinitionRes;
import org.apache.seatunnel.app.security.UserContextHolder;
import org.apache.seatunnel.app.service.IJobDefinitionService;
+import org.apache.seatunnel.app.service.WorkspaceService;
import org.apache.seatunnel.app.utils.ServletUtils;
import org.apache.seatunnel.common.access.AccessType;
import org.apache.seatunnel.common.access.ResourceType;
@@ -72,6 +73,8 @@ public class JobDefinitionServiceImpl extends
SeatunnelBaseServiceImpl
@Resource(name = "jobVersionDaoImpl")
private IJobVersionDao jobVersionDao;
+ @Resource private WorkspaceService workspaceService;
+
@Override
@Transactional
public long createJob(JobReq jobReq) throws
CodeGenerateUtils.CodeGenerateException {
@@ -206,6 +209,12 @@ public class JobDefinitionServiceImpl extends
SeatunnelBaseServiceImpl
jobDefinitionDao.delete(id);
}
+ @Override
+ public List<String> getJobDefinitionNames(String workspaceName, String
searchName) {
+ return jobDefinitionDao.getJobDefinitionNames(
+ workspaceService.getWorkspaceIdOrCurrent(workspaceName),
searchName);
+ }
+
private void permCheck(String resourceName, AccessType accessType) {
permissionCheck(
resourceName, ResourceType.JOB, accessType,
UserContextHolder.getAccessInfo());
diff --git
a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/impl/UserServiceImpl.java
b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/impl/UserServiceImpl.java
index 2a47e299..f6377600 100644
---
a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/impl/UserServiceImpl.java
+++
b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/impl/UserServiceImpl.java
@@ -245,6 +245,11 @@ public class UserServiceImpl extends
SeatunnelBaseServiceImpl implements IUserSe
return info;
}
+ @Override
+ public List<String> getUserNames(String searchName) {
+ return userDaoImpl.getUserNames(searchName);
+ }
+
private void permCheck(String resourceName, AccessType accessType) {
permissionCheck(
resourceName, ResourceType.USER, accessType,
UserContextHolder.getAccessInfo());
diff --git
a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/impl/VirtualTableServiceImpl.java
b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/impl/VirtualTableServiceImpl.java
index 12e4ee41..9cc341e6 100644
---
a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/impl/VirtualTableServiceImpl.java
+++
b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/impl/VirtualTableServiceImpl.java
@@ -331,4 +331,11 @@ public class VirtualTableServiceImpl extends
SeatunnelBaseServiceImpl
Long datasourceIdLong = Long.valueOf(datasourceId);
return virtualTableDao.getVirtualDatabaseNames(datasourceIdLong);
}
+
+ @Override
+ public List<String> getVirtualTableNamesWithinWorkspace(
+ String workspaceName, String searchName) {
+ return virtualTableDao.getDatasourceNames(
+ workspaceService.getWorkspaceIdOrCurrent(workspaceName),
searchName);
+ }
}
diff --git
a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/impl/WorkspaceServiceImpl.java
b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/impl/WorkspaceServiceImpl.java
index 9406aada..d209736d 100644
---
a/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/impl/WorkspaceServiceImpl.java
+++
b/seatunnel-server/seatunnel-app/src/main/java/org/apache/seatunnel/app/service/impl/WorkspaceServiceImpl.java
@@ -164,4 +164,9 @@ public class WorkspaceServiceImpl extends
SeatunnelBaseServiceImpl implements Wo
AccessType.READ,
UserContextHolder.getAccessInfo());
}
+
+ @Override
+ public List<String> getWorkspaceNames(String searchName) {
+ return workspaceDao.getWorkspaceNames(searchName);
+ }
}
diff --git
a/seatunnel-server/seatunnel-app/src/main/resources/org/apache/seatunnel/app/dal/mapper/UserMapper.xml
b/seatunnel-server/seatunnel-app/src/main/resources/org/apache/seatunnel/app/dal/mapper/UserMapper.xml
index 049aec32..27e3efee 100644
---
a/seatunnel-server/seatunnel-app/src/main/resources/org/apache/seatunnel/app/dal/mapper/UserMapper.xml
+++
b/seatunnel-server/seatunnel-app/src/main/resources/org/apache/seatunnel/app/dal/mapper/UserMapper.xml
@@ -104,4 +104,9 @@
from `user`
where status = 0
</select>
+ <select id="queryUserNames" resultType="java.lang.String">
+ select username
+ from `user`
+ where #{searchName} IS NULL OR username LIKE concat('%',
#{searchName}, '%')
+ </select>
</mapper>
diff --git
a/seatunnel-web-it/src/test/java/org/apache/seatunnel/app/controller/ResourceNameProviderControllerWrapper.java
b/seatunnel-web-it/src/test/java/org/apache/seatunnel/app/controller/ResourceNameProviderControllerWrapper.java
new file mode 100644
index 00000000..b0c2be3d
--- /dev/null
+++
b/seatunnel-web-it/src/test/java/org/apache/seatunnel/app/controller/ResourceNameProviderControllerWrapper.java
@@ -0,0 +1,70 @@
+/*
+ * 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.seatunnel.app.controller;
+
+import org.apache.seatunnel.app.common.Result;
+import org.apache.seatunnel.app.common.SeatunnelWebTestingBase;
+import org.apache.seatunnel.app.utils.JSONTestUtils;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+
+import java.util.List;
+
+public class ResourceNameProviderControllerWrapper extends
SeatunnelWebTestingBase {
+
+ private String buildUrl(String baseUrl, String workspaceName, String
searchName) {
+ StringBuilder url = new StringBuilder(baseUrl);
+ if (workspaceName != null || searchName != null) {
+ url.append("?");
+ if (workspaceName != null) {
+ url.append("workspaceName=").append(workspaceName);
+ }
+ if (searchName != null) {
+ if (workspaceName != null) {
+ url.append("&");
+ }
+ url.append("searchName=").append(searchName);
+ }
+ }
+ return url.toString();
+ }
+
+ public Result<List<String>> getWorkspaces(String searchName) {
+ String url = buildUrl("resources/workspace", null, searchName);
+ String response = sendRequest(urlWithParam(url));
+ return JSONTestUtils.parseObject(response, new
TypeReference<Result<List<String>>>() {});
+ }
+
+ public Result<List<String>> getDatasources(String workspaceName, String
searchName) {
+ String url = buildUrl("resources/datasource", workspaceName,
searchName);
+ String response = sendRequest(urlWithParam(url));
+ return JSONTestUtils.parseObject(response, new
TypeReference<Result<List<String>>>() {});
+ }
+
+ public Result<List<String>> getJobDefinitions(String workspaceName, String
searchName) {
+ String url = buildUrl("resources/job_definition", workspaceName,
searchName);
+ String response = sendRequest(urlWithParam(url));
+ return JSONTestUtils.parseObject(response, new
TypeReference<Result<List<String>>>() {});
+ }
+
+ public Result<List<String>> getUserNames(String searchName) {
+ String url = buildUrl("resources/user", null, searchName);
+ String response = sendRequest(urlWithParam(url));
+ return JSONTestUtils.parseObject(response, new
TypeReference<Result<List<String>>>() {});
+ }
+}
diff --git
a/seatunnel-web-it/src/test/java/org/apache/seatunnel/app/test/ResourceNameProviderControllerTest.java
b/seatunnel-web-it/src/test/java/org/apache/seatunnel/app/test/ResourceNameProviderControllerTest.java
new file mode 100644
index 00000000..4049ecc7
--- /dev/null
+++
b/seatunnel-web-it/src/test/java/org/apache/seatunnel/app/test/ResourceNameProviderControllerTest.java
@@ -0,0 +1,294 @@
+/*
+ * 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.seatunnel.app.test;
+
+import org.apache.seatunnel.app.common.Result;
+import org.apache.seatunnel.app.common.SeaTunnelWebCluster;
+import org.apache.seatunnel.app.controller.JobDefinitionControllerWrapper;
+import
org.apache.seatunnel.app.controller.ResourceNameProviderControllerWrapper;
+import
org.apache.seatunnel.app.controller.SeatunnelDatasourceControllerWrapper;
+import org.apache.seatunnel.app.controller.UserControllerWrapper;
+import org.apache.seatunnel.app.controller.WorkspaceControllerWrapper;
+import org.apache.seatunnel.app.domain.request.user.UserLoginReq;
+import org.apache.seatunnel.app.domain.response.user.AddUserRes;
+import org.apache.seatunnel.server.common.SeatunnelErrorEnum;
+
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+public class ResourceNameProviderControllerTest {
+ private static final SeaTunnelWebCluster seaTunnelWebCluster = new
SeaTunnelWebCluster();
+ private static ResourceNameProviderControllerWrapper resourceWrapper;
+ private static WorkspaceControllerWrapper workspaceControllerWrapper;
+ private static UserControllerWrapper userControllerWrapper;
+ private static SeatunnelDatasourceControllerWrapper
datasourceControllerWrapper;
+ private static JobDefinitionControllerWrapper
jobDefinitionControllerWrapper;
+ private static final String uniqueId = "_" + System.currentTimeMillis();
+
+ @BeforeAll
+ public static void setUp() {
+ seaTunnelWebCluster.start();
+ resourceWrapper = new ResourceNameProviderControllerWrapper();
+ workspaceControllerWrapper = new WorkspaceControllerWrapper();
+ userControllerWrapper = new UserControllerWrapper();
+ datasourceControllerWrapper = new
SeatunnelDatasourceControllerWrapper();
+ jobDefinitionControllerWrapper = new JobDefinitionControllerWrapper();
+ }
+
+ @Test
+ public void testGetWorkspaces() {
+ String prefix = System.currentTimeMillis() + "_";
+ String postfix = "_" + System.currentTimeMillis();
+ String workspaceName = prefix + "workspace" + uniqueId + "_name" +
postfix;
+ createWorkspace(workspaceName);
+
+ // search with infix
+ Result<List<String>> result = resourceWrapper.getWorkspaces(uniqueId);
+ assertTrue(result.isSuccess());
+ assertTrue(result.getData().contains(workspaceName));
+ // search with prefix
+ result = resourceWrapper.getWorkspaces(prefix);
+ assertTrue(result.isSuccess());
+ assertTrue(result.getData().contains(workspaceName));
+
+ // search with postfix
+ result = resourceWrapper.getWorkspaces(postfix);
+ assertTrue(result.isSuccess());
+ assertTrue(result.getData().contains(workspaceName));
+
+ // search with null
+ result = resourceWrapper.getWorkspaces(null);
+ assertTrue(result.isSuccess());
+ assertTrue(result.getData().contains(workspaceName));
+ }
+
+ @Test
+ public void testGetUserNames() {
+ String prefix = System.currentTimeMillis() + "_";
+ String postfix = "_" + System.currentTimeMillis();
+ String userName = prefix + "user" + uniqueId + "_name" + postfix;
+ String password = "password";
+ String workspaceName = "workspace_user" + uniqueId;
+ createWorkspaceAndUser(workspaceName, userName, password);
+
+ // search with infix
+ Result<List<String>> result = resourceWrapper.getUserNames(uniqueId);
+ assertTrue(result.isSuccess());
+ assertTrue(result.getData().contains(userName));
+
+ // search with prefix
+ result = resourceWrapper.getUserNames(prefix);
+ assertTrue(result.isSuccess());
+ assertTrue(result.getData().contains(userName));
+
+ // search with postfix
+ result = resourceWrapper.getUserNames(postfix);
+ assertTrue(result.isSuccess());
+ assertTrue(result.getData().contains(userName));
+
+ // search with null
+ result = resourceWrapper.getUserNames(null);
+ assertTrue(result.isSuccess());
+ assertTrue(result.getData().contains(userName));
+ }
+
+ @Test
+ public void testGetDatasource() {
+ String prefix = System.currentTimeMillis() + "_";
+ String postfix = "_" + System.currentTimeMillis();
+ String user1 = "user_get_datasource_11" + uniqueId;
+ String user2 = "user_get_datasource_12" + uniqueId;
+ String pass = "somePassword";
+ String workspace1 = "workspace_get_datasource_11" + uniqueId;
+ String workspace2 = "workspace_get_datasource_12" + uniqueId;
+
+ createWorkspaceAndUser(workspace1, user1, pass);
+ createWorkspaceAndUser(workspace2, user2, pass);
+
+ userControllerWrapper.loginAndSetCurrentUser(new UserLoginReq(user1,
pass, workspace1));
+ String datasourceName1 = prefix + "ds-1" + uniqueId + "_get" + postfix;
+
datasourceControllerWrapper.createFakeSourceDatasource(datasourceName1);
+
+ // search with infix
+ Result<List<String>> result =
resourceWrapper.getDatasources(workspace1, uniqueId);
+ assertTrue(result.isSuccess());
+ assertEquals(1, result.getData().size());
+ assertTrue(result.getData().contains(datasourceName1));
+
+ // search with prefix
+ result = resourceWrapper.getDatasources(workspace1, prefix);
+ assertTrue(result.isSuccess());
+ assertEquals(1, result.getData().size());
+ assertTrue(result.getData().contains(datasourceName1));
+
+ // search with postfix
+ result = resourceWrapper.getDatasources(workspace1, postfix);
+ assertTrue(result.isSuccess());
+ assertEquals(1, result.getData().size());
+ assertTrue(result.getData().contains(datasourceName1));
+
+ // search without searchName
+ result = resourceWrapper.getDatasources(workspace1, null);
+ assertTrue(result.isSuccess());
+ assertEquals(1, result.getData().size());
+ assertTrue(result.getData().contains(datasourceName1));
+
+ // search without workspaceName
+ result = resourceWrapper.getDatasources(null, null);
+ assertTrue(result.isSuccess());
+ assertEquals(1, result.getData().size());
+ assertTrue(result.getData().contains(datasourceName1));
+
+ // logout and login with another user with another namespace
+ userControllerWrapper.logout();
+ String datasourceName2 = prefix + "ds-2" + uniqueId + "_get" + postfix;
+ userControllerWrapper.loginAndSetCurrentUser(new UserLoginReq(user2,
pass, workspace2));
+
datasourceControllerWrapper.createFakeSourceDatasource(datasourceName2);
+
+ // Admin user will automatically log in when API is invoked
+ userControllerWrapper.logout();
+ result = resourceWrapper.getDatasources(workspace1, uniqueId);
+ assertTrue(result.isSuccess());
+ assertEquals(1, result.getData().size());
+ assertTrue(result.getData().contains(datasourceName1));
+
+ result = resourceWrapper.getDatasources(workspace2, uniqueId);
+ assertTrue(result.isSuccess());
+ assertEquals(1, result.getData().size());
+ assertTrue(result.getData().contains(datasourceName2));
+
+ // search without workspaceName
+ result = resourceWrapper.getDatasources(null, uniqueId);
+ assertTrue(result.isSuccess());
+ // if workspace is not passed, default workspace will be used and have
not added any
+ // datasource to default workspace
+ assertEquals(0, result.getData().size());
+
+ result = resourceWrapper.getDatasources("non_existing_workspace",
uniqueId);
+ assertFalse(result.isSuccess());
+ assertEquals(SeatunnelErrorEnum.RESOURCE_NOT_FOUND.getCode(),
result.getCode());
+ assertEquals("Workspace with name non_existing_workspace not found.",
result.getMsg());
+ }
+
+ @Test
+ public void testGetJobDefinitions() {
+ String prefix = System.currentTimeMillis() + "_";
+ String postfix = "_" + System.currentTimeMillis();
+ String user1 = "user_get_job_11" + uniqueId;
+ String user2 = "user_get_job_12" + uniqueId;
+ String pass = "somePassword";
+ String workspace1 = "workspace_get_job_11" + uniqueId;
+ String workspace2 = "workspace_get_job_12" + uniqueId;
+
+ createWorkspaceAndUser(workspace1, user1, pass);
+ createWorkspaceAndUser(workspace2, user2, pass);
+
+ userControllerWrapper.loginAndSetCurrentUser(new UserLoginReq(user1,
pass, workspace1));
+ String jobName1 = prefix + "job1" + uniqueId + "_get" + postfix;
+ jobDefinitionControllerWrapper.createJobDefinition(jobName1);
+
+ // search with infix
+ Result<List<String>> result =
resourceWrapper.getJobDefinitions(workspace1, uniqueId);
+ assertTrue(result.isSuccess());
+ assertEquals(1, result.getData().size());
+ assertTrue(result.getData().contains(jobName1));
+
+ // search with prefix
+ result = resourceWrapper.getJobDefinitions(workspace1, prefix);
+ assertTrue(result.isSuccess());
+ assertEquals(1, result.getData().size());
+ assertTrue(result.getData().contains(jobName1));
+
+ // search with postfix
+ result = resourceWrapper.getJobDefinitions(workspace1, postfix);
+ assertTrue(result.isSuccess());
+ assertEquals(1, result.getData().size());
+ assertTrue(result.getData().contains(jobName1));
+
+ // search without searchName
+ result = resourceWrapper.getJobDefinitions(workspace1, null);
+ assertTrue(result.isSuccess());
+ assertEquals(1, result.getData().size());
+ assertTrue(result.getData().contains(jobName1));
+
+ // search without workspaceName
+ result = resourceWrapper.getJobDefinitions(null, null);
+ assertTrue(result.isSuccess());
+ assertEquals(1, result.getData().size());
+ assertTrue(result.getData().contains(jobName1));
+
+ // logout and login with another user with another namespace
+ userControllerWrapper.logout();
+ String jobName2 = prefix + "job2" + uniqueId + "_get" + postfix;
+ userControllerWrapper.loginAndSetCurrentUser(new UserLoginReq(user2,
pass, workspace2));
+ jobDefinitionControllerWrapper.createJobDefinition(jobName2);
+
+ // Admin user will automatically log in when API is invoked
+ userControllerWrapper.logout();
+ result = resourceWrapper.getJobDefinitions(workspace1, uniqueId);
+ assertTrue(result.isSuccess());
+ assertEquals(1, result.getData().size());
+ assertTrue(result.getData().contains(jobName1));
+
+ result = resourceWrapper.getJobDefinitions(workspace2, uniqueId);
+ assertTrue(result.isSuccess());
+ assertEquals(1, result.getData().size());
+ assertTrue(result.getData().contains(jobName2));
+
+ // search without workspaceName
+ result = resourceWrapper.getJobDefinitions(null, uniqueId);
+ assertTrue(result.isSuccess());
+ // if workspace is not passed, default workspace will be used and have
not added any job to
+ // default workspace
+ assertEquals(0, result.getData().size());
+
+ result = resourceWrapper.getJobDefinitions("non_existing_workspace",
uniqueId);
+ assertFalse(result.isSuccess());
+ assertEquals(SeatunnelErrorEnum.RESOURCE_NOT_FOUND.getCode(),
result.getCode());
+ assertEquals("Workspace with name non_existing_workspace not found.",
result.getMsg());
+ }
+
+ private void createWorkspace(String workspaceName) {
+ Result<Long> result =
workspaceControllerWrapper.createWorkspace(workspaceName);
+ assertTrue(result.isSuccess());
+ assertTrue(result.getData() > 0);
+ }
+
+ private void createWorkspaceAndUser(String workspaceName, String username,
String password) {
+ workspaceControllerWrapper.createWorkspaceAndVerify(workspaceName);
+ Result<AddUserRes> result = userControllerWrapper.addUser(username,
password);
+ assertTrue(result.isSuccess());
+ }
+
+ @AfterEach
+ public void cleanup() {
+ userControllerWrapper.logout();
+ }
+
+ @AfterAll
+ public static void tearDown() {
+ seaTunnelWebCluster.stop();
+ }
+}