Complete the datasource code

This commit is contained in:
JiaJu Zhuang
2023-08-06 15:53:23 +08:00
parent c09ee3156e
commit 77417d8c38
51 changed files with 549 additions and 136 deletions

View File

@ -0,0 +1,36 @@
package ai.chat2db.server.domain.api.enums;
import ai.chat2db.server.tools.base.enums.BaseEnum;
import lombok.Getter;
/**
* Data Source Kind
*
* @author Jiaju Zhuang
*/
@Getter
public enum DataSourceKindEnum implements BaseEnum<String> {
/**
* PRIVATE
*/
PRIVATE("PRIVATE"),
/**
* SHARED
*/
SHARED("SHARED"),
;
final String description;
DataSourceKindEnum(String description) {
this.description = description;
}
@Override
public String getCode() {
return this.name();
}
}

View File

@ -119,6 +119,18 @@ public class DataSource {
*/
private Environment environment;
/**
* 用户id
*/
private Long userId;
/**
* 连接类型
*
* @see ai.chat2db.server.domain.api.enums.DataSourceKindEnum
*/
private String kind;
public LinkedHashMap<String, Object> getExtendMap() {
if (ObjectUtils.isEmpty(extendInfo)) {
return new LinkedHashMap<>();

View File

@ -94,4 +94,11 @@ public class DataSourceCreateParam {
* 驱动配置
*/
private DriverConfig driverConfig;
/**
* 连接类型
*
* @see ai.chat2db.server.domain.api.enums.DataSourceKindEnum
*/
private String kind;
}

View File

@ -16,4 +16,11 @@ public class DataSourcePageQueryParam extends PageQueryParam {
* 搜索关键词
*/
private String searchKey;
/**
* 连接类型
*
* @see ai.chat2db.server.domain.api.enums.DataSourceKindEnum
*/
private String kind;
}

View File

@ -1,6 +1,9 @@
package ai.chat2db.server.domain.api.param;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
/**
* @author moji
@ -8,6 +11,13 @@ import lombok.Data;
* @date 2022/09/23
*/
@Data
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
public class DataSourceSelector {
/**
* 环境id
*/
private Boolean environment;
}

View File

@ -100,4 +100,5 @@ public class DataSourceUpdateParam {
* 驱动配置
*/
private DriverConfig driverConfig;
}

View File

@ -0,0 +1,18 @@
package ai.chat2db.server.domain.api.param;
import ai.chat2db.server.tools.base.wrapper.param.PageQueryParam;
import lombok.Data;
/**
* environment
*
* @author Jiaju Zhuang
*/
@Data
public class EnvironmentPageQueryParam extends PageQueryParam {
/**
* 搜索关键词
*/
private String searchKey;
}

View File

@ -31,7 +31,8 @@ public interface DataSourceService {
* @param param
* @return
*/
DataResult<Long> create(DataSourceCreateParam param);
DataResult<Long> createWithPermission(DataSourceCreateParam param);
/**
* 更新数据源连接
@ -39,7 +40,7 @@ public interface DataSourceService {
* @param param
* @return
*/
ActionResult update(DataSourceUpdateParam param);
ActionResult updateWithPermission(DataSourceUpdateParam param);
/**
* 删除数据源连接
@ -47,7 +48,7 @@ public interface DataSourceService {
* @param id
* @return
*/
ActionResult delete(@NotNull Long id);
ActionResult deleteWithPermission(@NotNull Long id);
/**
* 根据id查询数据源连接详情
@ -57,6 +58,15 @@ public interface DataSourceService {
*/
DataResult<DataSource> queryById(@NotNull Long id);
/**
* 根据id查询数据源连接详情
*
* @param id
* @return
* @throws ai.chat2db.server.tools.common.exception.DataNotFoundException
*/
DataResult<DataSource> queryExistent(@NotNull Long id);
/**
* 克隆连接
*

View File

@ -0,0 +1,33 @@
package ai.chat2db.server.domain.api.service;
import java.util.List;
import ai.chat2db.server.domain.api.model.Environment;
import ai.chat2db.server.domain.api.param.EnvironmentPageQueryParam;
import ai.chat2db.server.tools.base.wrapper.result.ListResult;
import ai.chat2db.server.tools.base.wrapper.result.PageResult;
/**
* environment
*
* @author Jiaju Zhuang
*/
public interface EnvironmentService {
/**
* List Query Data
*
* @param idList
* @return
*/
ListResult<Environment> listQuery(List<Long> idList);
/**
* Paging Query Data
*
* @param param
* @return
*/
PageResult<Environment> pageQuery(EnvironmentPageQueryParam param);
}

View File

@ -168,6 +168,7 @@ public abstract class DataSourceConverter {
+ ".class))")
@Mapping(target = "extendInfo",
expression = "java(com.alibaba.fastjson2.JSON.parseArray(dataSourceDO.getExtendInfo(),ai.chat2db.spi.model.KeyValue.class))")
@Mapping(target = "environment.id", source = "environmentId")
public abstract DataSource do2dto(DataSourceDO dataSourceDO);
/**

View File

@ -0,0 +1,65 @@
package ai.chat2db.server.domain.core.converter;
import java.util.List;
import java.util.Map;
import ai.chat2db.server.domain.api.model.Environment;
import ai.chat2db.server.domain.api.service.EnvironmentService;
import ai.chat2db.server.domain.repository.entity.EnvironmentDO;
import ai.chat2db.server.tools.common.util.EasyCollectionUtils;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.MappingTarget;
import org.mapstruct.Mappings;
import org.springframework.context.annotation.Lazy;
/**
* converter
*
* @author Jiaju Zhuang
*/
@Slf4j
@Mapper(componentModel = "spring")
public abstract class EnvironmentConverter {
@Resource
@Lazy
private EnvironmentService environmentService;
/**
* convert
*
* @param list
* @return
*/
public abstract List<Environment> do2dto(List<EnvironmentDO> list);
/**
* Fill in detailed information
*
* @param list
*/
public void fillDetail(List<Environment> list) {
if (CollectionUtils.isEmpty(list)) {
return;
}
List<Long> idList = EasyCollectionUtils.toList(list, Environment::getId);
List<Environment> queryList = environmentService.listQuery(idList).getData();
Map<Long, Environment> queryMap = EasyCollectionUtils.toIdentityMap(queryList, Environment::getId);
for (Environment data : list) {
if (data == null || data.getId() == null) {
continue;
}
Environment query = queryMap.get(data.getId());
add(data, query);
}
}
@Mappings({
@Mapping(target = "id", ignore = true),
})
public abstract void add(@MappingTarget Environment target, Environment source);
}

View File

@ -5,6 +5,7 @@ import java.sql.SQLException;
import java.time.LocalDateTime;
import java.util.List;
import ai.chat2db.server.domain.api.enums.DataSourceKindEnum;
import ai.chat2db.server.domain.api.model.DataSource;
import ai.chat2db.server.domain.api.param.DataSourceCloseParam;
import ai.chat2db.server.domain.api.param.DataSourceCreateParam;
@ -17,6 +18,8 @@ import ai.chat2db.server.domain.api.param.DatabaseQueryAllParam;
import ai.chat2db.server.domain.api.service.DataSourceService;
import ai.chat2db.server.domain.api.service.DatabaseService;
import ai.chat2db.server.domain.core.converter.DataSourceConverter;
import ai.chat2db.server.domain.core.converter.EnvironmentConverter;
import ai.chat2db.server.domain.core.util.PermissionUtils;
import ai.chat2db.server.domain.repository.entity.DataSourceDO;
import ai.chat2db.server.domain.repository.mapper.DataSourceCustomMapper;
import ai.chat2db.server.domain.repository.mapper.DataSourceMapper;
@ -24,8 +27,13 @@ import ai.chat2db.server.tools.base.wrapper.result.ActionResult;
import ai.chat2db.server.tools.base.wrapper.result.DataResult;
import ai.chat2db.server.tools.base.wrapper.result.ListResult;
import ai.chat2db.server.tools.base.wrapper.result.PageResult;
import ai.chat2db.server.tools.common.exception.DataNotFoundException;
import ai.chat2db.server.tools.common.exception.ParamBusinessException;
import ai.chat2db.server.tools.common.exception.PermissionDeniedBusinessException;
import ai.chat2db.server.tools.common.model.LoginUser;
import ai.chat2db.server.tools.common.util.ContextUtils;
import ai.chat2db.server.tools.common.util.EasyCollectionUtils;
import ai.chat2db.server.tools.common.util.EasyEnumUtils;
import ai.chat2db.spi.config.DriverConfig;
import ai.chat2db.spi.model.DataSourceConnect;
import ai.chat2db.spi.model.Database;
@ -39,6 +47,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
@ -63,9 +72,18 @@ public class DataSourceServiceImpl implements DataSourceService {
private DatabaseService databaseService;
@Resource
private DataSourceCustomMapper dataSourceCustomMapper;
@Resource
private EnvironmentConverter environmentConverter;
@Override
public DataResult<Long> create(DataSourceCreateParam param) {
public DataResult<Long> createWithPermission(DataSourceCreateParam param) {
DataSourceKindEnum dataSourceKind = EasyEnumUtils.getEnum(DataSourceKindEnum.class, param.getKind());
if (dataSourceKind == null) {
throw new ParamBusinessException("kind");
}
if (dataSourceKind == DataSourceKindEnum.SHARED && !ContextUtils.getLoginUser().getAdmin()) {
throw new PermissionDeniedBusinessException();
}
DataSourceDO dataSourceDO = dataSourceConverter.param2do(param);
dataSourceDO.setGmtCreate(LocalDateTime.now());
dataSourceDO.setGmtModified(LocalDateTime.now());
@ -94,7 +112,10 @@ public class DataSourceServiceImpl implements DataSourceService {
}
@Override
public ActionResult update(DataSourceUpdateParam param) {
public ActionResult updateWithPermission(DataSourceUpdateParam param) {
DataSource dataSource = queryExistent(param.getId()).getData();
PermissionUtils.checkPermission(dataSource.getUserId());
DataSourceDO dataSourceDO = dataSourceConverter.param2do(param);
dataSourceDO.setGmtModified(LocalDateTime.now());
dataSourceMapper.updateById(dataSourceDO);
@ -102,7 +123,11 @@ public class DataSourceServiceImpl implements DataSourceService {
}
@Override
public ActionResult delete(Long id) {
public ActionResult deleteWithPermission(Long id) {
DataSource dataSource = queryExistent(id).getData();
PermissionUtils.checkPermission(dataSource.getUserId());
dataSourceMapper.deleteById(id);
return ActionResult.isSuccess();
}
@ -113,6 +138,15 @@ public class DataSourceServiceImpl implements DataSourceService {
return DataResult.of(dataSourceConverter.do2dto(dataSourceDO));
}
@Override
public DataResult<DataSource> queryExistent(Long id) {
DataResult<DataSource> dataResult = queryById(id);
if (dataResult.getData() == null) {
throw new DataNotFoundException();
}
return dataResult;
}
@Override
public DataResult<Long> copyById(Long id) {
DataSourceDO dataSourceDO = dataSourceMapper.selectById(id);
@ -138,6 +172,9 @@ public class DataSourceServiceImpl implements DataSourceService {
Page<DataSourceDO> page = new Page<>(start, offset);
IPage<DataSourceDO> iPage = dataSourceMapper.selectPage(page, queryWrapper);
List<DataSource> dataSources = dataSourceConverter.do2dto(iPage.getRecords());
fillData(dataSources,selector);
return PageResult.of(dataSources, iPage.getTotal(), param);
}
@ -148,6 +185,9 @@ public class DataSourceServiceImpl implements DataSourceService {
new Page<>(param.getPageNo(), param.getPageSize()),
BooleanUtils.isTrue(loginUser.getAdmin()), loginUser.getId(), param.getSearchKey());
List<DataSource> dataSources = dataSourceConverter.do2dto(iPage.getRecords());
fillData(dataSources,selector);
return PageResult.of(dataSources, iPage.getTotal(), param);
}
@ -194,4 +234,19 @@ public class DataSourceServiceImpl implements DataSourceService {
return ActionResult.isSuccess();
}
private void fillData(List<DataSource> list, DataSourceSelector selector) {
if (CollectionUtils.isEmpty(list) || selector == null) {
return;
}
fillEnvironment(list, selector);
}
private void fillEnvironment(List<DataSource> list, DataSourceSelector selector) {
if (BooleanUtils.isNotTrue(selector.getEnvironment())) {
return;
}
environmentConverter.fillDetail(EasyCollectionUtils.toList(list, DataSource::getEnvironment));
}
}

View File

@ -0,0 +1,61 @@
package ai.chat2db.server.domain.core.impl;
import java.util.List;
import ai.chat2db.server.domain.api.model.Environment;
import ai.chat2db.server.domain.api.param.EnvironmentPageQueryParam;
import ai.chat2db.server.domain.api.service.EnvironmentService;
import ai.chat2db.server.domain.core.converter.EnvironmentConverter;
import ai.chat2db.server.domain.repository.entity.EnvironmentDO;
import ai.chat2db.server.domain.repository.mapper.EnvironmentMapper;
import ai.chat2db.server.tools.base.wrapper.result.ListResult;
import ai.chat2db.server.tools.base.wrapper.result.PageResult;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
/**
* environment
*
* @author Jiaju Zhuang
*/
@Slf4j
@Service
public class EnvironmentServiceImpl implements EnvironmentService {
@Resource
private EnvironmentMapper environmentMapper;
@Resource
private EnvironmentConverter environmentConverter;
@Override
public ListResult<Environment> listQuery(List<Long> idList) {
if (CollectionUtils.isEmpty(idList)) {
return ListResult.empty();
}
LambdaQueryWrapper<EnvironmentDO> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.in(EnvironmentDO::getId, idList);
List<EnvironmentDO> dataList = environmentMapper.selectList(queryWrapper);
List<Environment> list = environmentConverter.do2dto(dataList);
return ListResult.of(list);
}
@Override
public PageResult<Environment> pageQuery(EnvironmentPageQueryParam param) {
LambdaQueryWrapper<EnvironmentDO> queryWrapper = new LambdaQueryWrapper<>();
if (StringUtils.isNotBlank(param.getSearchKey())) {
queryWrapper.and(wrapper -> wrapper.like(EnvironmentDO::getName, "%" + param.getSearchKey() + "%")
.or()
.like(EnvironmentDO::getShortName, "%" + param.getSearchKey() + "%"));
}
IPage<EnvironmentDO> iPage = environmentMapper.selectPage(new Page<>(param.getPageNo(), param.getPageSize()),
queryWrapper);
List<Environment> dataSources = environmentConverter.do2dto(iPage.getRecords());
return PageResult.of(dataSources, iPage.getTotal(), param);
}
}

View File

@ -0,0 +1,39 @@
package ai.chat2db.server.domain.core.util;
import ai.chat2db.server.domain.api.enums.RoleCodeEnum;
import ai.chat2db.server.tools.common.exception.PermissionDeniedBusinessException;
import ai.chat2db.server.tools.common.model.LoginUser;
import ai.chat2db.server.tools.common.util.ContextUtils;
/**
* Permission Utils
*
* @author Jiaju Zhuang
*/
public class PermissionUtils {
/**
* Verify whether the currently logged in user has permission to operate on the current content
*
* @param createUserId The creator of the current content
*/
public static void checkPermission(Long createUserId) {
LoginUser loginUser = ContextUtils.getLoginUser();
// Representative is desktop mode
if (RoleCodeEnum.DESKTOP.getDefaultUserId().equals(loginUser.getId())) {
if (RoleCodeEnum.DESKTOP.getDefaultUserId().equals(createUserId)) {
return;
} else {
throw new PermissionDeniedBusinessException();
}
}
// Administrators can edit anything
if (loginUser.getAdmin()) {
return;
}
// Not that administrators can only edit their own things
if (!loginUser.getId().equals(createUserId)) {
throw new PermissionDeniedBusinessException();
}
}
}

View File

@ -14,7 +14,7 @@ import lombok.Setter;
* </p>
*
* @author chat2db
* @since 2023-08-05
* @since 2023-08-06
*/
@Getter
@Setter
@ -123,4 +123,9 @@ public class DataSourceDO implements Serializable {
* 环境id
*/
private Long environmentId;
/**
* 连接类型
*/
private String kind;
}

View File

@ -9,7 +9,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
* </p>
*
* @author chat2db
* @since 2023-07-30
* @since 2023-08-06
*/
public interface DataSourceMapper extends BaseMapper<DataSourceDO> {

View File

@ -4,6 +4,7 @@ import ai.chat2db.server.tools.common.enums.ModeEnum;
import ai.chat2db.server.tools.common.model.ConfigJson;
import ai.chat2db.server.tools.common.util.ConfigUtils;
import ai.chat2db.server.tools.common.util.EasyEnumUtils;
import cn.hutool.core.lang.UUID;
import com.dtflys.forest.springboot.annotation.ForestScan;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ArrayUtils;
@ -49,6 +50,18 @@ public class Application {
// In this mode, no user login is required, so only local access is available
args = ArrayUtils.add(args, "--server.address=0.0.0.0");
}
String jwtSecretKey = System.getProperty("sa-token.jwt-secret-key");
// The user did not specify the jws key
if (StringUtils.isBlank(jwtSecretKey)) {
if (StringUtils.isBlank(configJson.getJwtSecretKey())) {
configJson.setJwtSecretKey(UUID.fastUUID().toString().replaceAll("-", ""));
ConfigUtils.setConfig(configJson);
}
// Ensure that the jwt Secret Key for each application is unique
args = ArrayUtils.add(args, "--sa-token.jwt-secret-key=" + configJson.getJwtSecretKey());
}
SpringApplication.run(Application.class, args);
}
}

View File

@ -2,6 +2,8 @@ spring:
# 默认开发环境
profiles:
active: dev
main:
allow-bean-definition-overriding: true
jpa:
# 展示sql
show-sql: true
@ -50,7 +52,7 @@ logging:
# 登录功能
sa-token:
# token名称 (同时也是cookie名称)
token-name: DBHUB
token-name: CHAT2DB
timeout: 2592000
# 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录)
is-concurrent: true
@ -60,8 +62,6 @@ sa-token:
token-style: uuid
# 是否输出操作日志
is-log: true
# jwt秘钥 部署的时候需要改掉,不然可以随便破解登录
jwt-secret-key: jwt_dbhub
is-write-header: true
chatgpt:

View File

@ -26,6 +26,9 @@ ALTER TABLE `data_source`
ALTER TABLE `data_source`
modify COLUMN `user_id` bigint(20) unsigned NOT NULL DEFAULT 1 COMMENT '用户id';
ALTER TABLE `data_source`
ADD COLUMN `kind` varchar(32) NOT NULL DEFAULT 'PRIVATE' COMMENT '连接类型';
update data_source
set user_id= 1;

View File

@ -8,6 +8,7 @@ common.paramDetailError=The parameter: {0} is incorrect
common.paramCheckError=The following parameters are not valid:
common.maxUploadSize=The file exceeds the maximum limit
common.permissionDenied=Permission denied
common.dataNotFound=Data not found
oauth.userNameNotExits=The current account does not exist
oauth.IllegalUserName=The current account cannot be logged in. Please change your account

View File

@ -7,6 +7,7 @@ common.paramDetailError=The parameter: {0} is incorrect
common.paramCheckError=The following parameters are not valid
common.maxUploadSize=The file exceeds the maximum limit
common.permissionDenied=Permission denied
common.dataNotFound=Data not found
oauth.userNameNotExits=The current account does not exist
oauth.IllegalUserName=The current account cannot be logged in. Please change your account

View File

@ -7,6 +7,7 @@ common.paramDetailError=您输入的参数:{0},存在异常
common.paramCheckError=请检查以下参数:
common.maxUploadSize=您输入的文件超过最大限制
common.permissionDenied=您没有权限访问该页面
common.dataNotFound=您访问的数据不存在
oauth.userNameNotExits=当前账号不存在
oauth.IllegalUserName=当前账号无法登录,请换一个账号

View File

@ -83,6 +83,7 @@ public class MybatisGeneratorTest extends BaseTest {
//开启实体类配置
.entityBuilder()
.formatFileName("%sDO")
.enableFileOverride()
//.addTableFills(new Column("gmt_create", FieldFill.INSERT)) // 表字段填充
//.addTableFills(new Column("update_time", FieldFill.INSERT_UPDATE)) // 表字段填充
//开启lombok

View File

@ -89,7 +89,7 @@ public class SQLExecutorOperationsTest extends BaseTest {
dataSourceCreateParam.setUrl(dialectProperties.getUrl());
dataSourceCreateParam.setUserName(dialectProperties.getUsername());
dataSourceCreateParam.setPassword(dialectProperties.getPassword());
DataResult<Long> dataSourceConnect = dataSourceService.create(dataSourceCreateParam);
DataResult<Long> dataSourceConnect = dataSourceService.createWithPermission(dataSourceCreateParam);
Assertions.assertTrue(dataSourceConnect.getSuccess(), "创建数据库连接池失败");
// Assertions.assertTrue(DataCenterUtils.JDBC_ACCESSOR_MAP.containsKey(dataSourceId), "创建数据库连接池失败");
}

View File

@ -1,35 +0,0 @@
package ai.chat2db.server.tools.base.enums;
import lombok.Getter;
/**
* @author moji
* @version ConnectionTypeEnum.java, v 0.1 2022年09月16日 14:59 moji Exp $
* @date 2022/09/16
*/
@Getter
public enum EnvTypeEnum implements BaseEnum<String> {
/**
* 日常环境
*/
DAILY("日常环境"),
/**
* 生产环境
*/
PRODUCT("生产环境"),
;
final String description;
EnvTypeEnum(String description) {
this.description = description;
}
@Override
public String getCode() {
return this.name();
}
}

View File

@ -11,8 +11,6 @@ import ai.chat2db.server.tools.base.wrapper.Result;
import ai.chat2db.server.tools.base.wrapper.param.PageQueryParam;
import ai.chat2db.server.tools.base.wrapper.result.web.WebPageResult;
import ai.chat2db.server.tools.base.wrapper.result.web.WebPageResult.Page;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.experimental.SuperBuilder;
@ -162,6 +160,7 @@ public class PageResult<T> implements Serializable, Result<List<T>> {
return new PageResult<>(data, 0L, param.getPageNo(), param.getPageSize());
}
/**
* 构建空的返回对象
*

View File

@ -0,0 +1,24 @@
package ai.chat2db.server.tools.common.exception;
import java.io.Serial;
import ai.chat2db.server.tools.base.constant.EasyToolsConstant;
import ai.chat2db.server.tools.base.excption.BusinessException;
import lombok.Getter;
/**
* Data not found exceptions
*
* @author Jiaju Zhuang
*/
@Getter
public class DataNotFoundException extends BusinessException {
@Serial
private static final long serialVersionUID = EasyToolsConstant.SERIAL_VERSION_UID;
public DataNotFoundException() {
super("common.dataNotFound");
}
}

View File

@ -20,4 +20,9 @@ public class ConfigJson {
* Last successfully launched version
*/
private String latestStartupSuccessVersion;
/**
* jwt
*/
private String jwtSecretKey;
}

View File

@ -37,4 +37,9 @@ public class LoginUser implements Serializable {
* Is it an administrator
*/
private Boolean admin;
/**
* Is it an desktop
*/
private Boolean desktop;
}

View File

@ -1,7 +1,7 @@
package ai.chat2db.server.admin.api.controller.common;
import ai.chat2db.server.admin.api.controller.common.request.CommonPageQueryRequest;
import ai.chat2db.server.common.api.controller.request.CommonPageQueryRequest;
import ai.chat2db.server.admin.api.controller.common.vo.TeamUserListVO;
import ai.chat2db.server.admin.api.controller.datasource.converter.DataSourceAdminConverter;
import ai.chat2db.server.domain.api.service.DataSourceService;

View File

@ -1,13 +1,14 @@
package ai.chat2db.server.admin.api.controller.datasource;
import ai.chat2db.server.admin.api.controller.common.request.CommonPageQueryRequest;
import ai.chat2db.server.common.api.controller.request.CommonPageQueryRequest;
import ai.chat2db.server.admin.api.controller.datasource.converter.DataSourceAdminConverter;
import ai.chat2db.server.admin.api.controller.datasource.request.DataSourceCloneRequest;
import ai.chat2db.server.admin.api.controller.datasource.request.DataSourceCreateRequest;
import ai.chat2db.server.admin.api.controller.datasource.request.DataSourceUpdateRequest;
import ai.chat2db.server.admin.api.controller.datasource.vo.DataSourcePageQueryVO;
import ai.chat2db.server.domain.api.param.DataSourceCreateParam;
import ai.chat2db.server.domain.api.param.DataSourceSelector;
import ai.chat2db.server.domain.api.param.DataSourceUpdateParam;
import ai.chat2db.server.domain.api.service.DataSourceService;
import ai.chat2db.server.tools.base.wrapper.result.ActionResult;
@ -32,6 +33,9 @@ import org.springframework.web.bind.annotation.RestController;
@RestController
public class DataSourceAdminController {
private static final DataSourceSelector DATA_SOURCE_SELECTOR = DataSourceSelector.builder()
.environment(Boolean.TRUE)
.build();
@Resource
private DataSourceService dataSourceService;
@Resource
@ -46,7 +50,7 @@ public class DataSourceAdminController {
*/
@GetMapping("/page")
public WebPageResult<DataSourcePageQueryVO> page(@Valid CommonPageQueryRequest request) {
return dataSourceService.queryPageWithPermission(dataSourceAdminConverter.request2param(request), null)
return dataSourceService.queryPageWithPermission(dataSourceAdminConverter.request2param(request), DATA_SOURCE_SELECTOR)
.mapToWeb(dataSourceAdminConverter::dto2vo);
}
@ -58,9 +62,9 @@ public class DataSourceAdminController {
* @version 2.1.0
*/
@PostMapping("/create")
public DataResult<Long> create(@RequestBody DataSourceCreateRequest request) {
public DataResult<Long> create(@Valid @RequestBody DataSourceCreateRequest request) {
DataSourceCreateParam param = dataSourceAdminConverter.createReq2param(request);
return dataSourceService.create(param);
return dataSourceService.createWithPermission(param);
}
/**
@ -71,9 +75,9 @@ public class DataSourceAdminController {
* @version 2.1.0
*/
@PostMapping("/update")
public ActionResult update(@RequestBody DataSourceUpdateRequest request) {
public ActionResult update(@Valid @RequestBody DataSourceUpdateRequest request) {
DataSourceUpdateParam param = dataSourceAdminConverter.updateReq2param(request);
return dataSourceService.update(param);
return dataSourceService.updateWithPermission(param);
}
/**
@ -97,6 +101,6 @@ public class DataSourceAdminController {
*/
@DeleteMapping("/{id}")
public ActionResult delete(@PathVariable Long id) {
return dataSourceService.delete(id);
return dataSourceService.deleteWithPermission(id);
}
}

View File

@ -1,9 +1,10 @@
package ai.chat2db.server.admin.api.controller.datasource.converter;
import ai.chat2db.server.admin.api.controller.common.request.CommonPageQueryRequest;
import ai.chat2db.server.admin.api.controller.datasource.request.DataSourceCreateRequest;
import ai.chat2db.server.admin.api.controller.datasource.request.DataSourceUpdateRequest;
import ai.chat2db.server.admin.api.controller.datasource.vo.DataSourcePageQueryVO;
import ai.chat2db.server.common.api.controller.request.CommonPageQueryRequest;
import ai.chat2db.server.domain.api.enums.DataSourceKindEnum;
import ai.chat2db.server.domain.api.model.DataSource;
import ai.chat2db.server.domain.api.param.DataSourceCreateParam;
import ai.chat2db.server.domain.api.param.DataSourcePageQueryParam;
@ -17,7 +18,7 @@ import org.mapstruct.Mappings;
*
* @author Jiaju Zhuang
*/
@Mapper(componentModel = "spring")
@Mapper(componentModel = "spring",imports = {DataSourceKindEnum.class})
public abstract class DataSourceAdminConverter {
/**
@ -51,7 +52,8 @@ public abstract class DataSourceAdminConverter {
* @return
*/
@Mappings({
@Mapping(source = "user", target = "userName")
@Mapping(source = "user", target = "userName"),
@Mapping(target = "kind", expression = "java(DataSourceKindEnum.SHARED.getCode())"),
})
public abstract DataSourceCreateParam createReq2param(DataSourceCreateRequest request);

View File

@ -2,7 +2,6 @@ package ai.chat2db.server.admin.api.controller.datasource.request;
import java.util.List;
import ai.chat2db.server.tools.base.enums.EnvTypeEnum;
import ai.chat2db.spi.config.DriverConfig;
import ai.chat2db.spi.model.KeyValue;
import ai.chat2db.spi.model.SSHInfo;
@ -51,12 +50,6 @@ public class DataSourceCreateRequest {
@NotNull
private String type;
/**
* 环境类型
* @see EnvTypeEnum
*/
private String envType;
/**
* host
*/
@ -103,6 +96,11 @@ public class DataSourceCreateRequest {
*/
private DriverConfig driverConfig;
/**
* 环境id
*/
@NotNull
private Long environmentId;
}

View File

@ -2,7 +2,6 @@ package ai.chat2db.server.admin.api.controller.datasource.request;
import java.util.List;
import ai.chat2db.server.tools.base.enums.EnvTypeEnum;
import ai.chat2db.spi.config.DriverConfig;
import ai.chat2db.spi.model.KeyValue;
import ai.chat2db.spi.model.SSHInfo;
@ -51,12 +50,11 @@ public class DataSourceUpdateRequest {
/**
* 环境类型
*
* @see EnvTypeEnum
*/
private String envType;
/**
* host
*/
@ -87,7 +85,6 @@ public class DataSourceUpdateRequest {
*/
private String driver;
/**
* jdbc版本
*/
@ -102,4 +99,10 @@ public class DataSourceUpdateRequest {
* 驱动配置
*/
private DriverConfig driverConfig;
/**
* 环境id
*/
@NotNull
private Long environmentId;
}

View File

@ -1,7 +1,7 @@
package ai.chat2db.server.admin.api.controller.datasource.vo;
import ai.chat2db.server.common.api.controller.vo.EnvironmentVO;
import ai.chat2db.server.common.api.controller.vo.SimpleEnvironmentVO;
import lombok.Data;
/**
@ -35,5 +35,5 @@ public class DataSourcePageQueryVO {
/**
* 环境
*/
private EnvironmentVO environment;
private SimpleEnvironmentVO environment;
}

View File

@ -1,7 +1,7 @@
package ai.chat2db.server.admin.api.controller.datasource.vo;
import ai.chat2db.server.common.api.controller.vo.EnvironmentVO;
import ai.chat2db.server.common.api.controller.vo.SimpleEnvironmentVO;
import lombok.Data;
/**
@ -35,5 +35,5 @@ public class SimpleDataSourceVO {
/**
* 环境
*/
private EnvironmentVO environment;
private SimpleEnvironmentVO environment;
}

View File

@ -1,7 +1,7 @@
package ai.chat2db.server.admin.api.controller.team;
import ai.chat2db.server.admin.api.controller.common.request.CommonPageQueryRequest;
import ai.chat2db.server.common.api.controller.request.CommonPageQueryRequest;
import ai.chat2db.server.admin.api.controller.team.request.TeamCreateRequest;
import ai.chat2db.server.admin.api.controller.team.request.TeamUpdateRequest;
import ai.chat2db.server.admin.api.controller.team.vo.TeamPageQueryVO;

View File

@ -1,7 +1,7 @@
package ai.chat2db.server.admin.api.controller.team;
import ai.chat2db.server.admin.api.controller.common.request.CommonPageQueryRequest;
import ai.chat2db.server.common.api.controller.request.CommonPageQueryRequest;
import ai.chat2db.server.admin.api.controller.team.request.TeamDataSourceBatchCreateRequest;
import ai.chat2db.server.admin.api.controller.team.vo.TeamDataSourcePageQueryVO;
import ai.chat2db.server.tools.base.wrapper.result.ActionResult;

View File

@ -1,7 +1,7 @@
package ai.chat2db.server.admin.api.controller.team;
import ai.chat2db.server.admin.api.controller.common.request.CommonPageQueryRequest;
import ai.chat2db.server.common.api.controller.request.CommonPageQueryRequest;
import ai.chat2db.server.admin.api.controller.team.request.TeamUserBatchCreateRequest;
import ai.chat2db.server.admin.api.controller.team.vo.TeamUserPageQueryVO;
import ai.chat2db.server.tools.base.wrapper.result.ActionResult;

View File

@ -1,7 +1,7 @@
package ai.chat2db.server.admin.api.controller.user;
import ai.chat2db.server.admin.api.controller.common.request.CommonPageQueryRequest;
import ai.chat2db.server.common.api.controller.request.CommonPageQueryRequest;
import ai.chat2db.server.admin.api.controller.user.converter.UserAdminConverter;
import ai.chat2db.server.admin.api.controller.user.request.UserCreateRequest;
import ai.chat2db.server.admin.api.controller.user.request.UserUpdateRequest;

View File

@ -1,7 +1,7 @@
package ai.chat2db.server.admin.api.controller.user;
import ai.chat2db.server.admin.api.controller.common.request.CommonPageQueryRequest;
import ai.chat2db.server.common.api.controller.request.CommonPageQueryRequest;
import ai.chat2db.server.admin.api.controller.user.request.UserTeamBatchCreateRequest;
import ai.chat2db.server.admin.api.controller.user.vo.UserDataSourcePageQueryVO;
import ai.chat2db.server.tools.base.wrapper.result.ActionResult;

View File

@ -1,7 +1,7 @@
package ai.chat2db.server.admin.api.controller.user;
import ai.chat2db.server.admin.api.controller.common.request.CommonPageQueryRequest;
import ai.chat2db.server.common.api.controller.request.CommonPageQueryRequest;
import ai.chat2db.server.admin.api.controller.user.request.UserTeamBatchCreateRequest;
import ai.chat2db.server.admin.api.controller.user.vo.UserTeamPageQueryVO;
import ai.chat2db.server.tools.base.wrapper.result.ActionResult;

View File

@ -22,6 +22,10 @@
<groupId>ai.chat2db</groupId>
<artifactId>chat2db-server-domain-api</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,42 @@
package ai.chat2db.server.common.api.controller;
import ai.chat2db.server.common.api.controller.converter.EnvironmentCommonConverter;
import ai.chat2db.server.common.api.controller.vo.SimpleEnvironmentVO;
import ai.chat2db.server.domain.api.param.EnvironmentPageQueryParam;
import ai.chat2db.server.domain.api.service.EnvironmentService;
import ai.chat2db.server.tools.base.wrapper.result.ListResult;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* Some general data queries
*
* @author Jiaju Zhuang
*/
@RequestMapping("/api/common")
@RestController
public class CommonCommonController {
@Resource
private EnvironmentService environmentService;
@Resource
private EnvironmentCommonConverter environmentCommonConverter;
/**
* Query all environments
*
* @return
* @version 2.1.0
*/
@GetMapping("/environment/list_all")
public ListResult<SimpleEnvironmentVO> environmentList() {
EnvironmentPageQueryParam environmentPageQueryParam = new EnvironmentPageQueryParam();
environmentPageQueryParam.setPageSize(Integer.MIN_VALUE);
return ListResult.of(
environmentCommonConverter.dto2vo(environmentService.pageQuery(environmentPageQueryParam).getData()));
}
}

View File

@ -0,0 +1,27 @@
package ai.chat2db.server.common.api.controller.converter;
import java.util.List;
import ai.chat2db.server.common.api.controller.vo.SimpleEnvironmentVO;
import ai.chat2db.server.domain.api.model.Environment;
import lombok.extern.slf4j.Slf4j;
import org.mapstruct.Mapper;
/**
* converter
*
* @author Jiaju Zhuang
*/
@Slf4j
@Mapper(componentModel = "spring")
public abstract class EnvironmentCommonConverter {
/**
* convert
*
* @param list
* @return
*/
public abstract List<SimpleEnvironmentVO> dto2vo(List<Environment> list);
}

View File

@ -1,5 +1,5 @@
package ai.chat2db.server.admin.api.controller.common.request;
package ai.chat2db.server.common.api.controller.request;
import ai.chat2db.server.tools.base.wrapper.request.PageQueryRequest;
import lombok.Data;

View File

@ -19,7 +19,7 @@ import lombok.experimental.SuperBuilder;
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
public class EnvironmentVO implements Serializable {
public class SimpleEnvironmentVO implements Serializable {
@Serial
private static final long serialVersionUID = EasyToolsConstant.SERIAL_VERSION_UID;

View File

@ -198,7 +198,7 @@ public class DataSourceController {
@PostMapping("/datasource/create")
public DataResult<Long> create(@RequestBody DataSourceCreateRequest request) {
DataSourceCreateParam param = dataSourceWebConverter.createReq2param(request);
return dataSourceService.create(param);
return dataSourceService.createWithPermission(param);
}
/**
@ -210,7 +210,7 @@ public class DataSourceController {
@RequestMapping(value = "/datasource/update",method = {RequestMethod.POST, RequestMethod.PUT})
public ActionResult update(@RequestBody DataSourceUpdateRequest request) {
DataSourceUpdateParam param = dataSourceWebConverter.updateReq2param(request);
return dataSourceService.update(param);
return dataSourceService.updateWithPermission(param);
}
/**
@ -232,7 +232,7 @@ public class DataSourceController {
*/
@DeleteMapping("/datasource/{id}")
public ActionResult delete(@PathVariable Long id) {
return dataSourceService.delete(id);
return dataSourceService.deleteWithPermission(id);
}
}

View File

@ -1,42 +0,0 @@
package ai.chat2db.server.web.api.controller.data.source;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import ai.chat2db.server.tools.base.enums.EnvTypeEnum;
import ai.chat2db.server.tools.base.wrapper.result.ListResult;
import ai.chat2db.server.web.api.controller.data.source.vo.EnvVO;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 环境打标服务类
*
* @author moji
* @version EnvController.java, v 0.1 2022年09月18日 14:04 moji Exp $
* @date 2022/09/18
*/
@RequestMapping("/api/env")
@RestController
public class EnvController {
/**
* 查询环境列表
*
* @return
*/
@GetMapping("/list")
public ListResult<EnvVO> list() {
List<EnvVO> envVOS = Arrays.stream(EnvTypeEnum.values()).map(envTypeEnum -> {
EnvVO envVO = new EnvVO();
envVO.setCode(envTypeEnum.getCode());
envVO.setName(envTypeEnum.getDescription());
return envVO;
}).collect(Collectors.toList());
return ListResult.of(envVOS);
}
}

View File

@ -8,7 +8,6 @@ import jakarta.validation.constraints.NotNull;
import ai.chat2db.spi.model.KeyValue;
import ai.chat2db.spi.model.SSHInfo;
import ai.chat2db.spi.model.SSLInfo;
import ai.chat2db.server.tools.base.enums.EnvTypeEnum;
import lombok.Data;
@ -53,12 +52,6 @@ public class DataSourceCreateRequest {
@NotNull
private String type;
/**
* 环境类型
* @see EnvTypeEnum
*/
private String envType;
/**
* host
*/
@ -106,5 +99,10 @@ public class DataSourceCreateRequest {
private DriverConfig driverConfig;
/**
* 环境id
*/
@NotNull
private Long environmentId;
}

View File

@ -8,7 +8,6 @@ import jakarta.validation.constraints.NotNull;
import ai.chat2db.spi.model.KeyValue;
import ai.chat2db.spi.model.SSHInfo;
import ai.chat2db.spi.model.SSLInfo;
import ai.chat2db.server.tools.base.enums.EnvTypeEnum;
import lombok.Data;