feat:support custom url pattern

This commit is contained in:
vran 2022-03-12 11:04:02 +08:00
parent 7a2ebcd663
commit 327d637557
11 changed files with 62 additions and 2 deletions

View File

@ -1,5 +1,6 @@
package com.databasir.api; package com.databasir.api;
import com.databasir.api.validator.DatabaseTypeValidator;
import com.databasir.common.JsonData; import com.databasir.common.JsonData;
import com.databasir.core.domain.database.data.*; import com.databasir.core.domain.database.data.*;
import com.databasir.core.domain.database.service.DatabaseTypeService; import com.databasir.core.domain.database.service.DatabaseTypeService;
@ -24,6 +25,8 @@ public class DatabaseTypeController {
private final DatabaseTypeService databaseTypeService; private final DatabaseTypeService databaseTypeService;
private final DatabaseTypeValidator databaseTypeValidator;
@GetMapping(Routes.DatabaseType.LIST_SIMPLE) @GetMapping(Routes.DatabaseType.LIST_SIMPLE)
public JsonData<List<String>> listSimpleDatabaseTypes() { public JsonData<List<String>> listSimpleDatabaseTypes() {
List<String> types = databaseTypeService.listSimpleDatabaseTypes(); List<String> types = databaseTypeService.listSimpleDatabaseTypes();
@ -41,6 +44,7 @@ public class DatabaseTypeController {
@PostMapping(Routes.DatabaseType.CREATE) @PostMapping(Routes.DatabaseType.CREATE)
@Operation(module = Operation.Modules.DATABASE_TYPE, name = "创建数据库类型") @Operation(module = Operation.Modules.DATABASE_TYPE, name = "创建数据库类型")
public JsonData<Integer> create(@RequestBody @Valid DatabaseTypeCreateRequest request) { public JsonData<Integer> create(@RequestBody @Valid DatabaseTypeCreateRequest request) {
databaseTypeValidator.isValidUrlPattern(request.getUrlPattern());
Integer id = databaseTypeService.create(request); Integer id = databaseTypeService.create(request);
return JsonData.ok(id); return JsonData.ok(id);
} }
@ -48,6 +52,7 @@ public class DatabaseTypeController {
@PatchMapping(Routes.DatabaseType.UPDATE) @PatchMapping(Routes.DatabaseType.UPDATE)
@Operation(module = Operation.Modules.DATABASE_TYPE, name = "更新数据库类型") @Operation(module = Operation.Modules.DATABASE_TYPE, name = "更新数据库类型")
public JsonData<Void> update(@RequestBody @Valid DatabaseTypeUpdateRequest request) { public JsonData<Void> update(@RequestBody @Valid DatabaseTypeUpdateRequest request) {
databaseTypeValidator.isValidUrlPattern(request.getUrlPattern());
databaseTypeService.update(request); databaseTypeService.update(request);
return JsonData.ok(); return JsonData.ok();
} }

View File

@ -0,0 +1,23 @@
package com.databasir.api.validator;
import com.databasir.core.domain.DomainErrors;
import org.springframework.stereotype.Component;
@Component
public class DatabaseTypeValidator {
public void isValidUrlPattern(String urlPattern) {
if (urlPattern == null) {
throw DomainErrors.INVALID_DATABASE_TYPE_URL_PATTERN.exception("url pattern 不能为空");
}
if (!urlPattern.contains("{{jdbc.protocol}}")) {
throw DomainErrors.INVALID_DATABASE_TYPE_URL_PATTERN.exception("必须包含变量{{jdbc.protocol}}");
}
if (!urlPattern.contains("{{db.url}}")) {
throw DomainErrors.INVALID_DATABASE_TYPE_URL_PATTERN.exception("必须包含变量{{db.url}}不能为空");
}
if (!urlPattern.contains("{{db.name}}")) {
throw DomainErrors.INVALID_DATABASE_TYPE_URL_PATTERN.exception("必须包含变量{{db.name}}不能为空");
}
}
}

View File

@ -31,6 +31,7 @@ public enum DomainErrors implements DatabasirErrors {
DATABASE_TYPE_NAME_DUPLICATE("A_10016", "数据库类型名已存在"), DATABASE_TYPE_NAME_DUPLICATE("A_10016", "数据库类型名已存在"),
MUST_NOT_MODIFY_SYSTEM_DEFAULT_DATABASE_TYPE("A_10017", "禁止修改系统默认数据库类型"), MUST_NOT_MODIFY_SYSTEM_DEFAULT_DATABASE_TYPE("A_10017", "禁止修改系统默认数据库类型"),
DOWNLOAD_DRIVER_ERROR("A_10018", "驱动下载失败"), DOWNLOAD_DRIVER_ERROR("A_10018", "驱动下载失败"),
INVALID_DATABASE_TYPE_URL_PATTERN("A_10019", "不合法的 url pattern"),
; ;
private final String errCode; private final String errCode;

View File

@ -23,4 +23,8 @@ public class DatabaseTypeCreateRequest {
@NotBlank @NotBlank
private String jdbcProtocol; private String jdbcProtocol;
@NotBlank
private String urlPattern;
} }

View File

@ -21,6 +21,8 @@ public class DatabaseTypeDetailResponse {
private String jdbcProtocol; private String jdbcProtocol;
private String urlPattern;
private Boolean deleted; private Boolean deleted;
private Integer deletedToken; private Integer deletedToken;

View File

@ -27,6 +27,8 @@ public class DatabaseTypePageResponse {
private Integer projectCount; private Integer projectCount;
private String urlPattern;
private LocalDateTime updateAt; private LocalDateTime updateAt;
private LocalDateTime createAt; private LocalDateTime createAt;

View File

@ -27,4 +27,7 @@ public class DatabaseTypeUpdateRequest {
@NotBlank @NotBlank
private String jdbcProtocol; private String jdbcProtocol;
@NotBlank
private String urlPattern;
} }

View File

@ -107,7 +107,18 @@ public class DocumentService {
documentPojoConverter.toColumnPojo(docId, tableMetaId, table.getColumns()); documentPojoConverter.toColumnPojo(docId, tableMetaId, table.getColumns());
tableColumnDocumentDao.batchInsert(tableColumnMetas); tableColumnDocumentDao.batchInsert(tableColumnMetas);
List<TableIndexDocumentPojo> tableIndexMetas = List<TableIndexDocumentPojo> tableIndexMetas =
documentPojoConverter.toIndexPojo(docId, tableMetaId, table.getIndexes()); documentPojoConverter.toIndexPojo(docId, tableMetaId, table.getIndexes())
.stream()
.filter(index -> {
if (index.getName() != null) {
return true;
} else {
log.warn("ignore table {} index {}, cause name is null", table.getName(), index);
return false;
}
})
.collect(Collectors.toList());
tableIndexDocumentDao.batchInsert(tableIndexMetas); tableIndexDocumentDao.batchInsert(tableIndexMetas);
List<TableTriggerDocumentPojo> tableTriggerMetas = List<TableTriggerDocumentPojo> tableTriggerMetas =
documentPojoConverter.toTriggerPojo(docId, tableMetaId, table.getTriggers()); documentPojoConverter.toTriggerPojo(docId, tableMetaId, table.getTriggers());

View File

@ -6,6 +6,7 @@ import com.databasir.dao.impl.DatabaseTypeDao;
import com.databasir.dao.tables.pojos.DatabaseTypePojo; import com.databasir.dao.tables.pojos.DatabaseTypePojo;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.io.File; import java.io.File;
@ -22,6 +23,7 @@ import java.util.Properties;
@Component @Component
@RequiredArgsConstructor @RequiredArgsConstructor
@Slf4j @Slf4j
@Order
public class CustomDatabaseConnectionFactory implements DatabaseConnectionFactory { public class CustomDatabaseConnectionFactory implements DatabaseConnectionFactory {
private final DatabaseTypeDao databaseTypeDao; private final DatabaseTypeDao databaseTypeDao;
@ -73,10 +75,13 @@ public class CustomDatabaseConnectionFactory implements DatabaseConnectionFactor
throw DomainErrors.CONNECT_DATABASE_FAILED.exception("驱动初始化异常:" + e.getMessage()); throw DomainErrors.CONNECT_DATABASE_FAILED.exception("驱动初始化异常:" + e.getMessage());
} }
String urlPattern = type.getUrlPattern();
String jdbcUrl = urlPattern.replace("{{jdbc.protocol}}", type.getJdbcProtocol())
.replace("{{db.url}}", context.getUrl())
.replace("{{db.name}}", context.getSchema());
Properties info = new Properties(); Properties info = new Properties();
info.put("user", context.getUsername()); info.put("user", context.getUsername());
info.put("password", context.getPassword()); info.put("password", context.getPassword());
String jdbcUrl = type.getJdbcProtocol() + "://" + context.getUrl() + "/" + context.getSchema();
return driver.connect(jdbcUrl, info); return driver.connect(jdbcUrl, info);
} }

View File

@ -1,5 +1,6 @@
package com.databasir.core.infrastructure.connection; package com.databasir.core.infrastructure.connection;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.sql.Connection; import java.sql.Connection;
@ -8,6 +9,7 @@ import java.sql.SQLException;
import java.util.Properties; import java.util.Properties;
@Component @Component
@Order(1)
public class MysqlDatabaseConnectionFactory implements DatabaseConnectionFactory { public class MysqlDatabaseConnectionFactory implements DatabaseConnectionFactory {
@Override @Override

View File

@ -1,5 +1,6 @@
package com.databasir.core.infrastructure.connection; package com.databasir.core.infrastructure.connection;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.sql.Connection; import java.sql.Connection;
@ -8,6 +9,7 @@ import java.sql.SQLException;
import java.util.Properties; import java.util.Properties;
@Component @Component
@Order(2)
public class PostgresqlDatabaseConnectionFactory implements DatabaseConnectionFactory { public class PostgresqlDatabaseConnectionFactory implements DatabaseConnectionFactory {
@Override @Override