From 85d6e1e9ee24e1575e67a3277a73e64c184db15f Mon Sep 17 00:00:00 2001 From: Ludo Mikula Date: Wed, 3 Apr 2024 23:25:42 +0200 Subject: [PATCH 1/8] fix: converst javax to jakarta --- .../api-service/lowcoder-dependencies/pom.xml | 21 +++++ server/api-service/lowcoder-domain/pom.xml | 93 +++++++++++++------ .../repository/ApplicationRepository.java | 8 +- .../asset/service/AssetServiceImpl.java | 19 ++-- .../domain/authentication/FindAuthConfig.java | 2 +- .../context/AuthRequestContext.java | 5 +- .../domain/datasource/model/Datasource.java | 30 +++--- .../service/DatasourceConnectionPool.java | 4 +- .../impl/ClientBasedConnectionPool.java | 4 +- .../service/impl/DatasourceServiceImpl.java | 32 +++---- .../lowcoder/domain/folder/model/Folder.java | 7 +- .../domain/folder/service/ElementNode.java | 7 +- .../domain/folder/service/FolderNode.java | 17 ++-- .../lowcoder/domain/folder/service/Tree.java | 10 +- .../lowcoder/domain/group/model/Group.java | 21 ++--- .../CustomInvitationRepositoryImpl.java | 5 +- .../invitation/service/InvitationService.java | 4 +- .../service/OrganizationServiceImpl.java | 41 ++++---- .../permission/model/ResourceAction.java | 16 ++-- .../permission/model/ResourceHolder.java | 7 +- .../domain/permission/model/ResourceRole.java | 25 ++--- .../service/ResourcePermissionHandler.java | 35 ++----- .../solution/SuggestAppAdminSolution.java | 34 +++---- .../domain/solutions/TemplateSolution.java | 42 ++++----- .../repository/TemplateRepository.java | 8 +- .../lowcoder/domain/user/model/APIKey.java | 2 +- .../lowcoder/domain/user/model/AuthUser.java | 16 +--- .../domain/user/service/UserServiceImpl.java | 3 +- .../impl/mock/MockDatasourceConnector.java | 16 ++-- .../infra/config/AutoReloadConfigFactory.java | 4 +- .../infra/event/ApplicationCommonEvent.java | 2 +- .../infra/localcache/ReloadableCache.java | 21 ++--- .../AutoReloadConfigInstanceImplTest.java | 13 +-- .../clickhouse/ClickHouseConnector.java | 33 +++---- .../org/lowcoder/plugin/es/EsConnector.java | 30 +++--- .../googlesheets/GoogleSheetsPlugin.java | 47 ++++------ .../plugin/graphql/GraphQLConnector.java | 14 ++- .../plugin/graphql/GraphQLExecutor.java | 82 +++++++--------- .../model/GraphQLQueryExecutionContext.java | 21 ++--- .../lowcoder/plugin/LowcoderApiConnector.java | 12 +-- .../lowcoder/plugin/mongo/MongoPlugin.java | 89 +++++++----------- .../plugin/mysql/MysqlQueryExecutor.java | 37 +++----- .../plugin/oracle/OracleQueryExecutor.java | 32 +++---- server/api-service/lowcoder-plugins/pom.xml | 4 + .../lowcoder/plugin/redis/RedisPlugin.java | 54 +++++------ .../plugin/restapi/RestApiConnector.java | 14 ++- .../plugin/restapi/RestApiExecutor.java | 87 +++++++---------- .../model/RestApiQueryExecutionContext.java | 20 ++-- .../plugins/SmtpDatasourceConfig.java | 17 ++-- .../snowflake/SnowflakeQueryExecutor.java | 24 +++-- .../plugin/sql/GeneralSqlExecutor.java | 46 ++++----- .../plugin/sql/SqlBasedConnector.java | 18 ++-- .../plugin/sql/SqlBasedQueryExecutor.java | 25 ++--- .../lowcoder/sdk/auth/AbstractAuthConfig.java | 16 ++-- .../lowcoder/sdk/auth/EmailAuthConfig.java | 10 +- .../sdk/auth/Oauth2OryAuthConfig.java | 10 +- .../sdk/auth/Oauth2SimpleAuthConfig.java | 12 +-- .../sdk/models/DatasourceStructure.java | 12 +-- .../sdk/models/DatasourceTestResult.java | 9 +- .../common/BlockingDatasourceConnector.java | 8 +- .../plugin/common/BlockingQueryExecutor.java | 8 +- .../plugin/common/DatasourceConnector.java | 27 +++--- .../sdk/plugin/common/ssl/SslConfig.java | 9 +- .../graphql/GraphQLDatasourceConfig.java | 35 ++++--- .../sdk/plugin/restapi/DataUtils.java | 35 ++++--- .../restapi/RestApiDatasourceConfig.java | 35 ++++--- .../sdk/plugin/restapi/auth/AuthConfig.java | 9 +- .../plugin/restapi/auth/BasicAuthConfig.java | 12 +-- .../restapi/auth/OAuthInheritAuthConfig.java | 3 +- .../sheet/changeset/SheetChangeSetRow.java | 20 ++-- .../sheet/changeset/SheetChangeSetRows.java | 14 ++- .../sqlcommand/changeset/ChangeSetRow.java | 22 ++--- .../sqlcommand/changeset/ChangeSetRows.java | 16 ++-- .../changeset/KeyValuePairChangeSet.java | 21 ++--- .../sqlcommand/command/InsertCommand.java | 19 ++-- .../org/lowcoder/sdk/util/CookieHelper.java | 20 ++-- .../java/org/lowcoder/sdk/util/JsonUtils.java | 29 +++--- .../org/lowcoder/sdk/util/MediaTypeUtils.java | 14 +-- .../org/lowcoder/sdk/util/MoreMapUtils.java | 7 +- .../sdk/util/RjsonMustacheParser.java | 47 ++++------ .../org/lowcoder/sdk/util/RjsonParser.java | 2 +- .../org/lowcoder/sdk/util/SqlGuiUtils.java | 16 ++-- .../java/org/lowcoder/sdk/util/UriUtils.java | 15 ++- .../sdk/webclient/WebClientBuildHelper.java | 22 ++--- .../application/ApplicationApiService.java | 58 ++++-------- .../api/application/ApplicationEndpoints.java | 30 ++---- .../application/view/ApplicationInfoView.java | 13 +-- .../authentication/dto/AuthConfigRequest.java | 11 +-- .../service/AuthenticationApiServiceImpl.java | 53 ++++------- .../api/datasource/DatasourceApiService.java | 79 ++++++---------- .../framework/filter/APIKeyAuthFilter.java | 4 +- .../framework/filter/GlobalContextFilter.java | 59 ++++-------- .../QueryExecuteHttpBodySizeFilter.java | 30 +++--- .../framework/filter/RequestCostFilter.java | 14 ++- .../framework/filter/ThrottlingFilter.java | 29 +++--- .../api/framework/filter/UserBanFilter.java | 3 +- .../filter/UserSessionPersistenceFilter.java | 2 +- .../framework/security/SecurityConfig.java | 27 ++---- .../lowcoder/api/home/FolderApiService.java | 76 ++++++--------- .../lowcoder/api/home/UserHomeApiService.java | 11 +-- .../api/home/UserHomeApiServiceImpl.java | 75 +++++---------- .../api/query/ApplicationQueryApiService.java | 36 +++---- .../usermanagement/InvitationApiService.java | 44 +++------ .../api/usermanagement/OrgDevChecker.java | 22 ++--- .../api/usermanagement/view/OrgView.java | 3 +- .../api/util/BusinessEventPublisher.java | 29 +++--- 106 files changed, 1011 insertions(+), 1511 deletions(-) diff --git a/server/api-service/lowcoder-dependencies/pom.xml b/server/api-service/lowcoder-dependencies/pom.xml index db8e5c167..c2ac2e3dd 100644 --- a/server/api-service/lowcoder-dependencies/pom.xml +++ b/server/api-service/lowcoder-dependencies/pom.xml @@ -73,6 +73,12 @@ 6.5.0.202303070854-r + + jakarta.persistence + jakarta.persistence-api + 3.1.0 + + org.apache.commons commons-collections4 @@ -137,7 +143,22 @@ com.querydsl querydsl-apt + 5.1.0 + jakarta + + + + com.querydsl + querydsl-jpa + 5.1.0 + jakarta + + + + com.querydsl + querydsl-mongodb 5.0.0 + jakarta diff --git a/server/api-service/lowcoder-domain/pom.xml b/server/api-service/lowcoder-domain/pom.xml index 3883d1f57..666c71346 100644 --- a/server/api-service/lowcoder-domain/pom.xml +++ b/server/api-service/lowcoder-domain/pom.xml @@ -5,7 +5,7 @@ lowcoder-root org.lowcoder - ${revision} + ${revision} 4.0.0 @@ -39,6 +39,10 @@ org.slf4j slf4j-log4j12 + + javax.annotation + javax.annotation-api + @@ -63,6 +67,10 @@ com.google.guava guava + + javax.inject + javax.inject + @@ -140,6 +148,7 @@ com.querydsl querydsl-apt + jakarta com.google.guava @@ -150,6 +159,11 @@ com.querydsl querydsl-jpa + jakarta + + + jakarta.persistence + jakarta.persistence-api @@ -191,11 +205,11 @@ es.moki.ratelimitj ratelimitj-redis - - io.lettuce - lettuce-core - - + + io.lettuce + lettuce-core + + @@ -234,13 +248,13 @@ test - - jakarta.xml.bind - jakarta.xml.bind-api + + jakarta.xml.bind + jakarta.xml.bind-api - - jakarta.activation - jakarta.activation-api + + jakarta.activation + jakarta.activation-api @@ -262,17 +276,38 @@ process - target/generated-sources/java - - org.springframework.data.mongodb.repository.support.MongoAnnotationProcessor - - - true - + target/generated-sources + org.springframework.data.mongodb.repository.support.MongoAnnotationProcessor + @@ -282,15 +317,15 @@ - - - org.lowcoder - lowcoder-dependencies - ${revision} - pom - import - - - + + + org.lowcoder + lowcoder-dependencies + ${revision} + pom + import + + + diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/application/repository/ApplicationRepository.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/application/repository/ApplicationRepository.java index de6b069ef..66a0f41e0 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/application/repository/ApplicationRepository.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/application/repository/ApplicationRepository.java @@ -1,19 +1,17 @@ package org.lowcoder.domain.application.repository; -import java.util.Collection; - -import javax.annotation.Nonnull; - +import jakarta.annotation.Nonnull; import org.lowcoder.domain.application.model.Application; import org.lowcoder.domain.application.model.ApplicationStatus; import org.springframework.data.mongodb.repository.Query; import org.springframework.data.mongodb.repository.ReactiveMongoRepository; import org.springframework.stereotype.Repository; - import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +import java.util.Collection; + @Repository public interface ApplicationRepository extends ReactiveMongoRepository, CustomApplicationRepository { diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/asset/service/AssetServiceImpl.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/asset/service/AssetServiceImpl.java index ff802c5d7..2708f661a 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/asset/service/AssetServiceImpl.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/asset/service/AssetServiceImpl.java @@ -1,14 +1,6 @@ package org.lowcoder.domain.asset.service; -import java.awt.Color; -import java.awt.Image; -import java.awt.image.BufferedImage; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.util.Set; - -import javax.imageio.ImageIO; - +import lombok.extern.slf4j.Slf4j; import org.lowcoder.domain.asset.model.Asset; import org.lowcoder.sdk.config.dynamic.Conf; import org.lowcoder.sdk.config.dynamic.ConfigCenter; @@ -25,11 +17,16 @@ import org.springframework.http.server.reactive.ServerHttpResponse; import org.springframework.stereotype.Service; import org.springframework.web.server.ServerWebExchange; - -import lombok.extern.slf4j.Slf4j; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.Set; + @Slf4j @Service public class AssetServiceImpl implements AssetService { diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/authentication/FindAuthConfig.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/authentication/FindAuthConfig.java index fa569922f..2d9e2ef29 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/authentication/FindAuthConfig.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/authentication/FindAuthConfig.java @@ -1,7 +1,7 @@ package org.lowcoder.domain.authentication; -import javax.annotation.Nullable; +import jakarta.annotation.Nullable; import org.lowcoder.domain.organization.model.Organization; import org.lowcoder.sdk.auth.AbstractAuthConfig; diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/authentication/context/AuthRequestContext.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/authentication/context/AuthRequestContext.java index c10e218f4..12d5bef2e 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/authentication/context/AuthRequestContext.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/authentication/context/AuthRequestContext.java @@ -1,11 +1,10 @@ package org.lowcoder.domain.authentication.context; -import javax.annotation.Nullable; - -import org.lowcoder.sdk.auth.AbstractAuthConfig; +import jakarta.annotation.Nullable; import lombok.Getter; import lombok.Setter; +import org.lowcoder.sdk.auth.AbstractAuthConfig; @Setter @Getter diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/datasource/model/Datasource.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/datasource/model/Datasource.java index 852e00db7..c5d00b6c8 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/datasource/model/Datasource.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/datasource/model/Datasource.java @@ -1,19 +1,11 @@ package org.lowcoder.domain.datasource.model; -import static org.lowcoder.domain.datasource.model.DatasourceCreationSource.LEGACY_WORKSPACE_PREDEFINED; -import static org.lowcoder.domain.datasource.model.DatasourceCreationSource.SYSTEM_STATIC; -import static org.lowcoder.domain.plugin.DatasourceMetaInfoConstants.GRAPHQL_API; -import static org.lowcoder.domain.plugin.DatasourceMetaInfoConstants.REST_API; - -import java.util.Locale; -import java.util.Optional; -import java.util.Set; - -import javax.annotation.Nullable; - -import com.fasterxml.jackson.annotation.JsonCreator; -import lombok.AllArgsConstructor; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; +import jakarta.annotation.Nullable; +import lombok.Getter; import lombok.NoArgsConstructor; +import lombok.Setter; import lombok.experimental.SuperBuilder; import lombok.extern.jackson.Jacksonized; import org.apache.commons.lang3.ObjectUtils; @@ -28,12 +20,14 @@ import org.lowcoder.sdk.util.LocaleUtils; import org.springframework.data.annotation.Transient; -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonProperty; +import java.util.Locale; +import java.util.Optional; +import java.util.Set; -import lombok.Getter; -import lombok.Setter; -import org.springframework.data.mongodb.core.mapping.Document; +import static org.lowcoder.domain.datasource.model.DatasourceCreationSource.LEGACY_WORKSPACE_PREDEFINED; +import static org.lowcoder.domain.datasource.model.DatasourceCreationSource.SYSTEM_STATIC; +import static org.lowcoder.domain.plugin.DatasourceMetaInfoConstants.GRAPHQL_API; +import static org.lowcoder.domain.plugin.DatasourceMetaInfoConstants.REST_API; @Getter @Setter diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/datasource/service/DatasourceConnectionPool.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/datasource/service/DatasourceConnectionPool.java index 7f7a34db9..1cf0f34d6 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/datasource/service/DatasourceConnectionPool.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/datasource/service/DatasourceConnectionPool.java @@ -1,10 +1,8 @@ package org.lowcoder.domain.datasource.service; -import javax.annotation.Nullable; - +import jakarta.annotation.Nullable; import org.lowcoder.domain.datasource.model.Datasource; import org.lowcoder.domain.datasource.model.DatasourceConnectionHolder; - import reactor.core.publisher.Mono; public interface DatasourceConnectionPool { diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/datasource/service/impl/ClientBasedConnectionPool.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/datasource/service/impl/ClientBasedConnectionPool.java index 509dbff45..3f82d69d8 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/datasource/service/impl/ClientBasedConnectionPool.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/datasource/service/impl/ClientBasedConnectionPool.java @@ -3,6 +3,8 @@ import com.google.common.cache.*; import com.google.common.collect.ImmutableList; import io.micrometer.core.instrument.Tags; +import jakarta.annotation.Nonnull; +import jakarta.annotation.Nullable; import jakarta.annotation.PostConstruct; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -22,8 +24,6 @@ import org.springframework.stereotype.Service; import reactor.core.publisher.Mono; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; import java.time.Duration; import java.time.Instant; import java.util.List; diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/datasource/service/impl/DatasourceServiceImpl.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/datasource/service/impl/DatasourceServiceImpl.java index 3a9f19df0..a080de296 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/datasource/service/impl/DatasourceServiceImpl.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/datasource/service/impl/DatasourceServiceImpl.java @@ -1,19 +1,9 @@ package org.lowcoder.domain.datasource.service.impl; -import static org.apache.commons.collections4.CollectionUtils.isNotEmpty; -import static org.lowcoder.sdk.util.ExceptionUtils.deferredError; -import static org.lowcoder.sdk.util.ExceptionUtils.ofError; -import static org.lowcoder.sdk.util.LocaleUtils.getLocale; - -import java.time.Duration; -import java.util.Collection; -import java.util.Locale; -import java.util.Set; -import java.util.stream.Collectors; - -import javax.annotation.Nonnull; - +import com.google.common.base.Joiner; +import jakarta.annotation.Nonnull; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.lowcoder.domain.application.model.ApplicationStatus; @@ -33,16 +23,22 @@ import org.lowcoder.sdk.models.DatasourceTestResult; import org.lowcoder.sdk.models.JsDatasourceConnectionConfig; import org.lowcoder.sdk.util.LocaleUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DuplicateKeyException; import org.springframework.stereotype.Service; - -import com.google.common.base.Joiner; - -import lombok.extern.slf4j.Slf4j; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +import java.time.Duration; +import java.util.Collection; +import java.util.Locale; +import java.util.Set; +import java.util.stream.Collectors; + +import static org.apache.commons.collections4.CollectionUtils.isNotEmpty; +import static org.lowcoder.sdk.util.ExceptionUtils.deferredError; +import static org.lowcoder.sdk.util.ExceptionUtils.ofError; +import static org.lowcoder.sdk.util.LocaleUtils.getLocale; + @Slf4j @Service @RequiredArgsConstructor diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/folder/model/Folder.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/folder/model/Folder.java index 9d9dab71d..a26592fd1 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/folder/model/Folder.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/folder/model/Folder.java @@ -1,14 +1,13 @@ package org.lowcoder.domain.folder.model; -import javax.annotation.Nullable; +import jakarta.annotation.Nullable; +import lombok.Getter; import lombok.NoArgsConstructor; +import lombok.Setter; import org.lowcoder.sdk.models.HasIdAndAuditing; import org.springframework.data.mongodb.core.mapping.Document; -import lombok.Getter; -import lombok.Setter; - @Getter @Setter @Document diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/folder/service/ElementNode.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/folder/service/ElementNode.java index 591ae8e51..6168b2ca4 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/folder/service/ElementNode.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/folder/service/ElementNode.java @@ -1,12 +1,11 @@ package org.lowcoder.domain.folder.service; -import java.util.function.Function; - -import javax.annotation.Nonnull; - +import jakarta.annotation.Nonnull; import lombok.Getter; import lombok.Setter; +import java.util.function.Function; + @Setter @Getter public class ElementNode implements Node { diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/folder/service/FolderNode.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/folder/service/FolderNode.java index 6eb09db0e..24117f0d1 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/folder/service/FolderNode.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/folder/service/FolderNode.java @@ -1,19 +1,14 @@ package org.lowcoder.domain.folder.service; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Comparator; -import java.util.List; -import java.util.PriorityQueue; -import java.util.function.Consumer; -import java.util.function.Function; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - +import jakarta.annotation.Nonnull; +import jakarta.annotation.Nullable; import lombok.Getter; import lombok.Setter; +import java.util.*; +import java.util.function.Consumer; +import java.util.function.Function; + @Getter @Setter public class FolderNode implements Node { diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/folder/service/Tree.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/folder/service/Tree.java index ec9f2e973..86b8199c5 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/folder/service/Tree.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/folder/service/Tree.java @@ -1,5 +1,9 @@ package org.lowcoder.domain.folder.service; +import jakarta.annotation.Nullable; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + import java.util.Collection; import java.util.Comparator; import java.util.List; @@ -7,12 +11,6 @@ import java.util.function.Function; import java.util.stream.Collectors; -import javax.annotation.Nullable; - -import org.apache.commons.lang3.StringUtils; - -import lombok.extern.slf4j.Slf4j; - @Slf4j public class Tree extends FolderNode { private static final int DEFAULT_DEPTH = 1; diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/group/model/Group.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/group/model/Group.java index e4f9f5638..80019d852 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/group/model/Group.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/group/model/Group.java @@ -1,12 +1,12 @@ package org.lowcoder.domain.group.model; -import java.beans.Transient; -import java.util.Comparator; -import java.util.Locale; - -import javax.annotation.Nonnull; - +import com.fasterxml.jackson.annotation.JsonIgnore; +import jakarta.annotation.Nonnull; +import jakarta.validation.constraints.NotNull; +import lombok.Getter; import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; import lombok.experimental.SuperBuilder; import lombok.extern.jackson.Jacksonized; import org.apache.commons.lang3.BooleanUtils; @@ -15,12 +15,9 @@ import org.lowcoder.sdk.models.HasIdAndAuditing; import org.springframework.data.mongodb.core.mapping.Document; -import com.fasterxml.jackson.annotation.JsonIgnore; - -import jakarta.validation.constraints.NotNull; -import lombok.Getter; -import lombok.Setter; -import lombok.ToString; +import java.beans.Transient; +import java.util.Comparator; +import java.util.Locale; @Setter @ToString diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/invitation/repository/CustomInvitationRepositoryImpl.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/invitation/repository/CustomInvitationRepositoryImpl.java index 825f6f24d..2efae95ec 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/invitation/repository/CustomInvitationRepositoryImpl.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/invitation/repository/CustomInvitationRepositoryImpl.java @@ -2,6 +2,7 @@ import static org.lowcoder.domain.util.QueryDslUtils.fieldName; +import lombok.RequiredArgsConstructor; import org.lowcoder.domain.invitation.model.Invitation; import org.lowcoder.domain.invitation.model.QInvitation; import org.lowcoder.sdk.constants.FieldName; @@ -17,10 +18,10 @@ import reactor.core.publisher.Mono; @Repository +@RequiredArgsConstructor public class CustomInvitationRepositoryImpl implements CustomInvitationRepository { - @Autowired - private ReactiveMongoTemplate mongoTemplate; + private final ReactiveMongoTemplate mongoTemplate; @Override public Mono addInvitedUser(String invitationId, String userId) { diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/invitation/service/InvitationService.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/invitation/service/InvitationService.java index 04c27276f..3486575a4 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/invitation/service/InvitationService.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/invitation/service/InvitationService.java @@ -1,8 +1,7 @@ package org.lowcoder.domain.invitation.service; -import javax.annotation.Nonnull; - +import jakarta.annotation.Nonnull; import org.lowcoder.domain.invitation.model.Invitation; import org.lowcoder.domain.invitation.repository.InvitationRepository; import org.lowcoder.domain.organization.model.MemberRole; @@ -10,7 +9,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; - import reactor.core.publisher.Mono; @Lazy diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/organization/service/OrganizationServiceImpl.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/organization/service/OrganizationServiceImpl.java index 3abdd84bb..4104ae233 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/organization/service/OrganizationServiceImpl.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/organization/service/OrganizationServiceImpl.java @@ -1,33 +1,14 @@ package org.lowcoder.domain.organization.service; -import static org.lowcoder.domain.authentication.AuthenticationService.DEFAULT_AUTH_CONFIG; -import static org.lowcoder.domain.organization.model.Organization.OrganizationCommonSettings.PASSWORD_RESET_EMAIL_TEMPLATE; -import static org.lowcoder.domain.organization.model.OrganizationState.ACTIVE; -import static org.lowcoder.domain.organization.model.OrganizationState.DELETED; -import static org.lowcoder.domain.util.QueryDslUtils.fieldName; -import static org.lowcoder.sdk.exception.BizError.UNABLE_TO_FIND_VALID_ORG; -import static org.lowcoder.sdk.util.ExceptionUtils.deferredError; -import static org.lowcoder.sdk.util.ExceptionUtils.ofError; -import static org.lowcoder.sdk.util.LocaleUtils.getLocale; -import static org.lowcoder.sdk.util.LocaleUtils.getMessage; - -import java.util.Collection; -import java.util.List; -import java.util.Locale; - -import javax.annotation.Nonnull; - +import jakarta.annotation.Nonnull; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.lowcoder.domain.asset.model.Asset; import org.lowcoder.domain.asset.service.AssetRepository; import org.lowcoder.domain.asset.service.AssetService; import org.lowcoder.domain.group.service.GroupService; import org.lowcoder.domain.organization.event.OrgDeletedEvent; -import org.lowcoder.domain.organization.model.MemberRole; -import org.lowcoder.domain.organization.model.Organization; -import org.lowcoder.domain.organization.model.OrganizationDomain; -import org.lowcoder.domain.organization.model.OrganizationState; -import org.lowcoder.domain.organization.model.QOrganization; +import org.lowcoder.domain.organization.model.*; import org.lowcoder.domain.organization.model.Organization.OrganizationCommonSettings; import org.lowcoder.domain.organization.repository.OrganizationRepository; import org.lowcoder.domain.user.model.User; @@ -47,11 +28,23 @@ import org.springframework.data.mongodb.core.query.Update; import org.springframework.http.codec.multipart.Part; import org.springframework.stereotype.Service; - -import lombok.extern.slf4j.Slf4j; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +import java.util.Collection; +import java.util.List; +import java.util.Locale; + +import static org.lowcoder.domain.authentication.AuthenticationService.DEFAULT_AUTH_CONFIG; +import static org.lowcoder.domain.organization.model.OrganizationState.ACTIVE; +import static org.lowcoder.domain.organization.model.OrganizationState.DELETED; +import static org.lowcoder.domain.util.QueryDslUtils.fieldName; +import static org.lowcoder.sdk.exception.BizError.UNABLE_TO_FIND_VALID_ORG; +import static org.lowcoder.sdk.util.ExceptionUtils.deferredError; +import static org.lowcoder.sdk.util.ExceptionUtils.ofError; +import static org.lowcoder.sdk.util.LocaleUtils.getLocale; +import static org.lowcoder.sdk.util.LocaleUtils.getMessage; + @Slf4j @Service public class OrganizationServiceImpl implements OrganizationService { diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/permission/model/ResourceAction.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/permission/model/ResourceAction.java index da442e7e0..a3cd2d6a3 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/permission/model/ResourceAction.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/permission/model/ResourceAction.java @@ -1,18 +1,16 @@ package org.lowcoder.domain.permission.model; -import static com.google.common.collect.Multimaps.toMultimap; -import static java.util.Collections.emptySet; -import static org.apache.commons.lang3.ObjectUtils.firstNonNull; +import com.google.common.collect.HashMultimap; +import com.google.common.collect.SetMultimap; +import jakarta.annotation.Nonnull; +import lombok.Getter; import java.util.Arrays; import java.util.Set; -import javax.annotation.Nonnull; - -import com.google.common.collect.HashMultimap; -import com.google.common.collect.SetMultimap; - -import lombok.Getter; +import static com.google.common.collect.Multimaps.toMultimap; +import static java.util.Collections.emptySet; +import static org.apache.commons.lang3.ObjectUtils.firstNonNull; @Getter public enum ResourceAction { diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/permission/model/ResourceHolder.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/permission/model/ResourceHolder.java index 8b4d36a84..6ac1b9469 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/permission/model/ResourceHolder.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/permission/model/ResourceHolder.java @@ -1,12 +1,11 @@ package org.lowcoder.domain.permission.model; -import static org.lowcoder.domain.permission.config.PermissionConst.ID_SPLITTER; +import jakarta.annotation.Nullable; +import org.apache.commons.lang3.StringUtils; import java.util.Arrays; -import javax.annotation.Nullable; - -import org.apache.commons.lang3.StringUtils; +import static org.lowcoder.domain.permission.config.PermissionConst.ID_SPLITTER; public enum ResourceHolder { USER("u"), diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/permission/model/ResourceRole.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/permission/model/ResourceRole.java index 249fa88bb..ae9018f2f 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/permission/model/ResourceRole.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/permission/model/ResourceRole.java @@ -1,26 +1,19 @@ package org.lowcoder.domain.permission.model; -import static com.google.common.collect.Maps.newHashMap; -import static org.lowcoder.sdk.util.StreamUtils.collectMap; - -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.function.Function; -import java.util.stream.Collectors; - -import javax.annotation.Nullable; - +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.google.common.collect.Streams; +import jakarta.annotation.Nullable; import org.jgrapht.Graph; import org.jgrapht.graph.DefaultDirectedGraph; import org.jgrapht.graph.DefaultEdge; import org.jgrapht.traverse.BreadthFirstIterator; -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.google.common.collect.Streams; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; + +import static com.google.common.collect.Maps.newHashMap; +import static org.lowcoder.sdk.util.StreamUtils.collectMap; public enum ResourceRole { diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/permission/service/ResourcePermissionHandler.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/permission/service/ResourcePermissionHandler.java index 3841a42b9..329ca8b99 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/permission/service/ResourcePermissionHandler.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/permission/service/ResourcePermissionHandler.java @@ -1,39 +1,24 @@ package org.lowcoder.domain.permission.service; -import static java.util.Collections.emptyList; -import static java.util.Collections.emptyMap; -import static java.util.Collections.singletonList; -import static java.util.function.Function.identity; -import static java.util.stream.Collectors.toMap; -import static org.lowcoder.sdk.constants.Authentication.isAnonymousUser; - -import java.util.Collection; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import javax.annotation.Nonnull; - +import com.google.common.collect.Maps; +import com.google.common.collect.Sets; +import jakarta.annotation.Nonnull; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.ListUtils; import org.lowcoder.domain.application.model.ApplicationRequestType; import org.lowcoder.domain.group.service.GroupMemberService; import org.lowcoder.domain.organization.service.OrgMemberService; -import org.lowcoder.domain.permission.model.ResourceAction; -import org.lowcoder.domain.permission.model.ResourceHolder; -import org.lowcoder.domain.permission.model.ResourcePermission; -import org.lowcoder.domain.permission.model.ResourceRole; -import org.lowcoder.domain.permission.model.ResourceType; -import org.lowcoder.domain.permission.model.UserPermissionOnResourceStatus; +import org.lowcoder.domain.permission.model.*; import org.lowcoder.sdk.config.CommonConfig; import org.springframework.beans.factory.annotation.Autowired; +import reactor.core.publisher.Mono; -import com.google.common.collect.Maps; -import com.google.common.collect.Sets; +import java.util.*; -import reactor.core.publisher.Mono; +import static java.util.Collections.*; +import static java.util.function.Function.identity; +import static java.util.stream.Collectors.toMap; +import static org.lowcoder.sdk.constants.Authentication.isAnonymousUser; abstract class ResourcePermissionHandler { diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/permission/solution/SuggestAppAdminSolution.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/permission/solution/SuggestAppAdminSolution.java index 4b648bf84..1a9fd3b11 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/permission/solution/SuggestAppAdminSolution.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/permission/solution/SuggestAppAdminSolution.java @@ -1,15 +1,7 @@ package org.lowcoder.domain.permission.solution; -import static com.google.common.collect.Lists.newArrayList; -import static com.google.common.collect.Sets.newHashSet; - -import java.util.List; -import java.util.Objects; -import java.util.Set; -import java.util.stream.Collectors; - -import javax.annotation.Nonnull; - +import jakarta.annotation.Nonnull; +import lombok.RequiredArgsConstructor; import org.lowcoder.domain.group.model.GroupMember; import org.lowcoder.domain.group.service.GroupMemberService; import org.lowcoder.domain.permission.model.ResourcePermission; @@ -17,25 +9,27 @@ import org.lowcoder.domain.permission.service.ResourcePermissionService; import org.lowcoder.domain.user.model.User; import org.lowcoder.domain.user.service.UserService; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; - import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +import java.util.List; +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; + +import static com.google.common.collect.Lists.newArrayList; +import static com.google.common.collect.Sets.newHashSet; + +@RequiredArgsConstructor @Service public class SuggestAppAdminSolution { private static final int LIMIT_COUNT_FOR_DISPLAY_ADMIN_NAMES = 7; - @Autowired - private GroupMemberService groupMemberService; - - @Autowired - private UserService userService; - - @Autowired - private ResourcePermissionService resourcePermissionService; + private final GroupMemberService groupMemberService; + private final UserService userService; + private final ResourcePermissionService resourcePermissionService; public Mono> getApplicationAdminUsers(String applicationId, int limit) { return resourcePermissionService.getByApplicationId(applicationId) diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/solutions/TemplateSolution.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/solutions/TemplateSolution.java index 85d73b84b..a8f773b00 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/solutions/TemplateSolution.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/solutions/TemplateSolution.java @@ -1,19 +1,7 @@ package org.lowcoder.domain.solutions; -import static java.util.Objects.isNull; -import static org.lowcoder.sdk.exception.BizError.TEMPLATE_NOT_CORRECT; -import static org.lowcoder.sdk.exception.BizError.TEMPLATE_NOT_EXIST; -import static org.lowcoder.sdk.util.ExceptionUtils.deferredError; -import static org.lowcoder.sdk.util.ExceptionUtils.ofError; - -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.stream.Collectors; - -import javax.annotation.Nonnull; - +import jakarta.annotation.Nonnull; +import lombok.RequiredArgsConstructor; import org.apache.commons.lang3.RandomStringUtils; import org.apache.commons.lang3.tuple.Pair; import org.lowcoder.domain.application.model.Application; @@ -28,27 +16,33 @@ import org.lowcoder.infra.annotation.NonEmptyMono; import org.lowcoder.infra.util.TupleUtils; import org.lowcoder.sdk.util.JsonUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; - import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +import static java.util.Objects.isNull; +import static org.lowcoder.sdk.exception.BizError.TEMPLATE_NOT_CORRECT; +import static org.lowcoder.sdk.exception.BizError.TEMPLATE_NOT_EXIST; +import static org.lowcoder.sdk.util.ExceptionUtils.deferredError; +import static org.lowcoder.sdk.util.ExceptionUtils.ofError; + @Lazy +@RequiredArgsConstructor @Service public class TemplateSolution { private static final int RANDOM_LENGTH = 6; - @Autowired - private TemplateService templateService; - - @Autowired - private DatasourceService datasourceService; - - @Autowired - private ApplicationService applicationService; + private final TemplateService templateService; + private final DatasourceService datasourceService; + private final ApplicationService applicationService; public Mono createFromTemplate(String templateId, String orgId, String visitorId) { return templateService.getById(templateId) diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/template/repository/TemplateRepository.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/template/repository/TemplateRepository.java index 0e6762c3f..8ddb5416b 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/template/repository/TemplateRepository.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/template/repository/TemplateRepository.java @@ -1,16 +1,14 @@ package org.lowcoder.domain.template.repository; -import java.util.Collection; - -import javax.annotation.Nonnull; - +import jakarta.annotation.Nonnull; import org.lowcoder.domain.template.model.Template; import org.springframework.data.mongodb.repository.ReactiveMongoRepository; import org.springframework.stereotype.Repository; - import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +import java.util.Collection; + @Repository public interface TemplateRepository extends ReactiveMongoRepository { diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/user/model/APIKey.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/user/model/APIKey.java index cc04fedfe..92152a71f 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/user/model/APIKey.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/user/model/APIKey.java @@ -1,10 +1,10 @@ package org.lowcoder.domain.user.model; +import jakarta.annotation.Nullable; import lombok.Builder; import lombok.Getter; import lombok.Setter; -import javax.annotation.Nullable; import java.util.function.Function; @Getter diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/user/model/AuthUser.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/user/model/AuthUser.java index 94d9f53f4..c70b6a8c4 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/user/model/AuthUser.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/user/model/AuthUser.java @@ -1,19 +1,13 @@ package org.lowcoder.domain.user.model; -import java.util.Map; -import java.util.Optional; -import java.util.Set; - -import javax.annotation.Nullable; - +import jakarta.annotation.Nullable; +import lombok.*; import org.apache.commons.lang3.StringUtils; import org.lowcoder.domain.authentication.context.AuthRequestContext; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; +import java.util.Map; +import java.util.Optional; +import java.util.Set; @Setter @Getter diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/user/service/UserServiceImpl.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/user/service/UserServiceImpl.java index dafb53297..740f72733 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/user/service/UserServiceImpl.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/user/service/UserServiceImpl.java @@ -1,6 +1,7 @@ package org.lowcoder.domain.user.service; +import jakarta.annotation.Nonnull; import jakarta.annotation.PostConstruct; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -33,7 +34,6 @@ import org.lowcoder.sdk.exception.BizException; import org.lowcoder.sdk.util.HashUtils; import org.lowcoder.sdk.util.LocaleUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DuplicateKeyException; import org.springframework.http.codec.multipart.Part; import org.springframework.stereotype.Service; @@ -41,7 +41,6 @@ import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; -import javax.annotation.Nonnull; import java.security.SecureRandom; import java.time.Instant; import java.time.temporal.ChronoUnit; diff --git a/server/api-service/lowcoder-domain/src/test/java/org/lowcoder/impl/mock/MockDatasourceConnector.java b/server/api-service/lowcoder-domain/src/test/java/org/lowcoder/impl/mock/MockDatasourceConnector.java index 3bf87e155..ed91528b1 100644 --- a/server/api-service/lowcoder-domain/src/test/java/org/lowcoder/impl/mock/MockDatasourceConnector.java +++ b/server/api-service/lowcoder-domain/src/test/java/org/lowcoder/impl/mock/MockDatasourceConnector.java @@ -1,20 +1,18 @@ package org.lowcoder.impl.mock; -import java.util.Collections; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.atomic.AtomicInteger; - -import javax.annotation.Nonnull; - +import jakarta.annotation.Nonnull; import org.lowcoder.domain.datasource.service.impl.ClientBasedConnectionPool.ClientBasedDatasourceCacheKey; import org.lowcoder.sdk.models.DatasourceConnectionConfig; import org.lowcoder.sdk.models.DatasourceTestResult; import org.lowcoder.sdk.plugin.common.DatasourceConnector; - import reactor.core.publisher.Mono; +import java.util.Collections; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicInteger; + public class MockDatasourceConnector implements DatasourceConnector { private static final ConcurrentHashMap CREATE_TIMES = new ConcurrentHashMap<>(); diff --git a/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/config/AutoReloadConfigFactory.java b/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/config/AutoReloadConfigFactory.java index eab1b618d..be29b2a0a 100644 --- a/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/config/AutoReloadConfigFactory.java +++ b/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/config/AutoReloadConfigFactory.java @@ -1,8 +1,7 @@ package org.lowcoder.infra.config; +import jakarta.annotation.Nullable; import jakarta.annotation.PostConstruct; -import lombok.NoArgsConstructor; -import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.lowcoder.infra.config.model.ServerConfig; import org.lowcoder.infra.config.repository.ServerConfigRepository; @@ -10,7 +9,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import javax.annotation.Nullable; import java.time.Duration; import java.util.Map; diff --git a/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/ApplicationCommonEvent.java b/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/ApplicationCommonEvent.java index cf74c1f48..c7bf02513 100644 --- a/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/ApplicationCommonEvent.java +++ b/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/ApplicationCommonEvent.java @@ -1,7 +1,7 @@ package org.lowcoder.infra.event; -import javax.annotation.Nullable; +import jakarta.annotation.Nullable; import lombok.Getter; import lombok.experimental.SuperBuilder; diff --git a/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/localcache/ReloadableCache.java b/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/localcache/ReloadableCache.java index f50939f94..59b568d06 100644 --- a/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/localcache/ReloadableCache.java +++ b/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/localcache/ReloadableCache.java @@ -1,22 +1,19 @@ package org.lowcoder.infra.localcache; -import static com.google.common.base.MoreObjects.firstNonNull; -import static java.util.concurrent.Executors.newSingleThreadScheduledExecutor; +import com.google.common.base.Preconditions; +import com.google.common.util.concurrent.MoreExecutors; +import jakarta.annotation.Nonnull; +import lombok.extern.slf4j.Slf4j; +import org.lowcoder.sdk.destructor.DestructorUtil; +import reactor.core.publisher.Mono; +import javax.annotation.CheckReturnValue; import java.time.Duration; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; -import javax.annotation.CheckReturnValue; -import javax.annotation.Nonnull; - -import org.lowcoder.sdk.destructor.DestructorUtil; - -import com.google.common.base.Preconditions; -import com.google.common.util.concurrent.MoreExecutors; - -import lombok.extern.slf4j.Slf4j; -import reactor.core.publisher.Mono; +import static com.google.common.base.MoreObjects.firstNonNull; +import static java.util.concurrent.Executors.newSingleThreadScheduledExecutor; @Slf4j public final class ReloadableCache { diff --git a/server/api-service/lowcoder-infra/src/test/java/org/lowcoder/infra/config/AutoReloadConfigInstanceImplTest.java b/server/api-service/lowcoder-infra/src/test/java/org/lowcoder/infra/config/AutoReloadConfigInstanceImplTest.java index f9e1442fd..a9a08559f 100644 --- a/server/api-service/lowcoder-infra/src/test/java/org/lowcoder/infra/config/AutoReloadConfigInstanceImplTest.java +++ b/server/api-service/lowcoder-infra/src/test/java/org/lowcoder/infra/config/AutoReloadConfigInstanceImplTest.java @@ -1,20 +1,17 @@ package org.lowcoder.infra.config; -import java.lang.reflect.Field; -import java.util.List; -import java.util.Map; - -import javax.annotation.Nullable; - +import jakarta.annotation.Nullable; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; -import org.lowcoder.infra.config.AutoReloadConfigFactory; -import org.lowcoder.infra.config.AutoReloadConfigInstanceImpl; import org.lowcoder.sdk.config.dynamic.Conf; import org.lowcoder.sdk.test.JsonFileReader; import org.lowcoder.sdk.util.JsonUtils; +import java.lang.reflect.Field; +import java.util.List; +import java.util.Map; + public class AutoReloadConfigInstanceImplTest { private static final AutoReloadConfigInstanceImpl configInstance = new AutoReloadConfigInstanceImpl(); diff --git a/server/api-service/lowcoder-plugins/clickHousePlugin/src/main/java/org/lowcoder/plugin/clickhouse/ClickHouseConnector.java b/server/api-service/lowcoder-plugins/clickHousePlugin/src/main/java/org/lowcoder/plugin/clickhouse/ClickHouseConnector.java index 20b45d360..f35fb7424 100644 --- a/server/api-service/lowcoder-plugins/clickHousePlugin/src/main/java/org/lowcoder/plugin/clickhouse/ClickHouseConnector.java +++ b/server/api-service/lowcoder-plugins/clickHousePlugin/src/main/java/org/lowcoder/plugin/clickhouse/ClickHouseConnector.java @@ -1,20 +1,9 @@ package org.lowcoder.plugin.clickhouse; -import static org.lowcoder.sdk.exception.PluginCommonError.DATASOURCE_ARGUMENT_ERROR; -import static org.lowcoder.sdk.exception.PluginCommonError.DATASOURCE_TIMEOUT_ERROR; -import static org.lowcoder.sdk.exception.PluginCommonError.QUERY_EXECUTION_ERROR; -import static org.lowcoder.sdk.plugin.common.QueryExecutionUtils.querySharedScheduler; - -import java.time.Duration; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; -import java.util.function.Supplier; - -import javax.annotation.Nonnull; - +import com.zaxxer.hikari.HikariConfig; +import com.zaxxer.hikari.HikariDataSource; +import com.zaxxer.hikari.pool.HikariPool.PoolInitializationException; +import jakarta.annotation.Nonnull; import org.apache.commons.lang3.StringUtils; import org.lowcoder.plugin.clickhouse.model.ClickHouseDatasourceConfig; import org.lowcoder.sdk.config.dynamic.ConfigCenter; @@ -22,12 +11,18 @@ import org.lowcoder.sdk.models.DatasourceTestResult; import org.lowcoder.sdk.plugin.common.DatasourceConnector; import org.pf4j.Extension; +import reactor.core.publisher.Mono; -import com.zaxxer.hikari.HikariConfig; -import com.zaxxer.hikari.HikariDataSource; -import com.zaxxer.hikari.pool.HikariPool.PoolInitializationException; +import java.time.Duration; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; +import java.util.function.Supplier; -import reactor.core.publisher.Mono; +import static org.lowcoder.sdk.exception.PluginCommonError.*; +import static org.lowcoder.sdk.plugin.common.QueryExecutionUtils.querySharedScheduler; @Extension public class ClickHouseConnector implements DatasourceConnector { diff --git a/server/api-service/lowcoder-plugins/elasticSearchPlugin/src/main/java/org/lowcoder/plugin/es/EsConnector.java b/server/api-service/lowcoder-plugins/elasticSearchPlugin/src/main/java/org/lowcoder/plugin/es/EsConnector.java index 7bc9a5013..d7557b93f 100644 --- a/server/api-service/lowcoder-plugins/elasticSearchPlugin/src/main/java/org/lowcoder/plugin/es/EsConnector.java +++ b/server/api-service/lowcoder-plugins/elasticSearchPlugin/src/main/java/org/lowcoder/plugin/es/EsConnector.java @@ -1,21 +1,8 @@ package org.lowcoder.plugin.es; -import static org.lowcoder.sdk.exception.BizError.DATASOURCE_CLOSE_FAILED; -import static org.lowcoder.sdk.exception.PluginCommonError.DATASOURCE_ARGUMENT_ERROR; -import static org.lowcoder.sdk.util.ExceptionUtils.ofException; -import static org.lowcoder.sdk.util.ExceptionUtils.ofPluginException; - -import java.io.IOException; -import java.time.Duration; -import java.util.Arrays; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.Set; - -import javax.annotation.Nonnull; - +import com.google.common.base.Joiner; +import jakarta.annotation.Nonnull; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.http.Header; import org.apache.http.HttpHost; @@ -43,11 +30,16 @@ import org.lowcoder.sdk.util.Preconditions; import org.pf4j.Extension; import org.springframework.http.HttpMethod; +import reactor.core.publisher.Mono; -import com.google.common.base.Joiner; +import java.io.IOException; +import java.time.Duration; +import java.util.*; -import lombok.extern.slf4j.Slf4j; -import reactor.core.publisher.Mono; +import static org.lowcoder.sdk.exception.BizError.DATASOURCE_CLOSE_FAILED; +import static org.lowcoder.sdk.exception.PluginCommonError.DATASOURCE_ARGUMENT_ERROR; +import static org.lowcoder.sdk.util.ExceptionUtils.ofException; +import static org.lowcoder.sdk.util.ExceptionUtils.ofPluginException; /** * doc references: diff --git a/server/api-service/lowcoder-plugins/googleSheetsPlugin/src/main/java/org/lowcoder/plugin/googlesheets/GoogleSheetsPlugin.java b/server/api-service/lowcoder-plugins/googleSheetsPlugin/src/main/java/org/lowcoder/plugin/googlesheets/GoogleSheetsPlugin.java index bcb2df7ea..d5568980d 100644 --- a/server/api-service/lowcoder-plugins/googleSheetsPlugin/src/main/java/org/lowcoder/plugin/googlesheets/GoogleSheetsPlugin.java +++ b/server/api-service/lowcoder-plugins/googleSheetsPlugin/src/main/java/org/lowcoder/plugin/googlesheets/GoogleSheetsPlugin.java @@ -1,34 +1,13 @@ package org.lowcoder.plugin.googlesheets; -import static org.lowcoder.plugin.googlesheets.GoogleSheetError.GOOGLESHEETS_EMPTY_QUERY_PARAM; -import static org.lowcoder.plugin.googlesheets.GoogleSheetError.GOOGLESHEETS_REQUEST_ERROR; -import static org.lowcoder.plugin.googlesheets.queryhandler.GoogleSheetsActionHandler.APPEND_DATA; -import static org.lowcoder.plugin.googlesheets.queryhandler.GoogleSheetsActionHandler.CLEAR_DATA; -import static org.lowcoder.plugin.googlesheets.queryhandler.GoogleSheetsActionHandler.DELETE_DATA; -import static org.lowcoder.plugin.googlesheets.queryhandler.GoogleSheetsActionHandler.READ_DATA; -import static org.lowcoder.plugin.googlesheets.queryhandler.GoogleSheetsActionHandler.UPDATE_DATA; -import static org.lowcoder.sdk.util.JsonUtils.fromJson; -import static org.lowcoder.sdk.util.JsonUtils.toJson; - -import java.io.IOException; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - -import javax.annotation.Nonnull; - +import com.google.api.services.sheets.v4.SheetsScopes; +import com.google.auth.oauth2.ServiceAccountCredentials; +import jakarta.annotation.Nonnull; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.StringUtils; -import org.lowcoder.plugin.googlesheets.model.GoogleSheetsActionRequest; -import org.lowcoder.plugin.googlesheets.model.GoogleSheetsAppendDataRequest; -import org.lowcoder.plugin.googlesheets.model.GoogleSheetsClearDataRequst; -import org.lowcoder.plugin.googlesheets.model.GoogleSheetsDatasourceConfig; -import org.lowcoder.plugin.googlesheets.model.GoogleSheetsDeleteDataRequest; -import org.lowcoder.plugin.googlesheets.model.GoogleSheetsQueryExecutionContext; -import org.lowcoder.plugin.googlesheets.model.GoogleSheetsReadDataRequest; -import org.lowcoder.plugin.googlesheets.model.GoogleSheetsUpdateDataRequest; -import org.lowcoder.plugin.googlesheets.model.ServiceAccountJsonUtils; +import org.lowcoder.plugin.googlesheets.model.*; import org.lowcoder.plugin.googlesheets.queryhandler.GoogleSheetsActionHandler; import org.lowcoder.plugin.googlesheets.queryhandler.GoogleSheetsActionHandlerFactory; import org.lowcoder.sdk.exception.PluginException; @@ -40,14 +19,20 @@ import org.pf4j.Extension; import org.pf4j.Plugin; import org.pf4j.PluginWrapper; - -import com.google.api.services.sheets.v4.SheetsScopes; -import com.google.auth.oauth2.ServiceAccountCredentials; - -import lombok.extern.slf4j.Slf4j; import reactor.core.publisher.Mono; import reactor.core.scheduler.Scheduler; +import java.io.IOException; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import static org.lowcoder.plugin.googlesheets.GoogleSheetError.GOOGLESHEETS_EMPTY_QUERY_PARAM; +import static org.lowcoder.plugin.googlesheets.GoogleSheetError.GOOGLESHEETS_REQUEST_ERROR; +import static org.lowcoder.plugin.googlesheets.queryhandler.GoogleSheetsActionHandler.*; +import static org.lowcoder.sdk.util.JsonUtils.fromJson; +import static org.lowcoder.sdk.util.JsonUtils.toJson; + public class GoogleSheetsPlugin extends Plugin { public GoogleSheetsPlugin(PluginWrapper wrapper) { super(wrapper); diff --git a/server/api-service/lowcoder-plugins/graphqlPlugin/src/main/java/org/lowcoder/plugin/graphql/GraphQLConnector.java b/server/api-service/lowcoder-plugins/graphqlPlugin/src/main/java/org/lowcoder/plugin/graphql/GraphQLConnector.java index 03480aa4d..358e1f505 100644 --- a/server/api-service/lowcoder-plugins/graphqlPlugin/src/main/java/org/lowcoder/plugin/graphql/GraphQLConnector.java +++ b/server/api-service/lowcoder-plugins/graphqlPlugin/src/main/java/org/lowcoder/plugin/graphql/GraphQLConnector.java @@ -1,19 +1,17 @@ package org.lowcoder.plugin.graphql; -import static java.util.Collections.emptySet; - -import java.util.Map; -import java.util.Set; - -import javax.annotation.Nonnull; - +import jakarta.annotation.Nonnull; import org.lowcoder.sdk.models.DatasourceTestResult; import org.lowcoder.sdk.plugin.common.DatasourceConnector; import org.lowcoder.sdk.plugin.graphql.GraphQLDatasourceConfig; import org.pf4j.Extension; - import reactor.core.publisher.Mono; +import java.util.Map; +import java.util.Set; + +import static java.util.Collections.emptySet; + @Extension public class GraphQLConnector implements DatasourceConnector { @Nonnull diff --git a/server/api-service/lowcoder-plugins/graphqlPlugin/src/main/java/org/lowcoder/plugin/graphql/GraphQLExecutor.java b/server/api-service/lowcoder-plugins/graphqlPlugin/src/main/java/org/lowcoder/plugin/graphql/GraphQLExecutor.java index cc18bf0aa..bd19bb67a 100644 --- a/server/api-service/lowcoder-plugins/graphqlPlugin/src/main/java/org/lowcoder/plugin/graphql/GraphQLExecutor.java +++ b/server/api-service/lowcoder-plugins/graphqlPlugin/src/main/java/org/lowcoder/plugin/graphql/GraphQLExecutor.java @@ -1,39 +1,12 @@ package org.lowcoder.plugin.graphql; -import static com.google.common.base.MoreObjects.firstNonNull; -import static org.apache.commons.collections4.MapUtils.emptyIfNull; -import static org.apache.commons.lang3.StringUtils.firstNonBlank; -import static org.apache.commons.lang3.StringUtils.trimToEmpty; -import static org.lowcoder.plugin.graphql.GraphQLError.GRAPHQL_EXECUTION_ERROR; -import static org.lowcoder.plugin.graphql.utils.GraphQLBodyUtils.convertToGraphQLBody; -import static org.lowcoder.sdk.exception.PluginCommonError.JSON_PARSE_ERROR; -import static org.lowcoder.sdk.exception.PluginCommonError.QUERY_ARGUMENT_ERROR; -import static org.lowcoder.sdk.exception.PluginCommonError.QUERY_EXECUTION_ERROR; -import static org.lowcoder.sdk.exception.PluginCommonError.QUERY_EXECUTION_TIMEOUT; -import static org.lowcoder.sdk.plugin.restapi.auth.RestApiAuthType.DIGEST_AUTH; -import static org.lowcoder.sdk.plugin.restapi.auth.RestApiAuthType.OAUTH2_INHERIT_FROM_LOGIN; -import static org.lowcoder.sdk.util.ExceptionUtils.propagateError; -import static org.lowcoder.sdk.util.JsonUtils.readTree; -import static org.lowcoder.sdk.util.JsonUtils.toJsonThrows; -import static org.lowcoder.sdk.util.MustacheHelper.renderMustacheString; -import static org.lowcoder.sdk.util.StreamUtils.collectList; -import static org.lowcoder.sdk.util.StreamUtils.distinctByKey; - -import java.io.IOException; -import java.net.URI; -import java.net.URISyntaxException; -import java.nio.charset.StandardCharsets; -import java.text.ParseException; -import java.util.*; -import java.util.Map.Entry; -import java.util.concurrent.TimeoutException; -import java.util.function.Consumer; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import javax.annotation.Nullable; - +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.ObjectNode; import com.google.common.collect.ImmutableMap; +import jakarta.annotation.Nullable; +import lombok.Builder; +import lombok.Getter; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; @@ -60,13 +33,7 @@ import org.lowcoder.sdk.util.MustacheHelper; import org.lowcoder.sdk.webclient.WebClientBuildHelper; import org.pf4j.Extension; -import org.springframework.http.HttpCookie; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpMethod; -import org.springframework.http.HttpStatus; -import org.springframework.http.InvalidMediaTypeException; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; +import org.springframework.http.*; import org.springframework.http.client.reactive.ClientHttpRequest; import org.springframework.util.MultiValueMap; import org.springframework.web.reactive.function.BodyInserter; @@ -74,16 +41,37 @@ import org.springframework.web.reactive.function.client.ClientResponse; import org.springframework.web.reactive.function.client.ExchangeStrategies; import org.springframework.web.reactive.function.client.WebClient; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.ObjectNode; - -import lombok.Builder; -import lombok.Getter; import reactor.core.publisher.Mono; import reactor.core.scheduler.Scheduler; +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; +import java.nio.charset.StandardCharsets; +import java.text.ParseException; +import java.util.*; +import java.util.Map.Entry; +import java.util.concurrent.TimeoutException; +import java.util.function.Consumer; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static com.google.common.base.MoreObjects.firstNonNull; +import static org.apache.commons.collections4.MapUtils.emptyIfNull; +import static org.apache.commons.lang3.StringUtils.firstNonBlank; +import static org.apache.commons.lang3.StringUtils.trimToEmpty; +import static org.lowcoder.plugin.graphql.GraphQLError.GRAPHQL_EXECUTION_ERROR; +import static org.lowcoder.plugin.graphql.utils.GraphQLBodyUtils.convertToGraphQLBody; +import static org.lowcoder.sdk.exception.PluginCommonError.*; +import static org.lowcoder.sdk.plugin.restapi.auth.RestApiAuthType.DIGEST_AUTH; +import static org.lowcoder.sdk.plugin.restapi.auth.RestApiAuthType.OAUTH2_INHERIT_FROM_LOGIN; +import static org.lowcoder.sdk.util.ExceptionUtils.propagateError; +import static org.lowcoder.sdk.util.JsonUtils.readTree; +import static org.lowcoder.sdk.util.JsonUtils.toJsonThrows; +import static org.lowcoder.sdk.util.MustacheHelper.renderMustacheString; +import static org.lowcoder.sdk.util.StreamUtils.collectList; +import static org.lowcoder.sdk.util.StreamUtils.distinctByKey; + @Extension public class GraphQLExecutor implements QueryExecutor { private static final String RESPONSE_DATA_TYPE = "X-LOWCODER-RESPONSE-DATA-TYPE"; diff --git a/server/api-service/lowcoder-plugins/graphqlPlugin/src/main/java/org/lowcoder/plugin/graphql/model/GraphQLQueryExecutionContext.java b/server/api-service/lowcoder-plugins/graphqlPlugin/src/main/java/org/lowcoder/plugin/graphql/model/GraphQLQueryExecutionContext.java index ffe875861..f3f10d4d3 100644 --- a/server/api-service/lowcoder-plugins/graphqlPlugin/src/main/java/org/lowcoder/plugin/graphql/model/GraphQLQueryExecutionContext.java +++ b/server/api-service/lowcoder-plugins/graphqlPlugin/src/main/java/org/lowcoder/plugin/graphql/model/GraphQLQueryExecutionContext.java @@ -1,25 +1,22 @@ package org.lowcoder.plugin.graphql.model; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import javax.annotation.Nullable; - +import com.fasterxml.jackson.databind.JsonNode; +import jakarta.annotation.Nullable; +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; import org.lowcoder.sdk.models.Property; import org.lowcoder.sdk.plugin.restapi.auth.AuthConfig; import org.lowcoder.sdk.query.QueryExecutionContext; import org.springframework.http.HttpCookie; import org.springframework.http.HttpMethod; import org.springframework.util.MultiValueMap; - -import com.fasterxml.jackson.databind.JsonNode; - -import lombok.Builder; -import lombok.Getter; -import lombok.Setter; import reactor.core.publisher.Mono; +import java.util.List; +import java.util.Map; +import java.util.Set; + @Builder public class GraphQLQueryExecutionContext extends QueryExecutionContext { private String url; diff --git a/server/api-service/lowcoder-plugins/lowcoderApiPlugin/src/main/java/org/lowcoder/plugin/LowcoderApiConnector.java b/server/api-service/lowcoder-plugins/lowcoderApiPlugin/src/main/java/org/lowcoder/plugin/LowcoderApiConnector.java index 4ce4466a2..71ae3e98e 100644 --- a/server/api-service/lowcoder-plugins/lowcoderApiPlugin/src/main/java/org/lowcoder/plugin/LowcoderApiConnector.java +++ b/server/api-service/lowcoder-plugins/lowcoderApiPlugin/src/main/java/org/lowcoder/plugin/LowcoderApiConnector.java @@ -1,18 +1,16 @@ package org.lowcoder.plugin; -import java.util.Collections; -import java.util.Map; -import java.util.Set; - -import javax.annotation.Nonnull; - +import jakarta.annotation.Nonnull; import org.lowcoder.sdk.models.DatasourceTestResult; import org.lowcoder.sdk.plugin.common.DatasourceConnector; import org.lowcoder.sdk.plugin.lowcoderapi.LowcoderApiDatasourceConfig; import org.pf4j.Extension; - import reactor.core.publisher.Mono; +import java.util.Collections; +import java.util.Map; +import java.util.Set; + @Extension public class LowcoderApiConnector implements DatasourceConnector { diff --git a/server/api-service/lowcoder-plugins/mongoPlugin/src/main/java/org/lowcoder/plugin/mongo/MongoPlugin.java b/server/api-service/lowcoder-plugins/mongoPlugin/src/main/java/org/lowcoder/plugin/mongo/MongoPlugin.java index 56457c05b..2496ae690 100644 --- a/server/api-service/lowcoder-plugins/mongoPlugin/src/main/java/org/lowcoder/plugin/mongo/MongoPlugin.java +++ b/server/api-service/lowcoder-plugins/mongoPlugin/src/main/java/org/lowcoder/plugin/mongo/MongoPlugin.java @@ -17,54 +17,15 @@ // adapted for mongodb queries package org.lowcoder.plugin.mongo; -import static com.google.common.collect.Maps.newHashMap; -import static org.lowcoder.plugin.mongo.MongoPluginError.MONGO_COMMAND_ERROR; -import static org.lowcoder.plugin.mongo.MongoPluginError.MONGO_EXECUTION_ERROR; -import static org.lowcoder.plugin.mongo.constants.MongoFieldName.AGGREGATE_PIPELINE; -import static org.lowcoder.plugin.mongo.constants.MongoFieldName.COUNT_QUERY; -import static org.lowcoder.plugin.mongo.constants.MongoFieldName.DELETE_QUERY; -import static org.lowcoder.plugin.mongo.constants.MongoFieldName.DISTINCT_QUERY; -import static org.lowcoder.plugin.mongo.constants.MongoFieldName.FIND_PROJECTION; -import static org.lowcoder.plugin.mongo.constants.MongoFieldName.FIND_QUERY; -import static org.lowcoder.plugin.mongo.constants.MongoFieldName.FIND_SORT; -import static org.lowcoder.plugin.mongo.constants.MongoFieldName.INSERT_DOCUMENT; -import static org.lowcoder.plugin.mongo.constants.MongoFieldName.RAW_COMMAND; -import static org.lowcoder.plugin.mongo.constants.MongoFieldName.UPDATE_OPERATION; -import static org.lowcoder.plugin.mongo.constants.MongoFieldName.UPDATE_QUERY; -import static org.lowcoder.plugin.mongo.model.MongoConnectionUriParser.extractInfoFromConnectionStringURI; -import static org.lowcoder.plugin.mongo.utils.MongoQueryUtils.isRawCommand; -import static org.lowcoder.plugin.mongo.utils.MongoQueryUtils.parseResultBody; -import static org.lowcoder.sdk.exception.PluginCommonError.CONNECTION_ERROR; -import static org.lowcoder.sdk.exception.PluginCommonError.DATASOURCE_ARGUMENT_ERROR; -import static org.lowcoder.sdk.exception.PluginCommonError.DATASOURCE_GET_STRUCTURE_ERROR; -import static org.lowcoder.sdk.exception.PluginCommonError.DATASOURCE_TIMEOUT_ERROR; -import static org.lowcoder.sdk.exception.PluginCommonError.INVALID_QUERY_SETTINGS; -import static org.lowcoder.sdk.exception.PluginCommonError.QUERY_ARGUMENT_ERROR; -import static org.lowcoder.sdk.exception.PluginCommonError.QUERY_EXECUTION_ERROR; -import static org.lowcoder.sdk.exception.PluginCommonError.QUERY_EXECUTION_TIMEOUT; -import static org.lowcoder.sdk.plugin.common.QueryExecutionUtils.getValueSafelyFromFormData; -import static org.lowcoder.sdk.plugin.common.QueryExecutionUtils.querySharedScheduler; -import static org.lowcoder.sdk.util.JsonUtils.toJson; -import static org.lowcoder.sdk.util.MustacheHelper.renderMustacheJsonString; -import static org.lowcoder.sdk.util.MustacheHelper.renderMustacheString; - -import java.math.BigInteger; -import java.time.Duration; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.HashSet; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; -import java.util.concurrent.TimeoutException; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import javax.annotation.Nonnull; - +import com.google.common.base.Joiner; +import com.google.common.collect.ImmutableSet; +import com.mongodb.MongoCommandException; +import com.mongodb.MongoSocketWriteException; +import com.mongodb.MongoTimeoutException; +import com.mongodb.reactivestreams.client.MongoClients; +import com.mongodb.reactivestreams.client.MongoDatabase; +import jakarta.annotation.Nonnull; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.bson.Document; import org.json.JSONObject; @@ -87,20 +48,32 @@ import org.pf4j.Plugin; import org.pf4j.PluginWrapper; import org.reactivestreams.Publisher; - -import com.google.common.base.Joiner; -import com.google.common.collect.ImmutableSet; -import com.mongodb.MongoCommandException; -import com.mongodb.MongoSocketWriteException; -import com.mongodb.MongoTimeoutException; -import com.mongodb.reactivestreams.client.MongoClients; -import com.mongodb.reactivestreams.client.MongoDatabase; - -import lombok.extern.slf4j.Slf4j; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import reactor.core.scheduler.Scheduler; +import java.math.BigInteger; +import java.time.Duration; +import java.util.*; +import java.util.Map.Entry; +import java.util.concurrent.TimeoutException; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import static com.google.common.collect.Maps.newHashMap; +import static org.lowcoder.plugin.mongo.MongoPluginError.MONGO_COMMAND_ERROR; +import static org.lowcoder.plugin.mongo.MongoPluginError.MONGO_EXECUTION_ERROR; +import static org.lowcoder.plugin.mongo.constants.MongoFieldName.*; +import static org.lowcoder.plugin.mongo.model.MongoConnectionUriParser.extractInfoFromConnectionStringURI; +import static org.lowcoder.plugin.mongo.utils.MongoQueryUtils.isRawCommand; +import static org.lowcoder.plugin.mongo.utils.MongoQueryUtils.parseResultBody; +import static org.lowcoder.sdk.exception.PluginCommonError.*; +import static org.lowcoder.sdk.plugin.common.QueryExecutionUtils.getValueSafelyFromFormData; +import static org.lowcoder.sdk.plugin.common.QueryExecutionUtils.querySharedScheduler; +import static org.lowcoder.sdk.util.JsonUtils.toJson; +import static org.lowcoder.sdk.util.MustacheHelper.renderMustacheJsonString; +import static org.lowcoder.sdk.util.MustacheHelper.renderMustacheString; + public class MongoPlugin extends Plugin { public MongoPlugin(PluginWrapper wrapper) { diff --git a/server/api-service/lowcoder-plugins/mysqlPlugin/src/main/java/org/lowcoder/plugin/mysql/MysqlQueryExecutor.java b/server/api-service/lowcoder-plugins/mysqlPlugin/src/main/java/org/lowcoder/plugin/mysql/MysqlQueryExecutor.java index 981ecada7..f15b672c7 100644 --- a/server/api-service/lowcoder-plugins/mysqlPlugin/src/main/java/org/lowcoder/plugin/mysql/MysqlQueryExecutor.java +++ b/server/api-service/lowcoder-plugins/mysqlPlugin/src/main/java/org/lowcoder/plugin/mysql/MysqlQueryExecutor.java @@ -1,20 +1,7 @@ package org.lowcoder.plugin.mysql; -import static org.lowcoder.plugin.mysql.utils.MysqlStructureParser.parseTableAndColumns; -import static org.lowcoder.plugin.mysql.utils.MysqlStructureParser.parseTableKeys; -import static org.lowcoder.sdk.exception.PluginCommonError.DATASOURCE_GET_STRUCTURE_ERROR; -import static org.lowcoder.sdk.exception.PluginCommonError.QUERY_ARGUMENT_ERROR; - -import java.sql.Connection; -import java.sql.SQLException; -import java.sql.Statement; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.LinkedHashMap; -import java.util.Map; - -import javax.annotation.Nonnull; - +import jakarta.annotation.Nonnull; +import lombok.extern.slf4j.Slf4j; import org.lowcoder.plugin.sql.GeneralSqlExecutor; import org.lowcoder.plugin.sql.SqlBasedQueryExecutor; import org.lowcoder.sdk.exception.PluginException; @@ -22,15 +9,21 @@ import org.lowcoder.sdk.models.DatasourceStructure.Table; import org.lowcoder.sdk.plugin.common.sql.SqlBasedDatasourceConnectionConfig; import org.lowcoder.sdk.plugin.sqlcommand.GuiSqlCommand; -import org.lowcoder.sdk.plugin.sqlcommand.command.mysql.MysqlBulkInsertCommand; -import org.lowcoder.sdk.plugin.sqlcommand.command.mysql.MysqlBulkUpdateCommand; -import org.lowcoder.sdk.plugin.sqlcommand.command.mysql.MysqlDeleteCommand; -import org.lowcoder.sdk.plugin.sqlcommand.command.mysql.MysqlInsertCommand; -import org.lowcoder.sdk.plugin.sqlcommand.command.mysql.MysqlUpdateCommand; -import org.lowcoder.sdk.plugin.sqlcommand.command.mysql.MysqlUpsertCommand; +import org.lowcoder.sdk.plugin.sqlcommand.command.mysql.*; import org.pf4j.Extension; -import lombok.extern.slf4j.Slf4j; +import java.sql.Connection; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.LinkedHashMap; +import java.util.Map; + +import static org.lowcoder.plugin.mysql.utils.MysqlStructureParser.parseTableAndColumns; +import static org.lowcoder.plugin.mysql.utils.MysqlStructureParser.parseTableKeys; +import static org.lowcoder.sdk.exception.PluginCommonError.DATASOURCE_GET_STRUCTURE_ERROR; +import static org.lowcoder.sdk.exception.PluginCommonError.QUERY_ARGUMENT_ERROR; @Slf4j @Extension diff --git a/server/api-service/lowcoder-plugins/oraclePlugin/src/main/java/org/lowcoder/plugin/oracle/OracleQueryExecutor.java b/server/api-service/lowcoder-plugins/oraclePlugin/src/main/java/org/lowcoder/plugin/oracle/OracleQueryExecutor.java index 7876029ee..d17c59791 100644 --- a/server/api-service/lowcoder-plugins/oraclePlugin/src/main/java/org/lowcoder/plugin/oracle/OracleQueryExecutor.java +++ b/server/api-service/lowcoder-plugins/oraclePlugin/src/main/java/org/lowcoder/plugin/oracle/OracleQueryExecutor.java @@ -1,23 +1,8 @@ package org.lowcoder.plugin.oracle; -import static org.lowcoder.sdk.exception.PluginCommonError.DATASOURCE_GET_STRUCTURE_ERROR; -import static org.lowcoder.sdk.exception.PluginCommonError.QUERY_ARGUMENT_ERROR; -import static org.lowcoder.sdk.plugin.common.sql.StructureParser.QUERY_STRUCTURE_SQL; - -import java.sql.Connection; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; -import java.util.List; -import java.util.Map; - -import javax.annotation.Nonnull; - -import org.lowcoder.plugin.oracle.gui.OracleBulkInsertCommand; -import org.lowcoder.plugin.oracle.gui.OracleBulkUpdateCommand; -import org.lowcoder.plugin.oracle.gui.OracleDeleteCommand; -import org.lowcoder.plugin.oracle.gui.OracleInsertCommand; -import org.lowcoder.plugin.oracle.gui.OracleUpdateCommand; +import jakarta.annotation.Nonnull; +import lombok.extern.slf4j.Slf4j; +import org.lowcoder.plugin.oracle.gui.*; import org.lowcoder.plugin.sql.GeneralSqlExecutor; import org.lowcoder.plugin.sql.SqlBasedQueryExecutor; import org.lowcoder.sdk.exception.PluginException; @@ -28,7 +13,16 @@ import org.lowcoder.sdk.plugin.sqlcommand.GuiSqlCommand; import org.pf4j.Extension; -import lombok.extern.slf4j.Slf4j; +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.List; +import java.util.Map; + +import static org.lowcoder.sdk.exception.PluginCommonError.DATASOURCE_GET_STRUCTURE_ERROR; +import static org.lowcoder.sdk.exception.PluginCommonError.QUERY_ARGUMENT_ERROR; +import static org.lowcoder.sdk.plugin.common.sql.StructureParser.QUERY_STRUCTURE_SQL; @Slf4j @Extension diff --git a/server/api-service/lowcoder-plugins/pom.xml b/server/api-service/lowcoder-plugins/pom.xml index 90512a3f5..d051542ad 100644 --- a/server/api-service/lowcoder-plugins/pom.xml +++ b/server/api-service/lowcoder-plugins/pom.xml @@ -30,6 +30,10 @@ org.slf4j slf4j-log4j12 + + javax.annotation + javax.annotation-api + diff --git a/server/api-service/lowcoder-plugins/redisPlugin/src/main/java/org/lowcoder/plugin/redis/RedisPlugin.java b/server/api-service/lowcoder-plugins/redisPlugin/src/main/java/org/lowcoder/plugin/redis/RedisPlugin.java index 3b0c54e91..e412af305 100644 --- a/server/api-service/lowcoder-plugins/redisPlugin/src/main/java/org/lowcoder/plugin/redis/RedisPlugin.java +++ b/server/api-service/lowcoder-plugins/redisPlugin/src/main/java/org/lowcoder/plugin/redis/RedisPlugin.java @@ -16,37 +16,8 @@ */ package org.lowcoder.plugin.redis; -import static com.google.common.collect.Maps.newHashMap; -import static java.util.Objects.isNull; -import static org.lowcoder.plugin.redis.RedisError.REDIS_EXECUTION_ERROR; -import static org.lowcoder.plugin.redis.RedisError.REDIS_URL_ERROR; -import static org.lowcoder.plugin.redis.constants.RedisConstants.JEDIS_POOL_MAX_IDLE; -import static org.lowcoder.plugin.redis.constants.RedisConstants.JEDIS_POOL_MAX_TOTAL; -import static org.lowcoder.plugin.redis.constants.RedisConstants.JEDIS_POOL_MIN_EVICTABLE_IDLE_MILLIS; -import static org.lowcoder.plugin.redis.constants.RedisConstants.JEDIS_POOL_MIN_IDLE; -import static org.lowcoder.plugin.redis.constants.RedisConstants.JEDIS_POOL_TIME_BETWEEN_EVICTION_RUNS_MILLIS; -import static org.lowcoder.plugin.redis.constants.RedisConstants.TEST_TIMEOUT_MILLIS; -import static org.lowcoder.plugin.redis.constants.RedisFieldName.RAW_COMMAND; -import static org.lowcoder.plugin.redis.utils.RedisQueryUtils.convertRedisFormInputToRedisCommand; -import static org.lowcoder.sdk.exception.PluginCommonError.QUERY_ARGUMENT_ERROR; -import static org.lowcoder.sdk.plugin.common.QueryExecutionUtils.getValueSafelyFromFormData; -import static org.lowcoder.sdk.util.MustacheHelper.renderMustacheArrayString; -import static org.lowcoder.sdk.util.MustacheHelper.renderMustacheStringWithoutRemoveSurroundedPar; - -import java.net.URI; -import java.time.Duration; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import java.util.stream.Collectors; - -import javax.annotation.Nonnull; - +import jakarta.annotation.Nonnull; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang3.ArrayUtils; import org.lowcoder.plugin.redis.commands.RedisCommand; @@ -63,8 +34,6 @@ import org.pf4j.Extension; import org.pf4j.Plugin; import org.pf4j.PluginWrapper; - -import lombok.extern.slf4j.Slf4j; import reactor.core.publisher.Mono; import reactor.core.scheduler.Scheduler; import redis.clients.jedis.Jedis; @@ -75,6 +44,25 @@ import redis.clients.jedis.exceptions.JedisException; import redis.clients.jedis.util.SafeEncoder; +import java.net.URI; +import java.time.Duration; +import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +import static com.google.common.collect.Maps.newHashMap; +import static java.util.Objects.isNull; +import static org.lowcoder.plugin.redis.RedisError.REDIS_EXECUTION_ERROR; +import static org.lowcoder.plugin.redis.RedisError.REDIS_URL_ERROR; +import static org.lowcoder.plugin.redis.constants.RedisConstants.*; +import static org.lowcoder.plugin.redis.constants.RedisFieldName.RAW_COMMAND; +import static org.lowcoder.plugin.redis.utils.RedisQueryUtils.convertRedisFormInputToRedisCommand; +import static org.lowcoder.sdk.exception.PluginCommonError.QUERY_ARGUMENT_ERROR; +import static org.lowcoder.sdk.plugin.common.QueryExecutionUtils.getValueSafelyFromFormData; +import static org.lowcoder.sdk.util.MustacheHelper.renderMustacheArrayString; +import static org.lowcoder.sdk.util.MustacheHelper.renderMustacheStringWithoutRemoveSurroundedPar; + public class RedisPlugin extends Plugin { public static final int DEFAULT_QUERY_TIMEOUT_SECONDS = 8; private static final String CMD_KEY = "cmd"; diff --git a/server/api-service/lowcoder-plugins/restApiPlugin/src/main/java/org/lowcoder/plugin/restapi/RestApiConnector.java b/server/api-service/lowcoder-plugins/restApiPlugin/src/main/java/org/lowcoder/plugin/restapi/RestApiConnector.java index 8cf21052e..2c0b0a7fc 100644 --- a/server/api-service/lowcoder-plugins/restApiPlugin/src/main/java/org/lowcoder/plugin/restapi/RestApiConnector.java +++ b/server/api-service/lowcoder-plugins/restApiPlugin/src/main/java/org/lowcoder/plugin/restapi/RestApiConnector.java @@ -1,19 +1,17 @@ package org.lowcoder.plugin.restapi; -import static java.util.Collections.emptySet; - -import java.util.Map; -import java.util.Set; - -import javax.annotation.Nonnull; - +import jakarta.annotation.Nonnull; import org.lowcoder.sdk.models.DatasourceTestResult; import org.lowcoder.sdk.plugin.common.DatasourceConnector; import org.lowcoder.sdk.plugin.restapi.RestApiDatasourceConfig; import org.pf4j.Extension; - import reactor.core.publisher.Mono; +import java.util.Map; +import java.util.Set; + +import static java.util.Collections.emptySet; + @Extension public class RestApiConnector implements DatasourceConnector { diff --git a/server/api-service/lowcoder-plugins/restApiPlugin/src/main/java/org/lowcoder/plugin/restapi/RestApiExecutor.java b/server/api-service/lowcoder-plugins/restApiPlugin/src/main/java/org/lowcoder/plugin/restapi/RestApiExecutor.java index 9f3eaf122..fdb5d4736 100644 --- a/server/api-service/lowcoder-plugins/restApiPlugin/src/main/java/org/lowcoder/plugin/restapi/RestApiExecutor.java +++ b/server/api-service/lowcoder-plugins/restApiPlugin/src/main/java/org/lowcoder/plugin/restapi/RestApiExecutor.java @@ -19,47 +19,13 @@ package org.lowcoder.plugin.restapi; -import static com.google.common.base.MoreObjects.firstNonNull; -import static org.apache.commons.collections4.MapUtils.emptyIfNull; -import static org.apache.commons.lang3.StringUtils.trimToEmpty; -import static org.lowcoder.plugin.restapi.RestApiError.REST_API_EXECUTION_ERROR; -import static org.lowcoder.plugin.restapi.helpers.ContentTypeHelper.isBinary; -import static org.lowcoder.plugin.restapi.helpers.ContentTypeHelper.isJson; -import static org.lowcoder.plugin.restapi.helpers.ContentTypeHelper.isJsonContentType; -import static org.lowcoder.plugin.restapi.helpers.ContentTypeHelper.isPicture; -import static org.lowcoder.plugin.restapi.helpers.ContentTypeHelper.isValidContentType; -import static org.lowcoder.plugin.restapi.helpers.ContentTypeHelper.parseContentType; -import static org.lowcoder.sdk.exception.PluginCommonError.JSON_PARSE_ERROR; -import static org.lowcoder.sdk.exception.PluginCommonError.QUERY_ARGUMENT_ERROR; -import static org.lowcoder.sdk.exception.PluginCommonError.QUERY_EXECUTION_ERROR; -import static org.lowcoder.sdk.plugin.restapi.DataUtils.convertToMultiformFileValue; -import static org.lowcoder.sdk.plugin.restapi.auth.RestApiAuthType.DIGEST_AUTH; -import static org.lowcoder.sdk.plugin.restapi.auth.RestApiAuthType.OAUTH2_INHERIT_FROM_LOGIN; -import static org.lowcoder.sdk.util.ExceptionUtils.propagateError; -import static org.lowcoder.sdk.util.JsonUtils.readTree; -import static org.lowcoder.sdk.util.JsonUtils.toJsonThrows; -import static org.lowcoder.sdk.util.MustacheHelper.renderMustacheJson; -import static org.lowcoder.sdk.util.MustacheHelper.renderMustacheString; -import static org.lowcoder.sdk.util.StreamUtils.collectList; - -import java.io.IOException; -import java.net.URI; -import java.net.URISyntaxException; -import java.nio.charset.StandardCharsets; -import java.text.ParseException; -import java.util.ArrayList; -import java.util.Base64; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.function.Consumer; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import javax.annotation.Nullable; - +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.ObjectNode; +import com.google.common.collect.ImmutableMap; +import jakarta.annotation.Nullable; +import lombok.Builder; +import lombok.Getter; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; @@ -86,27 +52,40 @@ import org.lowcoder.sdk.query.QueryVisitorContext; import org.lowcoder.sdk.webclient.WebClientBuildHelper; import org.pf4j.Extension; -import org.springframework.http.HttpCookie; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpMethod; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; +import org.springframework.http.*; import org.springframework.http.client.reactive.ClientHttpRequest; import org.springframework.util.MultiValueMap; import org.springframework.web.reactive.function.BodyInserter; import org.springframework.web.reactive.function.BodyInserters; import org.springframework.web.reactive.function.client.ExchangeStrategies; import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Mono; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.ObjectNode; -import com.google.common.collect.ImmutableMap; +import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; +import java.nio.charset.StandardCharsets; +import java.text.ParseException; +import java.util.*; +import java.util.function.Consumer; +import java.util.stream.Collectors; +import java.util.stream.Stream; -import lombok.Builder; -import lombok.Getter; -import reactor.core.publisher.Mono; +import static com.google.common.base.MoreObjects.firstNonNull; +import static org.apache.commons.collections4.MapUtils.emptyIfNull; +import static org.apache.commons.lang3.StringUtils.trimToEmpty; +import static org.lowcoder.plugin.restapi.RestApiError.REST_API_EXECUTION_ERROR; +import static org.lowcoder.plugin.restapi.helpers.ContentTypeHelper.*; +import static org.lowcoder.sdk.exception.PluginCommonError.*; +import static org.lowcoder.sdk.plugin.restapi.DataUtils.convertToMultiformFileValue; +import static org.lowcoder.sdk.plugin.restapi.auth.RestApiAuthType.DIGEST_AUTH; +import static org.lowcoder.sdk.plugin.restapi.auth.RestApiAuthType.OAUTH2_INHERIT_FROM_LOGIN; +import static org.lowcoder.sdk.util.ExceptionUtils.propagateError; +import static org.lowcoder.sdk.util.JsonUtils.readTree; +import static org.lowcoder.sdk.util.JsonUtils.toJsonThrows; +import static org.lowcoder.sdk.util.MustacheHelper.renderMustacheJson; +import static org.lowcoder.sdk.util.MustacheHelper.renderMustacheString; +import static org.lowcoder.sdk.util.StreamUtils.collectList; @Extension public class RestApiExecutor implements QueryExecutor { diff --git a/server/api-service/lowcoder-plugins/restApiPlugin/src/main/java/org/lowcoder/plugin/restapi/model/RestApiQueryExecutionContext.java b/server/api-service/lowcoder-plugins/restApiPlugin/src/main/java/org/lowcoder/plugin/restapi/model/RestApiQueryExecutionContext.java index 930fcab04..980bc9825 100644 --- a/server/api-service/lowcoder-plugins/restApiPlugin/src/main/java/org/lowcoder/plugin/restapi/model/RestApiQueryExecutionContext.java +++ b/server/api-service/lowcoder-plugins/restApiPlugin/src/main/java/org/lowcoder/plugin/restapi/model/RestApiQueryExecutionContext.java @@ -1,12 +1,9 @@ package org.lowcoder.plugin.restapi.model; -import java.net.URI; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import javax.annotation.Nullable; - +import jakarta.annotation.Nullable; +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; import org.lowcoder.sdk.models.Property; import org.lowcoder.sdk.plugin.common.ssl.SslConfig; import org.lowcoder.sdk.plugin.restapi.auth.AuthConfig; @@ -14,12 +11,13 @@ import org.springframework.http.HttpCookie; import org.springframework.http.HttpMethod; import org.springframework.util.MultiValueMap; - -import lombok.Builder; -import lombok.Getter; -import lombok.Setter; import reactor.core.publisher.Mono; +import java.net.URI; +import java.util.List; +import java.util.Map; +import java.util.Set; + @Builder public class RestApiQueryExecutionContext extends QueryExecutionContext { diff --git a/server/api-service/lowcoder-plugins/smtpPlugin/src/main/java/org/lowcoder/plugins/SmtpDatasourceConfig.java b/server/api-service/lowcoder-plugins/smtpPlugin/src/main/java/org/lowcoder/plugins/SmtpDatasourceConfig.java index 55614bf66..57d5eb2f8 100644 --- a/server/api-service/lowcoder-plugins/smtpPlugin/src/main/java/org/lowcoder/plugins/SmtpDatasourceConfig.java +++ b/server/api-service/lowcoder-plugins/smtpPlugin/src/main/java/org/lowcoder/plugins/SmtpDatasourceConfig.java @@ -1,19 +1,16 @@ package org.lowcoder.plugins; -import static org.apache.commons.lang3.ObjectUtils.firstNonNull; -import static org.apache.commons.lang3.StringUtils.isNotBlank; - -import java.util.function.Function; - -import javax.annotation.Nullable; - +import com.fasterxml.jackson.annotation.JsonView; +import jakarta.annotation.Nullable; +import lombok.Builder; +import lombok.Getter; import org.lowcoder.sdk.config.SerializeConfig.JsonViews; import org.lowcoder.sdk.models.DatasourceConnectionConfig; -import com.fasterxml.jackson.annotation.JsonView; +import java.util.function.Function; -import lombok.Builder; -import lombok.Getter; +import static org.apache.commons.lang3.ObjectUtils.firstNonNull; +import static org.apache.commons.lang3.StringUtils.isNotBlank; @Getter @Builder diff --git a/server/api-service/lowcoder-plugins/snowflakePlugin/src/main/java/org/lowcoder/plugin/snowflake/SnowflakeQueryExecutor.java b/server/api-service/lowcoder-plugins/snowflakePlugin/src/main/java/org/lowcoder/plugin/snowflake/SnowflakeQueryExecutor.java index d8ee2952e..3bf2157c4 100644 --- a/server/api-service/lowcoder-plugins/snowflakePlugin/src/main/java/org/lowcoder/plugin/snowflake/SnowflakeQueryExecutor.java +++ b/server/api-service/lowcoder-plugins/snowflakePlugin/src/main/java/org/lowcoder/plugin/snowflake/SnowflakeQueryExecutor.java @@ -1,17 +1,7 @@ package org.lowcoder.plugin.snowflake; -import static org.lowcoder.sdk.exception.PluginCommonError.DATASOURCE_GET_STRUCTURE_ERROR; - -import java.sql.Connection; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.Map; - -import javax.annotation.Nonnull; - +import jakarta.annotation.Nonnull; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.lowcoder.plugin.sql.GeneralSqlExecutor; import org.lowcoder.plugin.sql.SqlBasedQueryExecutor; @@ -26,7 +16,15 @@ import org.lowcoder.sdk.util.ExceptionUtils; import org.pf4j.Extension; -import lombok.extern.slf4j.Slf4j; +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.Map; + +import static org.lowcoder.sdk.exception.PluginCommonError.DATASOURCE_GET_STRUCTURE_ERROR; @SuppressWarnings({"SqlDialectInspection", "SqlNoDataSourceInspection"}) @Slf4j diff --git a/server/api-service/lowcoder-plugins/sqlBasedPlugin/src/main/java/org/lowcoder/plugin/sql/GeneralSqlExecutor.java b/server/api-service/lowcoder-plugins/sqlBasedPlugin/src/main/java/org/lowcoder/plugin/sql/GeneralSqlExecutor.java index 4d9fa3ec8..2348cbbd2 100644 --- a/server/api-service/lowcoder-plugins/sqlBasedPlugin/src/main/java/org/lowcoder/plugin/sql/GeneralSqlExecutor.java +++ b/server/api-service/lowcoder-plugins/sqlBasedPlugin/src/main/java/org/lowcoder/plugin/sql/GeneralSqlExecutor.java @@ -1,33 +1,7 @@ package org.lowcoder.plugin.sql; -import static com.google.common.collect.Lists.newArrayList; -import static com.google.common.collect.Maps.newHashMapWithExpectedSize; -import static java.util.Collections.emptyList; -import static org.lowcoder.sdk.exception.PluginCommonError.PREPARED_STATEMENT_BIND_PARAMETERS_ERROR; -import static org.lowcoder.sdk.exception.PluginCommonError.QUERY_EXECUTION_ERROR; -import static org.lowcoder.sdk.util.ExceptionUtils.wrapException; -import static org.lowcoder.sdk.util.JsonUtils.toJson; -import static org.lowcoder.sdk.util.MustacheHelper.doPrepareStatement; -import static org.lowcoder.sdk.util.MustacheHelper.extractMustacheKeysInOrder; -import static org.lowcoder.sdk.util.MustacheHelper.renderMustacheString; - -import java.math.BigDecimal; -import java.sql.Connection; -import java.sql.Date; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; -import java.sql.Time; -import java.sql.Timestamp; -import java.sql.Types; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import javax.annotation.Nonnull; - +import jakarta.annotation.Nonnull; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.tuple.Pair; import org.lowcoder.sdk.exception.PluginException; import org.lowcoder.sdk.models.QueryExecutionResult; @@ -37,7 +11,21 @@ import org.lowcoder.sdk.plugin.sqlcommand.GuiSqlCommand.GuiSqlCommandRenderResult; import org.lowcoder.sdk.plugin.sqlcommand.command.UpdateOrDeleteSingleCommandRenderResult; -import lombok.extern.slf4j.Slf4j; +import java.math.BigDecimal; +import java.sql.*; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static com.google.common.collect.Lists.newArrayList; +import static com.google.common.collect.Maps.newHashMapWithExpectedSize; +import static java.util.Collections.emptyList; +import static org.lowcoder.sdk.exception.PluginCommonError.PREPARED_STATEMENT_BIND_PARAMETERS_ERROR; +import static org.lowcoder.sdk.exception.PluginCommonError.QUERY_EXECUTION_ERROR; +import static org.lowcoder.sdk.util.ExceptionUtils.wrapException; +import static org.lowcoder.sdk.util.JsonUtils.toJson; +import static org.lowcoder.sdk.util.MustacheHelper.*; @Slf4j public class GeneralSqlExecutor { diff --git a/server/api-service/lowcoder-plugins/sqlBasedPlugin/src/main/java/org/lowcoder/plugin/sql/SqlBasedConnector.java b/server/api-service/lowcoder-plugins/sqlBasedPlugin/src/main/java/org/lowcoder/plugin/sql/SqlBasedConnector.java index 3bd3c79cc..73082f9d2 100644 --- a/server/api-service/lowcoder-plugins/sqlBasedPlugin/src/main/java/org/lowcoder/plugin/sql/SqlBasedConnector.java +++ b/server/api-service/lowcoder-plugins/sqlBasedPlugin/src/main/java/org/lowcoder/plugin/sql/SqlBasedConnector.java @@ -1,13 +1,8 @@ package org.lowcoder.plugin.sql; -import static org.lowcoder.sdk.exception.PluginCommonError.QUERY_EXECUTION_ERROR; - -import java.util.HashSet; -import java.util.Set; -import java.util.concurrent.TimeUnit; - -import javax.annotation.Nonnull; - +import com.zaxxer.hikari.HikariConfig; +import com.zaxxer.hikari.HikariDataSource; +import jakarta.annotation.Nonnull; import org.apache.commons.lang3.StringUtils; import org.lowcoder.sdk.exception.PluginException; import org.lowcoder.sdk.models.DatasourceTestResult; @@ -15,8 +10,11 @@ import org.lowcoder.sdk.plugin.common.sql.HikariPerfWrapper; import org.lowcoder.sdk.plugin.common.sql.SqlBasedDatasourceConnectionConfig; -import com.zaxxer.hikari.HikariConfig; -import com.zaxxer.hikari.HikariDataSource; +import java.util.HashSet; +import java.util.Set; +import java.util.concurrent.TimeUnit; + +import static org.lowcoder.sdk.exception.PluginCommonError.QUERY_EXECUTION_ERROR; public abstract class SqlBasedConnector extends BlockingDatasourceConnector { diff --git a/server/api-service/lowcoder-plugins/sqlBasedPlugin/src/main/java/org/lowcoder/plugin/sql/SqlBasedQueryExecutor.java b/server/api-service/lowcoder-plugins/sqlBasedPlugin/src/main/java/org/lowcoder/plugin/sql/SqlBasedQueryExecutor.java index d7810fadc..b578314bc 100644 --- a/server/api-service/lowcoder-plugins/sqlBasedPlugin/src/main/java/org/lowcoder/plugin/sql/SqlBasedQueryExecutor.java +++ b/server/api-service/lowcoder-plugins/sqlBasedPlugin/src/main/java/org/lowcoder/plugin/sql/SqlBasedQueryExecutor.java @@ -1,17 +1,9 @@ package org.lowcoder.plugin.sql; -import static org.lowcoder.sdk.exception.PluginCommonError.CONNECTION_ERROR; -import static org.lowcoder.sdk.exception.PluginCommonError.QUERY_ARGUMENT_ERROR; -import static org.lowcoder.sdk.exception.PluginCommonError.QUERY_EXECUTION_ERROR; -import static org.lowcoder.sdk.util.ExceptionUtils.wrapException; - -import java.sql.Connection; -import java.sql.SQLException; -import java.util.Map; -import java.util.Set; - -import javax.annotation.Nonnull; - +import com.google.common.collect.Maps; +import com.zaxxer.hikari.HikariDataSource; +import jakarta.annotation.Nonnull; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.StringUtils; import org.lowcoder.sdk.exception.InvalidHikariDatasourceException; @@ -27,10 +19,13 @@ import org.lowcoder.sdk.query.QueryVisitorContext; import org.lowcoder.sdk.util.MustacheHelper; -import com.google.common.collect.Maps; -import com.zaxxer.hikari.HikariDataSource; +import java.sql.Connection; +import java.sql.SQLException; +import java.util.Map; +import java.util.Set; -import lombok.extern.slf4j.Slf4j; +import static org.lowcoder.sdk.exception.PluginCommonError.*; +import static org.lowcoder.sdk.util.ExceptionUtils.wrapException; @Slf4j public abstract class SqlBasedQueryExecutor extends BlockingQueryExecutor implements DatasourceConnector { diff --git a/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/plugin/common/BlockingQueryExecutor.java b/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/plugin/common/BlockingQueryExecutor.java index 8a2eee5ea..a58d4261f 100644 --- a/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/plugin/common/BlockingQueryExecutor.java +++ b/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/plugin/common/BlockingQueryExecutor.java @@ -1,16 +1,14 @@ package org.lowcoder.sdk.plugin.common; -import static org.lowcoder.sdk.plugin.common.QueryExecutionUtils.querySharedScheduler; - -import javax.annotation.Nonnull; - +import jakarta.annotation.Nonnull; import org.lowcoder.sdk.models.DatasourceConnectionConfig; import org.lowcoder.sdk.models.DatasourceStructure; import org.lowcoder.sdk.models.QueryExecutionResult; import org.lowcoder.sdk.query.QueryExecutionContext; - import reactor.core.publisher.Mono; +import static org.lowcoder.sdk.plugin.common.QueryExecutionUtils.querySharedScheduler; + public abstract class BlockingQueryExecutor implements QueryExecutor { diff --git a/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/plugin/common/DatasourceConnector.java b/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/plugin/common/DatasourceConnector.java index b974eb1f3..64f33029e 100644 --- a/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/plugin/common/DatasourceConnector.java +++ b/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/plugin/common/DatasourceConnector.java @@ -1,28 +1,25 @@ package org.lowcoder.sdk.plugin.common; -import static org.lowcoder.sdk.exception.PluginCommonError.DATASOURCE_TIMEOUT_ERROR; -import static org.lowcoder.sdk.exception.PluginCommonError.QUERY_EXECUTION_ERROR; -import static org.lowcoder.sdk.util.ExceptionUtils.ofPluginException; -import static org.lowcoder.sdk.util.JsonUtils.fromJson; -import static org.lowcoder.sdk.util.JsonUtils.toJson; - -import java.time.Duration; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.TimeoutException; - -import javax.annotation.Nonnull; - +import com.google.common.reflect.TypeToken; +import jakarta.annotation.Nonnull; import org.lowcoder.sdk.exception.PluginCommonError; import org.lowcoder.sdk.exception.PluginException; import org.lowcoder.sdk.models.DatasourceConnectionConfig; import org.lowcoder.sdk.models.DatasourceTestResult; import org.lowcoder.sdk.models.TokenBasedConnectionDetail; import org.pf4j.ExtensionPoint; +import reactor.core.publisher.Mono; -import com.google.common.reflect.TypeToken; +import java.time.Duration; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.TimeoutException; -import reactor.core.publisher.Mono; +import static org.lowcoder.sdk.exception.PluginCommonError.DATASOURCE_TIMEOUT_ERROR; +import static org.lowcoder.sdk.exception.PluginCommonError.QUERY_EXECUTION_ERROR; +import static org.lowcoder.sdk.util.ExceptionUtils.ofPluginException; +import static org.lowcoder.sdk.util.JsonUtils.fromJson; +import static org.lowcoder.sdk.util.JsonUtils.toJson; @SuppressWarnings("unchecked") public interface DatasourceConnector extends ExtensionPoint { diff --git a/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/plugin/common/ssl/SslConfig.java b/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/plugin/common/ssl/SslConfig.java index 2f176864b..17d551ead 100644 --- a/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/plugin/common/ssl/SslConfig.java +++ b/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/plugin/common/ssl/SslConfig.java @@ -1,16 +1,13 @@ package org.lowcoder.sdk.plugin.common.ssl; -import javax.annotation.Nullable; - -import lombok.experimental.SuperBuilder; -import org.lowcoder.sdk.models.Encrypt; - import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonSubTypes.Type; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeInfo.Id; - +import jakarta.annotation.Nullable; import lombok.Getter; +import lombok.experimental.SuperBuilder; +import org.lowcoder.sdk.models.Encrypt; @Getter @JsonTypeInfo(use = Id.NAME, property = "sslCertVerificationType", visible = true, defaultImpl = VerifyCACertSslConfig.class) diff --git a/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/plugin/graphql/GraphQLDatasourceConfig.java b/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/plugin/graphql/GraphQLDatasourceConfig.java index b122a506e..17632b8cf 100644 --- a/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/plugin/graphql/GraphQLDatasourceConfig.java +++ b/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/plugin/graphql/GraphQLDatasourceConfig.java @@ -1,20 +1,10 @@ package org.lowcoder.sdk.plugin.graphql; -import static org.apache.commons.collections4.ListUtils.emptyIfNull; -import static org.apache.commons.lang3.StringUtils.trimToEmpty; -import static org.lowcoder.sdk.exception.BizError.INVALID_DATASOURCE_CONFIG_TYPE; -import static org.lowcoder.sdk.util.ExceptionUtils.ofException; -import static org.lowcoder.sdk.util.ExceptionUtils.ofPluginException; -import static org.lowcoder.sdk.util.JsonUtils.fromJson; -import static org.lowcoder.sdk.util.JsonUtils.toJson; - -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.function.Function; - -import javax.annotation.Nullable; - +import com.fasterxml.jackson.annotation.JsonCreator; +import jakarta.annotation.Nullable; +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; import lombok.extern.jackson.Jacksonized; import org.apache.commons.collections4.SetUtils; import org.lowcoder.sdk.exception.PluginCommonError; @@ -23,11 +13,18 @@ import org.lowcoder.sdk.plugin.restapi.auth.AuthConfig; import org.lowcoder.sdk.plugin.restapi.auth.RestApiAuthType; -import com.fasterxml.jackson.annotation.JsonCreator; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.function.Function; -import lombok.Builder; -import lombok.Getter; -import lombok.Setter; +import static org.apache.commons.collections4.ListUtils.emptyIfNull; +import static org.apache.commons.lang3.StringUtils.trimToEmpty; +import static org.lowcoder.sdk.exception.BizError.INVALID_DATASOURCE_CONFIG_TYPE; +import static org.lowcoder.sdk.util.ExceptionUtils.ofException; +import static org.lowcoder.sdk.util.ExceptionUtils.ofPluginException; +import static org.lowcoder.sdk.util.JsonUtils.fromJson; +import static org.lowcoder.sdk.util.JsonUtils.toJson; @Builder @Jacksonized diff --git a/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/plugin/restapi/DataUtils.java b/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/plugin/restapi/DataUtils.java index f8391fa49..4f7e93e76 100644 --- a/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/plugin/restapi/DataUtils.java +++ b/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/plugin/restapi/DataUtils.java @@ -18,20 +18,11 @@ // copied and adapted for rest api request package org.lowcoder.sdk.plugin.restapi; -import static org.lowcoder.sdk.exception.PluginCommonError.DATASOURCE_ARGUMENT_ERROR; -import static org.lowcoder.sdk.util.MustacheHelper.renderMustacheJson; - -import java.io.UnsupportedEncodingException; -import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; -import java.util.Base64; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -import javax.annotation.Nonnull; - +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.collect.Streams; +import jakarta.annotation.Nonnull; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.lowcoder.sdk.exception.PluginException; @@ -44,13 +35,19 @@ import org.springframework.http.client.reactive.ClientHttpRequest; import org.springframework.web.reactive.function.BodyInserter; import org.springframework.web.reactive.function.BodyInserters; +import reactor.core.publisher.Mono; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.common.collect.Streams; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.Base64; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; -import reactor.core.publisher.Mono; +import static org.lowcoder.sdk.exception.PluginCommonError.DATASOURCE_ARGUMENT_ERROR; +import static org.lowcoder.sdk.util.MustacheHelper.renderMustacheJson; public class DataUtils { diff --git a/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/plugin/restapi/RestApiDatasourceConfig.java b/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/plugin/restapi/RestApiDatasourceConfig.java index f60caa9bb..8a5425f15 100644 --- a/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/plugin/restapi/RestApiDatasourceConfig.java +++ b/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/plugin/restapi/RestApiDatasourceConfig.java @@ -1,20 +1,10 @@ package org.lowcoder.sdk.plugin.restapi; -import static org.apache.commons.collections4.ListUtils.emptyIfNull; -import static org.apache.commons.lang3.StringUtils.trimToEmpty; -import static org.lowcoder.sdk.exception.BizError.INVALID_DATASOURCE_CONFIG_TYPE; -import static org.lowcoder.sdk.util.ExceptionUtils.ofException; -import static org.lowcoder.sdk.util.ExceptionUtils.ofPluginException; -import static org.lowcoder.sdk.util.JsonUtils.fromJson; -import static org.lowcoder.sdk.util.JsonUtils.toJson; - -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.function.Function; - -import javax.annotation.Nullable; - +import com.fasterxml.jackson.annotation.JsonCreator; +import jakarta.annotation.Nullable; +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; import org.apache.commons.collections4.SetUtils; import org.lowcoder.sdk.exception.PluginCommonError; import org.lowcoder.sdk.models.DatasourceConnectionConfig; @@ -23,11 +13,18 @@ import org.lowcoder.sdk.plugin.restapi.auth.AuthConfig; import org.lowcoder.sdk.plugin.restapi.auth.RestApiAuthType; -import com.fasterxml.jackson.annotation.JsonCreator; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.function.Function; -import lombok.Builder; -import lombok.Getter; -import lombok.Setter; +import static org.apache.commons.collections4.ListUtils.emptyIfNull; +import static org.apache.commons.lang3.StringUtils.trimToEmpty; +import static org.lowcoder.sdk.exception.BizError.INVALID_DATASOURCE_CONFIG_TYPE; +import static org.lowcoder.sdk.util.ExceptionUtils.ofException; +import static org.lowcoder.sdk.util.ExceptionUtils.ofPluginException; +import static org.lowcoder.sdk.util.JsonUtils.fromJson; +import static org.lowcoder.sdk.util.JsonUtils.toJson; @Builder public class RestApiDatasourceConfig implements DatasourceConnectionConfig { diff --git a/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/plugin/restapi/auth/AuthConfig.java b/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/plugin/restapi/auth/AuthConfig.java index 9fd23a7c1..bbc622592 100644 --- a/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/plugin/restapi/auth/AuthConfig.java +++ b/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/plugin/restapi/auth/AuthConfig.java @@ -1,16 +1,13 @@ package org.lowcoder.sdk.plugin.restapi.auth; -import javax.annotation.Nullable; - -import lombok.experimental.SuperBuilder; -import org.lowcoder.sdk.models.Encrypt; - import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonSubTypes.Type; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.JsonTypeInfo.Id; - +import jakarta.annotation.Nullable; import lombok.Getter; +import lombok.experimental.SuperBuilder; +import org.lowcoder.sdk.models.Encrypt; @Getter @JsonTypeInfo(use = Id.NAME, property = "type", visible = true, defaultImpl = DefaultAuthConfig.class) diff --git a/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/plugin/restapi/auth/BasicAuthConfig.java b/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/plugin/restapi/auth/BasicAuthConfig.java index fec58a38b..3f5ce2587 100644 --- a/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/plugin/restapi/auth/BasicAuthConfig.java +++ b/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/plugin/restapi/auth/BasicAuthConfig.java @@ -1,18 +1,14 @@ package org.lowcoder.sdk.plugin.restapi.auth; -import java.util.function.Function; - -import javax.annotation.Nullable; - +import com.fasterxml.jackson.annotation.JsonView; +import jakarta.annotation.Nullable; +import lombok.Getter; import lombok.experimental.SuperBuilder; import lombok.extern.jackson.Jacksonized; import org.apache.commons.lang3.ObjectUtils; import org.lowcoder.sdk.config.SerializeConfig.JsonViews; -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonView; - -import lombok.Getter; +import java.util.function.Function; /** * not only basic auth config, but also digest auth config. diff --git a/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/plugin/restapi/auth/OAuthInheritAuthConfig.java b/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/plugin/restapi/auth/OAuthInheritAuthConfig.java index 4618bc4ba..c7ab4ac99 100644 --- a/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/plugin/restapi/auth/OAuthInheritAuthConfig.java +++ b/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/plugin/restapi/auth/OAuthInheritAuthConfig.java @@ -1,11 +1,10 @@ package org.lowcoder.sdk.plugin.restapi.auth; +import jakarta.annotation.Nullable; import lombok.Getter; import lombok.experimental.SuperBuilder; import lombok.extern.jackson.Jacksonized; -import javax.annotation.Nullable; - /** * oauth(inherit from login) auth config */ diff --git a/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/plugin/sheet/changeset/SheetChangeSetRow.java b/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/plugin/sheet/changeset/SheetChangeSetRow.java index 792eb82ab..491c1843f 100644 --- a/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/plugin/sheet/changeset/SheetChangeSetRow.java +++ b/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/plugin/sheet/changeset/SheetChangeSetRow.java @@ -1,22 +1,16 @@ package org.lowcoder.sdk.plugin.sheet.changeset; -import static org.lowcoder.sdk.exception.PluginCommonError.INVALID_GUI_SETTINGS; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.ObjectNode; +import jakarta.annotation.Nonnull; +import org.lowcoder.sdk.exception.PluginException; +import org.lowcoder.sdk.util.JsonUtils; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.Map.Entry; -import java.util.Set; import java.util.stream.Collectors; -import javax.annotation.Nonnull; - -import org.lowcoder.sdk.exception.PluginException; -import org.lowcoder.sdk.util.JsonUtils; - -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.ObjectNode; +import static org.lowcoder.sdk.exception.PluginCommonError.INVALID_GUI_SETTINGS; public class SheetChangeSetRow implements Iterable { diff --git a/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/plugin/sheet/changeset/SheetChangeSetRows.java b/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/plugin/sheet/changeset/SheetChangeSetRows.java index 02c1c9b4e..0ab9144d0 100644 --- a/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/plugin/sheet/changeset/SheetChangeSetRows.java +++ b/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/plugin/sheet/changeset/SheetChangeSetRows.java @@ -1,18 +1,16 @@ package org.lowcoder.sdk.plugin.sheet.changeset; -import static org.lowcoder.sdk.exception.PluginCommonError.INVALID_GUI_SETTINGS; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.google.common.collect.Streams; +import jakarta.annotation.Nonnull; +import org.lowcoder.sdk.exception.PluginException; import java.util.Iterator; import java.util.List; -import javax.annotation.Nonnull; - -import org.lowcoder.sdk.exception.PluginException; - -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.ArrayNode; -import com.google.common.collect.Streams; +import static org.lowcoder.sdk.exception.PluginCommonError.INVALID_GUI_SETTINGS; public record SheetChangeSetRows(List rows) implements Iterable { diff --git a/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/plugin/sqlcommand/changeset/ChangeSetRow.java b/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/plugin/sqlcommand/changeset/ChangeSetRow.java index 9f7fefb8b..bfeee100f 100644 --- a/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/plugin/sqlcommand/changeset/ChangeSetRow.java +++ b/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/plugin/sqlcommand/changeset/ChangeSetRow.java @@ -1,24 +1,18 @@ package org.lowcoder.sdk.plugin.sqlcommand.changeset; -import static org.lowcoder.sdk.exception.PluginCommonError.INVALID_GUI_SETTINGS; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.ObjectNode; +import com.google.common.collect.Streams; +import jakarta.annotation.Nonnull; +import org.lowcoder.sdk.exception.PluginException; +import org.lowcoder.sdk.util.SqlGuiUtils.GuiSqlValue; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; import java.util.stream.StreamSupport; -import javax.annotation.Nonnull; - -import org.lowcoder.sdk.exception.PluginException; -import org.lowcoder.sdk.util.SqlGuiUtils.GuiSqlValue; - -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.ObjectNode; -import com.google.common.collect.Streams; +import static org.lowcoder.sdk.exception.PluginCommonError.INVALID_GUI_SETTINGS; @SuppressWarnings("UnstableApiUsage") public class ChangeSetRow implements Iterable { diff --git a/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/plugin/sqlcommand/changeset/ChangeSetRows.java b/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/plugin/sqlcommand/changeset/ChangeSetRows.java index 156e30c5b..01759c042 100644 --- a/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/plugin/sqlcommand/changeset/ChangeSetRows.java +++ b/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/plugin/sqlcommand/changeset/ChangeSetRows.java @@ -1,7 +1,10 @@ package org.lowcoder.sdk.plugin.sqlcommand.changeset; -import static com.google.common.collect.Sets.newHashSet; -import static org.lowcoder.sdk.exception.PluginCommonError.INVALID_GUI_SETTINGS; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.google.common.collect.Streams; +import jakarta.annotation.Nonnull; +import org.lowcoder.sdk.exception.PluginException; import java.util.HashSet; import java.util.Iterator; @@ -10,13 +13,8 @@ import java.util.stream.Stream; import java.util.stream.StreamSupport; -import javax.annotation.Nonnull; - -import org.lowcoder.sdk.exception.PluginException; - -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.ArrayNode; -import com.google.common.collect.Streams; +import static com.google.common.collect.Sets.newHashSet; +import static org.lowcoder.sdk.exception.PluginCommonError.INVALID_GUI_SETTINGS; public record ChangeSetRows(List rows) implements Iterable { diff --git a/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/plugin/sqlcommand/changeset/KeyValuePairChangeSet.java b/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/plugin/sqlcommand/changeset/KeyValuePairChangeSet.java index f032e6169..3673f416e 100644 --- a/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/plugin/sqlcommand/changeset/KeyValuePairChangeSet.java +++ b/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/plugin/sqlcommand/changeset/KeyValuePairChangeSet.java @@ -1,17 +1,8 @@ package org.lowcoder.sdk.plugin.sqlcommand.changeset; -import static org.lowcoder.sdk.exception.PluginCommonError.INVALID_GUI_SETTINGS; -import static org.lowcoder.sdk.util.JsonUtils.toJson; - -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.stream.Collectors; - -import javax.annotation.Nonnull; - +import com.google.common.annotations.VisibleForTesting; +import jakarta.annotation.Nonnull; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; @@ -20,9 +11,11 @@ import org.lowcoder.sdk.util.SqlGuiUtils; import org.lowcoder.sdk.util.SqlGuiUtils.GuiSqlValue; -import com.google.common.annotations.VisibleForTesting; +import java.util.*; +import java.util.stream.Collectors; -import lombok.extern.slf4j.Slf4j; +import static org.lowcoder.sdk.exception.PluginCommonError.INVALID_GUI_SETTINGS; +import static org.lowcoder.sdk.util.JsonUtils.toJson; @Slf4j public class KeyValuePairChangeSet extends ChangeSet { diff --git a/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/plugin/sqlcommand/command/InsertCommand.java b/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/plugin/sqlcommand/command/InsertCommand.java index e65a52cbc..54c3b031e 100644 --- a/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/plugin/sqlcommand/command/InsertCommand.java +++ b/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/plugin/sqlcommand/command/InsertCommand.java @@ -1,15 +1,6 @@ package org.lowcoder.sdk.plugin.sqlcommand.command; -import static org.lowcoder.sdk.exception.PluginCommonError.INVALID_INSERT_COMMAND; -import static org.lowcoder.sdk.plugin.sqlcommand.changeset.ChangeSet.parseChangeSet; - -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import javax.annotation.Nonnull; - +import jakarta.annotation.Nonnull; import org.apache.commons.lang3.StringUtils; import org.lowcoder.sdk.exception.PluginException; import org.lowcoder.sdk.plugin.sqlcommand.GuiSqlCommand; @@ -19,6 +10,14 @@ import org.lowcoder.sdk.util.MustacheHelper; import org.lowcoder.sdk.util.SqlGuiUtils.GuiSqlValue; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import static org.lowcoder.sdk.exception.PluginCommonError.INVALID_INSERT_COMMAND; +import static org.lowcoder.sdk.plugin.sqlcommand.changeset.ChangeSet.parseChangeSet; + public abstract class InsertCommand implements GuiSqlCommand { private final String table; diff --git a/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/util/CookieHelper.java b/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/util/CookieHelper.java index 595a2c193..614d440b4 100644 --- a/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/util/CookieHelper.java +++ b/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/util/CookieHelper.java @@ -1,13 +1,7 @@ package org.lowcoder.sdk.util; -import static java.util.Optional.ofNullable; -import static org.lowcoder.sdk.util.IDUtils.generate; -import static org.lowcoder.sdk.util.UriUtils.getRefererURI; - -import java.util.Optional; - -import javax.annotation.Nullable; - +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.lowcoder.sdk.config.CommonConfig; import org.lowcoder.sdk.config.CommonConfig.Cookie; import org.springframework.beans.factory.annotation.Autowired; @@ -18,14 +12,18 @@ import org.springframework.util.MultiValueMap; import org.springframework.web.server.ServerWebExchange; -import lombok.extern.slf4j.Slf4j; +import java.util.Optional; + +import static java.util.Optional.ofNullable; +import static org.lowcoder.sdk.util.IDUtils.generate; +import static org.lowcoder.sdk.util.UriUtils.getRefererURI; +@RequiredArgsConstructor @Component @Slf4j public class CookieHelper { - @Autowired - private CommonConfig commonConfig; + private final CommonConfig commonConfig; public void saveCookie(String token, ServerWebExchange exchange) { boolean isUsingHttps = Optional.ofNullable(getRefererURI(exchange.getRequest())) diff --git a/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/util/JsonUtils.java b/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/util/JsonUtils.java index 19e52ed60..0c4dd861b 100644 --- a/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/util/JsonUtils.java +++ b/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/util/JsonUtils.java @@ -1,25 +1,9 @@ package org.lowcoder.sdk.util; -import java.nio.charset.StandardCharsets; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import javax.annotation.Nullable; - -import org.lowcoder.sdk.auth.EmailAuthConfig; -import org.lowcoder.sdk.auth.Oauth2KeycloakAuthConfig; -import org.lowcoder.sdk.auth.Oauth2OryAuthConfig; -import org.lowcoder.sdk.auth.Oauth2SimpleAuthConfig; - import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.ObjectWriter; -import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.databind.*; import com.fasterxml.jackson.databind.jsontype.NamedType; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ObjectNode; @@ -27,8 +11,17 @@ import com.fasterxml.jackson.databind.type.MapType; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.fasterxml.jackson.module.paramnames.ParameterNamesModule; - +import jakarta.annotation.Nullable; import lombok.extern.slf4j.Slf4j; +import org.lowcoder.sdk.auth.EmailAuthConfig; +import org.lowcoder.sdk.auth.Oauth2KeycloakAuthConfig; +import org.lowcoder.sdk.auth.Oauth2OryAuthConfig; +import org.lowcoder.sdk.auth.Oauth2SimpleAuthConfig; + +import java.nio.charset.StandardCharsets; +import java.util.List; +import java.util.Map; +import java.util.Set; import static org.lowcoder.sdk.auth.constants.AuthTypeConstants.*; diff --git a/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/util/MediaTypeUtils.java b/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/util/MediaTypeUtils.java index df188e9cb..99aff7369 100644 --- a/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/util/MediaTypeUtils.java +++ b/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/util/MediaTypeUtils.java @@ -1,18 +1,12 @@ package org.lowcoder.sdk.util; -import static org.springframework.http.MediaType.APPLICATION_OCTET_STREAM; -import static org.springframework.http.MediaType.APPLICATION_PDF; -import static org.springframework.http.MediaType.IMAGE_GIF; -import static org.springframework.http.MediaType.IMAGE_JPEG; -import static org.springframework.http.MediaType.IMAGE_PNG; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - +import com.google.common.base.Preconditions; +import jakarta.annotation.Nonnull; +import jakarta.annotation.Nullable; import org.apache.commons.lang3.StringUtils; import org.springframework.http.MediaType; -import com.google.common.base.Preconditions; +import static org.springframework.http.MediaType.*; public class MediaTypeUtils { diff --git a/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/util/MoreMapUtils.java b/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/util/MoreMapUtils.java index 3aa5b3fd3..33728404f 100644 --- a/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/util/MoreMapUtils.java +++ b/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/util/MoreMapUtils.java @@ -1,14 +1,13 @@ package org.lowcoder.sdk.util; +import com.google.common.collect.Maps; +import jakarta.annotation.Nullable; + import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; -import javax.annotation.Nullable; - -import com.google.common.collect.Maps; - /** * add more methods in addition to {@link org.apache.commons.collections4.MapUtils} */ diff --git a/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/util/RjsonMustacheParser.java b/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/util/RjsonMustacheParser.java index ad2f6843b..5f8eead91 100644 --- a/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/util/RjsonMustacheParser.java +++ b/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/util/RjsonMustacheParser.java @@ -1,16 +1,15 @@ package org.lowcoder.sdk.util; -import static org.apache.commons.lang3.StringUtils.isBlank; -import static org.apache.commons.lang3.StringUtils.replace; -import static org.lowcoder.sdk.exception.PluginCommonError.JSON_PARSE_ERROR; -import static org.lowcoder.sdk.util.JsonUtils.EMPTY_JSON_NODE; -import static org.lowcoder.sdk.util.JsonUtils.createArrayNode; -import static org.lowcoder.sdk.util.JsonUtils.createObjectNode; -import static org.lowcoder.sdk.util.JsonUtils.valueToTree; -import static org.lowcoder.sdk.util.MustacheHelper.isMustacheToken; -import static org.lowcoder.sdk.util.MustacheHelper.removeCurlyBraces; -import static org.lowcoder.sdk.util.MustacheHelper.tokenize; -import static org.lowcoder.sdk.util.StreamUtils.toMapNullFriendly; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.*; +import jakarta.annotation.Nonnull; +import jakarta.annotation.Nullable; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.math.NumberUtils; +import org.lowcoder.sdk.exception.PluginException; +import tv.twelvetone.json.Json; +import tv.twelvetone.json.JsonObject.Member; +import tv.twelvetone.json.JsonValue; import java.util.Collection; import java.util.HashMap; @@ -19,26 +18,12 @@ import java.util.Map.Entry; import java.util.concurrent.atomic.AtomicInteger; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.math.NumberUtils; -import org.lowcoder.sdk.exception.PluginException; - -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.node.ArrayNode; -import com.fasterxml.jackson.databind.node.BooleanNode; -import com.fasterxml.jackson.databind.node.DoubleNode; -import com.fasterxml.jackson.databind.node.FloatNode; -import com.fasterxml.jackson.databind.node.IntNode; -import com.fasterxml.jackson.databind.node.LongNode; -import com.fasterxml.jackson.databind.node.NullNode; -import com.fasterxml.jackson.databind.node.TextNode; - -import tv.twelvetone.json.Json; -import tv.twelvetone.json.JsonObject.Member; -import tv.twelvetone.json.JsonValue; +import static org.apache.commons.lang3.StringUtils.isBlank; +import static org.apache.commons.lang3.StringUtils.replace; +import static org.lowcoder.sdk.exception.PluginCommonError.JSON_PARSE_ERROR; +import static org.lowcoder.sdk.util.JsonUtils.*; +import static org.lowcoder.sdk.util.MustacheHelper.*; +import static org.lowcoder.sdk.util.StreamUtils.toMapNullFriendly; class RjsonMustacheParser { diff --git a/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/util/RjsonParser.java b/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/util/RjsonParser.java index 12d10572b..44790d706 100644 --- a/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/util/RjsonParser.java +++ b/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/util/RjsonParser.java @@ -1,7 +1,7 @@ package org.lowcoder.sdk.util; -import javax.annotation.Nonnull; +import jakarta.annotation.Nonnull; import tv.twelvetone.json.JsonValue; import tv.twelvetone.rjson.RJsonParser; import tv.twelvetone.rjson.RJsonParserFactory; diff --git a/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/util/SqlGuiUtils.java b/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/util/SqlGuiUtils.java index 19f7151a2..f9958c0d4 100644 --- a/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/util/SqlGuiUtils.java +++ b/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/util/SqlGuiUtils.java @@ -1,18 +1,16 @@ package org.lowcoder.sdk.util; -import static org.apache.commons.lang3.StringUtils.isBlank; -import static org.lowcoder.sdk.util.JsonUtils.jsonNodeToObject; -import static org.lowcoder.sdk.util.JsonUtils.toJson; +import com.fasterxml.jackson.databind.JsonNode; +import jakarta.annotation.Nonnull; +import org.apache.commons.lang3.RandomStringUtils; +import org.lowcoder.sdk.util.SqlGuiUtils.GuiSqlValue.EscapeSql; import java.util.Collection; import java.util.Map; -import javax.annotation.Nonnull; - -import org.apache.commons.lang3.RandomStringUtils; -import org.lowcoder.sdk.util.SqlGuiUtils.GuiSqlValue.EscapeSql; - -import com.fasterxml.jackson.databind.JsonNode; +import static org.apache.commons.lang3.StringUtils.isBlank; +import static org.lowcoder.sdk.util.JsonUtils.jsonNodeToObject; +import static org.lowcoder.sdk.util.JsonUtils.toJson; public final class SqlGuiUtils { diff --git a/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/util/UriUtils.java b/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/util/UriUtils.java index f28741deb..97c839e6a 100644 --- a/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/util/UriUtils.java +++ b/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/util/UriUtils.java @@ -1,21 +1,18 @@ package org.lowcoder.sdk.util; -import java.net.URI; -import java.util.Optional; - -import javax.annotation.Nullable; - +import com.google.common.net.InternetDomainName; +import jakarta.annotation.Nullable; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.lowcoder.sdk.constants.GlobalContext; import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.web.server.ServerWebExchange; - -import com.google.common.net.InternetDomainName; - -import lombok.extern.slf4j.Slf4j; import reactor.core.publisher.Mono; +import java.net.URI; +import java.util.Optional; + @Slf4j public class UriUtils { diff --git a/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/webclient/WebClientBuildHelper.java b/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/webclient/WebClientBuildHelper.java index c2b846f09..601a3037c 100644 --- a/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/webclient/WebClientBuildHelper.java +++ b/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/webclient/WebClientBuildHelper.java @@ -1,12 +1,9 @@ package org.lowcoder.sdk.webclient; -import java.security.cert.CertificateException; -import java.security.cert.X509Certificate; -import java.time.Duration; -import java.util.Set; - -import javax.net.ssl.SSLException; - +import io.netty.handler.ssl.SslContext; +import io.netty.handler.ssl.SslContextBuilder; +import io.netty.handler.ssl.util.InsecureTrustManagerFactory; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.lowcoder.sdk.plugin.common.ssl.DisableVerifySslConfig; @@ -16,15 +13,16 @@ import org.springframework.http.client.reactive.ReactorClientHttpConnector; import org.springframework.web.reactive.function.client.WebClient; import org.springframework.web.reactive.function.client.WebClient.Builder; - -import io.netty.handler.ssl.SslContext; -import io.netty.handler.ssl.SslContextBuilder; -import io.netty.handler.ssl.util.InsecureTrustManagerFactory; -import lombok.extern.slf4j.Slf4j; import reactor.netty.http.client.HttpClient; import reactor.netty.tcp.SslProvider; import reactor.netty.transport.ProxyProvider.Proxy; +import javax.net.ssl.SSLException; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; +import java.time.Duration; +import java.util.Set; + @Slf4j public class WebClientBuildHelper { diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationApiService.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationApiService.java index ea81c199c..faedec286 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationApiService.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationApiService.java @@ -1,29 +1,11 @@ package org.lowcoder.api.application; -import static org.lowcoder.domain.application.model.ApplicationStatus.NORMAL; -import static org.lowcoder.domain.permission.model.ResourceAction.EDIT_APPLICATIONS; -import static org.lowcoder.domain.permission.model.ResourceAction.MANAGE_APPLICATIONS; -import static org.lowcoder.domain.permission.model.ResourceAction.PUBLISH_APPLICATIONS; -import static org.lowcoder.domain.permission.model.ResourceAction.READ_APPLICATIONS; -import static org.lowcoder.domain.permission.model.ResourceAction.USE_DATASOURCES; -import static org.lowcoder.sdk.exception.BizError.ILLEGAL_APPLICATION_PERMISSION_ID; -import static org.lowcoder.sdk.exception.BizError.INVALID_PARAMETER; -import static org.lowcoder.sdk.exception.BizError.NOT_AUTHORIZED; -import static org.lowcoder.sdk.exception.BizError.NO_PERMISSION_TO_REQUEST_APP; -import static org.lowcoder.sdk.exception.BizError.USER_NOT_SIGNED_IN; -import static org.lowcoder.sdk.util.ExceptionUtils.deferredError; -import static org.lowcoder.sdk.util.ExceptionUtils.ofError; - -import java.time.Instant; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.stream.Collectors; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - +import com.google.common.collect.Maps; +import com.google.common.collect.Sets; +import jakarta.annotation.Nonnull; +import jakarta.annotation.Nullable; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.SetUtils; import org.apache.commons.lang3.StringUtils; @@ -45,40 +27,40 @@ import org.lowcoder.domain.application.service.ApplicationService; import org.lowcoder.domain.datasource.model.Datasource; import org.lowcoder.domain.datasource.service.DatasourceService; -import org.lowcoder.domain.group.service.GroupService; import org.lowcoder.domain.interaction.UserApplicationInteractionService; import org.lowcoder.domain.organization.model.Organization; import org.lowcoder.domain.organization.service.OrgMemberService; import org.lowcoder.domain.organization.service.OrganizationService; -import org.lowcoder.domain.permission.model.ResourceAction; -import org.lowcoder.domain.permission.model.ResourceHolder; -import org.lowcoder.domain.permission.model.ResourcePermission; -import org.lowcoder.domain.permission.model.ResourceRole; -import org.lowcoder.domain.permission.model.ResourceType; +import org.lowcoder.domain.permission.model.*; import org.lowcoder.domain.permission.service.ResourcePermissionService; import org.lowcoder.domain.permission.solution.SuggestAppAdminSolution; import org.lowcoder.domain.plugin.service.DatasourceMetaInfoService; import org.lowcoder.domain.solutions.TemplateSolution; import org.lowcoder.domain.template.model.Template; import org.lowcoder.domain.template.service.TemplateService; -import org.lowcoder.domain.user.service.UserService; import org.lowcoder.infra.util.TupleUtils; import org.lowcoder.sdk.constants.Authentication; import org.lowcoder.sdk.exception.BizError; import org.lowcoder.sdk.exception.BizException; import org.lowcoder.sdk.plugin.common.QueryExecutor; import org.lowcoder.sdk.util.ExceptionUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; - -import com.google.common.collect.Maps; -import com.google.common.collect.Sets; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +import java.time.Instant; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +import static org.lowcoder.domain.application.model.ApplicationStatus.NORMAL; +import static org.lowcoder.domain.permission.model.ResourceAction.*; +import static org.lowcoder.sdk.exception.BizError.*; +import static org.lowcoder.sdk.util.ExceptionUtils.deferredError; +import static org.lowcoder.sdk.util.ExceptionUtils.ofError; + @RequiredArgsConstructor @Service @Slf4j diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationEndpoints.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationEndpoints.java index b026a2544..7720a051c 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationEndpoints.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationEndpoints.java @@ -1,40 +1,26 @@ package org.lowcoder.api.application; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import javax.annotation.Nullable; - +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.v3.oas.annotations.Operation; +import jakarta.annotation.Nullable; import org.apache.commons.lang3.BooleanUtils; import org.lowcoder.api.application.view.ApplicationInfoView; import org.lowcoder.api.application.view.ApplicationPermissionView; import org.lowcoder.api.application.view.ApplicationView; import org.lowcoder.api.application.view.MarketplaceApplicationInfoView; - -//Falk: shouldn't be here ...? -// import org.lowcoder.api.application.view.AgencyProfileApplicationView; import org.lowcoder.api.framework.view.ResponseView; import org.lowcoder.api.home.UserHomepageView; import org.lowcoder.domain.application.model.Application; import org.lowcoder.domain.application.model.ApplicationStatus; import org.lowcoder.infra.constant.NewUrl; import org.lowcoder.infra.constant.Url; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -import com.fasterxml.jackson.annotation.JsonProperty; - -import io.swagger.v3.oas.annotations.Operation; +import org.springframework.web.bind.annotation.*; import reactor.core.publisher.Mono; +import java.util.List; +import java.util.Map; +import java.util.Set; + @RestController @RequestMapping(value = {Url.APPLICATION_URL, NewUrl.APPLICATION_URL}) public interface ApplicationEndpoints diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/view/ApplicationInfoView.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/view/ApplicationInfoView.java index ca7702a26..b72bce8a9 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/view/ApplicationInfoView.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/view/ApplicationInfoView.java @@ -1,17 +1,14 @@ package org.lowcoder.api.application.view; -import java.time.Instant; - -import javax.annotation.Nullable; - -import org.lowcoder.api.home.FolderInfoView; -import org.lowcoder.domain.application.model.ApplicationStatus; - import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonInclude.Include; - +import jakarta.annotation.Nullable; import lombok.Builder; import lombok.Getter; +import org.lowcoder.api.home.FolderInfoView; +import org.lowcoder.domain.application.model.ApplicationStatus; + +import java.time.Instant; @Builder @Getter diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/authentication/dto/AuthConfigRequest.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/authentication/dto/AuthConfigRequest.java index 77f134458..3b8cb98fa 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/authentication/dto/AuthConfigRequest.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/authentication/dto/AuthConfigRequest.java @@ -1,15 +1,14 @@ package org.lowcoder.api.authentication.dto; -import static org.lowcoder.sdk.util.IDUtils.generate; - -import java.util.HashMap; - -import javax.annotation.Nullable; - +import jakarta.annotation.Nullable; import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; +import java.util.HashMap; + +import static org.lowcoder.sdk.util.IDUtils.generate; + public class AuthConfigRequest extends HashMap { /** diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/authentication/service/AuthenticationApiServiceImpl.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/authentication/service/AuthenticationApiServiceImpl.java index c28740cdc..110831c98 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/authentication/service/AuthenticationApiServiceImpl.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/authentication/service/AuthenticationApiServiceImpl.java @@ -1,5 +1,7 @@ package org.lowcoder.api.authentication.service; +import jakarta.annotation.Nullable; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; @@ -33,14 +35,12 @@ import org.lowcoder.sdk.exception.BizError; import org.lowcoder.sdk.exception.BizException; import org.lowcoder.sdk.util.CookieHelper; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.context.ReactiveSecurityContextHolder; import org.springframework.stereotype.Service; import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; -import javax.annotation.Nullable; import java.util.*; import java.util.function.Function; import java.util.function.Predicate; @@ -51,43 +51,24 @@ import static org.lowcoder.sdk.util.ExceptionUtils.ofError; @Service +@RequiredArgsConstructor @Slf4j public class AuthenticationApiServiceImpl implements AuthenticationApiService { - @Autowired - private OrgApiService orgApiService; - - @Autowired - private OrganizationService organizationService; - - @Autowired - private AuthRequestFactory authRequestFactory; - - @Autowired - private AuthenticationService authenticationService; - - @Autowired - private UserService userService; - @Autowired - private InvitationApiService invitationApiService; - @Autowired - private BusinessEventPublisher businessEventPublisher; - @Autowired - private SessionUserService sessionUserService; - @Autowired - private CookieHelper cookieHelper; - @Autowired - private AuthConfigFactory authConfigFactory; - @Autowired - private UserApiService userApiService; - @Autowired - private OrgMemberService orgMemberService; - - @Autowired - private JWTUtils jwtUtils; - - @Autowired - private AuthProperties authProperties; + private final OrgApiService orgApiService; + private final OrganizationService organizationService; + private final AuthRequestFactory authRequestFactory; + private final AuthenticationService authenticationService; + private final UserService userService; + private final InvitationApiService invitationApiService; + private final BusinessEventPublisher businessEventPublisher; + private final SessionUserService sessionUserService; + private final CookieHelper cookieHelper; + private final AuthConfigFactory authConfigFactory; + private final UserApiService userApiService; + private final OrgMemberService orgMemberService; + private final JWTUtils jwtUtils; + private final AuthProperties authProperties; @Override public Mono authenticateByForm(String loginId, String password, String source, boolean register, String authId, String orgId) { diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/datasource/DatasourceApiService.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/datasource/DatasourceApiService.java index aa574f157..172623755 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/datasource/DatasourceApiService.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/datasource/DatasourceApiService.java @@ -1,19 +1,7 @@ package org.lowcoder.api.datasource; -import static org.lowcoder.domain.permission.model.ResourceAction.MANAGE_DATASOURCES; -import static org.lowcoder.domain.permission.model.ResourceAction.READ_APPLICATIONS; -import static org.lowcoder.domain.permission.model.ResourceAction.USE_DATASOURCES; -import static org.lowcoder.sdk.exception.BizError.NOT_AUTHORIZED; -import static org.lowcoder.sdk.util.ExceptionUtils.deferredError; - -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.stream.Collectors; - -import javax.annotation.Nullable; - +import jakarta.annotation.Nullable; +import lombok.RequiredArgsConstructor; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.lowcoder.api.application.ApplicationApiService; @@ -48,49 +36,40 @@ import org.lowcoder.sdk.models.DatasourceTestResult; import org.lowcoder.sdk.models.HasIdAndAuditing; import org.lowcoder.sdk.models.JsDatasourceConnectionConfig; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; - import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +import static org.lowcoder.domain.permission.model.ResourceAction.*; +import static org.lowcoder.sdk.exception.BizError.NOT_AUTHORIZED; +import static org.lowcoder.sdk.util.ExceptionUtils.deferredError; + +@RequiredArgsConstructor @Service public class DatasourceApiService { - @Autowired - private SessionUserService sessionUserService; - - @Autowired - private OrgMemberService orgMemberService; - - @Autowired - private DatasourceService datasourceService; - - @Autowired - private ResourcePermissionService resourcePermissionService; - @Autowired - private PermissionHelper permissionHelper; - @Autowired - private OrgDevChecker orgDevChecker; - - @Autowired - private UserService userService; - @Autowired - private DatasourceConnectionPool datasourceConnectionPool; - @Autowired - private OrganizationService organizationService; - @Autowired - private ApplicationService applicationService; - @Autowired - private JsDatasourceHelper jsDatasourceHelper; - @Autowired - private DatasourceMetaInfoService datasourceMetaInfoService; - @Autowired - private DatasourcePluginClient datasourcePluginClient; - @Autowired - private DatasourceRepository datasourceRepository; - @Autowired - private ApplicationApiService applicationApiService; + private final SessionUserService sessionUserService; + private final OrgMemberService orgMemberService; + private final DatasourceService datasourceService; + private final ResourcePermissionService resourcePermissionService; + private final PermissionHelper permissionHelper; + private final OrgDevChecker orgDevChecker; + + private final UserService userService; + private final DatasourceConnectionPool datasourceConnectionPool; + private final OrganizationService organizationService; + private final ApplicationService applicationService; + private final JsDatasourceHelper jsDatasourceHelper; + private final DatasourceMetaInfoService datasourceMetaInfoService; + private final DatasourcePluginClient datasourcePluginClient; + private final DatasourceRepository datasourceRepository; + private final ApplicationApiService applicationApiService; public Mono create(Datasource datasource) { return sessionUserService.getVisitorId() diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/framework/filter/APIKeyAuthFilter.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/framework/filter/APIKeyAuthFilter.java index 79a0ea663..6151a597e 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/framework/filter/APIKeyAuthFilter.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/framework/filter/APIKeyAuthFilter.java @@ -1,6 +1,7 @@ package org.lowcoder.api.framework.filter; import io.jsonwebtoken.Claims; +import jakarta.annotation.Nonnull; import lombok.extern.slf4j.Slf4j; import org.lowcoder.api.authentication.util.JWTUtils; import org.lowcoder.api.home.SessionUserService; @@ -10,8 +11,6 @@ import org.springframework.web.server.WebFilterChain; import reactor.core.publisher.Mono; -import javax.annotation.Nonnull; - import static org.lowcoder.api.authentication.util.AuthenticationUtils.toAuthentication; import static org.springframework.security.core.context.ReactiveSecurityContextHolder.withAuthentication; @@ -19,7 +18,6 @@ public class APIKeyAuthFilter implements WebFilter { private final SessionUserService service; - private final CookieHelper cookieHelper; private final JWTUtils jwtUtils; diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/framework/filter/GlobalContextFilter.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/framework/filter/GlobalContextFilter.java index fe7c889ea..0e61d6ff3 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/framework/filter/GlobalContextFilter.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/framework/filter/GlobalContextFilter.java @@ -1,27 +1,8 @@ package org.lowcoder.api.framework.filter; -import static java.util.Optional.ofNullable; -import static java.util.stream.Collectors.toMap; -import static org.lowcoder.api.framework.filter.FilterOrder.GLOBAL_CONTEXT; -import static org.lowcoder.sdk.constants.Authentication.isAnonymousUser; -import static org.lowcoder.sdk.constants.GlobalContext.CLIENT_IP; -import static org.lowcoder.sdk.constants.GlobalContext.CLIENT_LOCALE; -import static org.lowcoder.sdk.constants.GlobalContext.CURRENT_ORG_MEMBER; -import static org.lowcoder.sdk.constants.GlobalContext.DOMAIN; -import static org.lowcoder.sdk.constants.GlobalContext.REQUEST; -import static org.lowcoder.sdk.constants.GlobalContext.REQUEST_ID_LOG; -import static org.lowcoder.sdk.constants.GlobalContext.REQUEST_METHOD; -import static org.lowcoder.sdk.constants.GlobalContext.REQUEST_PATH; -import static org.lowcoder.sdk.constants.GlobalContext.VISITOR_ID; -import static org.lowcoder.sdk.constants.GlobalContext.VISITOR_TOKEN; -import static org.lowcoder.sdk.util.IDUtils.generate; - -import java.util.Map; -import java.util.Map.Entry; -import java.util.Optional; - -import javax.annotation.Nonnull; - +import jakarta.annotation.Nonnull; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.lowcoder.api.framework.service.GlobalContextService; import org.lowcoder.api.home.SessionUserService; import org.lowcoder.domain.organization.service.OrgMemberService; @@ -30,7 +11,6 @@ import org.lowcoder.infra.util.NetworkUtils; import org.lowcoder.sdk.util.CookieHelper; import org.lowcoder.sdk.util.UriUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.Ordered; import org.springframework.http.HttpMethod; import org.springframework.http.server.reactive.ServerHttpRequest; @@ -38,11 +18,21 @@ import org.springframework.web.server.ServerWebExchange; import org.springframework.web.server.WebFilter; import org.springframework.web.server.WebFilterChain; - -import lombok.extern.slf4j.Slf4j; import reactor.core.publisher.Mono; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Optional; + +import static java.util.Optional.ofNullable; +import static java.util.stream.Collectors.toMap; +import static org.lowcoder.api.framework.filter.FilterOrder.GLOBAL_CONTEXT; +import static org.lowcoder.sdk.constants.Authentication.isAnonymousUser; +import static org.lowcoder.sdk.constants.GlobalContext.*; +import static org.lowcoder.sdk.util.IDUtils.generate; + @Component +@RequiredArgsConstructor @Slf4j public class GlobalContextFilter implements WebFilter, Ordered { @@ -51,20 +41,11 @@ public class GlobalContextFilter implements WebFilter, Ordered { public static final String CONTEXT_MAP = "context-map"; - @Autowired - private SessionUserService sessionUserService; - - @Autowired - private OrgMemberService orgMemberService; - - @Autowired - private ServerLogService serverLogService; - - @Autowired - private GlobalContextService globalContextService; - - @Autowired - private CookieHelper cookieHelper; + private final SessionUserService sessionUserService; + private final OrgMemberService orgMemberService; + private final ServerLogService serverLogService; + private final GlobalContextService globalContextService; + private final CookieHelper cookieHelper; @Nonnull @Override diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/framework/filter/QueryExecuteHttpBodySizeFilter.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/framework/filter/QueryExecuteHttpBodySizeFilter.java index 367c816da..8de4c2364 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/framework/filter/QueryExecuteHttpBodySizeFilter.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/framework/filter/QueryExecuteHttpBodySizeFilter.java @@ -1,13 +1,9 @@ package org.lowcoder.api.framework.filter; -import static org.lowcoder.api.framework.filter.FilterOrder.QUERY_EXECUTE_HTTP_BODY_SIZE; -import static org.lowcoder.sdk.exception.BizError.EXCEED_QUERY_REQUEST_SIZE; -import static org.lowcoder.sdk.exception.BizError.EXCEED_QUERY_RESPONSE_SIZE; - -import java.util.concurrent.atomic.AtomicLong; - -import javax.annotation.Nonnull; - +import jakarta.annotation.Nonnull; +import jakarta.annotation.PostConstruct; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.lowcoder.infra.constant.NewUrl; import org.lowcoder.infra.constant.Url; import org.lowcoder.sdk.config.CommonConfig; @@ -15,7 +11,6 @@ import org.lowcoder.sdk.config.dynamic.ConfigInstanceHelper; import org.lowcoder.sdk.exception.BizException; import org.reactivestreams.Publisher; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.core.Ordered; import org.springframework.core.io.buffer.DataBuffer; @@ -28,25 +23,26 @@ import org.springframework.web.server.ServerWebExchange; import org.springframework.web.server.WebFilter; import org.springframework.web.server.WebFilterChain; - -import jakarta.annotation.PostConstruct; -import lombok.extern.slf4j.Slf4j; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +import java.util.concurrent.atomic.AtomicLong; + +import static org.lowcoder.api.framework.filter.FilterOrder.QUERY_EXECUTE_HTTP_BODY_SIZE; +import static org.lowcoder.sdk.exception.BizError.EXCEED_QUERY_REQUEST_SIZE; +import static org.lowcoder.sdk.exception.BizError.EXCEED_QUERY_RESPONSE_SIZE; + /** * check query request and response size */ @Slf4j @Component +@RequiredArgsConstructor @ConditionalOnProperty(value = "common.cloud", havingValue = "true") public class QueryExecuteHttpBodySizeFilter implements WebFilter, Ordered { - @Autowired - private ConfigCenter configCenter; - - @Autowired - private CommonConfig commonConfig; + private final ConfigCenter configCenter; + private final CommonConfig commonConfig; private ConfigInstanceHelper configInstance; diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/framework/filter/RequestCostFilter.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/framework/filter/RequestCostFilter.java index 3f002474a..879b63e37 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/framework/filter/RequestCostFilter.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/framework/filter/RequestCostFilter.java @@ -1,21 +1,19 @@ package org.lowcoder.api.framework.filter; -import static org.lowcoder.api.framework.filter.FilterOrder.REQUEST_COST; - -import java.time.Duration; - -import javax.annotation.Nonnull; - +import jakarta.annotation.Nonnull; +import lombok.extern.slf4j.Slf4j; import org.springframework.core.Ordered; import org.springframework.http.HttpHeaders; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; import org.springframework.web.server.WebFilter; import org.springframework.web.server.WebFilterChain; - -import lombok.extern.slf4j.Slf4j; import reactor.core.publisher.Mono; +import java.time.Duration; + +import static org.lowcoder.api.framework.filter.FilterOrder.REQUEST_COST; + @Slf4j @Component public class RequestCostFilter implements WebFilter, Ordered { diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/framework/filter/ThrottlingFilter.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/framework/filter/ThrottlingFilter.java index edbf45c9f..90cb147a8 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/framework/filter/ThrottlingFilter.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/framework/filter/ThrottlingFilter.java @@ -1,16 +1,10 @@ package org.lowcoder.api.framework.filter; -import static java.util.Collections.emptyMap; -import static org.lowcoder.api.framework.filter.FilterOrder.THROTTLING; -import static org.lowcoder.sdk.exception.BizError.REQUEST_THROTTLED; -import static org.lowcoder.sdk.util.ExceptionUtils.ofError; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.function.Supplier; - -import javax.annotation.Nonnull; - +import com.google.common.util.concurrent.RateLimiter; +import jakarta.annotation.Nonnull; +import jakarta.annotation.PostConstruct; +import lombok.Getter; +import lombok.extern.slf4j.Slf4j; import org.lowcoder.sdk.config.dynamic.ConfigCenter; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; @@ -21,13 +15,16 @@ import org.springframework.web.server.ServerWebExchange; import org.springframework.web.server.WebFilter; import org.springframework.web.server.WebFilterChain; +import reactor.core.publisher.Mono; -import com.google.common.util.concurrent.RateLimiter; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Supplier; -import jakarta.annotation.PostConstruct; -import lombok.Getter; -import lombok.extern.slf4j.Slf4j; -import reactor.core.publisher.Mono; +import static java.util.Collections.emptyMap; +import static org.lowcoder.api.framework.filter.FilterOrder.THROTTLING; +import static org.lowcoder.sdk.exception.BizError.REQUEST_THROTTLED; +import static org.lowcoder.sdk.util.ExceptionUtils.ofError; @ConditionalOnExpression("${default.api-rate-limit:0} > 0") @SuppressWarnings("UnstableApiUsage") diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/framework/filter/UserBanFilter.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/framework/filter/UserBanFilter.java index 73d6deb6f..5187dd173 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/framework/filter/UserBanFilter.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/framework/filter/UserBanFilter.java @@ -5,8 +5,7 @@ import static org.lowcoder.sdk.exception.BizError.USER_BANNED; import static org.lowcoder.sdk.util.ExceptionUtils.ofError; -import javax.annotation.Nonnull; - +import jakarta.annotation.Nonnull; import org.lowcoder.api.home.SessionUserService; import org.lowcoder.domain.user.model.UserStatus; import org.lowcoder.domain.user.service.UserStatusService; diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/framework/filter/UserSessionPersistenceFilter.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/framework/filter/UserSessionPersistenceFilter.java index 4804d16a4..d86b9df74 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/framework/filter/UserSessionPersistenceFilter.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/framework/filter/UserSessionPersistenceFilter.java @@ -1,5 +1,6 @@ package org.lowcoder.api.framework.filter; +import jakarta.annotation.Nonnull; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.tuple.Triple; import org.lowcoder.api.authentication.request.AuthRequest; @@ -19,7 +20,6 @@ import org.springframework.web.server.WebFilterChain; import reactor.core.publisher.Mono; -import javax.annotation.Nonnull; import java.time.Instant; import java.util.Optional; diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/framework/security/SecurityConfig.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/framework/security/SecurityConfig.java index e255cc5dc..71dd036d2 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/framework/security/SecurityConfig.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/framework/security/SecurityConfig.java @@ -1,24 +1,8 @@ package org.lowcoder.api.framework.security; -import static org.lowcoder.infra.constant.NewUrl.GITHUB_STAR; -import static org.lowcoder.infra.constant.Url.APPLICATION_URL; -import static org.lowcoder.infra.constant.Url.CONFIG_URL; -import static org.lowcoder.infra.constant.Url.CUSTOM_AUTH; -import static org.lowcoder.infra.constant.Url.DATASOURCE_URL; -import static org.lowcoder.infra.constant.Url.GROUP_URL; -import static org.lowcoder.infra.constant.Url.INVITATION_URL; -import static org.lowcoder.infra.constant.Url.ORGANIZATION_URL; -import static org.lowcoder.infra.constant.Url.QUERY_URL; -import static org.lowcoder.infra.constant.Url.STATE_URL; -import static org.lowcoder.infra.constant.Url.USER_URL; -import static org.lowcoder.sdk.constants.Authentication.ANONYMOUS_USER; -import static org.lowcoder.sdk.constants.Authentication.ANONYMOUS_USER_ID; - -import java.util.List; - -import javax.annotation.Nonnull; - +import jakarta.annotation.Nonnull; +import lombok.RequiredArgsConstructor; import org.lowcoder.api.authentication.request.AuthRequestFactory; import org.lowcoder.api.authentication.service.AuthenticationApiServiceImpl; import org.lowcoder.api.authentication.util.JWTUtils; @@ -50,7 +34,12 @@ import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource; import org.springframework.web.server.adapter.ForwardedHeaderTransformer; -import lombok.RequiredArgsConstructor; +import java.util.List; + +import static org.lowcoder.infra.constant.NewUrl.GITHUB_STAR; +import static org.lowcoder.infra.constant.Url.*; +import static org.lowcoder.sdk.constants.Authentication.ANONYMOUS_USER; +import static org.lowcoder.sdk.constants.Authentication.ANONYMOUS_USER_ID; @RequiredArgsConstructor @Configuration diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/home/FolderApiService.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/home/FolderApiService.java index fcb066195..a712eb51e 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/home/FolderApiService.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/home/FolderApiService.java @@ -1,25 +1,8 @@ package org.lowcoder.api.home; -import static org.apache.commons.collections4.CollectionUtils.isNotEmpty; -import static org.lowcoder.infra.util.MonoUtils.emptyIfNull; -import static org.lowcoder.sdk.exception.BizError.FOLDER_NOT_EXIST; -import static org.lowcoder.sdk.exception.BizError.FOLDER_OPERATE_NO_PERMISSION; -import static org.lowcoder.sdk.exception.BizError.ILLEGAL_FOLDER_PERMISSION_ID; -import static org.lowcoder.sdk.util.ExceptionUtils.ofError; - -import java.time.Instant; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.function.Function; -import java.util.function.ToLongFunction; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - +import jakarta.annotation.Nonnull; +import jakarta.annotation.Nullable; +import lombok.RequiredArgsConstructor; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.lowcoder.api.application.view.ApplicationInfoView; @@ -31,12 +14,7 @@ import org.lowcoder.domain.application.model.ApplicationType; import org.lowcoder.domain.folder.model.Folder; import org.lowcoder.domain.folder.model.FolderElement; -import org.lowcoder.domain.folder.service.ElementNode; -import org.lowcoder.domain.folder.service.FolderElementRelationService; -import org.lowcoder.domain.folder.service.FolderNode; -import org.lowcoder.domain.folder.service.FolderService; -import org.lowcoder.domain.folder.service.Node; -import org.lowcoder.domain.folder.service.Tree; +import org.lowcoder.domain.folder.service.*; import org.lowcoder.domain.group.service.GroupService; import org.lowcoder.domain.interaction.UserFolderInteraction; import org.lowcoder.domain.interaction.UserFolderInteractionService; @@ -52,12 +30,21 @@ import org.lowcoder.domain.user.service.UserService; import org.lowcoder.sdk.exception.BizError; import org.lowcoder.sdk.exception.BizException; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; - import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +import java.time.Instant; +import java.util.*; +import java.util.function.Function; +import java.util.function.ToLongFunction; + +import static org.apache.commons.collections4.CollectionUtils.isNotEmpty; +import static org.lowcoder.infra.util.MonoUtils.emptyIfNull; +import static org.lowcoder.sdk.exception.BizError.*; +import static org.lowcoder.sdk.util.ExceptionUtils.ofError; + +@RequiredArgsConstructor @Service public class FolderApiService { @@ -78,28 +65,17 @@ public class FolderApiService { return ((FolderNode) node).getSelf().getName(); }); - @Autowired - private FolderService folderService; - @Autowired - private SessionUserService sessionUserService; - @Autowired - private OrgDevChecker orgDevChecker; - @Autowired - private UserHomeApiService userHomeApiService; - @Autowired - private FolderElementRelationService folderElementRelationService; - @Autowired - private ResourcePermissionService resourcePermissionService; - @Autowired - private PermissionHelper permissionHelper; - @Autowired - private GroupService groupService; - @Autowired - private UserService userService; - @Autowired - private OrganizationService organizationService; - @Autowired - private UserFolderInteractionService userFolderInteractionService; + private final FolderService folderService; + private final SessionUserService sessionUserService; + private final OrgDevChecker orgDevChecker; + private final UserHomeApiService userHomeApiService; + private final FolderElementRelationService folderElementRelationService; + private final ResourcePermissionService resourcePermissionService; + private final PermissionHelper permissionHelper; + private final GroupService groupService; + private final UserService userService; + private final OrganizationService organizationService; + private final UserFolderInteractionService userFolderInteractionService; public Mono create(Folder folder) { if (StringUtils.isBlank(folder.getName())) { diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/home/UserHomeApiService.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/home/UserHomeApiService.java index 454af54d8..db041e07f 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/home/UserHomeApiService.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/home/UserHomeApiService.java @@ -1,17 +1,16 @@ package org.lowcoder.api.home; -import javax.annotation.Nullable; - -import org.lowcoder.api.application.view.MarketplaceApplicationInfoView; -import reactor.core.publisher.Flux; -import reactor.core.publisher.Mono; +import jakarta.annotation.Nullable; import org.lowcoder.api.application.view.ApplicationInfoView; +import org.lowcoder.api.application.view.MarketplaceApplicationInfoView; import org.lowcoder.api.usermanagement.view.UserProfileView; import org.lowcoder.domain.application.model.ApplicationStatus; import org.lowcoder.domain.application.model.ApplicationType; import org.lowcoder.domain.user.model.User; import org.springframework.web.server.ServerWebExchange; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; public interface UserHomeApiService { @@ -22,7 +21,7 @@ public interface UserHomeApiService { Mono getUserHomePageView(ApplicationType applicationType); Flux getAllAuthorisedApplications4CurrentOrgMember(@Nullable ApplicationType applicationType, - @Nullable ApplicationStatus applicationStatus, boolean withContainerSize); + @Nullable ApplicationStatus applicationStatus, boolean withContainerSize); public Flux getAllMarketplaceApplications(@Nullable ApplicationType applicationType); diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/home/UserHomeApiServiceImpl.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/home/UserHomeApiServiceImpl.java index c682e8c70..3fae974b3 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/home/UserHomeApiServiceImpl.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/home/UserHomeApiServiceImpl.java @@ -1,21 +1,7 @@ package org.lowcoder.api.home; -import static java.util.Objects.isNull; -import static org.lowcoder.domain.permission.model.ResourceAction.READ_APPLICATIONS; -import static org.lowcoder.infra.util.MonoUtils.emptyIfNull; -import static org.lowcoder.sdk.util.StreamUtils.collectList; - -import java.time.Instant; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import java.util.function.Function; -import java.util.stream.Collectors; - -import javax.annotation.Nullable; - +import jakarta.annotation.Nullable; +import lombok.RequiredArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.lowcoder.api.application.view.ApplicationInfoView; import org.lowcoder.api.application.view.ApplicationInfoView.ApplicationInfoViewBuilder; @@ -42,48 +28,37 @@ import org.lowcoder.domain.user.service.UserStatusService; import org.lowcoder.infra.util.NetworkUtils; import org.lowcoder.sdk.config.CommonConfig; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; - import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +import java.time.Instant; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; -@Component -public class UserHomeApiServiceImpl implements UserHomeApiService { - - - @Autowired - private SessionUserService sessionUserService; - - @Autowired - private OrganizationService organizationService; - - @Autowired - private OrgMemberService orgMemberService; - - @Autowired - private ApplicationService applicationService; - - @Autowired - private ResourcePermissionService resourcePermissionService; - - @Autowired - private UserService userService; +import static java.util.Objects.isNull; +import static org.lowcoder.domain.permission.model.ResourceAction.READ_APPLICATIONS; +import static org.lowcoder.infra.util.MonoUtils.emptyIfNull; +import static org.lowcoder.sdk.util.StreamUtils.collectList; - @Autowired - private UserStatusService userStatusService; - @Autowired - private OrgDevChecker orgDevChecker; - @Autowired - private FolderApiService folderApiService; - @Autowired - private UserApplicationInteractionService userApplicationInteractionService; +@RequiredArgsConstructor +@Component +public class UserHomeApiServiceImpl implements UserHomeApiService { - @Autowired - private CommonConfig config; + private final SessionUserService sessionUserService; + private final OrganizationService organizationService; + private final OrgMemberService orgMemberService; + private final ApplicationService applicationService; + private final ResourcePermissionService resourcePermissionService; + private final UserService userService; + private final UserStatusService userStatusService; + private final OrgDevChecker orgDevChecker; + private final FolderApiService folderApiService; + private final UserApplicationInteractionService userApplicationInteractionService; + private final CommonConfig config; @Override public Mono buildUserProfileView(User user, ServerWebExchange exchange) { @@ -202,7 +177,7 @@ public Mono getUserHomePageView(ApplicationType applicationTyp @Override public Flux getAllAuthorisedApplications4CurrentOrgMember(@Nullable ApplicationType applicationType, - @Nullable ApplicationStatus applicationStatus, boolean withContainerSize) { + @Nullable ApplicationStatus applicationStatus, boolean withContainerSize) { return sessionUserService.getVisitorOrgMemberCache() .flatMapMany(orgMember -> { diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/query/ApplicationQueryApiService.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/query/ApplicationQueryApiService.java index 9a1242691..5c8da1476 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/query/ApplicationQueryApiService.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/query/ApplicationQueryApiService.java @@ -1,5 +1,7 @@ package org.lowcoder.api.query; +import jakarta.annotation.Nullable; +import lombok.RequiredArgsConstructor; import org.apache.commons.lang.ArrayUtils; import org.apache.commons.lang3.StringUtils; import org.lowcoder.api.home.SessionUserService; @@ -29,7 +31,6 @@ import org.lowcoder.sdk.plugin.restapi.auth.OAuthInheritAuthConfig; import org.lowcoder.sdk.query.QueryVisitorContext; import org.lowcoder.sdk.util.ExceptionUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpCookie; import org.springframework.stereotype.Service; @@ -38,7 +39,6 @@ import reactor.core.publisher.Mono; import reactor.core.publisher.Timed; -import javax.annotation.Nullable; import java.util.Collections; import java.util.List; import java.util.Optional; @@ -50,32 +50,18 @@ import static org.lowcoder.sdk.util.ExceptionUtils.deferredError; import static org.lowcoder.sdk.util.ExceptionUtils.ofError; +@RequiredArgsConstructor @Service public class ApplicationQueryApiService { - @Autowired - private SessionUserService sessionUserService; - - @Autowired - private LibraryQueryService libraryQueryService; - - @Autowired - private LibraryQueryRecordService libraryQueryRecordService; - - @Autowired - private ApplicationService applicationService; - - @Autowired - private ResourcePermissionService resourcePermissionService; - - @Autowired - private DatasourceService datasourceService; - - @Autowired - private QueryExecutionService queryExecutionService; - - @Autowired - private CommonConfig commonConfig; + private final SessionUserService sessionUserService; + private final LibraryQueryService libraryQueryService; + private final LibraryQueryRecordService libraryQueryRecordService; + private final ApplicationService applicationService; + private final ResourcePermissionService resourcePermissionService; + private final DatasourceService datasourceService; + private final QueryExecutionService queryExecutionService; + private final CommonConfig commonConfig; @Value("${server.port}") private int port; diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/InvitationApiService.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/InvitationApiService.java index 0f2773707..0aec7385b 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/InvitationApiService.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/InvitationApiService.java @@ -1,12 +1,7 @@ package org.lowcoder.api.usermanagement; -import static org.lowcoder.sdk.exception.BizError.INVITED_ORG_DELETED; -import static org.lowcoder.sdk.exception.BizError.INVITER_NOT_FOUND; -import static org.lowcoder.sdk.util.ExceptionUtils.deferredError; -import static org.lowcoder.sdk.util.ExceptionUtils.ofException; - -import javax.annotation.Nonnull; - +import jakarta.annotation.Nonnull; +import lombok.RequiredArgsConstructor; import org.lowcoder.api.bizthreshold.AbstractBizThresholdChecker; import org.lowcoder.api.home.SessionUserService; import org.lowcoder.api.usermanagement.view.InvitationVO; @@ -19,34 +14,25 @@ import org.lowcoder.domain.user.service.UserService; import org.lowcoder.sdk.exception.BizError; import org.lowcoder.sdk.exception.BizException; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; - import reactor.core.publisher.Mono; +import static org.lowcoder.sdk.exception.BizError.INVITED_ORG_DELETED; +import static org.lowcoder.sdk.exception.BizError.INVITER_NOT_FOUND; +import static org.lowcoder.sdk.util.ExceptionUtils.deferredError; +import static org.lowcoder.sdk.util.ExceptionUtils.ofException; + +@RequiredArgsConstructor @Service public class InvitationApiService { - @Autowired - private InvitationService invitationService; - - @Autowired - private OrgApiService orgApiService; - - @Autowired - private UserService userService; - - @Autowired - private SessionUserService sessionUserService; - - @Autowired - private OrganizationService organizationService; - - @Autowired - private OrgMemberService orgMemberService; - - @Autowired - private AbstractBizThresholdChecker bizThresholdChecker; + private final InvitationService invitationService; + private final OrgApiService orgApiService; + private final UserService userService; + private final SessionUserService sessionUserService; + private final OrganizationService organizationService; + private final OrgMemberService orgMemberService; + private final AbstractBizThresholdChecker bizThresholdChecker; public Mono inviteUser(String invitationId) { return sessionUserService.getVisitorId() diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/OrgDevChecker.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/OrgDevChecker.java index 315c5f6f2..925f11a26 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/OrgDevChecker.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/OrgDevChecker.java @@ -1,29 +1,23 @@ package org.lowcoder.api.usermanagement; -import static org.lowcoder.sdk.util.ExceptionUtils.ofError; - -import javax.annotation.Nonnull; - +import jakarta.annotation.Nonnull; +import lombok.RequiredArgsConstructor; import org.lowcoder.api.home.SessionUserService; import org.lowcoder.domain.group.service.GroupMemberService; import org.lowcoder.domain.group.service.GroupService; import org.lowcoder.sdk.exception.BizError; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; - import reactor.core.publisher.Mono; +import static org.lowcoder.sdk.util.ExceptionUtils.ofError; + +@RequiredArgsConstructor @Component public class OrgDevChecker { - @Autowired - private SessionUserService sessionUserService; - - @Autowired - private GroupService groupService; - - @Autowired - private GroupMemberService groupMemberService; + private final SessionUserService sessionUserService; + private final GroupService groupService; + private final GroupMemberService groupMemberService; /** * check whether current user is org admin or dev diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/view/OrgView.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/view/OrgView.java index 40f1ced57..965c9a912 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/view/OrgView.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/view/OrgView.java @@ -1,7 +1,6 @@ package org.lowcoder.api.usermanagement.view; -import javax.annotation.Nonnull; - +import jakarta.annotation.Nonnull; import org.lowcoder.domain.organization.model.Organization; public class OrgView { diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/util/BusinessEventPublisher.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/util/BusinessEventPublisher.java index 850c33d78..b967f65a7 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/util/BusinessEventPublisher.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/util/BusinessEventPublisher.java @@ -1,6 +1,8 @@ package org.lowcoder.api.util; import com.google.common.hash.Hashing; +import jakarta.annotation.Nullable; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.lowcoder.api.application.view.ApplicationInfoView; @@ -41,37 +43,28 @@ import org.lowcoder.plugin.api.event.LowcoderEvent.EventType; import org.lowcoder.sdk.constants.Authentication; import org.lowcoder.sdk.util.LocaleUtils; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationEventPublisher; import org.springframework.stereotype.Component; import reactor.core.publisher.Mono; -import javax.annotation.Nullable; import java.nio.charset.StandardCharsets; import java.util.*; import static org.lowcoder.domain.permission.model.ResourceHolder.USER; @Slf4j +@RequiredArgsConstructor @Component public class BusinessEventPublisher { - @Autowired - private ApplicationEventPublisher applicationEventPublisher; - @Autowired - private SessionUserService sessionUserService; - @Autowired - private GroupService groupService; - @Autowired - private UserService userService; - @Autowired - private FolderService folderService; - @Autowired - private ApplicationService applicationService; - @Autowired - private DatasourceService datasourceService; - @Autowired - private ResourcePermissionService resourcePermissionService; + private final ApplicationEventPublisher applicationEventPublisher; + private final SessionUserService sessionUserService; + private final GroupService groupService; + private final UserService userService; + private final FolderService folderService; + private final ApplicationService applicationService; + private final DatasourceService datasourceService; + private final ResourcePermissionService resourcePermissionService; public Mono publishFolderCommonEvent(String folderId, String folderName, EventType eventType) { From 1b77959afbb89b4810c35bd43fb23b651de4a660 Mon Sep 17 00:00:00 2001 From: Ludo Mikula Date: Thu, 4 Apr 2024 18:53:46 +0200 Subject: [PATCH 2/8] fix: refactor all services to use proper proxying via interfaces --- server/api-service/lowcoder-domain/pom.xml | 26 - .../service/ApplicationService.java | 275 +------- .../service/ApplicationServiceImpl.java | 307 ++++++++ ...ApplicationHistorySnapshotServiceImpl.java | 6 +- .../AuthenticationServiceImpl.java | 16 +- .../impl/ClientBasedConnectionPool.java | 8 +- .../impl/DatasourceConnectionPoolFacade.java | 9 +- .../impl/TokenBasedConnectionPool.java | 9 +- .../service/FolderElementRelationService.java | 34 +- .../FolderElementRelationServiceImpl.java | 44 ++ .../domain/folder/service/FolderService.java | 62 +- .../folder/service/FolderServiceImpl.java | 72 ++ .../UserApplicationInteractionService.java | 26 +- ...UserApplicationInteractionServiceImpl.java | 33 + .../UserFolderInteractionService.java | 28 +- .../UserFolderInteractionServiceImpl.java | 35 + .../invitation/service/InvitationService.java | 34 +- .../service/InvitationServiceImpl.java | 38 + .../service/meta/MaterialMetaServiceImpl.java | 9 +- .../service/OrganizationServiceImpl.java | 45 +- .../service/ApplicationPermissionHandler.java | 19 +- .../service/DatasourcePermissionHandler.java | 6 +- .../service/ResourcePermissionService.java | 276 ++------ .../ResourcePermissionServiceImpl.java | 262 +++++++ .../ResourcePermissionRepositoryImpl.java | 10 +- .../SuggestAppAdminSolutionService.java | 12 + ...> SuggestAppAdminSolutionServiceImpl.java} | 4 +- .../service/LibraryQueryRecordService.java | 63 +- .../LibraryQueryRecordServiceImpl.java | 74 ++ .../query/service/LibraryQueryService.java | 68 +- .../service/LibraryQueryServiceImpl.java | 80 +++ .../query/service/QueryExecutionService.java | 115 +-- .../service/QueryExecutionServiceImpl.java | 117 ++++ .../solutions/TemplateSolutionService.java | 15 + ....java => TemplateSolutionServiceImpl.java} | 6 +- .../template/service/TemplateService.java | 27 +- .../template/service/TemplateServiceImpl.java | 36 + .../service/EmailCommunicationService.java | 48 +- .../EmailCommunicationServiceImpl.java | 49 ++ .../user/service/UserStatusService.java | 39 +- .../user/service/UserStatusServiceImpl.java | 44 ++ .../impl/ClientBasedConnectionPoolTest.java | 6 + .../infra/birelation/BiRelationService.java | 248 ++----- .../birelation/BiRelationServiceImpl.java | 224 ++++++ .../infra/serverlog/ServerLogService.java | 69 +- .../infra/serverlog/ServerLogServiceImpl.java | 71 ++ .../application/ApplicationApiService.java | 630 +---------------- .../ApplicationApiServiceImpl.java | 660 ++++++++++++++++++ .../api/datasource/DatasourceApiService.java | 274 +------- .../datasource/DatasourceApiServiceImpl.java | 301 ++++++++ .../lowcoder/api/home/FolderApiService.java | 406 +---------- .../api/home/FolderApiServiceImpl.java | 429 ++++++++++++ .../api/query/ApplicationQueryApiService.java | 209 +----- .../query/ApplicationQueryApiServiceImpl.java | 216 ++++++ .../api/query/LibraryQueryApiService.java | 374 +--------- .../api/query/LibraryQueryApiServiceImpl.java | 369 ++++++++++ .../query/LibraryQueryRecordApiService.java | 106 +-- .../LibraryQueryRecordApiServiceImpl.java | 103 +++ .../api/usermanagement/GroupApiService.java | 256 +------ .../usermanagement/GroupApiServiceImpl.java | 267 +++++++ .../usermanagement/InvitationApiService.java | 108 +-- .../InvitationApiServiceImpl.java | 114 +++ .../api/usermanagement/UserApiService.java | 125 +--- .../usermanagement/UserApiServiceImpl.java | 133 ++++ .../src/main/resources/application.yaml | 6 +- 65 files changed, 4485 insertions(+), 3705 deletions(-) create mode 100644 server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/application/service/ApplicationServiceImpl.java create mode 100644 server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/folder/service/FolderElementRelationServiceImpl.java create mode 100644 server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/folder/service/FolderServiceImpl.java create mode 100644 server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/interaction/UserApplicationInteractionServiceImpl.java create mode 100644 server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/interaction/UserFolderInteractionServiceImpl.java create mode 100644 server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/invitation/service/InvitationServiceImpl.java create mode 100644 server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/permission/service/ResourcePermissionServiceImpl.java create mode 100644 server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/permission/solution/SuggestAppAdminSolutionService.java rename server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/permission/solution/{SuggestAppAdminSolution.java => SuggestAppAdminSolutionServiceImpl.java} (96%) create mode 100644 server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/query/service/LibraryQueryRecordServiceImpl.java create mode 100644 server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/query/service/LibraryQueryServiceImpl.java create mode 100644 server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/query/service/QueryExecutionServiceImpl.java create mode 100644 server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/solutions/TemplateSolutionService.java rename server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/solutions/{TemplateSolution.java => TemplateSolutionServiceImpl.java} (98%) create mode 100644 server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/template/service/TemplateServiceImpl.java create mode 100644 server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/user/service/EmailCommunicationServiceImpl.java create mode 100644 server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/user/service/UserStatusServiceImpl.java create mode 100644 server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/birelation/BiRelationServiceImpl.java create mode 100644 server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/serverlog/ServerLogServiceImpl.java create mode 100644 server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationApiServiceImpl.java create mode 100644 server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/datasource/DatasourceApiServiceImpl.java create mode 100644 server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/home/FolderApiServiceImpl.java create mode 100644 server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/query/ApplicationQueryApiServiceImpl.java create mode 100644 server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/query/LibraryQueryApiServiceImpl.java create mode 100644 server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/query/LibraryQueryRecordApiServiceImpl.java create mode 100644 server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/GroupApiServiceImpl.java create mode 100644 server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/InvitationApiServiceImpl.java create mode 100644 server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/UserApiServiceImpl.java diff --git a/server/api-service/lowcoder-domain/pom.xml b/server/api-service/lowcoder-domain/pom.xml index 666c71346..69a6a1c85 100644 --- a/server/api-service/lowcoder-domain/pom.xml +++ b/server/api-service/lowcoder-domain/pom.xml @@ -282,32 +282,6 @@ - diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/application/service/ApplicationService.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/application/service/ApplicationService.java index a5f83cdaf..3bdcbac9f 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/application/service/ApplicationService.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/application/service/ApplicationService.java @@ -1,289 +1,74 @@ package org.lowcoder.domain.application.service; - -import static org.lowcoder.domain.application.ApplicationUtil.getDependentModulesFromDsl; - -import java.util.*; -import java.util.stream.Collectors; - import org.lowcoder.domain.application.model.Application; import org.lowcoder.domain.application.model.ApplicationRequestType; import org.lowcoder.domain.application.model.ApplicationStatus; -import org.lowcoder.domain.application.repository.ApplicationRepository; -import org.lowcoder.domain.permission.model.ResourceRole; -import org.lowcoder.domain.permission.service.ResourcePermissionService; import org.lowcoder.infra.annotation.NonEmptyMono; -import org.lowcoder.infra.mongo.MongoUpsertHelper; -import org.lowcoder.sdk.constants.FieldName; -import org.lowcoder.sdk.exception.BizError; -import org.lowcoder.sdk.exception.BizException; -import org.lowcoder.sdk.models.HasIdAndAuditing; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Service; - -import com.google.common.collect.Lists; -import com.google.common.collect.Sets; - -import lombok.extern.slf4j.Slf4j; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; -@Lazy -@Service -@Slf4j -public class ApplicationService { - - - @Autowired - private MongoUpsertHelper mongoUpsertHelper; - - @Autowired - private ResourcePermissionService resourcePermissionService; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Set; - @Autowired - private ApplicationRepository repository; +public interface ApplicationService { + Mono findById(String id); - public Mono findById(String id) { - if (id == null) { - return Mono.error(new BizException(BizError.INVALID_PARAMETER, "INVALID_PARAMETER", FieldName.ID)); - } + Mono findByIdWithoutDsl(String id); - return repository.findByIdWithDsl(id) - .switchIfEmpty(Mono.error(new BizException(BizError.NO_RESOURCE_FOUND, "CANT_FIND_APPLICATION", id))); - } + Mono updateById(String applicationId, Application application); - public Mono findByIdWithoutDsl(String id) { - if (id == null) { - return Mono.error(new BizException(BizError.INVALID_PARAMETER, "INVALID_PARAMETER", FieldName.ID)); - } + Mono updatePublishedApplicationDSL(String applicationId, Map applicationDSL); - return repository.findById(id) - .switchIfEmpty(Mono.error(new BizException(BizError.NO_RESOURCE_FOUND, "CANT_FIND_APPLICATION", id))); - } + Mono publish(String applicationId); - public Mono updateById(String applicationId, Application application) { - if (applicationId == null) { - return Mono.error(new BizException(BizError.INVALID_PARAMETER, "INVALID_PARAMETER", FieldName.ID)); - } + Mono create(Application newApplication, String visitorId); - return mongoUpsertHelper.updateById(application, applicationId); - } + Flux findByOrganizationIdWithDsl(String organizationId); + Flux findByOrganizationIdWithoutDsl(String organizationId); - public Mono updatePublishedApplicationDSL(String applicationId, Map applicationDSL) { - Application application = Application.builder().publishedApplicationDSL(applicationDSL).build(); - return mongoUpsertHelper.updateById(application, applicationId); - } + Flux findAllMarketplaceApps(); - public Mono publish(String applicationId) { - return findById(applicationId) - .flatMap(newApplication -> { // copy editingApplicationDSL to publishedApplicationDSL - Map editingApplicationDSL = newApplication.getEditingApplicationDSL(); - return updatePublishedApplicationDSL(applicationId, editingApplicationDSL) - .thenReturn(newApplication); - }); - } + Flux findAllAgencyProfileApps(); - public Mono create(Application newApplication, String visitorId) { - return repository.save(newApplication) - .delayUntil(app -> resourcePermissionService.addApplicationPermissionToUser(app.getId(), visitorId, ResourceRole.OWNER)); - } + Mono countByOrganizationId(String orgId, ApplicationStatus applicationStatus); - /** - * If you don't need dsl, please use {@link #findByOrganizationIdWithoutDsl(String)} - */ - public Flux findByOrganizationIdWithDsl(String organizationId) { - return repository.findByOrganizationIdWithDsl(organizationId); - } + Flux findByIdIn(List applicationIds); - public Flux findByOrganizationIdWithoutDsl(String organizationId) { - return repository.findByOrganizationId(organizationId); - } + Mono> getAllDependentModulesFromApplicationId(String applicationId, boolean viewMode); - public Flux findAllMarketplaceApps() { - return repository.findByPublicToAllIsTrueAndPublicToMarketplaceIsTrue(); - } + Mono> getAllDependentModulesFromApplication(Application application, boolean viewMode); - public Flux findAllAgencyProfileApps() { - return repository.findByPublicToAllIsTrueAndAgencyProfileIsTrue(); - } + Mono> getAllDependentModulesFromDsl(Map dsl); - public Mono countByOrganizationId(String orgId, ApplicationStatus applicationStatus) { - return repository.countByOrganizationIdAndApplicationStatus(orgId, applicationStatus); - } - - public Flux findByIdIn(List applicationIds) { - return repository.findByIdIn(applicationIds); - } - - public Mono> getAllDependentModulesFromApplicationId(String applicationId, boolean viewMode) { - return findById(applicationId) - .flatMap(app -> getAllDependentModulesFromApplication(app, viewMode)); - } - - public Mono> getAllDependentModulesFromApplication(Application application, boolean viewMode) { - Map dsl = viewMode ? application.getLiveApplicationDsl() : application.getEditingApplicationDSL(); - return getAllDependentModulesFromDsl(dsl); - } - - public Mono> getAllDependentModulesFromDsl(Map dsl) { - Set circularDependencyCheckSet = Sets.newHashSet(); - return Mono.just(getDependentModulesFromDsl(dsl)) - .doOnNext(circularDependencyCheckSet::addAll) - .flatMapMany(moduleSet -> findByIdIn(Lists.newArrayList(moduleSet))) - .onErrorContinue((e, i) -> log.warn("get dependent modules on error continue , {}", e.getMessage())) - .expandDeep(module -> getDependentModules(module, circularDependencyCheckSet)) - .collectList(); - } - - private Flux getDependentModules(Application module, Set circularDependencyCheckSet) { - return Flux.fromIterable(module.getLiveModules()) - .filter(moduleId -> !circularDependencyCheckSet.contains(moduleId)) - .doOnNext(circularDependencyCheckSet::add) - .collectList() - .flatMapMany(this::findByIdIn) - .onErrorContinue((e, i) -> log.warn("get dependent modules on error continue , {}", e.getMessage())); - } - - public Mono setApplicationPublicToAll(String applicationId, boolean publicToAll) { - Application application = Application.builder() - .publicToAll(publicToAll) - .build(); - return mongoUpsertHelper.updateById(application, applicationId); - } + Mono setApplicationPublicToAll(String applicationId, boolean publicToAll); // Falk: String title, String category, String description, String image will be set in Application Settings inside DSL by Frontend - public Mono setApplicationPublicToMarketplace(String applicationId, Boolean publicToMarketplace) { - - return findById(applicationId) - - .map(application -> { - - Map applicationDsl = application.getEditingApplicationDSL(); - - // Falk: this logic is not needed anymore, because we set Meta Data in Settings in the UI already - /* if (applicationDsl.containsKey("ui")) { - Map dataObject = (Map) applicationDsl.get("ui"); - - if(publicToMarketplace) { - Map marketplaceMeta = new HashMap<>(); - marketplaceMeta.put("title", title); - marketplaceMeta.put("description", description); - marketplaceMeta.put("category", category); - marketplaceMeta.put("image", image); - if (dataObject.containsKey("marketplaceMeta")) { - dataObject.replace("marketplaceMeta", marketplaceMeta); - } else { - dataObject.put("marketplaceMeta", marketplaceMeta); - } - } else { - dataObject.remove("marketplaceMeta"); - } - - applicationDsl.replace("ui", dataObject); - - } */ - - return Application.builder() - .publicToMarketplace(publicToMarketplace) - .editingApplicationDSL(applicationDsl) - .build(); - - }) - .flatMap(application -> mongoUpsertHelper.updateById(application, applicationId)); - - - } - - public Mono setApplicationAsAgencyProfile(String applicationId, boolean agencyProfile) { - Application application = Application.builder() - .agencyProfile(agencyProfile) - .build(); - return mongoUpsertHelper.updateById(application, applicationId); - } + Mono setApplicationPublicToMarketplace(String applicationId, Boolean publicToMarketplace); + Mono setApplicationAsAgencyProfile(String applicationId, boolean agencyProfile); @NonEmptyMono @SuppressWarnings("ReactiveStreamsNullableInLambdaInTransform") - public Mono> getFilteredPublicApplicationIds(ApplicationRequestType requestType, Collection applicationIds, boolean isAnonymous, Boolean isPrivateMarketplace) { + Mono> getFilteredPublicApplicationIds(ApplicationRequestType requestType, Collection applicationIds, boolean isAnonymous, Boolean isPrivateMarketplace); - switch(requestType) - { - case PUBLIC_TO_ALL: - if (isAnonymous) - { - return getPublicApplicationIds(applicationIds); - } - else - { - return getPrivateApplicationIds(applicationIds); - } - case PUBLIC_TO_MARKETPLACE: - return getPublicMarketplaceApplicationIds(applicationIds, isAnonymous, isPrivateMarketplace); - case AGENCY_PROFILE: - return getPublicAgencyApplicationIds(applicationIds); - default: - return Mono.empty(); - } - } - - - /** - * Find all public applications - doesn't matter if user is anonymous, because these apps are public - */ @NonEmptyMono @SuppressWarnings("ReactiveStreamsNullableInLambdaInTransform") - public Mono> getPublicApplicationIds(Collection applicationIds) { - - return repository.findByPublicToAllIsTrueAndIdIn(applicationIds) - .map(HasIdAndAuditing::getId) - .collect(Collectors.toSet()); - } - + Mono> getPublicApplicationIds(Collection applicationIds); - /** - * Find all private applications for viewing. - */ @NonEmptyMono @SuppressWarnings("ReactiveStreamsNullableInLambdaInTransform") - public Mono> getPrivateApplicationIds(Collection applicationIds) { - // TODO: in 2.4.0 we need to check whether the app was published or not - return repository.findByIdIn(applicationIds) - .map(HasIdAndAuditing::getId) - .collect(Collectors.toSet()); - } - - - /** - * Find all marketplace applications - filter based on whether user is anonymous and whether it's a private marketplace - */ + Mono> getPrivateApplicationIds(Collection applicationIds); + @NonEmptyMono @SuppressWarnings("ReactiveStreamsNullableInLambdaInTransform") - public Mono> getPublicMarketplaceApplicationIds(Collection applicationIds, boolean isAnonymous, boolean isPrivateMarketplace) { - - if ((isAnonymous && !isPrivateMarketplace) || !isAnonymous) - { - return repository.findByPublicToAllIsTrueAndPublicToMarketplaceIsTrueAndIdIn(applicationIds) - .map(HasIdAndAuditing::getId) - .collect(Collectors.toSet()); - } - return Mono.empty(); - } + Mono> getPublicMarketplaceApplicationIds(Collection applicationIds, boolean isAnonymous, boolean isPrivateMarketplace); - /** - * Find all agency applications - */ @NonEmptyMono @SuppressWarnings("ReactiveStreamsNullableInLambdaInTransform") - public Mono> getPublicAgencyApplicationIds(Collection applicationIds) { - - return repository.findByPublicToAllIsTrueAndAgencyProfileIsTrueAndIdIn(applicationIds) - .map(HasIdAndAuditing::getId) - .collect(Collectors.toSet()); - } + Mono> getPublicAgencyApplicationIds(Collection applicationIds); - public Flux findAll() { - return repository.findAll(); - } + Flux findAll(); } diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/application/service/ApplicationServiceImpl.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/application/service/ApplicationServiceImpl.java new file mode 100644 index 000000000..a7224e946 --- /dev/null +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/application/service/ApplicationServiceImpl.java @@ -0,0 +1,307 @@ +package org.lowcoder.domain.application.service; + + +import static org.lowcoder.domain.application.ApplicationUtil.getDependentModulesFromDsl; + +import java.util.*; +import java.util.stream.Collectors; + +import lombok.RequiredArgsConstructor; +import org.lowcoder.domain.application.model.Application; +import org.lowcoder.domain.application.model.ApplicationRequestType; +import org.lowcoder.domain.application.model.ApplicationStatus; +import org.lowcoder.domain.application.repository.ApplicationRepository; +import org.lowcoder.domain.permission.model.ResourceRole; +import org.lowcoder.domain.permission.service.ResourcePermissionService; +import org.lowcoder.infra.annotation.NonEmptyMono; +import org.lowcoder.infra.mongo.MongoUpsertHelper; +import org.lowcoder.sdk.constants.FieldName; +import org.lowcoder.sdk.exception.BizError; +import org.lowcoder.sdk.exception.BizException; +import org.lowcoder.sdk.models.HasIdAndAuditing; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; + +import lombok.extern.slf4j.Slf4j; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +@RequiredArgsConstructor +@Service +@Slf4j +public class ApplicationServiceImpl implements ApplicationService { + + private final MongoUpsertHelper mongoUpsertHelper; + private final ResourcePermissionService resourcePermissionService; + private final ApplicationRepository repository; + + @Override + public Mono findById(String id) { + if (id == null) { + return Mono.error(new BizException(BizError.INVALID_PARAMETER, "INVALID_PARAMETER", FieldName.ID)); + } + + return repository.findByIdWithDsl(id) + .switchIfEmpty(Mono.error(new BizException(BizError.NO_RESOURCE_FOUND, "CANT_FIND_APPLICATION", id))); + } + + @Override + public Mono findByIdWithoutDsl(String id) { + if (id == null) { + return Mono.error(new BizException(BizError.INVALID_PARAMETER, "INVALID_PARAMETER", FieldName.ID)); + } + + return repository.findById(id) + .switchIfEmpty(Mono.error(new BizException(BizError.NO_RESOURCE_FOUND, "CANT_FIND_APPLICATION", id))); + } + + @Override + public Mono updateById(String applicationId, Application application) { + if (applicationId == null) { + return Mono.error(new BizException(BizError.INVALID_PARAMETER, "INVALID_PARAMETER", FieldName.ID)); + } + + return mongoUpsertHelper.updateById(application, applicationId); + } + + + @Override + public Mono updatePublishedApplicationDSL(String applicationId, Map applicationDSL) { + Application application = Application.builder().publishedApplicationDSL(applicationDSL).build(); + return mongoUpsertHelper.updateById(application, applicationId); + } + + @Override + public Mono publish(String applicationId) { + return findById(applicationId) + .flatMap(newApplication -> { // copy editingApplicationDSL to publishedApplicationDSL + Map editingApplicationDSL = newApplication.getEditingApplicationDSL(); + return updatePublishedApplicationDSL(applicationId, editingApplicationDSL) + .thenReturn(newApplication); + }); + } + + @Override + public Mono create(Application newApplication, String visitorId) { + return repository.save(newApplication) + .delayUntil(app -> resourcePermissionService.addApplicationPermissionToUser(app.getId(), visitorId, ResourceRole.OWNER)); + } + + /** + * If you don't need dsl, please use {@link #findByOrganizationIdWithoutDsl(String)} + */ + @Override + public Flux findByOrganizationIdWithDsl(String organizationId) { + return repository.findByOrganizationIdWithDsl(organizationId); + } + + @Override + public Flux findByOrganizationIdWithoutDsl(String organizationId) { + return repository.findByOrganizationId(organizationId); + } + + @Override + public Flux findAllMarketplaceApps() { + return repository.findByPublicToAllIsTrueAndPublicToMarketplaceIsTrue(); + } + + @Override + public Flux findAllAgencyProfileApps() { + return repository.findByPublicToAllIsTrueAndAgencyProfileIsTrue(); + } + + @Override + public Mono countByOrganizationId(String orgId, ApplicationStatus applicationStatus) { + return repository.countByOrganizationIdAndApplicationStatus(orgId, applicationStatus); + } + + @Override + public Flux findByIdIn(List applicationIds) { + return repository.findByIdIn(applicationIds); + } + + @Override + public Mono> getAllDependentModulesFromApplicationId(String applicationId, boolean viewMode) { + return findById(applicationId) + .flatMap(app -> getAllDependentModulesFromApplication(app, viewMode)); + } + + @Override + public Mono> getAllDependentModulesFromApplication(Application application, boolean viewMode) { + Map dsl = viewMode ? application.getLiveApplicationDsl() : application.getEditingApplicationDSL(); + return getAllDependentModulesFromDsl(dsl); + } + + @Override + public Mono> getAllDependentModulesFromDsl(Map dsl) { + Set circularDependencyCheckSet = Sets.newHashSet(); + return Mono.just(getDependentModulesFromDsl(dsl)) + .doOnNext(circularDependencyCheckSet::addAll) + .flatMapMany(moduleSet -> findByIdIn(Lists.newArrayList(moduleSet))) + .onErrorContinue((e, i) -> log.warn("get dependent modules on error continue , {}", e.getMessage())) + .expandDeep(module -> getDependentModules(module, circularDependencyCheckSet)) + .collectList(); + } + + private Flux getDependentModules(Application module, Set circularDependencyCheckSet) { + return Flux.fromIterable(module.getLiveModules()) + .filter(moduleId -> !circularDependencyCheckSet.contains(moduleId)) + .doOnNext(circularDependencyCheckSet::add) + .collectList() + .flatMapMany(this::findByIdIn) + .onErrorContinue((e, i) -> log.warn("get dependent modules on error continue , {}", e.getMessage())); + } + + @Override + public Mono setApplicationPublicToAll(String applicationId, boolean publicToAll) { + Application application = Application.builder() + .publicToAll(publicToAll) + .build(); + return mongoUpsertHelper.updateById(application, applicationId); + } + + // Falk: String title, String category, String description, String image will be set in Application Settings inside DSL by Frontend + @Override + public Mono setApplicationPublicToMarketplace(String applicationId, Boolean publicToMarketplace) { + + return findById(applicationId) + + .map(application -> { + + Map applicationDsl = application.getEditingApplicationDSL(); + + // Falk: this logic is not needed anymore, because we set Meta Data in Settings in the UI already + /* if (applicationDsl.containsKey("ui")) { + Map dataObject = (Map) applicationDsl.get("ui"); + + if(publicToMarketplace) { + Map marketplaceMeta = new HashMap<>(); + marketplaceMeta.put("title", title); + marketplaceMeta.put("description", description); + marketplaceMeta.put("category", category); + marketplaceMeta.put("image", image); + if (dataObject.containsKey("marketplaceMeta")) { + dataObject.replace("marketplaceMeta", marketplaceMeta); + } else { + dataObject.put("marketplaceMeta", marketplaceMeta); + } + } else { + dataObject.remove("marketplaceMeta"); + } + + applicationDsl.replace("ui", dataObject); + + } */ + + return Application.builder() + .publicToMarketplace(publicToMarketplace) + .editingApplicationDSL(applicationDsl) + .build(); + + }) + .flatMap(application -> mongoUpsertHelper.updateById(application, applicationId)); + + + } + + @Override + public Mono setApplicationAsAgencyProfile(String applicationId, boolean agencyProfile) { + Application application = Application.builder() + .agencyProfile(agencyProfile) + .build(); + return mongoUpsertHelper.updateById(application, applicationId); + } + + + @Override + @NonEmptyMono + @SuppressWarnings("ReactiveStreamsNullableInLambdaInTransform") + public Mono> getFilteredPublicApplicationIds(ApplicationRequestType requestType, Collection applicationIds, boolean isAnonymous, Boolean isPrivateMarketplace) { + + switch(requestType) + { + case PUBLIC_TO_ALL: + if (isAnonymous) + { + return getPublicApplicationIds(applicationIds); + } + else + { + return getPrivateApplicationIds(applicationIds); + } + case PUBLIC_TO_MARKETPLACE: + return getPublicMarketplaceApplicationIds(applicationIds, isAnonymous, isPrivateMarketplace); + case AGENCY_PROFILE: + return getPublicAgencyApplicationIds(applicationIds); + default: + return Mono.empty(); + } + } + + + /** + * Find all public applications - doesn't matter if user is anonymous, because these apps are public + */ + @Override + @NonEmptyMono + @SuppressWarnings("ReactiveStreamsNullableInLambdaInTransform") + public Mono> getPublicApplicationIds(Collection applicationIds) { + + return repository.findByPublicToAllIsTrueAndIdIn(applicationIds) + .map(HasIdAndAuditing::getId) + .collect(Collectors.toSet()); + } + + + /** + * Find all private applications for viewing. + */ + @Override + @NonEmptyMono + @SuppressWarnings("ReactiveStreamsNullableInLambdaInTransform") + public Mono> getPrivateApplicationIds(Collection applicationIds) { + // TODO: in 2.4.0 we need to check whether the app was published or not + return repository.findByIdIn(applicationIds) + .map(HasIdAndAuditing::getId) + .collect(Collectors.toSet()); + } + + + /** + * Find all marketplace applications - filter based on whether user is anonymous and whether it's a private marketplace + */ + @Override + @NonEmptyMono + @SuppressWarnings("ReactiveStreamsNullableInLambdaInTransform") + public Mono> getPublicMarketplaceApplicationIds(Collection applicationIds, boolean isAnonymous, boolean isPrivateMarketplace) { + + if ((isAnonymous && !isPrivateMarketplace) || !isAnonymous) + { + return repository.findByPublicToAllIsTrueAndPublicToMarketplaceIsTrueAndIdIn(applicationIds) + .map(HasIdAndAuditing::getId) + .collect(Collectors.toSet()); + } + return Mono.empty(); + } + + /** + * Find all agency applications + */ + @Override + @NonEmptyMono + @SuppressWarnings("ReactiveStreamsNullableInLambdaInTransform") + public Mono> getPublicAgencyApplicationIds(Collection applicationIds) { + + return repository.findByPublicToAllIsTrueAndAgencyProfileIsTrueAndIdIn(applicationIds) + .map(HasIdAndAuditing::getId) + .collect(Collectors.toSet()); + } + + @Override + public Flux findAll() { + return repository.findAll(); + } +} diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/application/service/impl/ApplicationHistorySnapshotServiceImpl.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/application/service/impl/ApplicationHistorySnapshotServiceImpl.java index 81e56adc1..647dfe908 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/application/service/impl/ApplicationHistorySnapshotServiceImpl.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/application/service/impl/ApplicationHistorySnapshotServiceImpl.java @@ -7,6 +7,7 @@ import java.util.List; import java.util.Map; +import lombok.RequiredArgsConstructor; import org.lowcoder.domain.application.model.ApplicationHistorySnapshot; import org.lowcoder.domain.application.repository.ApplicationHistorySnapshotRepository; import org.lowcoder.domain.application.service.ApplicationHistorySnapshotService; @@ -19,12 +20,11 @@ import reactor.core.publisher.Mono; -@Lazy +@RequiredArgsConstructor @Service public class ApplicationHistorySnapshotServiceImpl implements ApplicationHistorySnapshotService { - @Autowired - private ApplicationHistorySnapshotRepository repository; + private final ApplicationHistorySnapshotRepository repository; @Override public Mono createHistorySnapshot(String applicationId, Map dsl, Map context, String userId) { diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/authentication/AuthenticationServiceImpl.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/authentication/AuthenticationServiceImpl.java index 703253a4b..79be4a4d5 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/authentication/AuthenticationServiceImpl.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/authentication/AuthenticationServiceImpl.java @@ -1,5 +1,6 @@ package org.lowcoder.domain.authentication; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.lowcoder.domain.organization.service.OrgMemberService; import org.lowcoder.domain.organization.service.OrganizationService; @@ -22,19 +23,14 @@ import static org.lowcoder.sdk.util.ExceptionUtils.ofError; @Slf4j +@RequiredArgsConstructor @Service public class AuthenticationServiceImpl implements AuthenticationService { - @Autowired - private OrganizationService organizationService; - - @Autowired - private OrgMemberService orgMemberService; - - @Autowired - private CommonConfig commonConfig; - @Autowired - private AuthProperties authProperties; + private final OrganizationService organizationService; + private final OrgMemberService orgMemberService; + private final CommonConfig commonConfig; + private final AuthProperties authProperties; @Override public Mono findAuthConfigByAuthId(String orgId, String authId) { diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/datasource/service/impl/ClientBasedConnectionPool.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/datasource/service/impl/ClientBasedConnectionPool.java index 3f82d69d8..ca0f9f793 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/datasource/service/impl/ClientBasedConnectionPool.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/datasource/service/impl/ClientBasedConnectionPool.java @@ -6,6 +6,7 @@ import jakarta.annotation.Nonnull; import jakarta.annotation.Nullable; import jakarta.annotation.PostConstruct; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.lowcoder.domain.datasource.model.ClientBasedDatasourceConnectionHolder; @@ -42,6 +43,7 @@ * and their status management, so these clients will be cached and invalidated once datasource is updated. */ @Slf4j +@RequiredArgsConstructor @Service public class ClientBasedConnectionPool implements DatasourceConnectionPool { @@ -55,10 +57,8 @@ public class ClientBasedConnectionPool implements DatasourceConnectionPool { ); private static final Map HIKARI_PERF_WRAPPER_MAP = new ConcurrentHashMap<>(); - @Autowired - private DatasourceMetaInfoService datasourceMetaInfoService; - @Autowired - private PerfHelper perfHelper; + private final DatasourceMetaInfoService datasourceMetaInfoService; + private final PerfHelper perfHelper; @PostConstruct public void init() { diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/datasource/service/impl/DatasourceConnectionPoolFacade.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/datasource/service/impl/DatasourceConnectionPoolFacade.java index cb0d6be25..35e6a2e3a 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/datasource/service/impl/DatasourceConnectionPoolFacade.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/datasource/service/impl/DatasourceConnectionPoolFacade.java @@ -1,6 +1,7 @@ package org.lowcoder.domain.datasource.service.impl; import jakarta.annotation.PostConstruct; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.lowcoder.domain.datasource.model.Datasource; import org.lowcoder.domain.datasource.model.DatasourceConnectionHolder; @@ -25,15 +26,13 @@ import static org.lowcoder.domain.plugin.DatasourceMetaInfoConstants.REST_API; @Primary +@RequiredArgsConstructor @Service @Slf4j public class DatasourceConnectionPoolFacade implements DatasourceConnectionPool { - @Autowired - private List pools; - - @Autowired - private DatasourceMetaInfoService metaInfoService; + private final List pools; + private final DatasourceMetaInfoService metaInfoService; private Map, DatasourceConnectionPool> poolMap; diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/datasource/service/impl/TokenBasedConnectionPool.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/datasource/service/impl/TokenBasedConnectionPool.java index 51442bf49..8095820ce 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/datasource/service/impl/TokenBasedConnectionPool.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/datasource/service/impl/TokenBasedConnectionPool.java @@ -5,6 +5,7 @@ import static org.lowcoder.sdk.exception.BizError.PLUGIN_CREATE_CONNECTION_FAILED; import static org.lowcoder.sdk.util.ExceptionUtils.deferredError; +import lombok.RequiredArgsConstructor; import org.lowcoder.domain.datasource.model.Datasource; import org.lowcoder.domain.datasource.model.DatasourceConnectionHolder; import org.lowcoder.domain.datasource.model.TokenBasedConnection; @@ -20,15 +21,13 @@ import lombok.extern.slf4j.Slf4j; import reactor.core.publisher.Mono; +@RequiredArgsConstructor @Service @Slf4j public class TokenBasedConnectionPool implements DatasourceConnectionPool { - @Autowired - private DatasourceMetaInfoService datasourceMetaInfoService; - - @Autowired - private TokenBasedConnectionRepository connectionRepository; + private final DatasourceMetaInfoService datasourceMetaInfoService; + private final TokenBasedConnectionRepository connectionRepository; @Override public Mono getOrCreateConnection(Datasource datasource) { diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/folder/service/FolderElementRelationService.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/folder/service/FolderElementRelationService.java index fc8696739..ca778379a 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/folder/service/FolderElementRelationService.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/folder/service/FolderElementRelationService.java @@ -1,39 +1,17 @@ package org.lowcoder.domain.folder.service; -import static org.lowcoder.infra.birelation.BiRelationBizType.FOLDER_ELEMENT; - -import java.util.List; - import org.lowcoder.domain.folder.model.FolderElement; -import org.lowcoder.infra.birelation.BiRelationBizType; -import org.lowcoder.infra.birelation.BiRelationService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; -@Service -public class FolderElementRelationService { - - @Autowired - private BiRelationService biRelationService; +import java.util.List; - public Mono deleteByFolderIds(List folderIds) { - return biRelationService.removeAllBiRelations(FOLDER_ELEMENT, folderIds); - } +public interface FolderElementRelationService { + Mono deleteByFolderIds(List folderIds); - public Mono deleteByElementId(String elementId) { - return biRelationService.removeAllBiRelationsByTargetId(FOLDER_ELEMENT, elementId); - } + Mono deleteByElementId(String elementId); - public Mono create(String folderId, String elementId) { - return biRelationService.addBiRelation(BiRelationBizType.FOLDER_ELEMENT, folderId, elementId, null, null) - .then(); - } + Mono create(String folderId, String elementId); - public Flux getByElementIds(List elementIds) { - return biRelationService.getByTargetIds(BiRelationBizType.FOLDER_ELEMENT, elementIds) - .map(biRelation -> new FolderElement(biRelation.getSourceId(), biRelation.getTargetId())); - } + Flux getByElementIds(List elementIds); } diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/folder/service/FolderElementRelationServiceImpl.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/folder/service/FolderElementRelationServiceImpl.java new file mode 100644 index 000000000..ec0aa6b0c --- /dev/null +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/folder/service/FolderElementRelationServiceImpl.java @@ -0,0 +1,44 @@ +package org.lowcoder.domain.folder.service; + +import static org.lowcoder.infra.birelation.BiRelationBizType.FOLDER_ELEMENT; + +import java.util.List; + +import lombok.RequiredArgsConstructor; +import org.lowcoder.domain.folder.model.FolderElement; +import org.lowcoder.infra.birelation.BiRelationBizType; +import org.lowcoder.infra.birelation.BiRelationService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +@RequiredArgsConstructor +@Service +public class FolderElementRelationServiceImpl implements FolderElementRelationService { + + private final BiRelationService biRelationService; + + @Override + public Mono deleteByFolderIds(List folderIds) { + return biRelationService.removeAllBiRelations(FOLDER_ELEMENT, folderIds); + } + + @Override + public Mono deleteByElementId(String elementId) { + return biRelationService.removeAllBiRelationsByTargetId(FOLDER_ELEMENT, elementId); + } + + @Override + public Mono create(String folderId, String elementId) { + return biRelationService.addBiRelation(BiRelationBizType.FOLDER_ELEMENT, folderId, elementId, null, null) + .then(); + } + + @Override + public Flux getByElementIds(List elementIds) { + return biRelationService.getByTargetIds(BiRelationBizType.FOLDER_ELEMENT, elementIds) + .map(biRelation -> new FolderElement(biRelation.getSourceId(), biRelation.getTargetId())); + } +} diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/folder/service/FolderService.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/folder/service/FolderService.java index c0e9a9bac..1ac2d5e6f 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/folder/service/FolderService.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/folder/service/FolderService.java @@ -1,67 +1,21 @@ package org.lowcoder.domain.folder.service; -import static org.lowcoder.sdk.exception.BizError.NO_RESOURCE_FOUND; - -import java.util.Collection; - import org.lowcoder.domain.folder.model.Folder; -import org.lowcoder.domain.folder.repository.FolderRepository; -import org.lowcoder.infra.mongo.MongoUpsertHelper; -import org.lowcoder.sdk.constants.FieldName; -import org.lowcoder.sdk.exception.BizError; -import org.lowcoder.sdk.exception.BizException; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; -@Service -public class FolderService { - - @Autowired - private FolderRepository repository; - - @Autowired - private MongoUpsertHelper mongoUpsertHelper; - - public Mono updateById(String id, Folder resource) { - if (id == null) { - return Mono.error(new BizException(BizError.INVALID_PARAMETER, "INVALID_PARAMETER", FieldName.ID)); - } - - return mongoUpsertHelper.updateById(resource, id); - } +import java.util.Collection; - public Mono findById(String id) { - if (id == null) { - return Mono.error(new BizException(BizError.INVALID_PARAMETER, "INVALID_PARAMETER", FieldName.ID)); - } +public interface FolderService { + Mono updateById(String id, Folder resource); - return repository.findById(id) - .switchIfEmpty(Mono.error(new BizException(BizError.NO_RESOURCE_FOUND, "FOLDER_NOT_FOUND", id))); - } + Mono findById(String id); - public Mono create(Folder folder) { - return repository.save(folder); - } + Mono create(Folder folder); - public Flux findByOrganizationId(String organizationId) { - return repository.findByOrganizationId(organizationId); - } + Flux findByOrganizationId(String organizationId); - public Mono deleteAllById(Collection ids) { - return repository.deleteAllById(ids); - } + Mono deleteAllById(Collection ids); - public Mono exist(String id) { - return findById(id) - .hasElement() - .onErrorResume(throwable -> { - if (throwable instanceof BizException bizException && bizException.getError() == NO_RESOURCE_FOUND) { - return Mono.just(false); - } - return Mono.error(throwable); - }); - } + Mono exist(String id); } diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/folder/service/FolderServiceImpl.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/folder/service/FolderServiceImpl.java new file mode 100644 index 000000000..2ad876946 --- /dev/null +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/folder/service/FolderServiceImpl.java @@ -0,0 +1,72 @@ +package org.lowcoder.domain.folder.service; + +import static org.lowcoder.sdk.exception.BizError.NO_RESOURCE_FOUND; + +import java.util.Collection; + +import lombok.RequiredArgsConstructor; +import org.lowcoder.domain.folder.model.Folder; +import org.lowcoder.domain.folder.repository.FolderRepository; +import org.lowcoder.infra.mongo.MongoUpsertHelper; +import org.lowcoder.sdk.constants.FieldName; +import org.lowcoder.sdk.exception.BizError; +import org.lowcoder.sdk.exception.BizException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +@RequiredArgsConstructor +@Service +public class FolderServiceImpl implements FolderService { + + private final FolderRepository repository; + private final MongoUpsertHelper mongoUpsertHelper; + + @Override + public Mono updateById(String id, Folder resource) { + if (id == null) { + return Mono.error(new BizException(BizError.INVALID_PARAMETER, "INVALID_PARAMETER", FieldName.ID)); + } + + return mongoUpsertHelper.updateById(resource, id); + } + + @Override + public Mono findById(String id) { + if (id == null) { + return Mono.error(new BizException(BizError.INVALID_PARAMETER, "INVALID_PARAMETER", FieldName.ID)); + } + + return repository.findById(id) + .switchIfEmpty(Mono.error(new BizException(BizError.NO_RESOURCE_FOUND, "FOLDER_NOT_FOUND", id))); + } + + @Override + public Mono create(Folder folder) { + return repository.save(folder); + } + + @Override + public Flux findByOrganizationId(String organizationId) { + return repository.findByOrganizationId(organizationId); + } + + @Override + public Mono deleteAllById(Collection ids) { + return repository.deleteAllById(ids); + } + + @Override + public Mono exist(String id) { + return findById(id) + .hasElement() + .onErrorResume(throwable -> { + if (throwable instanceof BizException bizException && bizException.getError() == NO_RESOURCE_FOUND) { + return Mono.just(false); + } + return Mono.error(throwable); + }); + } +} diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/interaction/UserApplicationInteractionService.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/interaction/UserApplicationInteractionService.java index a0b1f884f..82a172d06 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/interaction/UserApplicationInteractionService.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/interaction/UserApplicationInteractionService.java @@ -1,30 +1,12 @@ package org.lowcoder.domain.interaction; -import java.time.Instant; - -import org.lowcoder.infra.birelation.BiRelation; -import org.lowcoder.infra.birelation.BiRelationBizType; -import org.lowcoder.infra.birelation.BiRelationService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; -@Service -public class UserApplicationInteractionService { - - @Autowired - private BiRelationService biRelationService; - - public Mono upsert(String userId, String applicationId, Instant lastViewTime) { - BiRelation biRelation = new UserApplicationInteraction(userId, applicationId, lastViewTime).toBiRelation(); +import java.time.Instant; - return biRelationService.upsert(biRelation).then(); - } +public interface UserApplicationInteractionService { + Mono upsert(String userId, String applicationId, Instant lastViewTime); - public Flux findByUserId(String userId) { - return biRelationService.getBySourceId(BiRelationBizType.USER_APP_INTERACTION, userId) - .map(UserApplicationInteraction::of); - } + Flux findByUserId(String userId); } diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/interaction/UserApplicationInteractionServiceImpl.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/interaction/UserApplicationInteractionServiceImpl.java new file mode 100644 index 000000000..2e1bf5bdb --- /dev/null +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/interaction/UserApplicationInteractionServiceImpl.java @@ -0,0 +1,33 @@ +package org.lowcoder.domain.interaction; + +import java.time.Instant; + +import lombok.RequiredArgsConstructor; +import org.lowcoder.infra.birelation.BiRelation; +import org.lowcoder.infra.birelation.BiRelationBizType; +import org.lowcoder.infra.birelation.BiRelationService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +@RequiredArgsConstructor +@Service +public class UserApplicationInteractionServiceImpl implements UserApplicationInteractionService { + + private final BiRelationService biRelationService; + + @Override + public Mono upsert(String userId, String applicationId, Instant lastViewTime) { + BiRelation biRelation = new UserApplicationInteraction(userId, applicationId, lastViewTime).toBiRelation(); + + return biRelationService.upsert(biRelation).then(); + } + + @Override + public Flux findByUserId(String userId) { + return biRelationService.getBySourceId(BiRelationBizType.USER_APP_INTERACTION, userId) + .map(UserApplicationInteraction::of); + } +} diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/interaction/UserFolderInteractionService.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/interaction/UserFolderInteractionService.java index f339229d9..770b7cdf7 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/interaction/UserFolderInteractionService.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/interaction/UserFolderInteractionService.java @@ -1,32 +1,12 @@ package org.lowcoder.domain.interaction; -import java.time.Instant; - -import org.lowcoder.infra.birelation.BiRelation; -import org.lowcoder.infra.birelation.BiRelationBizType; -import org.lowcoder.infra.birelation.BiRelationService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; -/** - * relation service of user-folder - */ -@Service -public class UserFolderInteractionService { - - @Autowired - private BiRelationService biRelationService; +import java.time.Instant; - public Mono upsert(String userId, String folderId, Instant lastViewTime) { - BiRelation biRelation = new UserFolderInteraction(userId, folderId, lastViewTime).toBiRelation(); - return biRelationService.upsert(biRelation).then(); - } +public interface UserFolderInteractionService { + Mono upsert(String userId, String folderId, Instant lastViewTime); - public Flux findByUserId(String userId) { - return biRelationService.getBySourceId(BiRelationBizType.USER_FOLDER_INTERACTION, userId) - .map(UserFolderInteraction::of); - } + Flux findByUserId(String userId); } diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/interaction/UserFolderInteractionServiceImpl.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/interaction/UserFolderInteractionServiceImpl.java new file mode 100644 index 000000000..13dd8110b --- /dev/null +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/interaction/UserFolderInteractionServiceImpl.java @@ -0,0 +1,35 @@ +package org.lowcoder.domain.interaction; + +import java.time.Instant; + +import lombok.RequiredArgsConstructor; +import org.lowcoder.infra.birelation.BiRelation; +import org.lowcoder.infra.birelation.BiRelationBizType; +import org.lowcoder.infra.birelation.BiRelationService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +/** + * relation service of user-folder + */ +@RequiredArgsConstructor +@Service +public class UserFolderInteractionServiceImpl implements UserFolderInteractionService { + + private final BiRelationService biRelationService; + + @Override + public Mono upsert(String userId, String folderId, Instant lastViewTime) { + BiRelation biRelation = new UserFolderInteraction(userId, folderId, lastViewTime).toBiRelation(); + return biRelationService.upsert(biRelation).then(); + } + + @Override + public Flux findByUserId(String userId) { + return biRelationService.getBySourceId(BiRelationBizType.USER_FOLDER_INTERACTION, userId) + .map(UserFolderInteraction::of); + } +} diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/invitation/service/InvitationService.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/invitation/service/InvitationService.java index 3486575a4..ea0debec4 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/invitation/service/InvitationService.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/invitation/service/InvitationService.java @@ -1,39 +1,13 @@ package org.lowcoder.domain.invitation.service; - import jakarta.annotation.Nonnull; import org.lowcoder.domain.invitation.model.Invitation; -import org.lowcoder.domain.invitation.repository.InvitationRepository; -import org.lowcoder.domain.organization.model.MemberRole; -import org.lowcoder.domain.organization.service.OrgMemberService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Service; import reactor.core.publisher.Mono; -@Lazy -@Service -public class InvitationService { - - @Autowired - private InvitationRepository invitationRepository; - - @Autowired - private OrgMemberService orgMemberService; - - @Autowired - private InvitationRepository repository; - - public Mono create(Invitation invitation) { - return repository.save(invitation); - } - - public Mono getById(@Nonnull String invitationId) { - return invitationRepository.findById(invitationId); - } +public interface InvitationService { + Mono create(Invitation invitation); - public Mono inviteToOrg(String userId, String orgId) { - return orgMemberService.addMember(orgId, userId, MemberRole.MEMBER); - } + Mono getById(@Nonnull String invitationId); + Mono inviteToOrg(String userId, String orgId); } diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/invitation/service/InvitationServiceImpl.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/invitation/service/InvitationServiceImpl.java new file mode 100644 index 000000000..81d3e2109 --- /dev/null +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/invitation/service/InvitationServiceImpl.java @@ -0,0 +1,38 @@ +package org.lowcoder.domain.invitation.service; + + +import jakarta.annotation.Nonnull; +import lombok.RequiredArgsConstructor; +import org.lowcoder.domain.invitation.model.Invitation; +import org.lowcoder.domain.invitation.repository.InvitationRepository; +import org.lowcoder.domain.organization.model.MemberRole; +import org.lowcoder.domain.organization.service.OrgMemberService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import reactor.core.publisher.Mono; + +@RequiredArgsConstructor +@Service +public class InvitationServiceImpl implements InvitationService { + + private final InvitationRepository invitationRepository; + private final OrgMemberService orgMemberService; + private final InvitationRepository repository; + + @Override + public Mono create(Invitation invitation) { + return repository.save(invitation); + } + + @Override + public Mono getById(@Nonnull String invitationId) { + return invitationRepository.findById(invitationId); + } + + @Override + public Mono inviteToOrg(String userId, String orgId) { + return orgMemberService.addMember(orgId, userId, MemberRole.MEMBER); + } + +} diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/material/service/meta/MaterialMetaServiceImpl.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/material/service/meta/MaterialMetaServiceImpl.java index 16e23b436..0e02c704f 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/material/service/meta/MaterialMetaServiceImpl.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/material/service/meta/MaterialMetaServiceImpl.java @@ -2,6 +2,7 @@ import java.util.Map; +import lombok.RequiredArgsConstructor; import org.apache.commons.collections4.MapUtils; import org.lowcoder.domain.material.model.MaterialMeta; import org.lowcoder.domain.material.repository.MaterialMateRepository; @@ -19,14 +20,12 @@ import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +@RequiredArgsConstructor @Service public class MaterialMetaServiceImpl implements MaterialMetaService { - @Autowired - private ReactiveMongoTemplate reactiveMongoTemplate; - - @Autowired - private MaterialMateRepository repository; + private final ReactiveMongoTemplate reactiveMongoTemplate; + private final MaterialMateRepository repository; @Override public Mono existsByOrgIdAndFilename(String orgId, String filename) { diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/organization/service/OrganizationServiceImpl.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/organization/service/OrganizationServiceImpl.java index 4104ae233..21e9bcdb1 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/organization/service/OrganizationServiceImpl.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/organization/service/OrganizationServiceImpl.java @@ -1,6 +1,8 @@ package org.lowcoder.domain.organization.service; import jakarta.annotation.Nonnull; +import jakarta.annotation.PostConstruct; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.lowcoder.domain.asset.model.Asset; @@ -46,10 +48,11 @@ import static org.lowcoder.sdk.util.LocaleUtils.getMessage; @Slf4j +@RequiredArgsConstructor @Service public class OrganizationServiceImpl implements OrganizationService { - private final Conf logoMaxSizeInKb; + private Conf logoMaxSizeInKb; private static final String PASSWORD_RESET_EMAIL_TEMPLATE_DEFAULT = "

Hi, %s
" + "Here is the link to reset your password: %s
" + @@ -57,33 +60,19 @@ public class OrganizationServiceImpl implements OrganizationService { "Regards,
" + "The Lowcoder Team

"; - @Autowired - private AssetRepository assetRepository; - - @Autowired - private AssetService assetService; - - @Lazy - @Autowired - private OrgMemberService orgMemberService; - - @Autowired - private MongoUpsertHelper mongoUpsertHelper; - - @Autowired - private OrganizationRepository repository; - - @Autowired - private GroupService groupService; - - @Autowired - private ApplicationContext applicationContext; - - @Autowired - private CommonConfig commonConfig; - - @Autowired - public OrganizationServiceImpl(ConfigCenter configCenter) { + private final AssetRepository assetRepository; + private final AssetService assetService; + private final OrgMemberService orgMemberService; + private final MongoUpsertHelper mongoUpsertHelper; + private final OrganizationRepository repository; + private final GroupService groupService; + private final ApplicationContext applicationContext; + private final CommonConfig commonConfig; + private final ConfigCenter configCenter; + + @PostConstruct + private void init() + { logoMaxSizeInKb = configCenter.asset().ofInteger("logoMaxSizeInKb", 300); } diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/permission/service/ApplicationPermissionHandler.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/permission/service/ApplicationPermissionHandler.java index c97c2b236..c02a6c84e 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/permission/service/ApplicationPermissionHandler.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/permission/service/ApplicationPermissionHandler.java @@ -15,6 +15,7 @@ import java.util.Map; import java.util.Set; +import lombok.RequiredArgsConstructor; import org.lowcoder.domain.application.model.Application; import org.lowcoder.domain.application.model.ApplicationRequestType; import org.lowcoder.domain.application.service.ApplicationService; @@ -22,23 +23,21 @@ import org.lowcoder.domain.permission.model.ResourcePermission; import org.lowcoder.domain.permission.model.ResourceRole; import org.lowcoder.domain.permission.model.ResourceType; -import org.lowcoder.domain.solutions.TemplateSolution; +import org.lowcoder.domain.solutions.TemplateSolutionService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; import reactor.core.publisher.Mono; -@Lazy +@RequiredArgsConstructor @Component class ApplicationPermissionHandler extends ResourcePermissionHandler { private static final ResourceRole ANONYMOUS_USER_ROLE = ResourceRole.VIEWER; - @Autowired - private ApplicationService applicationService; - @Autowired - private TemplateSolution templateSolution; + private final ApplicationService applicationService; + private final TemplateSolutionService templateSolutionService; @Override protected Mono>> getAnonymousUserPermissions(Collection resourceIds, @@ -49,7 +48,7 @@ protected Mono>> getAnonymousUserPermission Set applicationIds = newHashSet(resourceIds); return Mono.zip(applicationService.getPublicApplicationIds(applicationIds), - templateSolution.getTemplateApplicationIds(applicationIds)) + templateSolutionService.getTemplateApplicationIds(applicationIds)) .map(tuple -> { Set publicAppIds = tuple.getT1(); Set templateAppIds = tuple.getT2(); @@ -64,7 +63,7 @@ protected Mono>> getAnonymousUserPermission Set applicationIds = newHashSet(resourceIds); return Mono.zip(applicationService.getPrivateApplicationIds(applicationIds), - templateSolution.getTemplateApplicationIds(applicationIds)) + templateSolutionService.getTemplateApplicationIds(applicationIds)) .map(tuple -> { Set publicAppIds = tuple.getT1(); Set templateAppIds = tuple.getT2(); @@ -84,7 +83,7 @@ protected Mono>> getAnonymousUserApplicatio Set applicationIds = newHashSet(resourceIds); return Mono.zip(applicationService.getFilteredPublicApplicationIds(requestType, applicationIds, Boolean.TRUE, config.getMarketplace().isPrivateMode()) .defaultIfEmpty(new HashSet<>()), - templateSolution.getTemplateApplicationIds(applicationIds) + templateSolutionService.getTemplateApplicationIds(applicationIds) .defaultIfEmpty(new HashSet<>()) ).map(tuple -> { Set publicAppIds = tuple.getT1(); @@ -98,7 +97,7 @@ protected Mono>> getNonAnonymousUserApplica Collection resourceIds, ResourceAction resourceAction, ApplicationRequestType requestType) { Set applicationIds = newHashSet(resourceIds); return Mono.zip(applicationService.getFilteredPublicApplicationIds(requestType, applicationIds, Boolean.FALSE, config.getMarketplace().isPrivateMode()), - templateSolution.getTemplateApplicationIds(applicationIds)) + templateSolutionService.getTemplateApplicationIds(applicationIds)) .map(tuple -> { Set publicAppIds = tuple.getT1(); Set templateAppIds = tuple.getT2(); diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/permission/service/DatasourcePermissionHandler.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/permission/service/DatasourcePermissionHandler.java index 75e034218..cc02e1ce8 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/permission/service/DatasourcePermissionHandler.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/permission/service/DatasourcePermissionHandler.java @@ -9,6 +9,7 @@ import java.util.function.Function; import java.util.stream.Collectors; +import lombok.RequiredArgsConstructor; import org.apache.commons.collections4.CollectionUtils; import org.lowcoder.domain.application.model.ApplicationRequestType; import org.lowcoder.domain.datasource.model.Datasource; @@ -25,14 +26,13 @@ import reactor.core.publisher.Mono; -@Lazy +@RequiredArgsConstructor @Component class DatasourcePermissionHandler extends ResourcePermissionHandler { private static final ResourceRole SYSTEM_STATIC_DATASOURCE_USER_ROLE = ResourceRole.OWNER; - @Autowired - private DatasourceService datasourceService; + private final DatasourceService datasourceService; @Override protected Mono>> getAnonymousUserPermissions(Collection resourceIds, ResourceAction resourceAction) { diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/permission/service/ResourcePermissionService.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/permission/service/ResourcePermissionService.java index 13900333b..9e2154cbc 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/permission/service/ResourcePermissionService.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/permission/service/ResourcePermissionService.java @@ -1,245 +1,75 @@ package org.lowcoder.domain.permission.service; -import static java.util.Collections.singleton; -import static org.apache.commons.collections4.SetUtils.emptyIfNull; -import static org.lowcoder.sdk.exception.BizError.INVALID_PERMISSION_OPERATION; -import static org.lowcoder.sdk.exception.BizError.NOT_AUTHORIZED; -import static org.lowcoder.sdk.util.ExceptionUtils.ofError; -import static org.lowcoder.sdk.util.ExceptionUtils.ofException; +import jakarta.annotation.Nullable; +import org.lowcoder.domain.application.model.ApplicationRequestType; +import org.lowcoder.domain.permission.model.*; +import org.lowcoder.infra.annotation.NonEmptyMono; +import org.lowcoder.infra.annotation.PossibleEmptyMono; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; import java.util.Collection; -import java.util.Collections; -import java.util.Comparator; import java.util.List; import java.util.Map; -import java.util.Map.Entry; import java.util.Set; -import jakarta.annotation.Nullable; -import jakarta.validation.constraints.NotNull; +public interface ResourcePermissionService { + Mono>> getByResourceTypeAndResourceIds(ResourceType resourceType, + Collection resourceIds); -import org.apache.commons.collections4.CollectionUtils; -import org.lowcoder.domain.application.model.ApplicationRequestType; -import org.lowcoder.domain.permission.model.ResourceAction; -import org.lowcoder.domain.permission.model.ResourceHolder; -import org.lowcoder.domain.permission.model.ResourcePermission; -import org.lowcoder.domain.permission.model.ResourceRole; -import org.lowcoder.domain.permission.model.ResourceType; -import org.lowcoder.domain.permission.model.UserPermissionOnResourceStatus; -import org.lowcoder.infra.annotation.NonEmptyMono; -import org.lowcoder.infra.annotation.PossibleEmptyMono; -import org.lowcoder.sdk.exception.BizException; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Lazy; -import org.springframework.stereotype.Service; + @NonEmptyMono + Mono> getByResourceTypeAndResourceId(ResourceType resourceType, String resourceId); -import com.google.common.collect.HashMultimap; -import com.google.common.collect.Multimap; + @NonEmptyMono + Mono> getByApplicationId(String applicationId); -import reactor.core.publisher.Flux; -import reactor.core.publisher.Mono; + @NonEmptyMono + Mono> getByDataSourceId(String dataSourceId); -@Service -public class ResourcePermissionService { + Mono insertBatchPermission(ResourceType resourceType, String resourceId, @Nullable Set userIds, + @Nullable Set groupIds, ResourceRole role); - @Autowired - private ResourcePermissionRepository repository; + Mono addDataSourcePermissionToUser(String dataSourceId, + String userId, + ResourceRole role); - @Lazy - @Autowired - private ApplicationPermissionHandler applicationPermissionHandler; + Mono addApplicationPermissionToUser(String applicationId, + String userId, + ResourceRole role); - @Lazy - @Autowired - private DatasourcePermissionHandler datasourcePermissionHandler; + Mono addApplicationPermissionToGroup(String applicationId, + String groupId, + ResourceRole role); - public Mono>> getByResourceTypeAndResourceIds(ResourceType resourceType, - Collection resourceIds) { - return repository.getByResourceTypeAndResourceIds(resourceType, resourceIds); - } + Mono getById(String permissionId); - @NonEmptyMono - public Mono> getByResourceTypeAndResourceId(ResourceType resourceType, String resourceId) { - return repository.getByResourceTypeAndResourceId(resourceType, resourceId); - } + Mono removeById(String permissionId); - @NonEmptyMono - public Mono> getByApplicationId(String applicationId) { - return getByResourceTypeAndResourceId(ResourceType.APPLICATION, applicationId); - } + Mono updateRoleById(String permissionId, ResourceRole role); - @NonEmptyMono - public Mono> getByDataSourceId(String dataSourceId) { - return getByResourceTypeAndResourceId(ResourceType.DATASOURCE, dataSourceId); - } - - public Mono insertBatchPermission(ResourceType resourceType, String resourceId, @Nullable Set userIds, - @Nullable Set groupIds, ResourceRole role) { - if (CollectionUtils.isEmpty(userIds) && CollectionUtils.isEmpty(groupIds)) { - return Mono.empty(); - } - return repository.insertBatchPermission(resourceType, resourceId, buildResourceHolders(emptyIfNull(userIds), emptyIfNull(groupIds)), role); - } - - private Multimap buildResourceHolders(@NotNull Set userIds, @NotNull Set groupIds) { - HashMultimap result = HashMultimap.create(); - for (String userId : userIds) { - result.put(ResourceHolder.USER, userId); - } - for (String groupId : groupIds) { - result.put(ResourceHolder.GROUP, groupId); - } - return result; - } - - @SuppressWarnings("SameParameterValue") - Mono addPermission(ResourceType resourceType, String resourceId, - ResourceHolder holderType, String holderId, - ResourceRole resourceRole) { - return repository.addPermission(resourceType, resourceId, holderType, holderId, resourceRole); - } - - public Mono addDataSourcePermissionToUser(String dataSourceId, - String userId, - ResourceRole role) { - return addPermission(ResourceType.DATASOURCE, dataSourceId, ResourceHolder.USER, userId, role); - } - - public Mono addApplicationPermissionToUser(String applicationId, - String userId, - ResourceRole role) { - return addPermission(ResourceType.APPLICATION, applicationId, ResourceHolder.USER, userId, role); - } - - public Mono addApplicationPermissionToGroup(String applicationId, - String groupId, - ResourceRole role) { - return addPermission(ResourceType.APPLICATION, applicationId, ResourceHolder.GROUP, groupId, role); - } - - public Mono getById(String permissionId) { - return repository.getById(permissionId); - } - - public Mono removeById(String permissionId) { - return repository.removePermissionById(permissionId); - } - - public Mono updateRoleById(String permissionId, ResourceRole role) { - return repository.updatePermissionRoleById(permissionId, role); - } - - /** - * @return map key: resourceId, value: all permissions user have for this resource - */ - private Mono>> getAllMatchingPermissions(String userId, - Collection resourceIds, - ResourceAction resourceAction) { - ResourceType resourceType = resourceAction.getResourceType(); - var resourcePermissionHandler = getResourcePermissionHandler(resourceType); - return resourcePermissionHandler.getAllMatchingPermissions(userId, resourceIds, resourceAction); - } - - private ResourcePermissionHandler getResourcePermissionHandler(ResourceType resourceType) { - if (resourceType == ResourceType.DATASOURCE) { - return datasourcePermissionHandler; - } - - if (resourceType == ResourceType.APPLICATION) { - return applicationPermissionHandler; - } - - throw ofException(INVALID_PERMISSION_OPERATION, "INVALID_PERMISSION_OPERATION", resourceType); - } - - public Flux filterResourceWithPermission(String userId, Collection resourceIds, ResourceAction resourceAction) { - return getAllMatchingPermissions(userId, resourceIds, resourceAction) - .flatMapIterable(Map::entrySet) - .filter(entry -> CollectionUtils.isNotEmpty(entry.getValue())) - .map(Entry::getKey); - } - - public Mono checkResourcePermissionWithError(String userId, String resourceId, ResourceAction action) { - return getAllMatchingPermissions(userId, singleton(resourceId), action) - .flatMap(map -> { - List resourcePermissions = map.get(resourceId); - if (CollectionUtils.isNotEmpty(resourcePermissions)) { - return Mono.empty(); - } - return Mono.error(new BizException(NOT_AUTHORIZED, "NOT_AUTHORIZED")); - }); - } + Flux filterResourceWithPermission(String userId, Collection resourceIds, ResourceAction resourceAction); + + Mono checkResourcePermissionWithError(String userId, String resourceId, ResourceAction action); @PossibleEmptyMono - public Mono getMaxMatchingPermission(String userId, String resourceId, ResourceAction resourceAction) { - return getMaxMatchingPermission(userId, Collections.singleton(resourceId), resourceAction) - .flatMap(map -> { - ResourcePermission resourcePermission = map.get(resourceId); - if (resourcePermission == null) { - return Mono.empty(); - } - return Mono.just(resourcePermission); - }); - } - - /** - * If current user has enough permissions for all resources. - */ - public Mono haveAllEnoughPermissions(String userId, Collection resourceIds, ResourceAction resourceAction) { - return getMaxMatchingPermission(userId, resourceIds, resourceAction) - .map(map -> map.keySet().containsAll(resourceIds)); - } - - public Mono> getMaxMatchingPermission(String userId, - Collection resourceIds, ResourceAction resourceAction) { - return getAllMatchingPermissions(userId, resourceIds, resourceAction) - .flatMapIterable(Map::entrySet) - .filter(it -> CollectionUtils.isNotEmpty(it.getValue())) - .collectMap(Entry::getKey, entry -> getMaxRole(entry.getValue())); - } - - @SuppressWarnings("OptionalGetWithoutIsPresent") - private ResourcePermission getMaxRole(List permissions) { - return permissions.stream() - .max(Comparator.comparingInt(it -> it.getResourceRole().getRoleWeight())) - .get(); - } - - public Mono checkAndReturnMaxPermission(String userId, String resourceId, ResourceAction resourceAction) { - return getMaxMatchingPermission(userId, Collections.singleton(resourceId), resourceAction) - .flatMap(permissionMap -> { - if (!permissionMap.containsKey(resourceId)) { - return ofError(NOT_AUTHORIZED, "NOT_AUTHORIZED"); - } - return Mono.just(permissionMap.get(resourceId)); - }); - } - - public Mono checkUserPermissionStatusOnResource - (String userId, String resourceId, ResourceAction resourceAction) { - ResourceType resourceType = resourceAction.getResourceType(); - var resourcePermissionHandler = getResourcePermissionHandler(resourceType); - return resourcePermissionHandler.checkUserPermissionStatusOnResource(userId, resourceId, resourceAction); - } - - public Mono checkUserPermissionStatusOnApplication - (String userId, String resourceId, ResourceAction resourceAction, ApplicationRequestType requestType) { - ResourceType resourceType = resourceAction.getResourceType(); - var resourcePermissionHandler = getResourcePermissionHandler(resourceType); - return resourcePermissionHandler.checkUserPermissionStatusOnApplication(userId, resourceId, resourceAction, requestType); -} - - - public Mono removeUserApplicationPermission(String appId, String userId) { - return repository.removePermissionBy(ResourceType.APPLICATION, appId, ResourceHolder.USER, userId); - } - - public Mono removeUserDatasourcePermission(String appId, String userId) { - return repository.removePermissionBy(ResourceType.APPLICATION, appId, ResourceHolder.USER, userId); - } - - public Mono getUserAssignedPermissionForApplication(String applicationId, String userId) { - return repository.getByResourceTypeAndResourceIdAndTargetId(ResourceType.APPLICATION, - applicationId, ResourceHolder.USER, userId); - } + Mono getMaxMatchingPermission(String userId, String resourceId, ResourceAction resourceAction); + + Mono haveAllEnoughPermissions(String userId, Collection resourceIds, ResourceAction resourceAction); + + Mono> getMaxMatchingPermission(String userId, + Collection resourceIds, ResourceAction resourceAction); + + Mono checkAndReturnMaxPermission(String userId, String resourceId, ResourceAction resourceAction); + + Mono checkUserPermissionStatusOnResource + (String userId, String resourceId, ResourceAction resourceAction); + + Mono checkUserPermissionStatusOnApplication + (String userId, String resourceId, ResourceAction resourceAction, ApplicationRequestType requestType); + + Mono removeUserApplicationPermission(String appId, String userId); + + Mono removeUserDatasourcePermission(String appId, String userId); + + Mono getUserAssignedPermissionForApplication(String applicationId, String userId); } diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/permission/service/ResourcePermissionServiceImpl.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/permission/service/ResourcePermissionServiceImpl.java new file mode 100644 index 000000000..0cff8d3c1 --- /dev/null +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/permission/service/ResourcePermissionServiceImpl.java @@ -0,0 +1,262 @@ +package org.lowcoder.domain.permission.service; + +import static java.util.Collections.singleton; +import static org.apache.commons.collections4.SetUtils.emptyIfNull; +import static org.lowcoder.sdk.exception.BizError.INVALID_PERMISSION_OPERATION; +import static org.lowcoder.sdk.exception.BizError.NOT_AUTHORIZED; +import static org.lowcoder.sdk.util.ExceptionUtils.ofError; +import static org.lowcoder.sdk.util.ExceptionUtils.ofException; + +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +import jakarta.annotation.Nullable; +import jakarta.validation.constraints.NotNull; + +import lombok.RequiredArgsConstructor; +import org.apache.commons.collections4.CollectionUtils; +import org.lowcoder.domain.application.model.ApplicationRequestType; +import org.lowcoder.domain.permission.model.ResourceAction; +import org.lowcoder.domain.permission.model.ResourceHolder; +import org.lowcoder.domain.permission.model.ResourcePermission; +import org.lowcoder.domain.permission.model.ResourceRole; +import org.lowcoder.domain.permission.model.ResourceType; +import org.lowcoder.domain.permission.model.UserPermissionOnResourceStatus; +import org.lowcoder.infra.annotation.NonEmptyMono; +import org.lowcoder.infra.annotation.PossibleEmptyMono; +import org.lowcoder.sdk.exception.BizException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; + +import com.google.common.collect.HashMultimap; +import com.google.common.collect.Multimap; + +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +@RequiredArgsConstructor +@Service +public class ResourcePermissionServiceImpl implements ResourcePermissionService { + + private final ResourcePermissionRepository repository; + private final ApplicationPermissionHandler applicationPermissionHandler; + private final DatasourcePermissionHandler datasourcePermissionHandler; + + @Override + public Mono>> getByResourceTypeAndResourceIds(ResourceType resourceType, + Collection resourceIds) { + return repository.getByResourceTypeAndResourceIds(resourceType, resourceIds); + } + + @Override + @NonEmptyMono + public Mono> getByResourceTypeAndResourceId(ResourceType resourceType, String resourceId) { + return repository.getByResourceTypeAndResourceId(resourceType, resourceId); + } + + @Override + @NonEmptyMono + public Mono> getByApplicationId(String applicationId) { + return getByResourceTypeAndResourceId(ResourceType.APPLICATION, applicationId); + } + + @Override + @NonEmptyMono + public Mono> getByDataSourceId(String dataSourceId) { + return getByResourceTypeAndResourceId(ResourceType.DATASOURCE, dataSourceId); + } + + @Override + public Mono insertBatchPermission(ResourceType resourceType, String resourceId, @Nullable Set userIds, + @Nullable Set groupIds, ResourceRole role) { + if (CollectionUtils.isEmpty(userIds) && CollectionUtils.isEmpty(groupIds)) { + return Mono.empty(); + } + return repository.insertBatchPermission(resourceType, resourceId, buildResourceHolders(emptyIfNull(userIds), emptyIfNull(groupIds)), role); + } + + private Multimap buildResourceHolders(@NotNull Set userIds, @NotNull Set groupIds) { + HashMultimap result = HashMultimap.create(); + for (String userId : userIds) { + result.put(ResourceHolder.USER, userId); + } + for (String groupId : groupIds) { + result.put(ResourceHolder.GROUP, groupId); + } + return result; + } + + @SuppressWarnings("SameParameterValue") + Mono addPermission(ResourceType resourceType, String resourceId, + ResourceHolder holderType, String holderId, + ResourceRole resourceRole) { + return repository.addPermission(resourceType, resourceId, holderType, holderId, resourceRole); + } + + @Override + public Mono addDataSourcePermissionToUser(String dataSourceId, + String userId, + ResourceRole role) { + return addPermission(ResourceType.DATASOURCE, dataSourceId, ResourceHolder.USER, userId, role); + } + + @Override + public Mono addApplicationPermissionToUser(String applicationId, + String userId, + ResourceRole role) { + return addPermission(ResourceType.APPLICATION, applicationId, ResourceHolder.USER, userId, role); + } + + @Override + public Mono addApplicationPermissionToGroup(String applicationId, + String groupId, + ResourceRole role) { + return addPermission(ResourceType.APPLICATION, applicationId, ResourceHolder.GROUP, groupId, role); + } + + @Override + public Mono getById(String permissionId) { + return repository.getById(permissionId); + } + + @Override + public Mono removeById(String permissionId) { + return repository.removePermissionById(permissionId); + } + + @Override + public Mono updateRoleById(String permissionId, ResourceRole role) { + return repository.updatePermissionRoleById(permissionId, role); + } + + /** + * @return map key: resourceId, value: all permissions user have for this resource + */ + private Mono>> getAllMatchingPermissions(String userId, + Collection resourceIds, + ResourceAction resourceAction) { + ResourceType resourceType = resourceAction.getResourceType(); + var resourcePermissionHandler = getResourcePermissionHandler(resourceType); + return resourcePermissionHandler.getAllMatchingPermissions(userId, resourceIds, resourceAction); + } + + private ResourcePermissionHandler getResourcePermissionHandler(ResourceType resourceType) { + if (resourceType == ResourceType.DATASOURCE) { + return datasourcePermissionHandler; + } + + if (resourceType == ResourceType.APPLICATION) { + return applicationPermissionHandler; + } + + throw ofException(INVALID_PERMISSION_OPERATION, "INVALID_PERMISSION_OPERATION", resourceType); + } + + @Override + public Flux filterResourceWithPermission(String userId, Collection resourceIds, ResourceAction resourceAction) { + return getAllMatchingPermissions(userId, resourceIds, resourceAction) + .flatMapIterable(Map::entrySet) + .filter(entry -> CollectionUtils.isNotEmpty(entry.getValue())) + .map(Entry::getKey); + } + + @Override + public Mono checkResourcePermissionWithError(String userId, String resourceId, ResourceAction action) { + return getAllMatchingPermissions(userId, singleton(resourceId), action) + .flatMap(map -> { + List resourcePermissions = map.get(resourceId); + if (CollectionUtils.isNotEmpty(resourcePermissions)) { + return Mono.empty(); + } + return Mono.error(new BizException(NOT_AUTHORIZED, "NOT_AUTHORIZED")); + }); + } + + @Override + @PossibleEmptyMono + public Mono getMaxMatchingPermission(String userId, String resourceId, ResourceAction resourceAction) { + return getMaxMatchingPermission(userId, Collections.singleton(resourceId), resourceAction) + .flatMap(map -> { + ResourcePermission resourcePermission = map.get(resourceId); + if (resourcePermission == null) { + return Mono.empty(); + } + return Mono.just(resourcePermission); + }); + } + + /** + * If current user has enough permissions for all resources. + */ + @Override + public Mono haveAllEnoughPermissions(String userId, Collection resourceIds, ResourceAction resourceAction) { + return getMaxMatchingPermission(userId, resourceIds, resourceAction) + .map(map -> map.keySet().containsAll(resourceIds)); + } + + @Override + public Mono> getMaxMatchingPermission(String userId, + Collection resourceIds, ResourceAction resourceAction) { + return getAllMatchingPermissions(userId, resourceIds, resourceAction) + .flatMapIterable(Map::entrySet) + .filter(it -> CollectionUtils.isNotEmpty(it.getValue())) + .collectMap(Entry::getKey, entry -> getMaxRole(entry.getValue())); + } + + @SuppressWarnings("OptionalGetWithoutIsPresent") + private ResourcePermission getMaxRole(List permissions) { + return permissions.stream() + .max(Comparator.comparingInt(it -> it.getResourceRole().getRoleWeight())) + .get(); + } + + @Override + public Mono checkAndReturnMaxPermission(String userId, String resourceId, ResourceAction resourceAction) { + return getMaxMatchingPermission(userId, Collections.singleton(resourceId), resourceAction) + .flatMap(permissionMap -> { + if (!permissionMap.containsKey(resourceId)) { + return ofError(NOT_AUTHORIZED, "NOT_AUTHORIZED"); + } + return Mono.just(permissionMap.get(resourceId)); + }); + } + + @Override + public Mono checkUserPermissionStatusOnResource + (String userId, String resourceId, ResourceAction resourceAction) { + ResourceType resourceType = resourceAction.getResourceType(); + var resourcePermissionHandler = getResourcePermissionHandler(resourceType); + return resourcePermissionHandler.checkUserPermissionStatusOnResource(userId, resourceId, resourceAction); + } + + @Override + public Mono checkUserPermissionStatusOnApplication + (String userId, String resourceId, ResourceAction resourceAction, ApplicationRequestType requestType) { + ResourceType resourceType = resourceAction.getResourceType(); + var resourcePermissionHandler = getResourcePermissionHandler(resourceType); + return resourcePermissionHandler.checkUserPermissionStatusOnApplication(userId, resourceId, resourceAction, requestType); +} + + + @Override + public Mono removeUserApplicationPermission(String appId, String userId) { + return repository.removePermissionBy(ResourceType.APPLICATION, appId, ResourceHolder.USER, userId); + } + + @Override + public Mono removeUserDatasourcePermission(String appId, String userId) { + return repository.removePermissionBy(ResourceType.APPLICATION, appId, ResourceHolder.USER, userId); + } + + @Override + public Mono getUserAssignedPermissionForApplication(String applicationId, String userId) { + return repository.getByResourceTypeAndResourceIdAndTargetId(ResourceType.APPLICATION, + applicationId, ResourceHolder.USER, userId); + } +} diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/permission/service/impl/ResourcePermissionRepositoryImpl.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/permission/service/impl/ResourcePermissionRepositoryImpl.java index 87bfa85e9..91c68b828 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/permission/service/impl/ResourcePermissionRepositoryImpl.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/permission/service/impl/ResourcePermissionRepositoryImpl.java @@ -8,6 +8,7 @@ import java.util.Map; import java.util.stream.Collectors; +import lombok.RequiredArgsConstructor; import org.lowcoder.domain.permission.model.ResourceHolder; import org.lowcoder.domain.permission.model.ResourcePermission; import org.lowcoder.domain.permission.model.ResourceRole; @@ -26,15 +27,12 @@ import reactor.core.publisher.Mono; @Slf4j -@Lazy +@RequiredArgsConstructor @Service public class ResourcePermissionRepositoryImpl implements ResourcePermissionRepository { - @Autowired - private MongoUpsertHelper mongoUpsertHelper; - - @Autowired - private BiRelationService biRelationService; + private final MongoUpsertHelper mongoUpsertHelper; + private final BiRelationService biRelationService; @Override public Mono>> getByResourceTypeAndResourceIds(ResourceType resourceType, diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/permission/solution/SuggestAppAdminSolutionService.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/permission/solution/SuggestAppAdminSolutionService.java new file mode 100644 index 000000000..120172b9b --- /dev/null +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/permission/solution/SuggestAppAdminSolutionService.java @@ -0,0 +1,12 @@ +package org.lowcoder.domain.permission.solution; + +import org.lowcoder.domain.user.model.User; +import reactor.core.publisher.Mono; + +import java.util.List; + +public interface SuggestAppAdminSolutionService { + Mono> getApplicationAdminUsers(String applicationId, int limit); + + Mono getSuggestAppAdminNames(String applicationId); +} diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/permission/solution/SuggestAppAdminSolution.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/permission/solution/SuggestAppAdminSolutionServiceImpl.java similarity index 96% rename from server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/permission/solution/SuggestAppAdminSolution.java rename to server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/permission/solution/SuggestAppAdminSolutionServiceImpl.java index 1a9fd3b11..a5063416c 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/permission/solution/SuggestAppAdminSolution.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/permission/solution/SuggestAppAdminSolutionServiceImpl.java @@ -23,7 +23,7 @@ @RequiredArgsConstructor @Service -public class SuggestAppAdminSolution { +public class SuggestAppAdminSolutionServiceImpl implements SuggestAppAdminSolutionService { private static final int LIMIT_COUNT_FOR_DISPLAY_ADMIN_NAMES = 7; @@ -31,6 +31,7 @@ public class SuggestAppAdminSolution { private final UserService userService; private final ResourcePermissionService resourcePermissionService; + @Override public Mono> getApplicationAdminUsers(String applicationId, int limit) { return resourcePermissionService.getByApplicationId(applicationId) .flatMap(permissions -> getSuggestAdminIds(limit, permissions)) @@ -76,6 +77,7 @@ private Mono> getSuggestAdminIds(int limit, List getSuggestAppAdminNames(String applicationId) { return getApplicationAdminUsers(applicationId, LIMIT_COUNT_FOR_DISPLAY_ADMIN_NAMES) .map(users -> users.stream() diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/query/service/LibraryQueryRecordService.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/query/service/LibraryQueryRecordService.java index 816c12b55..4e412fd50 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/query/service/LibraryQueryRecordService.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/query/service/LibraryQueryRecordService.java @@ -1,66 +1,23 @@ package org.lowcoder.domain.query.service; -import static org.lowcoder.sdk.exception.BizError.LIBRARY_QUERY_NOT_FOUND; -import static org.lowcoder.sdk.util.ExceptionUtils.deferredError; - -import java.util.Comparator; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - import org.lowcoder.domain.query.model.LibraryQueryRecord; -import org.lowcoder.domain.query.repository.LibraryQueryRecordRepository; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - import reactor.core.publisher.Mono; -@Service -public class LibraryQueryRecordService { - - @Autowired - private LibraryQueryRecordRepository libraryQueryRecordRepository; - - public Mono insert(LibraryQueryRecord libraryQueryRecord) { - return libraryQueryRecordRepository.save(libraryQueryRecord); - } - - /** - * get all published versions - */ - public Mono> getByLibraryQueryId(String libraryQueryId) { - return libraryQueryRecordRepository.findByLibraryQueryId(libraryQueryId) - .sort(Comparator.comparing(LibraryQueryRecord::getCreatedAt).reversed()) - .collectList(); - } +import java.util.List; +import java.util.Map; - public Mono>> getByLibraryQueryIdIn(List libraryQueryIdList) { - return libraryQueryRecordRepository.findByLibraryQueryIdIn(libraryQueryIdList) - .sort(Comparator.comparing(LibraryQueryRecord::getCreatedAt).reversed()) - .collectList() - .map(libraryQueryRecords -> libraryQueryRecords.stream() - .collect(Collectors.groupingBy(LibraryQueryRecord::getLibraryQueryId))); - } +public interface LibraryQueryRecordService { + Mono insert(LibraryQueryRecord libraryQueryRecord); - public Mono getById(String id) { - return libraryQueryRecordRepository.findById(id) - .switchIfEmpty(deferredError(LIBRARY_QUERY_NOT_FOUND, "LIBRARY_QUERY_NOT_FOUND")); - } + Mono> getByLibraryQueryId(String libraryQueryId); - /** - * get the latest published version - */ - public Mono getLatestRecordByLibraryQueryId(String libraryQueryId) { - return libraryQueryRecordRepository.findTop1ByLibraryQueryIdOrderByCreatedAtDesc(libraryQueryId); - } + Mono>> getByLibraryQueryIdIn(List libraryQueryIdList); - public Mono deleteAllLibraryQueryTagByLibraryQueryId(String libraryQueryId) { - return libraryQueryRecordRepository.deleteByLibraryQueryId(libraryQueryId); - } + Mono getById(String id); - public Mono deleteById(String id) { - return libraryQueryRecordRepository.deleteById(id); - } + Mono getLatestRecordByLibraryQueryId(String libraryQueryId); + Mono deleteAllLibraryQueryTagByLibraryQueryId(String libraryQueryId); + Mono deleteById(String id); } diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/query/service/LibraryQueryRecordServiceImpl.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/query/service/LibraryQueryRecordServiceImpl.java new file mode 100644 index 000000000..1ec370eeb --- /dev/null +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/query/service/LibraryQueryRecordServiceImpl.java @@ -0,0 +1,74 @@ +package org.lowcoder.domain.query.service; + +import static org.lowcoder.sdk.exception.BizError.LIBRARY_QUERY_NOT_FOUND; +import static org.lowcoder.sdk.util.ExceptionUtils.deferredError; + +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import lombok.RequiredArgsConstructor; +import org.lowcoder.domain.query.model.LibraryQueryRecord; +import org.lowcoder.domain.query.repository.LibraryQueryRecordRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import reactor.core.publisher.Mono; + +@RequiredArgsConstructor +@Service +public class LibraryQueryRecordServiceImpl implements LibraryQueryRecordService { + + private final LibraryQueryRecordRepository libraryQueryRecordRepository; + + @Override + public Mono insert(LibraryQueryRecord libraryQueryRecord) { + return libraryQueryRecordRepository.save(libraryQueryRecord); + } + + /** + * get all published versions + */ + @Override + public Mono> getByLibraryQueryId(String libraryQueryId) { + return libraryQueryRecordRepository.findByLibraryQueryId(libraryQueryId) + .sort(Comparator.comparing(LibraryQueryRecord::getCreatedAt).reversed()) + .collectList(); + } + + @Override + public Mono>> getByLibraryQueryIdIn(List libraryQueryIdList) { + return libraryQueryRecordRepository.findByLibraryQueryIdIn(libraryQueryIdList) + .sort(Comparator.comparing(LibraryQueryRecord::getCreatedAt).reversed()) + .collectList() + .map(libraryQueryRecords -> libraryQueryRecords.stream() + .collect(Collectors.groupingBy(LibraryQueryRecord::getLibraryQueryId))); + } + + @Override + public Mono getById(String id) { + return libraryQueryRecordRepository.findById(id) + .switchIfEmpty(deferredError(LIBRARY_QUERY_NOT_FOUND, "LIBRARY_QUERY_NOT_FOUND")); + } + + /** + * get the latest published version + */ + @Override + public Mono getLatestRecordByLibraryQueryId(String libraryQueryId) { + return libraryQueryRecordRepository.findTop1ByLibraryQueryIdOrderByCreatedAtDesc(libraryQueryId); + } + + @Override + public Mono deleteAllLibraryQueryTagByLibraryQueryId(String libraryQueryId) { + return libraryQueryRecordRepository.deleteByLibraryQueryId(libraryQueryId); + } + + @Override + public Mono deleteById(String id) { + return libraryQueryRecordRepository.deleteById(id); + } + + +} diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/query/service/LibraryQueryService.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/query/service/LibraryQueryService.java index 8ec5faafe..2f1193d9f 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/query/service/LibraryQueryService.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/query/service/LibraryQueryService.java @@ -1,74 +1,28 @@ package org.lowcoder.domain.query.service; -import static org.lowcoder.sdk.exception.BizError.LIBRARY_QUERY_NOT_FOUND; -import static org.lowcoder.sdk.util.ExceptionUtils.deferredError; - -import java.util.Map; - import org.lowcoder.domain.query.model.BaseQuery; import org.lowcoder.domain.query.model.LibraryQuery; -import org.lowcoder.domain.query.model.LibraryQueryRecord; -import org.lowcoder.domain.query.repository.LibraryQueryRepository; -import org.lowcoder.infra.mongo.MongoUpsertHelper; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; -@Service -public class LibraryQueryService { - - @Autowired - private LibraryQueryRepository libraryQueryRepository; - - @Autowired - private LibraryQueryRecordService libraryQueryRecordService; - - @Autowired - private MongoUpsertHelper mongoUpsertHelper; +import java.util.Map; - public Mono getById(String libraryQueryId) { - return libraryQueryRepository.findById(libraryQueryId) - .switchIfEmpty(deferredError(LIBRARY_QUERY_NOT_FOUND, "LIBRARY_QUERY_NOT_FOUND")); - } +public interface LibraryQueryService { + Mono getById(String libraryQueryId); - public Mono getByName(String libraryQueryName) { - return libraryQueryRepository.findByName(libraryQueryName) - .switchIfEmpty(deferredError(LIBRARY_QUERY_NOT_FOUND, "LIBRARY_QUERY_NOT_FOUND")); - } + Mono getByName(String libraryQueryName); - public Flux getByOrganizationId(String organizationId) { - return libraryQueryRepository.findByOrganizationId(organizationId); - } + Flux getByOrganizationId(String organizationId); - public Mono insert(LibraryQuery libraryQuery) { - return libraryQueryRepository.save(libraryQuery); - } + Mono insert(LibraryQuery libraryQuery); - public Mono update(String libraryQueryId, LibraryQuery libraryQuery) { - return mongoUpsertHelper.updateById(libraryQuery, libraryQueryId); - } + Mono update(String libraryQueryId, LibraryQuery libraryQuery); - public Mono delete(String libraryQueryId) { - return libraryQueryRepository.deleteById(libraryQueryId); - } + Mono delete(String libraryQueryId); - public Mono getEditingBaseQueryByLibraryQueryId(String libraryQueryId) { - return getById(libraryQueryId).map(LibraryQuery::getQuery); - } + Mono getEditingBaseQueryByLibraryQueryId(String libraryQueryId); - public Mono getLiveBaseQueryByLibraryQueryId(String libraryQueryId) { - return libraryQueryRecordService.getLatestRecordByLibraryQueryId(libraryQueryId) - .map(LibraryQueryRecord::getQuery) - .switchIfEmpty(getById(libraryQueryId) - .map(LibraryQuery::getQuery)); - } + Mono getLiveBaseQueryByLibraryQueryId(String libraryQueryId); - public Mono> getLiveDSLByLibraryQueryId(String libraryQueryId) { - return libraryQueryRecordService.getLatestRecordByLibraryQueryId(libraryQueryId) - .map(LibraryQueryRecord::getLibraryQueryDSL) - .switchIfEmpty(getById(libraryQueryId) - .map(LibraryQuery::getLibraryQueryDSL)); - } + Mono> getLiveDSLByLibraryQueryId(String libraryQueryId); } diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/query/service/LibraryQueryServiceImpl.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/query/service/LibraryQueryServiceImpl.java new file mode 100644 index 000000000..7c25fa562 --- /dev/null +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/query/service/LibraryQueryServiceImpl.java @@ -0,0 +1,80 @@ +package org.lowcoder.domain.query.service; + +import static org.lowcoder.sdk.exception.BizError.LIBRARY_QUERY_NOT_FOUND; +import static org.lowcoder.sdk.util.ExceptionUtils.deferredError; + +import java.util.Map; + +import lombok.RequiredArgsConstructor; +import org.lowcoder.domain.query.model.BaseQuery; +import org.lowcoder.domain.query.model.LibraryQuery; +import org.lowcoder.domain.query.model.LibraryQueryRecord; +import org.lowcoder.domain.query.repository.LibraryQueryRepository; +import org.lowcoder.infra.mongo.MongoUpsertHelper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +@RequiredArgsConstructor +@Service +public class LibraryQueryServiceImpl implements LibraryQueryService { + + private final LibraryQueryRepository libraryQueryRepository; + private final LibraryQueryRecordService libraryQueryRecordService; + private final MongoUpsertHelper mongoUpsertHelper; + + @Override + public Mono getById(String libraryQueryId) { + return libraryQueryRepository.findById(libraryQueryId) + .switchIfEmpty(deferredError(LIBRARY_QUERY_NOT_FOUND, "LIBRARY_QUERY_NOT_FOUND")); + } + + @Override + public Mono getByName(String libraryQueryName) { + return libraryQueryRepository.findByName(libraryQueryName) + .switchIfEmpty(deferredError(LIBRARY_QUERY_NOT_FOUND, "LIBRARY_QUERY_NOT_FOUND")); + } + + @Override + public Flux getByOrganizationId(String organizationId) { + return libraryQueryRepository.findByOrganizationId(organizationId); + } + + @Override + public Mono insert(LibraryQuery libraryQuery) { + return libraryQueryRepository.save(libraryQuery); + } + + @Override + public Mono update(String libraryQueryId, LibraryQuery libraryQuery) { + return mongoUpsertHelper.updateById(libraryQuery, libraryQueryId); + } + + @Override + public Mono delete(String libraryQueryId) { + return libraryQueryRepository.deleteById(libraryQueryId); + } + + @Override + public Mono getEditingBaseQueryByLibraryQueryId(String libraryQueryId) { + return getById(libraryQueryId).map(LibraryQuery::getQuery); + } + + @Override + public Mono getLiveBaseQueryByLibraryQueryId(String libraryQueryId) { + return libraryQueryRecordService.getLatestRecordByLibraryQueryId(libraryQueryId) + .map(LibraryQueryRecord::getQuery) + .switchIfEmpty(getById(libraryQueryId) + .map(LibraryQuery::getQuery)); + } + + @Override + public Mono> getLiveDSLByLibraryQueryId(String libraryQueryId) { + return libraryQueryRecordService.getLatestRecordByLibraryQueryId(libraryQueryId) + .map(LibraryQueryRecord::getLibraryQueryDSL) + .switchIfEmpty(getById(libraryQueryId) + .map(LibraryQuery::getLibraryQueryDSL)); + } +} diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/query/service/QueryExecutionService.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/query/service/QueryExecutionService.java index 6a4d1fb02..e78f4655b 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/query/service/QueryExecutionService.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/query/service/QueryExecutionService.java @@ -1,122 +1,13 @@ package org.lowcoder.domain.query.service; -import lombok.extern.slf4j.Slf4j; import org.lowcoder.domain.datasource.model.Datasource; -import org.lowcoder.domain.datasource.model.DatasourceConnectionHolder; -import org.lowcoder.domain.datasource.service.DatasourceConnectionPool; -import org.lowcoder.domain.plugin.client.DatasourcePluginClient; -import org.lowcoder.domain.plugin.service.DatasourceMetaInfoService; -import org.lowcoder.domain.query.util.QueryTimeoutUtils; -import org.lowcoder.sdk.config.CommonConfig; -import org.lowcoder.sdk.exception.BizException; -import org.lowcoder.sdk.exception.PluginException; -import org.lowcoder.sdk.models.JsDatasourceConnectionConfig; -import org.lowcoder.sdk.models.Property; import org.lowcoder.sdk.models.QueryExecutionResult; -import org.lowcoder.sdk.query.QueryExecutionContext; import org.lowcoder.sdk.query.QueryVisitorContext; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; import reactor.core.publisher.Mono; -import java.time.Duration; -import java.util.HashMap; -import java.util.List; import java.util.Map; -import java.util.concurrent.TimeoutException; -import java.util.stream.Collectors; -import static org.lowcoder.sdk.exception.BizError.QUERY_EXECUTION_ERROR; -import static org.lowcoder.sdk.exception.PluginCommonError.QUERY_EXECUTION_TIMEOUT; -import static org.lowcoder.sdk.util.ExceptionUtils.ofException; - -@Slf4j -@Service -public class QueryExecutionService { - - @Autowired - private DatasourceConnectionPool datasourceConnectionPool; - - @Autowired - private DatasourceMetaInfoService datasourceMetaInfoService; - - @Autowired - private DatasourcePluginClient datasourcePluginClient; - - @Autowired - private CommonConfig common; - - public Mono executeQuery(Datasource datasource, Map queryConfig, Map requestParams, - String timeoutStr, QueryVisitorContext queryVisitorContext) { - - int timeoutMs = QueryTimeoutUtils.parseQueryTimeoutMs(timeoutStr, requestParams, common.getMaxQueryTimeout()); - queryConfig.putIfAbsent("timeoutMs", String.valueOf(timeoutMs)); - - return Mono.defer(() -> { - if (datasourceMetaInfoService.isJsDatasourcePlugin(datasource.getType())) { - return executeByNodeJs(datasource, queryConfig, requestParams, queryVisitorContext); - } - return executeLocally(datasource, queryConfig, requestParams, queryVisitorContext); - }) - .timeout(Duration.ofMillis(timeoutMs)) - .onErrorMap(TimeoutException.class, e -> new PluginException(QUERY_EXECUTION_TIMEOUT, "PLUGIN_EXECUTION_TIMEOUT", timeoutMs)) - .onErrorResume(PluginException.class, pluginException -> Mono.just(QueryExecutionResult.error(pluginException))) - .onErrorMap(exception -> { - if (exception instanceof BizException) { - return exception; - } - log.error("query exception", exception); - return ofException(QUERY_EXECUTION_ERROR, "QUERY_EXECUTION_ERROR", exception.getMessage()); - }); - } - - private Mono executeLocally(Datasource datasource, Map queryConfig, Map requestParams, - QueryVisitorContext queryVisitorContext) { - var queryExecutor = datasourceMetaInfoService.getQueryExecutor(datasource.getType()); - - return queryExecutor.buildQueryExecutionContextMono(datasource.getDetailConfig(), queryConfig, requestParams, queryVisitorContext) - .zipWhen(context -> datasourceConnectionPool.getOrCreateConnection(datasource)) - .flatMap(tuple -> { - QueryExecutionContext queryExecutionRequest = tuple.getT1(); - DatasourceConnectionHolder connectionHolder = tuple.getT2(); - return queryExecutor.doExecuteQuery(connectionHolder.connection(), queryExecutionRequest) - .doOnError(connectionHolder::onQueryError); - }); - } - - private Mono executeByNodeJs(Datasource datasource, Map queryConfig, Map requestParams, QueryVisitorContext queryVisitorContext) { - List> context = requestParams.entrySet() - .stream() - .map(entry -> Map.of("key", entry.getKey(), "value", entry.getValue())) - .collect(Collectors.toList()); - - //forward cookies to js datasource - List> cookies = queryVisitorContext.getCookies().entrySet() - .stream() - .map(entry -> Map.of("key", entry.getKey(), "value", entry.getValue())) - .collect(Collectors.toList()); - context.addAll(cookies); - - // forward oauth2 access token in case of oauth2(inherit from login) - - if(datasource.getDetailConfig() instanceof JsDatasourceConnectionConfig jsDatasourceConnectionConfig - && jsDatasourceConnectionConfig.isOauth2InheritFromLogin()) { - return Mono.defer(() -> injectOauth2Token(queryVisitorContext, context)) - .then(Mono.defer(() -> datasourcePluginClient.executeQuery(datasource.getType(), queryConfig, context, datasource.getDetailConfig()))); - } else { - return datasourcePluginClient.executeQuery(datasource.getType(), queryConfig, context, datasource.getDetailConfig()); - } - - - } - - private Mono injectOauth2Token(QueryVisitorContext queryVisitorContext, List> context) { - return queryVisitorContext.getAuthTokenMono() - .doOnNext(properties -> { - for (Property property : properties) { - context.add(Map.of("key" , property.getKey(), "value", property.getValue())); - } - }) - .then(); - } +public interface QueryExecutionService { + Mono executeQuery(Datasource datasource, Map queryConfig, Map requestParams, + String timeoutStr, QueryVisitorContext queryVisitorContext); } diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/query/service/QueryExecutionServiceImpl.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/query/service/QueryExecutionServiceImpl.java new file mode 100644 index 000000000..6807ebc32 --- /dev/null +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/query/service/QueryExecutionServiceImpl.java @@ -0,0 +1,117 @@ +package org.lowcoder.domain.query.service; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.lowcoder.domain.datasource.model.Datasource; +import org.lowcoder.domain.datasource.model.DatasourceConnectionHolder; +import org.lowcoder.domain.datasource.service.DatasourceConnectionPool; +import org.lowcoder.domain.plugin.client.DatasourcePluginClient; +import org.lowcoder.domain.plugin.service.DatasourceMetaInfoService; +import org.lowcoder.domain.query.util.QueryTimeoutUtils; +import org.lowcoder.sdk.config.CommonConfig; +import org.lowcoder.sdk.exception.BizException; +import org.lowcoder.sdk.exception.PluginException; +import org.lowcoder.sdk.models.JsDatasourceConnectionConfig; +import org.lowcoder.sdk.models.Property; +import org.lowcoder.sdk.models.QueryExecutionResult; +import org.lowcoder.sdk.query.QueryExecutionContext; +import org.lowcoder.sdk.query.QueryVisitorContext; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import reactor.core.publisher.Mono; + +import java.time.Duration; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeoutException; +import java.util.stream.Collectors; + +import static org.lowcoder.sdk.exception.BizError.QUERY_EXECUTION_ERROR; +import static org.lowcoder.sdk.exception.PluginCommonError.QUERY_EXECUTION_TIMEOUT; +import static org.lowcoder.sdk.util.ExceptionUtils.ofException; + +@RequiredArgsConstructor +@Slf4j +@Service +public class QueryExecutionServiceImpl implements QueryExecutionService { + + private final DatasourceConnectionPool datasourceConnectionPool; + private final DatasourceMetaInfoService datasourceMetaInfoService; + private final DatasourcePluginClient datasourcePluginClient; + private final CommonConfig common; + + @Override + public Mono executeQuery(Datasource datasource, Map queryConfig, Map requestParams, + String timeoutStr, QueryVisitorContext queryVisitorContext) { + + int timeoutMs = QueryTimeoutUtils.parseQueryTimeoutMs(timeoutStr, requestParams, common.getMaxQueryTimeout()); + queryConfig.putIfAbsent("timeoutMs", String.valueOf(timeoutMs)); + + return Mono.defer(() -> { + if (datasourceMetaInfoService.isJsDatasourcePlugin(datasource.getType())) { + return executeByNodeJs(datasource, queryConfig, requestParams, queryVisitorContext); + } + return executeLocally(datasource, queryConfig, requestParams, queryVisitorContext); + }) + .timeout(Duration.ofMillis(timeoutMs)) + .onErrorMap(TimeoutException.class, e -> new PluginException(QUERY_EXECUTION_TIMEOUT, "PLUGIN_EXECUTION_TIMEOUT", timeoutMs)) + .onErrorResume(PluginException.class, pluginException -> Mono.just(QueryExecutionResult.error(pluginException))) + .onErrorMap(exception -> { + if (exception instanceof BizException) { + return exception; + } + log.error("query exception", exception); + return ofException(QUERY_EXECUTION_ERROR, "QUERY_EXECUTION_ERROR", exception.getMessage()); + }); + } + + private Mono executeLocally(Datasource datasource, Map queryConfig, Map requestParams, + QueryVisitorContext queryVisitorContext) { + var queryExecutor = datasourceMetaInfoService.getQueryExecutor(datasource.getType()); + + return queryExecutor.buildQueryExecutionContextMono(datasource.getDetailConfig(), queryConfig, requestParams, queryVisitorContext) + .zipWhen(context -> datasourceConnectionPool.getOrCreateConnection(datasource)) + .flatMap(tuple -> { + QueryExecutionContext queryExecutionRequest = tuple.getT1(); + DatasourceConnectionHolder connectionHolder = tuple.getT2(); + return queryExecutor.doExecuteQuery(connectionHolder.connection(), queryExecutionRequest) + .doOnError(connectionHolder::onQueryError); + }); + } + + private Mono executeByNodeJs(Datasource datasource, Map queryConfig, Map requestParams, QueryVisitorContext queryVisitorContext) { + List> context = requestParams.entrySet() + .stream() + .map(entry -> Map.of("key", entry.getKey(), "value", entry.getValue())) + .collect(Collectors.toList()); + + //forward cookies to js datasource + List> cookies = queryVisitorContext.getCookies().entrySet() + .stream() + .map(entry -> Map.of("key", entry.getKey(), "value", entry.getValue())) + .collect(Collectors.toList()); + context.addAll(cookies); + + // forward oauth2 access token in case of oauth2(inherit from login) + + if(datasource.getDetailConfig() instanceof JsDatasourceConnectionConfig jsDatasourceConnectionConfig + && jsDatasourceConnectionConfig.isOauth2InheritFromLogin()) { + return Mono.defer(() -> injectOauth2Token(queryVisitorContext, context)) + .then(Mono.defer(() -> datasourcePluginClient.executeQuery(datasource.getType(), queryConfig, context, datasource.getDetailConfig()))); + } else { + return datasourcePluginClient.executeQuery(datasource.getType(), queryConfig, context, datasource.getDetailConfig()); + } + + + } + + private Mono injectOauth2Token(QueryVisitorContext queryVisitorContext, List> context) { + return queryVisitorContext.getAuthTokenMono() + .doOnNext(properties -> { + for (Property property : properties) { + context.add(Map.of("key" , property.getKey(), "value", property.getValue())); + } + }) + .then(); + } +} diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/solutions/TemplateSolutionService.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/solutions/TemplateSolutionService.java new file mode 100644 index 000000000..7576a8ed0 --- /dev/null +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/solutions/TemplateSolutionService.java @@ -0,0 +1,15 @@ +package org.lowcoder.domain.solutions; + +import org.lowcoder.domain.application.model.Application; +import org.lowcoder.infra.annotation.NonEmptyMono; +import reactor.core.publisher.Mono; + +import java.util.Collection; +import java.util.Set; + +public interface TemplateSolutionService { + Mono createFromTemplate(String templateId, String orgId, String visitorId); + + @NonEmptyMono + Mono> getTemplateApplicationIds(Collection applicationIds); +} diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/solutions/TemplateSolution.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/solutions/TemplateSolutionServiceImpl.java similarity index 98% rename from server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/solutions/TemplateSolution.java rename to server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/solutions/TemplateSolutionServiceImpl.java index a8f773b00..1279668cf 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/solutions/TemplateSolution.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/solutions/TemplateSolutionServiceImpl.java @@ -16,7 +16,6 @@ import org.lowcoder.infra.annotation.NonEmptyMono; import org.lowcoder.infra.util.TupleUtils; import org.lowcoder.sdk.util.JsonUtils; -import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -33,10 +32,9 @@ import static org.lowcoder.sdk.util.ExceptionUtils.deferredError; import static org.lowcoder.sdk.util.ExceptionUtils.ofError; -@Lazy @RequiredArgsConstructor @Service -public class TemplateSolution { +public class TemplateSolutionServiceImpl implements TemplateSolutionService { private static final int RANDOM_LENGTH = 6; @@ -44,6 +42,7 @@ public class TemplateSolution { private final DatasourceService datasourceService; private final ApplicationService applicationService; + @Override public Mono createFromTemplate(String templateId, String orgId, String visitorId) { return templateService.getById(templateId) .switchIfEmpty(deferredError(TEMPLATE_NOT_EXIST, "TEMPLATE_NOT_EXIST")) @@ -74,6 +73,7 @@ public Mono createFromTemplate(String templateId, String orgId, Str } + @Override @NonEmptyMono public Mono> getTemplateApplicationIds(Collection applicationIds) { return templateService.getByApplicationIds(applicationIds) diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/template/service/TemplateService.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/template/service/TemplateService.java index 6e2831f48..a440ade39 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/template/service/TemplateService.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/template/service/TemplateService.java @@ -1,32 +1,15 @@ package org.lowcoder.domain.template.service; -import java.util.Collection; - import org.lowcoder.domain.template.model.Template; -import org.lowcoder.domain.template.repository.TemplateRepository; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import lombok.extern.slf4j.Slf4j; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; -@Slf4j -@Service -public class TemplateService { - - @Autowired - private TemplateRepository templateRepository; +import java.util.Collection; - public Mono