From 9dc94cdaa319dbe565c2c3ce1042a8276cd9ff5a Mon Sep 17 00:00:00 2001 From: Cheng Jinbao Date: Mon, 14 Oct 2024 16:01:33 +0800 Subject: [PATCH 01/12] refactor: re --- .../wetech/flexmodel/api/ApiLogResource.java | 49 ++++++++++++++++--- .../application/ApiLogApplicationService.java | 26 ++++++++-- .../domain/model/api/ApiLogRepository.java | 4 +- .../domain/model/api/ApiLogService.java | 22 +++------ .../persistence/ApiLogFmRepository.java | 4 +- 5 files changed, 74 insertions(+), 31 deletions(-) diff --git a/src/main/java/tech/wetech/flexmodel/api/ApiLogResource.java b/src/main/java/tech/wetech/flexmodel/api/ApiLogResource.java index ca14608..bc3569d 100644 --- a/src/main/java/tech/wetech/flexmodel/api/ApiLogResource.java +++ b/src/main/java/tech/wetech/flexmodel/api/ApiLogResource.java @@ -7,7 +7,10 @@ import tech.wetech.flexmodel.codegen.entity.ApiLog; import tech.wetech.flexmodel.domain.model.api.LogStat; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.List; +import java.util.Set; /** * @author cjbi @@ -21,16 +24,48 @@ public class ApiLogResource { ApiLogApplicationService apiLogApplicationService; @GET - public List findApiList(@QueryParam("current" ) @DefaultValue("1" ) int current, - @QueryParam("pageSize" ) @DefaultValue("50" ) int pageSize, - @QueryParam("filter" ) String filter) { - return apiLogApplicationService.findApiLogs(filter, current, pageSize); + public List findApiList(@QueryParam("current") @DefaultValue("1") int current, + @QueryParam("pageSize") @DefaultValue("50") int pageSize, + @QueryParam("keyword") String keyword, + @QueryParam("dateRange") String dateRange, + @QueryParam("level") String levelStr + ) { + RequestResult result = parseQuery(dateRange, levelStr); + return apiLogApplicationService.findApiLogs(current, pageSize, keyword, result.startDate(), result.endDate(), result.level()); } @GET - @Path("/stat" ) - public List stat(@QueryParam("filter" ) String filter) { - return apiLogApplicationService.stat(filter); + @Path("/stat") + public List stat(@QueryParam("pageSize") @DefaultValue("50") int pageSize, + @QueryParam("keyword") String keyword, + @QueryParam("dateRange") String dateRange, + @QueryParam("level") String levelStr) { + RequestResult result = parseQuery(dateRange, levelStr); + return apiLogApplicationService.stat(keyword, result.startDate(), result.endDate(), result.level()); + } + + private static RequestResult parseQuery(String dateRange, String levelStr) { + LocalDateTime startDate = null; + LocalDateTime endDate = null; + Set level = null; + if (dateRange != null) { + try { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + String[] dateRangeArr = dateRange.split(","); + startDate = LocalDateTime.parse(dateRangeArr[0], formatter); + endDate = LocalDateTime.parse(dateRangeArr[1], formatter); + } catch (Exception e) { + startDate = null; + endDate = null; + } + } + if (levelStr != null) { + level = Set.of(levelStr.split(",")); + } + return new RequestResult(startDate, endDate, level); + } + + private record RequestResult(LocalDateTime startDate, LocalDateTime endDate, Set level) { } } diff --git a/src/main/java/tech/wetech/flexmodel/application/ApiLogApplicationService.java b/src/main/java/tech/wetech/flexmodel/application/ApiLogApplicationService.java index a7f923c..62d13a2 100644 --- a/src/main/java/tech/wetech/flexmodel/application/ApiLogApplicationService.java +++ b/src/main/java/tech/wetech/flexmodel/application/ApiLogApplicationService.java @@ -3,10 +3,13 @@ import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; import tech.wetech.flexmodel.codegen.entity.ApiLog; +import tech.wetech.flexmodel.criterion.Example; import tech.wetech.flexmodel.domain.model.api.ApiLogService; import tech.wetech.flexmodel.domain.model.api.LogStat; +import java.time.LocalDateTime; import java.util.List; +import java.util.Set; /** * @author cjbi @@ -17,11 +20,26 @@ public class ApiLogApplicationService { @Inject ApiLogService apiLogService; - public List findApiLogs(String filter, int current, int pageSize) { - return apiLogService.find(filter, current, pageSize); + public List findApiLogs(int current, int pageSize, String keyword, LocalDateTime startDate, LocalDateTime endDate, Set level) { + + return apiLogService.find(f -> getCriteria(keyword, startDate, endDate, level, f), current, pageSize); + } + + public List stat(String keyword, LocalDateTime startDate, LocalDateTime endDate, Set level) { + return apiLogService.stat(f -> getCriteria(keyword, startDate, endDate, level, f)); } - public List stat(String filter) { - return apiLogService.stat(filter); + + private static Example.Criteria getCriteria(String keyword, LocalDateTime startDate, LocalDateTime endDate, Set level, Example.Criteria f) { + if (keyword != null) { + f.contains("data", keyword); + } + if (startDate != null && endDate != null) { + f.between("createdAt", startDate, endDate); + } + if (level != null) { + f.in("level", level); + } + return f; } } diff --git a/src/main/java/tech/wetech/flexmodel/domain/model/api/ApiLogRepository.java b/src/main/java/tech/wetech/flexmodel/domain/model/api/ApiLogRepository.java index c57186d..233787a 100644 --- a/src/main/java/tech/wetech/flexmodel/domain/model/api/ApiLogRepository.java +++ b/src/main/java/tech/wetech/flexmodel/domain/model/api/ApiLogRepository.java @@ -11,9 +11,9 @@ */ public interface ApiLogRepository { - List find(String filter, Integer current, Integer pageSize); + List find(UnaryOperator filter, Integer current, Integer pageSize); - List stat(String filter); + List stat(UnaryOperator filter); ApiLog save(ApiLog record); diff --git a/src/main/java/tech/wetech/flexmodel/domain/model/api/ApiLogService.java b/src/main/java/tech/wetech/flexmodel/domain/model/api/ApiLogService.java index adc095e..635188d 100644 --- a/src/main/java/tech/wetech/flexmodel/domain/model/api/ApiLogService.java +++ b/src/main/java/tech/wetech/flexmodel/domain/model/api/ApiLogService.java @@ -3,8 +3,10 @@ import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; import tech.wetech.flexmodel.codegen.entity.ApiLog; +import tech.wetech.flexmodel.criterion.Example; import java.util.List; +import java.util.function.UnaryOperator; /** * @author cjbi @@ -19,24 +21,12 @@ public ApiLog create(ApiLog apiLog) { return apiLogRepository.save(apiLog); } - public List find(String filter, Integer current, Integer pageSize) { - String qFilter = null; - if (filter != null && !filter.isEmpty()) { - qFilter = String.format(""" - { "contains": [{ "var": "data" }, "%s"] } - """, filter); - } - return apiLogRepository.find(qFilter, current, pageSize); + public List find(UnaryOperator filter, Integer current, Integer pageSize) { + return apiLogRepository.find(filter, current, pageSize); } - public List stat(String filter) { - String qFilter = null; - if (filter != null && !filter.isEmpty()) { - qFilter = String.format(""" - { "contains": [{ "var": "data" }, "%s"] } - """, filter); - } - return apiLogRepository.stat(qFilter); + public List stat(UnaryOperator filter) { + return apiLogRepository.stat(filter); } } diff --git a/src/main/java/tech/wetech/flexmodel/infrastructrue/persistence/ApiLogFmRepository.java b/src/main/java/tech/wetech/flexmodel/infrastructrue/persistence/ApiLogFmRepository.java index ec921f2..50aee63 100644 --- a/src/main/java/tech/wetech/flexmodel/infrastructrue/persistence/ApiLogFmRepository.java +++ b/src/main/java/tech/wetech/flexmodel/infrastructrue/persistence/ApiLogFmRepository.java @@ -24,7 +24,7 @@ public class ApiLogFmRepository implements ApiLogRepository { ApiLogDAO apiLogDAO; @Override - public List find(String filter, Integer current, Integer pageSize) { + public List find(UnaryOperator filter, Integer current, Integer pageSize) { return apiLogDAO.find(query -> { if (filter != null) { query.setFilter(filter); @@ -39,7 +39,7 @@ public List find(String filter, Integer current, Integer pageSize) { @Override - public List stat(String filter) { + public List stat(UnaryOperator filter) { return apiLogDAO.find(query -> query .setProjection(projection -> projection From 835f87c2ee3d5548171f863504562de83e504cdd Mon Sep 17 00:00:00 2001 From: Cheng Jinbao Date: Mon, 14 Oct 2024 20:51:23 +0800 Subject: [PATCH 02/12] refactor: re --- src/main/resources/import.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/resources/import.json b/src/main/resources/import.json index 2a77152..f528aa6 100644 --- a/src/main/resources/import.json +++ b/src/main/resources/import.json @@ -693,7 +693,7 @@ "enable": true, "datasource": "system", "execution": { - "query": "mutation MyMutation($classCode: String, $className: String, $id: ID = \"\") {\n create_system_Classes(\n data: { classCode: $classCode, className: $className, id: $id }\n ) {\n classCode\n className\n id\n }\n}", + "query": "mutation MyMutation($classCode: String, $className: String, $id: ID = \"\") {\n system_create_Classes(\n data: { classCode: $classCode, className: $className, id: $id }\n ) {\n classCode\n className\n id\n }\n}", "operationName": "MyMutation" } }, @@ -714,7 +714,7 @@ "enable": true, "datasource": "system", "execution": { - "query": "mutation MyMutation($classCode: String, $className: String, $id: ID) {\n update_system_Classes_by_id(\n id: \"1\"\n _set: { classCode: $classCode, className: $className, id: $id }\n ) {\n classCode\n className\n id\n }\n}", + "query": "mutation MyMutation($classCode: String, $className: String, $id: ID) {\n system_update_Classes_by_id(\n id: \"1\"\n _set: { classCode: $classCode, className: $className, id: $id }\n ) {\n classCode\n className\n id\n }\n}", "operationName": "MyMutation" } }, @@ -735,7 +735,7 @@ "enable": true, "datasource": "system", "execution": { - "query": "mutation MyMutation($id: ID!) {\n delete_system_Classes_by_id(id: $id) {\n classCode\n className\n id\n }\n}", + "query": "mutation MyMutation($id: ID!) {\n system_delete_Classes_by_id(id: $id) {\n classCode\n className\n id\n }\n}", "operationName": "MyMutation" } }, From b493f96afd6651c020b364ed14c5f72e0f6e10cc Mon Sep 17 00:00:00 2001 From: Cheng Jinbao Date: Mon, 21 Oct 2024 19:10:46 +0800 Subject: [PATCH 03/12] refactor: re --- .../infrastructrue/FmEngineSessions.java | 12 --------- src/main/resources/import.json | 25 ++----------------- .../flexmodel/api/RestAPIResourceTest.java | 4 +-- 3 files changed, 4 insertions(+), 37 deletions(-) diff --git a/src/main/java/tech/wetech/flexmodel/infrastructrue/FmEngineSessions.java b/src/main/java/tech/wetech/flexmodel/infrastructrue/FmEngineSessions.java index 95f15c5..828efa3 100644 --- a/src/main/java/tech/wetech/flexmodel/infrastructrue/FmEngineSessions.java +++ b/src/main/java/tech/wetech/flexmodel/infrastructrue/FmEngineSessions.java @@ -13,13 +13,10 @@ import tech.wetech.flexmodel.codegen.entity.Datasource; import tech.wetech.flexmodel.domain.model.connect.DatasourceService; import tech.wetech.flexmodel.domain.model.connect.SessionDatasource; -import tech.wetech.flexmodel.event.DomainEvent; -import tech.wetech.flexmodel.event.schema.AbstractSchemaEvent; import tech.wetech.flexmodel.graphql.GraphQLProvider; import tech.wetech.flexmodel.sql.JdbcDataSourceProvider; import java.util.List; -import java.util.concurrent.CompletableFuture; /** * @author cjbi @@ -41,15 +38,6 @@ public void installDatasource(@Observes StartupEvent startupEvent, sessionDatasource.add(datasource); } graphQLProvider.init(); - sessionFactory.subscribeEvent(DomainEvent.class, event -> { - if (event instanceof AbstractSchemaEvent) { - try { - CompletableFuture.runAsync(graphQLProvider::init); - } catch (Exception e) { - log.error("Subscribe flex model schema event event error: {}", e.getMessage()); - } - } - }); } @Produces diff --git a/src/main/resources/import.json b/src/main/resources/import.json index f528aa6..c755cae 100644 --- a/src/main/resources/import.json +++ b/src/main/resources/import.json @@ -637,13 +637,8 @@ "createdAt": "2024-07-13T23:21:10", "meta": { "auth": false, - "type": "list", - "model": "Classes", - "enable": true, - "paging": false, - "datasource": "system", "execution": { - "query": "query MyQuery($order_by: system_Classes_order_by = { id: asc }, $size: Int = 10, $page: Int = 1) {\n system_Classes_list(order_by: $order_by, size: $size, page: $page) {\n classCode\n className\n id\n }\n}", + "query": "query MyQuery($order_by: system_Classes_order_by = { id: asc }, $size: Int = 10, $page: Int = 1) {\n system_list_Classes(order_by: $order_by, size: $size, page: $page) {\n classCode\n className\n id\n }\n}", "variables": { "order_by": { "id": "desc" @@ -664,12 +659,8 @@ "createdAt": "2024-07-13T23:21:10", "meta": { "auth": false, - "type": "view", - "model": "Classes", - "enable": true, - "datasource": "system", "execution": { - "query": "query MyQuery($id: Int) {\n system_Classes(where: { id: { _eq: $id } }) {\n classCode\n className\n id\n }\n}", + "query": "query MyQuery($id: Int) {\n system_find_one_Classes(where: { id: { _eq: $id } }) {\n classCode\n className\n id\n }\n}", "variables": { "id": 1 }, @@ -688,10 +679,6 @@ "createdAt": "2024-07-13T23:21:11", "meta": { "auth": false, - "type": "create", - "model": "Classes", - "enable": true, - "datasource": "system", "execution": { "query": "mutation MyMutation($classCode: String, $className: String, $id: ID = \"\") {\n system_create_Classes(\n data: { classCode: $classCode, className: $className, id: $id }\n ) {\n classCode\n className\n id\n }\n}", "operationName": "MyMutation" @@ -709,10 +696,6 @@ "createdAt": "2024-07-13T23:21:11", "meta": { "auth": false, - "type": "update", - "model": "Classes", - "enable": true, - "datasource": "system", "execution": { "query": "mutation MyMutation($classCode: String, $className: String, $id: ID) {\n system_update_Classes_by_id(\n id: \"1\"\n _set: { classCode: $classCode, className: $className, id: $id }\n ) {\n classCode\n className\n id\n }\n}", "operationName": "MyMutation" @@ -730,10 +713,6 @@ "createdAt": "2024-07-13T23:21:12", "meta": { "auth": false, - "type": "delete", - "model": "Classes", - "enable": true, - "datasource": "system", "execution": { "query": "mutation MyMutation($id: ID!) {\n system_delete_Classes_by_id(id: $id) {\n classCode\n className\n id\n }\n}", "operationName": "MyMutation" diff --git a/src/test/java/tech/wetech/flexmodel/api/RestAPIResourceTest.java b/src/test/java/tech/wetech/flexmodel/api/RestAPIResourceTest.java index 6aaf5af..e84f1f4 100644 --- a/src/test/java/tech/wetech/flexmodel/api/RestAPIResourceTest.java +++ b/src/test/java/tech/wetech/flexmodel/api/RestAPIResourceTest.java @@ -28,14 +28,14 @@ void testGET() { .then() .statusCode(200) .body("size()", greaterThanOrEqualTo(1)) - .body("data.system_Classes_list[0].classCode", notNullValue()); + .body("data.system_list_Classes[0].classCode", notNullValue()); // view given() .when() .get("/api/v1/system/Classes/1") .then() .statusCode(200) - .body("data.system_Classes.classCode", notNullValue()); + .body("data.system_find_one_Classes.classCode", notNullValue()); } @Test From 50713bfa69fe907ee02afef6fd62ecb7e4cc8695 Mon Sep 17 00:00:00 2001 From: Cheng Jinbao Date: Wed, 23 Oct 2024 18:54:54 +0800 Subject: [PATCH 04/12] refactor: re --- pom.xml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/pom.xml b/pom.xml index 563e1c7..eddbf8b 100644 --- a/pom.xml +++ b/pom.xml @@ -31,6 +31,11 @@ + + com.graphql-java + graphql-java + 22.3 + org.mongodb mongodb-driver-sync @@ -44,6 +49,12 @@ tech.wetech.flexmodel flexmodel-graphql ${project.version} + + + graphql-java + com.graphql-java + + tech.wetech.flexmodel From ee8f446377ec6af97b0d6795274e4653963afcdf Mon Sep 17 00:00:00 2001 From: Cheng Jinbao Date: Thu, 24 Oct 2024 12:51:33 +0800 Subject: [PATCH 05/12] refactor: re --- pom.xml | 17 ++++------ .../flexmodel/api/DatasourceResource.java | 19 ++++++----- .../ModelingApplicationService.java | 11 +++--- .../model/connect/DatasourceService.java | 6 +++- .../model/connect/SessionDatasource.java | 4 +++ .../model/modeling/ModelRepository.java | 4 ++- .../domain/model/modeling/ModelService.java | 6 ++-- .../infrastructrue/FmRestAPIResources.java | 18 +++++++++- .../infrastructrue/SessionDatasourceImpl.java | 34 ++++++++++++++++++- .../persistence/ModelFmRepository.java | 6 ++-- 10 files changed, 92 insertions(+), 33 deletions(-) diff --git a/pom.xml b/pom.xml index eddbf8b..9c89bfb 100644 --- a/pom.xml +++ b/pom.xml @@ -28,14 +28,15 @@ pom import + + com.graphql-java + graphql-java + 22.3 + - - com.graphql-java - graphql-java - 22.3 - + org.mongodb mongodb-driver-sync @@ -49,12 +50,6 @@ tech.wetech.flexmodel flexmodel-graphql ${project.version} - - - graphql-java - com.graphql-java - - tech.wetech.flexmodel diff --git a/src/main/java/tech/wetech/flexmodel/api/DatasourceResource.java b/src/main/java/tech/wetech/flexmodel/api/DatasourceResource.java index 395f148..8464d5a 100644 --- a/src/main/java/tech/wetech/flexmodel/api/DatasourceResource.java +++ b/src/main/java/tech/wetech/flexmodel/api/DatasourceResource.java @@ -12,10 +12,7 @@ import tech.wetech.flexmodel.domain.model.connect.database.Database; import tech.wetech.flexmodel.util.JsonUtils; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; /** * @author cjbi @@ -37,10 +34,16 @@ public ValidateResult validateConnection(Datasource datasource) { return modelingApplicationService.validateConnection(datasource); } - @GET - @Path("/{datasourceName}/refresh") - public List refresh(@PathParam("datasourceName") String datasourceName) { - return modelingApplicationService.refresh(datasourceName); + @POST + @Path("/{datasourceName}/import") + public List importModels(@PathParam("datasourceName") String datasourceName, Set models) { + return modelingApplicationService.importModels(datasourceName, models); + } + + @POST + @Path("/physics/names") + public List getPhysicsModelNames(Datasource datasource) { + return modelingApplicationService.getPhysicsModelNames(datasource); } @GET diff --git a/src/main/java/tech/wetech/flexmodel/application/ModelingApplicationService.java b/src/main/java/tech/wetech/flexmodel/application/ModelingApplicationService.java index 22e4865..a0b036c 100644 --- a/src/main/java/tech/wetech/flexmodel/application/ModelingApplicationService.java +++ b/src/main/java/tech/wetech/flexmodel/application/ModelingApplicationService.java @@ -11,6 +11,7 @@ import tech.wetech.flexmodel.domain.model.modeling.ModelService; import java.util.List; +import java.util.Set; /** * @author cjbi @@ -76,13 +77,15 @@ public void dropIndex(String datasourceName, String modelName, String indexName) modelService.dropIndex(datasourceName, modelName, indexName); } - public List refresh(String datasourceName) { - return modelService.refresh(datasourceName); - } - public ValidateResult validateConnection(Datasource datasource) { return datasourceService.validate(datasource); } + public List getPhysicsModelNames(Datasource datasource) { + return datasourceService.getPhysicsModelNames(datasource); + } + public List importModels(String datasourceName, Set models) { + return modelService.syncModels(datasourceName, models); + } } diff --git a/src/main/java/tech/wetech/flexmodel/domain/model/connect/DatasourceService.java b/src/main/java/tech/wetech/flexmodel/domain/model/connect/DatasourceService.java index d0851f9..e36124f 100644 --- a/src/main/java/tech/wetech/flexmodel/domain/model/connect/DatasourceService.java +++ b/src/main/java/tech/wetech/flexmodel/domain/model/connect/DatasourceService.java @@ -23,9 +23,13 @@ public ValidateResult validate(Datasource datasource) { return sessionDatasource.validate(datasource); } + public List getPhysicsModelNames(Datasource datasource) { + return sessionDatasource.getPhysicsModelNames(datasource); + } + public Datasource createDatasource(Datasource datasource) { Optional optional = findOne(datasource.getName()); - if(optional.isPresent()) { + if (optional.isPresent()) { throw new ConnectException("The data source name is duplicated"); } datasource.setType("user"); diff --git a/src/main/java/tech/wetech/flexmodel/domain/model/connect/SessionDatasource.java b/src/main/java/tech/wetech/flexmodel/domain/model/connect/SessionDatasource.java index 071cc24..e855efe 100644 --- a/src/main/java/tech/wetech/flexmodel/domain/model/connect/SessionDatasource.java +++ b/src/main/java/tech/wetech/flexmodel/domain/model/connect/SessionDatasource.java @@ -2,11 +2,15 @@ import tech.wetech.flexmodel.codegen.entity.Datasource; +import java.util.List; + /** * @author cjbi */ public interface SessionDatasource { + List getPhysicsModelNames(Datasource datasource); + ValidateResult validate(Datasource datasource); void add(Datasource datasource); diff --git a/src/main/java/tech/wetech/flexmodel/domain/model/modeling/ModelRepository.java b/src/main/java/tech/wetech/flexmodel/domain/model/modeling/ModelRepository.java index 59e5e70..d79affa 100644 --- a/src/main/java/tech/wetech/flexmodel/domain/model/modeling/ModelRepository.java +++ b/src/main/java/tech/wetech/flexmodel/domain/model/modeling/ModelRepository.java @@ -6,6 +6,7 @@ import java.util.List; import java.util.Optional; +import java.util.Set; /** * @author cjbi @@ -32,5 +33,6 @@ public interface ModelRepository { void dropIndex(String datasourceName, String modelName, String indexName); - List refresh(String datasourceName); + List syncModels(String datasourceName, Set modelName); + } diff --git a/src/main/java/tech/wetech/flexmodel/domain/model/modeling/ModelService.java b/src/main/java/tech/wetech/flexmodel/domain/model/modeling/ModelService.java index ee1982f..e876e2d 100644 --- a/src/main/java/tech/wetech/flexmodel/domain/model/modeling/ModelService.java +++ b/src/main/java/tech/wetech/flexmodel/domain/model/modeling/ModelService.java @@ -8,6 +8,7 @@ import java.util.List; import java.util.Optional; +import java.util.Set; /** * @author cjbi @@ -64,8 +65,7 @@ public void dropIndex(String datasourceName, String modelName, String indexName) modelRepository.dropIndex(datasourceName, modelName, indexName); } - public List refresh(String datasourceName) { - return modelRepository.refresh(datasourceName); + public List syncModels(String datasourceName, Set models) { + return modelRepository.syncModels(datasourceName, models); } - } diff --git a/src/main/java/tech/wetech/flexmodel/infrastructrue/FmRestAPIResources.java b/src/main/java/tech/wetech/flexmodel/infrastructrue/FmRestAPIResources.java index e5dd1df..354f12b 100644 --- a/src/main/java/tech/wetech/flexmodel/infrastructrue/FmRestAPIResources.java +++ b/src/main/java/tech/wetech/flexmodel/infrastructrue/FmRestAPIResources.java @@ -1,26 +1,42 @@ package tech.wetech.flexmodel.infrastructrue; import io.quarkus.runtime.StartupEvent; +import io.vertx.core.http.HttpMethod; import io.vertx.ext.web.Router; import io.vertx.ext.web.handler.BodyHandler; import jakarta.enterprise.event.Observes; import jakarta.inject.Inject; +import lombok.extern.slf4j.Slf4j; import tech.wetech.flexmodel.application.ApiRuntimeApplicationService; +import tech.wetech.flexmodel.graphql.GraphQLProvider; /** * @author cjbi */ +@Slf4j public class FmRestAPIResources { @Inject ApiRuntimeApplicationService apiRuntimeApplicationService; - void installRoute(@Observes StartupEvent startupEvent, Router router) { + void installRoute(@Observes StartupEvent startupEvent, Router router, GraphQLProvider graphQLProvider) { // 处理所有以"/api/v1"开头的请求 router.route().handler(BodyHandler.create()); router.route() .pathRegex("/api/v1/.*") .handler(apiRuntimeApplicationService::accept); + + router.route().pathRegex("/api/datasources.*") + .handler(handle -> { + + handle.addEndHandler(v -> { + if (handle.request().method() != HttpMethod.GET) { + log.info(">>> Refreshing GraphQL schema..."); + graphQLProvider.init(); + } + }); + handle.next(); + }); } } diff --git a/src/main/java/tech/wetech/flexmodel/infrastructrue/SessionDatasourceImpl.java b/src/main/java/tech/wetech/flexmodel/infrastructrue/SessionDatasourceImpl.java index dc06169..b327b22 100644 --- a/src/main/java/tech/wetech/flexmodel/infrastructrue/SessionDatasourceImpl.java +++ b/src/main/java/tech/wetech/flexmodel/infrastructrue/SessionDatasourceImpl.java @@ -25,7 +25,10 @@ import javax.sql.DataSource; import java.sql.DriverManager; +import java.sql.ResultSet; import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; import static org.bson.codecs.configuration.CodecRegistries.fromProviders; import static org.bson.codecs.configuration.CodecRegistries.fromRegistries; @@ -40,10 +43,38 @@ public class SessionDatasourceImpl implements SessionDatasource { @Inject SessionFactory sessionFactory; - public String getContent(String template) { + private String getContent(String template) { return StringUtils.simpleRenderTemplate(template, SystemVariablesHolder.getSystemVariables()); } + @Override + public List getPhysicsModelNames(Datasource datasource) { + List list = new ArrayList<>(); + if (datasource.getConfig() instanceof MongoDB mongoDB) { + try (MongoClient mongoClient = MongoClients.create(mongoDB.getUrl())) { + mongoClient.getClusterDescription(); + mongoClient.getDatabase(datasource.getName()).listCollectionNames() + .forEach(list::add); + return list; + } + } else { + Database config = JsonUtils.getInstance().convertValue(datasource.getConfig(), Database.class); + try (var conn = DriverManager.getConnection( + getContent(config.getUrl()), + getContent(config.getUsername()), + getContent(config.getPassword()))) { + ResultSet tables = conn.getMetaData().getTables(null, null, "%", new String[]{"TABLE"}); + while (tables.next()) { + String tableName = tables.getString("TABLE_NAME"); + list.add(tableName); + } + return list; + } catch (SQLException e) { + return list; + } + } + } + @Override public ValidateResult validate(Datasource datasource) { long beginTime = System.currentTimeMillis(); @@ -107,4 +138,5 @@ public MongoDatabase buildMongoDatabase(MongoDB mongodb) { public void delete(String datasourceName) { sessionFactory.removeDataSourceProvider(datasourceName); } + } diff --git a/src/main/java/tech/wetech/flexmodel/infrastructrue/persistence/ModelFmRepository.java b/src/main/java/tech/wetech/flexmodel/infrastructrue/persistence/ModelFmRepository.java index f5bdd15..b75d1a8 100644 --- a/src/main/java/tech/wetech/flexmodel/infrastructrue/persistence/ModelFmRepository.java +++ b/src/main/java/tech/wetech/flexmodel/infrastructrue/persistence/ModelFmRepository.java @@ -13,6 +13,7 @@ import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.Set; import java.util.function.Function; import java.util.function.UnaryOperator; @@ -196,10 +197,9 @@ public void dropIndex(String datasourceName, String modelName, String indexName) } @Override - @SuppressWarnings("all") - public List refresh(String datasourceName) { + public List syncModels(String datasourceName, Set modelNames) { try (Session session = sessionFactory.createSession(datasourceName)) { - return (List) session.syncModels(); + return (List) session.syncModels(modelNames); } } } From 69570c7ece2d4ad1d012cf73b753fb18577b441b Mon Sep 17 00:00:00 2001 From: Cheng Jinbao Date: Fri, 25 Oct 2024 14:20:48 +0800 Subject: [PATCH 06/12] refactor: re --- .../wetech/flexmodel/api/SettingResource.java | 51 ----------- .../flexmodel/api/SettingsResource.java | 30 ++++++ .../SettingsApplicationService.java | 25 +++++ .../domain/model/settings/Settings.java | 28 ++++++ .../model/settings/SettingsRepository.java | 12 +++ .../model/settings/SettingsService.java | 23 +++++ .../flexmodel/infrastructrue/LogFilter.java | 54 ++++++----- .../persistence/SettingsFmRepository.java | 50 ++++++++++ src/main/resources/import.json | 91 +++++++++++++++++++ 9 files changed, 290 insertions(+), 74 deletions(-) delete mode 100644 src/main/java/tech/wetech/flexmodel/api/SettingResource.java create mode 100644 src/main/java/tech/wetech/flexmodel/api/SettingsResource.java create mode 100644 src/main/java/tech/wetech/flexmodel/application/SettingsApplicationService.java create mode 100644 src/main/java/tech/wetech/flexmodel/domain/model/settings/Settings.java create mode 100644 src/main/java/tech/wetech/flexmodel/domain/model/settings/SettingsRepository.java create mode 100644 src/main/java/tech/wetech/flexmodel/domain/model/settings/SettingsService.java create mode 100644 src/main/java/tech/wetech/flexmodel/infrastructrue/persistence/SettingsFmRepository.java diff --git a/src/main/java/tech/wetech/flexmodel/api/SettingResource.java b/src/main/java/tech/wetech/flexmodel/api/SettingResource.java deleted file mode 100644 index 76e746b..0000000 --- a/src/main/java/tech/wetech/flexmodel/api/SettingResource.java +++ /dev/null @@ -1,51 +0,0 @@ -package tech.wetech.flexmodel.api; - -import jakarta.ws.rs.Consumes; -import jakarta.ws.rs.GET; -import jakarta.ws.rs.Path; -import jakarta.ws.rs.Produces; -import jakarta.ws.rs.core.MediaType; - -import java.io.IOException; -import java.net.URI; -import java.net.URLEncoder; -import java.net.http.HttpClient; -import java.net.http.HttpRequest; -import java.net.http.HttpResponse; -import java.nio.charset.StandardCharsets; -import java.util.Map; -import java.util.stream.Collectors; - -/** - * @author cjbi - */ -@Path("/api/settings") -@Produces(MediaType.APPLICATION_JSON) -@Consumes(MediaType.APPLICATION_JSON) -public class SettingResource { - - - @GET - @Path("/hello") - public Object test() throws IOException, InterruptedException { - String paramString = Map.of( - "token", "eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJhRERlR2R0UWpZQmJIY1BqZS1OVDRZTjJ5Q2NwbXhnMmFRaE9GdjFiTWZ3In0.eyJleHAiOjE3MTg5NDM2NTgsImlhdCI6MTcxODk0MzM1OCwianRpIjoiMWVkZGEwNGItYjVmOC00YzgxLWE5MzMtMWJjN2JlNzQ0Mjc4IiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDg0L2F1dGgvcmVhbG1zL215cmVhbG0iLCJhdWQiOlsibXlzZXJ2ZXIiLCJhY2NvdW50Il0sInN1YiI6IjQxODlhODA0LWUyODItNGJhZS1iMGJjLTNhODhiOWU2OGE0NSIsInR5cCI6IkJlYXJlciIsImF6cCI6Im15Y2xpZW50Iiwic2Vzc2lvbl9zdGF0ZSI6IjIyOTdjZjAyLTJhNjQtNDMyZS04NDljLTFjMzM3ZmNiMmFhNSIsImFjciI6IjEiLCJyZWFsbV9hY2Nlc3MiOnsicm9sZXMiOlsiZGVmYXVsdC1yb2xlcy1teXJlYWxtIiwib2ZmbGluZV9hY2Nlc3MiLCJ1bWFfYXV0aG9yaXphdGlvbiJdfSwicmVzb3VyY2VfYWNjZXNzIjp7Im15Y2xpZW50Ijp7InJvbGVzIjpbIkFETUlOX0NMSSJdfSwibXlzZXJ2ZXIiOnsicm9sZXMiOlsiU0VSVkVSX1JPTEUiXX0sImFjY291bnQiOnsicm9sZXMiOlsibWFuYWdlLWFjY291bnQiLCJtYW5hZ2UtYWNjb3VudC1saW5rcyIsInZpZXctcHJvZmlsZSJdfX0sInNjb3BlIjoicHJvZmlsZSBlbWFpbCIsInNpZCI6IjIyOTdjZjAyLTJhNjQtNDMyZS04NDljLTFjMzM3ZmNiMmFhNSIsImVtYWlsX3ZlcmlmaWVkIjpmYWxzZSwibmFtZSI6IkppbmJhbyBDaGVuZyIsInByZWZlcnJlZF91c2VybmFtZSI6ImFkbWluIiwiZ2l2ZW5fbmFtZSI6IkppbmJhbyIsImZhbWlseV9uYW1lIjoiQ2hlbmcifQ.e5Gqe1AK1HqydHJbRhlVgfFiDlsZ8K1jyzKm4OgpCtLRpYxUcR-LQ34alXM0Gwv8yrLlK7lRpA39nDjk6cPzB2nLuZRWrGpPkeelk0Q5tQHkeQ_l7fxuEDR5WqmfJF06cjfD-xushe-wQciWYbOIkW41M2h-cqsHwEtPblMHELKUyJP-PvorbInJS2oPtsdg4NE1FLS4rDCelPtA9AOEmMrPXSqh0k2gPZeT7z2q5xG2ZkJ8ln8hhAq38tFdr5e0XE0RhoZX7Gl8nor8n5ljh0QYBZMesJ-1fLUdsXDML9WN0ZXov32M3oTOYyzuXCzlBlcNjvwGX08ACy_p3i6S4g", - "token_type_hint", "access_token", - "client_id", "myserver", - "client_secret", "BTpxEohjeTXvK0JkuiULF2fTLOxgUuG4" - ).entrySet() - .stream() - .map(e -> e.getKey() + "=" + URLEncoder.encode(e.getValue(), StandardCharsets.UTF_8)) - .collect(Collectors.joining("&")); - - HttpRequest request = HttpRequest.newBuilder() - .uri(URI.create("http://localhost:8084/auth/realms/myrealm/protocol/openid-connect/token/introspect")) - .headers("Content-Type", "application/x-www-form-urlencoded") - .POST(HttpRequest.BodyPublishers.ofString(paramString)) - .build(); - HttpClient client = HttpClient.newHttpClient(); - HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); - return response.body(); - } - -} diff --git a/src/main/java/tech/wetech/flexmodel/api/SettingsResource.java b/src/main/java/tech/wetech/flexmodel/api/SettingsResource.java new file mode 100644 index 0000000..7d99a51 --- /dev/null +++ b/src/main/java/tech/wetech/flexmodel/api/SettingsResource.java @@ -0,0 +1,30 @@ +package tech.wetech.flexmodel.api; + +import jakarta.inject.Inject; +import jakarta.ws.rs.*; +import jakarta.ws.rs.core.MediaType; +import tech.wetech.flexmodel.application.SettingsApplicationService; +import tech.wetech.flexmodel.domain.model.settings.Settings; + +/** + * @author cjbi + */ +@Path("/api/settings") +@Produces(MediaType.APPLICATION_JSON) +@Consumes(MediaType.APPLICATION_JSON) +public class SettingsResource { + + @Inject + SettingsApplicationService settingsApplicationService; + + @GET + public Object getSettings() { + return settingsApplicationService.getSettings(); + } + + @PATCH + public Object saveSettings(Settings settings) { + return settingsApplicationService.saveSettings(settings); + } + +} diff --git a/src/main/java/tech/wetech/flexmodel/application/SettingsApplicationService.java b/src/main/java/tech/wetech/flexmodel/application/SettingsApplicationService.java new file mode 100644 index 0000000..c410842 --- /dev/null +++ b/src/main/java/tech/wetech/flexmodel/application/SettingsApplicationService.java @@ -0,0 +1,25 @@ +package tech.wetech.flexmodel.application; + +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import tech.wetech.flexmodel.domain.model.settings.Settings; +import tech.wetech.flexmodel.domain.model.settings.SettingsService; + +/** + * @author cjbi + */ +@ApplicationScoped +public class SettingsApplicationService { + + @Inject + SettingsService settingsService; + + public Settings getSettings() { + return settingsService.getSettings(); + } + + public Settings saveSettings(Settings settings) { + return settingsService.saveSettings(settings); + } + +} diff --git a/src/main/java/tech/wetech/flexmodel/domain/model/settings/Settings.java b/src/main/java/tech/wetech/flexmodel/domain/model/settings/Settings.java new file mode 100644 index 0000000..962a302 --- /dev/null +++ b/src/main/java/tech/wetech/flexmodel/domain/model/settings/Settings.java @@ -0,0 +1,28 @@ +package tech.wetech.flexmodel.domain.model.settings; + +import lombok.Getter; +import lombok.Setter; + +/** + * @author cjbi + */ +@Getter +@Setter +public class Settings { + + private Log log = new Log(); + + @Getter + @Setter + public static class Log { + /** + * 最大保留天数 + */ + private int maxDays = 7; + /** + * 开启控制台日志 + */ + private boolean enableConsoleLogging = false; + } + +} diff --git a/src/main/java/tech/wetech/flexmodel/domain/model/settings/SettingsRepository.java b/src/main/java/tech/wetech/flexmodel/domain/model/settings/SettingsRepository.java new file mode 100644 index 0000000..7b4a6ee --- /dev/null +++ b/src/main/java/tech/wetech/flexmodel/domain/model/settings/SettingsRepository.java @@ -0,0 +1,12 @@ +package tech.wetech.flexmodel.domain.model.settings; + +/** + * @author cjbi + */ +public interface SettingsRepository { + + Settings saveSettings(Settings settings); + + Settings getSettings(); + +} diff --git a/src/main/java/tech/wetech/flexmodel/domain/model/settings/SettingsService.java b/src/main/java/tech/wetech/flexmodel/domain/model/settings/SettingsService.java new file mode 100644 index 0000000..d1a9dda --- /dev/null +++ b/src/main/java/tech/wetech/flexmodel/domain/model/settings/SettingsService.java @@ -0,0 +1,23 @@ +package tech.wetech.flexmodel.domain.model.settings; + +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; + +/** + * @author cjbi + */ +@ApplicationScoped +public class SettingsService { + + @Inject + SettingsRepository settingsRepository; + + public Settings getSettings() { + return settingsRepository.getSettings(); + } + + public Settings saveSettings(Settings settings) { + return settingsRepository.saveSettings(settings); + } + +} diff --git a/src/main/java/tech/wetech/flexmodel/infrastructrue/LogFilter.java b/src/main/java/tech/wetech/flexmodel/infrastructrue/LogFilter.java index 2d52ff9..a8f67bd 100644 --- a/src/main/java/tech/wetech/flexmodel/infrastructrue/LogFilter.java +++ b/src/main/java/tech/wetech/flexmodel/infrastructrue/LogFilter.java @@ -11,6 +11,7 @@ import tech.wetech.flexmodel.domain.model.api.ApiLogService; import tech.wetech.flexmodel.domain.model.api.LogData; import tech.wetech.flexmodel.domain.model.api.LogLevel; +import tech.wetech.flexmodel.domain.model.settings.SettingsService; import tech.wetech.flexmodel.util.JsonUtils; import java.io.IOException; @@ -28,6 +29,9 @@ public class LogFilter implements ContainerRequestFilter, ContainerResponseFilte @Inject ApiLogService apiLogService; + @Inject + SettingsService settingsService; + @Override public void filter(ContainerRequestContext requestContext) throws IOException { reqBeginTime.set(System.currentTimeMillis()); @@ -43,29 +47,33 @@ public void filter(ContainerRequestContext requestContext, ContainerResponseCont execTime = -1L; } CompletableFuture.runAsync(() -> { - ApiLog apiLog = new ApiLog(); - LogData apiData = new LogData(); - apiLog.setData(apiData); - apiData.setMethod(requestContext.getMethod()); - apiData.setPath(requestContext.getUriInfo().getPath()); - apiData.setReferer(requestContext.getHeaders().getFirst("Referer")); -// apiData.setRemoteIp(null); - apiData.setUserAgent(requestContext.getHeaders().getFirst("User-Agent")); - int statusCode = responseContext.getStatus(); - String reasonPhrase = responseContext.getStatusInfo().getReasonPhrase(); - apiData.setStatus(statusCode); - apiData.setMessage(reasonPhrase); - apiLog.setLevel(LogLevel.INFO.toString()); - if (statusCode >= 400 && statusCode < 500) { - apiLog.setLevel(LogLevel.WARN.toString()); - apiData.setErrors(JsonUtils.getInstance().stringify(responseContext.getEntity())); - } else if (statusCode >= 500) { - apiLog.setLevel(LogLevel.ERROR.toString()); - apiData.setErrors(JsonUtils.getInstance().stringify(responseContext.getEntity())); - } - apiData.setExecTime(execTime); - apiLog.setUri(apiData.getMethod() + " " + apiData.getPath()); - apiLogService.create(apiLog); + saveLog(requestContext, responseContext, execTime); }); } + + private void saveLog(ContainerRequestContext requestContext, ContainerResponseContext responseContext, long execTime) { + ApiLog apiLog = new ApiLog(); + LogData apiData = new LogData(); + apiLog.setData(apiData); + apiData.setMethod(requestContext.getMethod()); + apiData.setPath(requestContext.getUriInfo().getPath()); + apiData.setReferer(requestContext.getHeaders().getFirst("Referer")); +// apiData.setRemoteIp(null); + apiData.setUserAgent(requestContext.getHeaders().getFirst("User-Agent")); + int statusCode = responseContext.getStatus(); + String reasonPhrase = responseContext.getStatusInfo().getReasonPhrase(); + apiData.setStatus(statusCode); + apiData.setMessage(reasonPhrase); + apiLog.setLevel(LogLevel.INFO.toString()); + if (statusCode >= 400 && statusCode < 500) { + apiLog.setLevel(LogLevel.WARN.toString()); + apiData.setErrors(JsonUtils.getInstance().stringify(responseContext.getEntity())); + } else if (statusCode >= 500) { + apiLog.setLevel(LogLevel.ERROR.toString()); + apiData.setErrors(JsonUtils.getInstance().stringify(responseContext.getEntity())); + } + apiData.setExecTime(execTime); + apiLog.setUri(apiData.getMethod() + " " + apiData.getPath()); + apiLogService.create(apiLog); + } } diff --git a/src/main/java/tech/wetech/flexmodel/infrastructrue/persistence/SettingsFmRepository.java b/src/main/java/tech/wetech/flexmodel/infrastructrue/persistence/SettingsFmRepository.java new file mode 100644 index 0000000..8eb1b6c --- /dev/null +++ b/src/main/java/tech/wetech/flexmodel/infrastructrue/persistence/SettingsFmRepository.java @@ -0,0 +1,50 @@ +package tech.wetech.flexmodel.infrastructrue.persistence; + +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; +import tech.wetech.flexmodel.codegen.dao.ConfigDAO; +import tech.wetech.flexmodel.codegen.entity.Config; +import tech.wetech.flexmodel.domain.model.settings.Settings; +import tech.wetech.flexmodel.domain.model.settings.SettingsRepository; +import tech.wetech.flexmodel.util.JsonUtils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author cjbi + */ +@ApplicationScoped +public class SettingsFmRepository implements SettingsRepository { + + @Inject + ConfigDAO configDAO; + + @Override + @SuppressWarnings("unchecked") + public Settings saveSettings(Settings settings) { + Map settingsMap = JsonUtils.getInstance().convertValue(settings, Map.class); + settingsMap.forEach((key, value) -> { + if (value != null) { + Config config = configDAO.find(query -> query.setFilter(f -> f.equalTo("key", key))) + .stream().findFirst() + .orElseGet(Config::new); + config.setKey(key); + config.setValue(JsonUtils.getInstance().stringify(value)); + configDAO.save(config); + } + }); + return settings; + } + + @Override + public Settings getSettings() { + List list = configDAO.findAll(); + Map settingsMap = new HashMap<>(); + for (Config config : list) { + settingsMap.put(config.getKey(), JsonUtils.getInstance().parseToObject(config.getValue(), Object.class)); + } + return JsonUtils.getInstance().convertValue(settingsMap, Settings.class); + } +} diff --git a/src/main/resources/import.json b/src/main/resources/import.json index c755cae..20850ae 100644 --- a/src/main/resources/import.json +++ b/src/main/resources/import.json @@ -372,6 +372,97 @@ ], "indexes": [] }, + { + "name": "Config", + "comment": "配置", + "type": "entity", + "fields": [ + { + "name": "id", + "type": "id", + "unique": true, + "nullable": true, + "generator": { + "type": "ULIDValueGenerator", + "generationTime": "INSERT" + }, + "modelName": "Config", + "validators": [], + "generatedValue": "ULID" + }, + { + "name": "key", + "comment": "名称", + "type": "string", + "length": 255, + "unique": false, + "nullable": false, + "modelName": "Config", + "validators": [ + { + "type": "NotNullValidator", + "message": "must not be null" + } + ] + }, + { + "name": "value", + "type": "text", + "length": 255, + "unique": false, + "nullable": true, + "modelName": "Config", + "validators": [] + }, + { + "name": "createdAt", + "type": "datetime", + "unique": false, + "nullable": false, + "generator": { + "type": "DatetimeNowValueGenerator", + "generationTime": "INSERT" + }, + "modelName": "ApiInfo", + "validators": [ + { + "type": "NotNullValidator", + "message": "must not be null" + } + ] + }, + { + "name": "updatedAt", + "type": "datetime", + "unique": false, + "nullable": false, + "generator": { + "type": "DatetimeNowValueGenerator", + "generationTime": "ALWAYS" + }, + "modelName": "Config", + "validators": [ + { + "type": "NotNullValidator", + "message": "must not be null" + } + ] + } + ], + "indexes": [ + { + "name": "IDX_key", + "modelName": "Config", + "fields": [ + { + "fieldName": "key", + "direction": "ASC" + } + ], + "unique": true + } + ] + }, { "type": "entity", "name": "Teacher", From 9375293e6e6ff1f53921f6b655b7cc2a0febf94d Mon Sep 17 00:00:00 2001 From: Cheng Jinbao Date: Fri, 25 Oct 2024 16:55:55 +0800 Subject: [PATCH 07/12] refactor: re --- .../flexmodel/application/DocumentApplicationService.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/main/java/tech/wetech/flexmodel/application/DocumentApplicationService.java b/src/main/java/tech/wetech/flexmodel/application/DocumentApplicationService.java index b2d12d0..51cfbee 100644 --- a/src/main/java/tech/wetech/flexmodel/application/DocumentApplicationService.java +++ b/src/main/java/tech/wetech/flexmodel/application/DocumentApplicationService.java @@ -46,12 +46,9 @@ public class DocumentApplicationService { static { TYPE_MAPPING.put("ID", Map.of("type", "string")); TYPE_MAPPING.put("String", Map.of("type", "string")); - TYPE_MAPPING.put("Text", Map.of("type", "string")); TYPE_MAPPING.put("Int", Map.of("type", "integer", "format", "int32")); - TYPE_MAPPING.put("Long", Map.of("type", "integer", "format", "int64")); TYPE_MAPPING.put("Float", Map.of("type", "number", "format", "double")); TYPE_MAPPING.put("Boolean", Map.of("type", "boolean")); -// typeMapping.put("", Map.of("type", "array")); TYPE_MAPPING.put("JSON", Map.of("type", "object")); } @@ -72,7 +69,7 @@ private Map buildInfo() { return Map.of( "title", "Flexmodel API document", "description", """ - Learn how to interact with Flexmodel programmatically + Interact with Flexmodel programmatically """ ); } From 25473e43be435f11871a09b7fef93be3c90ab374 Mon Sep 17 00:00:00 2001 From: Cheng Jinbao Date: Fri, 25 Oct 2024 17:03:29 +0800 Subject: [PATCH 08/12] refactor: re --- .../infrastructrue/persistence/ApiInfoFmRepository.java | 2 +- .../infrastructrue/persistence/DatasourceFmRepository.java | 2 +- .../persistence/IdentityProviderFmRepository.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/tech/wetech/flexmodel/infrastructrue/persistence/ApiInfoFmRepository.java b/src/main/java/tech/wetech/flexmodel/infrastructrue/persistence/ApiInfoFmRepository.java index 8070380..d4c0373 100644 --- a/src/main/java/tech/wetech/flexmodel/infrastructrue/persistence/ApiInfoFmRepository.java +++ b/src/main/java/tech/wetech/flexmodel/infrastructrue/persistence/ApiInfoFmRepository.java @@ -24,7 +24,7 @@ public void deleteByParentId(String parentId) { @Override public List findAll() { - return apiInfoDAO.find(query -> query); + return apiInfoDAO.findAll(); } @Override diff --git a/src/main/java/tech/wetech/flexmodel/infrastructrue/persistence/DatasourceFmRepository.java b/src/main/java/tech/wetech/flexmodel/infrastructrue/persistence/DatasourceFmRepository.java index d810d93..18cf689 100644 --- a/src/main/java/tech/wetech/flexmodel/infrastructrue/persistence/DatasourceFmRepository.java +++ b/src/main/java/tech/wetech/flexmodel/infrastructrue/persistence/DatasourceFmRepository.java @@ -21,7 +21,7 @@ public class DatasourceFmRepository implements DatasourceRepository { @Override public List findAll() { - return datasourceDAO.find(query -> query); + return datasourceDAO.findAll(); } @Override diff --git a/src/main/java/tech/wetech/flexmodel/infrastructrue/persistence/IdentityProviderFmRepository.java b/src/main/java/tech/wetech/flexmodel/infrastructrue/persistence/IdentityProviderFmRepository.java index 8a93c69..aa9b687 100644 --- a/src/main/java/tech/wetech/flexmodel/infrastructrue/persistence/IdentityProviderFmRepository.java +++ b/src/main/java/tech/wetech/flexmodel/infrastructrue/persistence/IdentityProviderFmRepository.java @@ -19,7 +19,7 @@ public class IdentityProviderFmRepository implements IdentityProviderRepository @Override public List findAll() { - return identityProviderDAO.find(query -> query); + return identityProviderDAO.findAll(); } @Override From a4d91f90a0e294c9c30ed1c36a38acbed008b609 Mon Sep 17 00:00:00 2001 From: Cheng Jinbao Date: Fri, 25 Oct 2024 17:49:23 +0800 Subject: [PATCH 09/12] refactor: re --- .../IdentityProviderApplicationService.java | 4 ++-- .../flexmodel/domain/model/api/ApiInfoRepository.java | 2 ++ .../flexmodel/domain/model/api/ApiInfoService.java | 6 ++++++ .../domain/model/connect/DatasourceService.java | 7 +++++++ .../domain/model/idp/IdentityProviderService.java | 11 ++++++++++- .../persistence/ApiInfoFmRepository.java | 5 +++++ 6 files changed, 32 insertions(+), 3 deletions(-) diff --git a/src/main/java/tech/wetech/flexmodel/application/IdentityProviderApplicationService.java b/src/main/java/tech/wetech/flexmodel/application/IdentityProviderApplicationService.java index 0012abe..e950c4e 100644 --- a/src/main/java/tech/wetech/flexmodel/application/IdentityProviderApplicationService.java +++ b/src/main/java/tech/wetech/flexmodel/application/IdentityProviderApplicationService.java @@ -21,11 +21,11 @@ public List findAll() { } public IdentityProvider createProvider(IdentityProvider identityProvider) { - return identityProviderService.save(identityProvider); + return identityProviderService.create(identityProvider); } public IdentityProvider updateProvider(IdentityProvider identityProvider) { - return identityProviderService.save(identityProvider); + return identityProviderService.update(identityProvider); } public void deleteProvider(String id) { diff --git a/src/main/java/tech/wetech/flexmodel/domain/model/api/ApiInfoRepository.java b/src/main/java/tech/wetech/flexmodel/domain/model/api/ApiInfoRepository.java index f74b7b4..e7bdc73 100644 --- a/src/main/java/tech/wetech/flexmodel/domain/model/api/ApiInfoRepository.java +++ b/src/main/java/tech/wetech/flexmodel/domain/model/api/ApiInfoRepository.java @@ -11,6 +11,8 @@ public interface ApiInfoRepository { void deleteByParentId(String parentId); + ApiInfo findById(String id); + List findAll(); ApiInfo save(ApiInfo record); diff --git a/src/main/java/tech/wetech/flexmodel/domain/model/api/ApiInfoService.java b/src/main/java/tech/wetech/flexmodel/domain/model/api/ApiInfoService.java index 57402be..6f60e0a 100644 --- a/src/main/java/tech/wetech/flexmodel/domain/model/api/ApiInfoService.java +++ b/src/main/java/tech/wetech/flexmodel/domain/model/api/ApiInfoService.java @@ -27,6 +27,12 @@ public ApiInfo create(ApiInfo apiInfo) { } public ApiInfo update(ApiInfo apiInfo) { + ApiInfo older = apiInfoRepository.findById(apiInfo.getId()); + if (older == null) { + return apiInfo; + } + apiInfo.setCreatedAt(older.getCreatedAt()); + apiInfo.setEnabled(older.getEnabled()); return apiInfoRepository.save(apiInfo); } diff --git a/src/main/java/tech/wetech/flexmodel/domain/model/connect/DatasourceService.java b/src/main/java/tech/wetech/flexmodel/domain/model/connect/DatasourceService.java index e36124f..58b3038 100644 --- a/src/main/java/tech/wetech/flexmodel/domain/model/connect/DatasourceService.java +++ b/src/main/java/tech/wetech/flexmodel/domain/model/connect/DatasourceService.java @@ -39,6 +39,13 @@ public Datasource createDatasource(Datasource datasource) { } public Datasource updateDatasource(Datasource datasource) { + Optional optional = findOne(datasource.getName()); + if (optional.isEmpty()) { + return datasource; + } + datasource.setEnabled(optional.orElseThrow().getEnabled()); + datasource.setType(optional.orElseThrow().getType()); + datasource.setCreatedAt(optional.orElseThrow().getCreatedAt()); datasource = datasourceRepository.save(datasource); sessionDatasource.delete(datasource.getName()); sessionDatasource.add(datasource); diff --git a/src/main/java/tech/wetech/flexmodel/domain/model/idp/IdentityProviderService.java b/src/main/java/tech/wetech/flexmodel/domain/model/idp/IdentityProviderService.java index d5a0375..1704371 100644 --- a/src/main/java/tech/wetech/flexmodel/domain/model/idp/IdentityProviderService.java +++ b/src/main/java/tech/wetech/flexmodel/domain/model/idp/IdentityProviderService.java @@ -24,7 +24,16 @@ public List findAll() { return identityProviderRepository.findAll(); } - public IdentityProvider save(IdentityProvider identityProvider) { + public IdentityProvider create(IdentityProvider identityProvider) { + return identityProviderRepository.save(identityProvider); + } + + public IdentityProvider update(IdentityProvider identityProvider) { + IdentityProvider older = identityProviderRepository.find(identityProvider.getName()); + if (older == null) { + return identityProvider; + } + identityProvider.setCreatedAt(older.getCreatedAt()); return identityProviderRepository.save(identityProvider); } diff --git a/src/main/java/tech/wetech/flexmodel/infrastructrue/persistence/ApiInfoFmRepository.java b/src/main/java/tech/wetech/flexmodel/infrastructrue/persistence/ApiInfoFmRepository.java index d4c0373..03acd8e 100644 --- a/src/main/java/tech/wetech/flexmodel/infrastructrue/persistence/ApiInfoFmRepository.java +++ b/src/main/java/tech/wetech/flexmodel/infrastructrue/persistence/ApiInfoFmRepository.java @@ -22,6 +22,11 @@ public void deleteByParentId(String parentId) { apiInfoDAO.delete(f -> f.equalTo("parentId", parentId)); } + @Override + public ApiInfo findById(String id) { + return apiInfoDAO.findById(id); + } + @Override public List findAll() { return apiInfoDAO.findAll(); From e005f691ec30df26c54eacf7029d70b7570739f4 Mon Sep 17 00:00:00 2001 From: Cheng Jinbao Date: Fri, 25 Oct 2024 19:26:09 +0800 Subject: [PATCH 10/12] refactor: re --- .../wetech/flexmodel/api/DatasourceResource.java | 15 +++++++++++++-- .../application/ModelingApplicationService.java | 6 +++++- .../domain/model/modeling/ModelRepository.java | 1 + .../domain/model/modeling/ModelService.java | 4 ++++ .../persistence/ModelFmRepository.java | 5 +++++ 5 files changed, 28 insertions(+), 3 deletions(-) diff --git a/src/main/java/tech/wetech/flexmodel/api/DatasourceResource.java b/src/main/java/tech/wetech/flexmodel/api/DatasourceResource.java index 8464d5a..7314e1d 100644 --- a/src/main/java/tech/wetech/flexmodel/api/DatasourceResource.java +++ b/src/main/java/tech/wetech/flexmodel/api/DatasourceResource.java @@ -2,6 +2,7 @@ import jakarta.inject.Inject; import jakarta.validation.Valid; +import jakarta.validation.constraints.NotBlank; import jakarta.ws.rs.*; import jakarta.ws.rs.core.MediaType; import tech.wetech.flexmodel.Entity; @@ -34,10 +35,16 @@ public ValidateResult validateConnection(Datasource datasource) { return modelingApplicationService.validateConnection(datasource); } + @POST + @Path("/{datasourceName}/sync") + public List syncModels(@PathParam("datasourceName") String datasourceName, Set models) { + return modelingApplicationService.syncModels(datasourceName, models); + } + @POST @Path("/{datasourceName}/import") - public List importModels(@PathParam("datasourceName") String datasourceName, Set models) { - return modelingApplicationService.importModels(datasourceName, models); + public void importModels(@PathParam("datasourceName") String datasourceName, ImportScriptRequest request) { + modelingApplicationService.importModels(datasourceName, request.script()); } @POST @@ -83,4 +90,8 @@ public void deleteDatasource(@PathParam("datasourceName") String datasourceName) modelingApplicationService.deleteDatasource(datasourceName); } + public record ImportScriptRequest(@NotBlank String script) { + + } + } diff --git a/src/main/java/tech/wetech/flexmodel/application/ModelingApplicationService.java b/src/main/java/tech/wetech/flexmodel/application/ModelingApplicationService.java index a0b036c..01b3938 100644 --- a/src/main/java/tech/wetech/flexmodel/application/ModelingApplicationService.java +++ b/src/main/java/tech/wetech/flexmodel/application/ModelingApplicationService.java @@ -85,7 +85,11 @@ public List getPhysicsModelNames(Datasource datasource) { return datasourceService.getPhysicsModelNames(datasource); } - public List importModels(String datasourceName, Set models) { + public List syncModels(String datasourceName, Set models) { return modelService.syncModels(datasourceName, models); } + + public void importModels(String datasourceName, String script) { + modelService.importModels(datasourceName, script); + } } diff --git a/src/main/java/tech/wetech/flexmodel/domain/model/modeling/ModelRepository.java b/src/main/java/tech/wetech/flexmodel/domain/model/modeling/ModelRepository.java index d79affa..bd65013 100644 --- a/src/main/java/tech/wetech/flexmodel/domain/model/modeling/ModelRepository.java +++ b/src/main/java/tech/wetech/flexmodel/domain/model/modeling/ModelRepository.java @@ -35,4 +35,5 @@ public interface ModelRepository { List syncModels(String datasourceName, Set modelName); + void importModels(String datasourceName, String script); } diff --git a/src/main/java/tech/wetech/flexmodel/domain/model/modeling/ModelService.java b/src/main/java/tech/wetech/flexmodel/domain/model/modeling/ModelService.java index e876e2d..e4ea76d 100644 --- a/src/main/java/tech/wetech/flexmodel/domain/model/modeling/ModelService.java +++ b/src/main/java/tech/wetech/flexmodel/domain/model/modeling/ModelService.java @@ -68,4 +68,8 @@ public void dropIndex(String datasourceName, String modelName, String indexName) public List syncModels(String datasourceName, Set models) { return modelRepository.syncModels(datasourceName, models); } + + public void importModels(String datasourceName, String script) { + modelRepository.importModels(datasourceName, script); + } } diff --git a/src/main/java/tech/wetech/flexmodel/infrastructrue/persistence/ModelFmRepository.java b/src/main/java/tech/wetech/flexmodel/infrastructrue/persistence/ModelFmRepository.java index b75d1a8..de62ed3 100644 --- a/src/main/java/tech/wetech/flexmodel/infrastructrue/persistence/ModelFmRepository.java +++ b/src/main/java/tech/wetech/flexmodel/infrastructrue/persistence/ModelFmRepository.java @@ -202,4 +202,9 @@ public List syncModels(String datasourceName, Set modelNames) { return (List) session.syncModels(modelNames); } } + + @Override + public void importModels(String datasourceName, String script) { + sessionFactory.loadScriptString(datasourceName, script); + } } From a26d61443504b190843a828212d6d15774f90bb8 Mon Sep 17 00:00:00 2001 From: Cheng Jinbao Date: Sun, 27 Oct 2024 16:09:04 +0800 Subject: [PATCH 11/12] refactor: re --- .../wetech/flexmodel/api/DatasourceResource.java | 2 +- .../flexmodel/domain/model/settings/Settings.java | 12 +++++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/main/java/tech/wetech/flexmodel/api/DatasourceResource.java b/src/main/java/tech/wetech/flexmodel/api/DatasourceResource.java index 7314e1d..c291b60 100644 --- a/src/main/java/tech/wetech/flexmodel/api/DatasourceResource.java +++ b/src/main/java/tech/wetech/flexmodel/api/DatasourceResource.java @@ -43,7 +43,7 @@ public List syncModels(@PathParam("datasourceName") String datasourceNam @POST @Path("/{datasourceName}/import") - public void importModels(@PathParam("datasourceName") String datasourceName, ImportScriptRequest request) { + public void importModels(@PathParam("datasourceName") String datasourceName, @Valid ImportScriptRequest request) { modelingApplicationService.importModels(datasourceName, request.script()); } diff --git a/src/main/java/tech/wetech/flexmodel/domain/model/settings/Settings.java b/src/main/java/tech/wetech/flexmodel/domain/model/settings/Settings.java index 962a302..4423ac9 100644 --- a/src/main/java/tech/wetech/flexmodel/domain/model/settings/Settings.java +++ b/src/main/java/tech/wetech/flexmodel/domain/model/settings/Settings.java @@ -10,7 +10,9 @@ @Setter public class Settings { + private String appName = "Flexmodel"; private Log log = new Log(); + private Security security = new Security(); @Getter @Setter @@ -22,7 +24,15 @@ public static class Log { /** * 开启控制台日志 */ - private boolean enableConsoleLogging = false; + private boolean consoleLoggingEnabled = false; + } + + @Getter + @Setter + public static class Security { + private boolean apiRateLimitingEnabled = false; + private int maxRequests = 500; + private int limitRefreshPeriod = 60; } } From 0212d297b941cf54ab6dc3217c7f083c9b67a7fc Mon Sep 17 00:00:00 2001 From: Cheng Jinbao Date: Mon, 28 Oct 2024 13:37:37 +0800 Subject: [PATCH 12/12] refactor: re --- .../flexmodel/api/DatasourceResourceTest.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/test/java/tech/wetech/flexmodel/api/DatasourceResourceTest.java b/src/test/java/tech/wetech/flexmodel/api/DatasourceResourceTest.java index 37a9f44..d81de00 100644 --- a/src/test/java/tech/wetech/flexmodel/api/DatasourceResourceTest.java +++ b/src/test/java/tech/wetech/flexmodel/api/DatasourceResourceTest.java @@ -40,15 +40,21 @@ void testValidateConnection() { .body("success", is(true)); } - @Test - void testRefresh() { + /*@Test + void testSync() { given() .when() - .get("/api/datasources/system/refresh") + .contentType(ContentType.JSON) + .body(""" + [ + "system_Teacher", "system_Student", "system_Classes" + ] + """) + .post("/api/datasources/system/sync") .then() .statusCode(200) .body("size()", greaterThanOrEqualTo(1)); - } + }*/ @Test void testFindAll() {