Skip to content

Commit 40748c2

Browse files
authored
Merge pull request lowcoder-org#323 from lvhuichao/develop
1. feat: solve the deserialization of polymorphism in mongodb; 2. support js library
2 parents fb6908a + 26922c5 commit 40748c2

File tree

28 files changed

+377
-159
lines changed

28 files changed

+377
-159
lines changed

server/api-service/openblocks-domain/src/main/java/com/openblocks/domain/authentication/AuthenticationServiceImpl.java

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,7 @@ private Flux<FindAuthConfig> findAllAuthConfigsByDomain() {
7070
.stream()
7171
.map(abstractAuthConfig -> new FindAuthConfig(abstractAuthConfig, organization))
7272
.collect(Collectors.toList())
73-
)
74-
.doOnNext(__ -> log.info("find auth configs by domain"));
73+
);
7574
}
7675

7776
protected Flux<FindAuthConfig> findAllAuthConfigsForEnterpriseMode() {
@@ -84,15 +83,13 @@ protected Flux<FindAuthConfig> findAllAuthConfigsForEnterpriseMode() {
8483
.stream()
8584
.map(abstractAuthConfig -> new FindAuthConfig(abstractAuthConfig, organization))
8685
.collect(Collectors.toList())
87-
)
88-
.doOnNext(__ -> log.info("find auth configs for enterprise mode."));
86+
);
8987
}
9088

9189
private Flux<FindAuthConfig> findAllAuthConfigsForSaasMode() {
9290
if (commonConfig.getWorkspace().getMode() == WorkspaceMode.SAAS) {
9391
return Flux.fromIterable(authProperties.getAuthConfigs())
94-
.map(abstractAuthConfig -> new FindAuthConfig(abstractAuthConfig, null))
95-
.doOnNext(__ -> log.info("find auth configs for saas mode"));
92+
.map(abstractAuthConfig -> new FindAuthConfig(abstractAuthConfig, null));
9693
}
9794
return Flux.empty();
9895
}

server/api-service/openblocks-domain/src/main/java/com/openblocks/domain/configurations/MongoConfig.java

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,6 @@
2525
import com.mongodb.ReadConcern;
2626
import com.mongodb.ReadPreference;
2727
import com.mongodb.WriteConcern;
28-
import com.openblocks.domain.encryption.EncryptionService;
29-
import com.openblocks.domain.encryption.ModelEncryptionEventListener;
3028
import com.openblocks.domain.user.model.User;
3129
import com.openblocks.sdk.config.MaterialProperties;
3230
import com.openblocks.sdk.models.HasIdAndAuditing;
@@ -104,10 +102,4 @@ public ReactiveGridFsTemplate reactiveGridFsTemplate(ReactiveMongoDatabaseFactor
104102
public MongoTemplate mongoTemplate(MongoDatabaseFactory mongoDbFactory, MappingMongoConverter mappingMongoConverter) {
105103
return new MongoTemplate(mongoDbFactory, mappingMongoConverter);
106104
}
107-
108-
@Bean
109-
public <E> ModelEncryptionEventListener<E> encryptionMongoEventListener(EncryptionService encryptionService) {
110-
return new ModelEncryptionEventListener<>(encryptionService);
111-
}
112-
113105
}

server/api-service/openblocks-domain/src/main/java/com/openblocks/domain/encryption/DecryptRequired.java

Lines changed: 0 additions & 7 deletions
This file was deleted.

server/api-service/openblocks-domain/src/main/java/com/openblocks/domain/encryption/EncryptRequired.java

Lines changed: 0 additions & 7 deletions
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package com.openblocks.domain.mongodb;
2+
3+
public interface AfterMongodbRead {
4+
5+
void afterMongodbRead(MongodbInterceptorContext context);
6+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package com.openblocks.domain.mongodb;
2+
3+
public interface BeforeMongodbWrite {
4+
5+
void beforeMongodbWrite(MongodbInterceptorContext context);
6+
}
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,40 @@
1-
package com.openblocks.domain.encryption;
1+
package com.openblocks.domain.mongodb;
22

3+
import org.springframework.beans.factory.annotation.Autowired;
34
import org.springframework.context.event.EventListener;
45
import org.springframework.data.mongodb.core.mapping.event.AbstractMongoEventListener;
56
import org.springframework.data.mongodb.core.mapping.event.AfterConvertEvent;
67
import org.springframework.data.mongodb.core.mapping.event.BeforeConvertEvent;
8+
import org.springframework.stereotype.Component;
79

10+
import com.openblocks.domain.encryption.EncryptionService;
811
import com.openblocks.infra.mongo.MongoUpsertHelper;
912
import com.openblocks.sdk.event.BeforeSaveEvent;
1013

1114
import lombok.extern.slf4j.Slf4j;
1215

1316
@Slf4j
14-
public class ModelEncryptionEventListener<E> extends AbstractMongoEventListener<E> {
17+
@Component
18+
public class MongodbEventListener<E> extends AbstractMongoEventListener<E> {
1519

16-
private final EncryptionService encryptionService;
17-
18-
public ModelEncryptionEventListener(EncryptionService encryptionService) {
19-
this.encryptionService = encryptionService;
20-
}
20+
@Autowired
21+
private EncryptionService encryptionService;
2122

2223
@Override
2324
public void onBeforeConvert(BeforeConvertEvent<E> event) {
2425
E source = event.getSource();
2526

26-
if (source instanceof EncryptRequired encryptRequired) {
27-
encryptRequired.encrypt(encryptionService);
27+
if (source instanceof BeforeMongodbWrite beforeMongodbWrite) {
28+
beforeMongodbWrite.beforeMongodbWrite(new MongodbInterceptorContext(encryptionService));
2829
}
2930
}
3031

3132
@Override
3233
public void onAfterConvert(AfterConvertEvent<E> event) {
3334
E source = event.getSource();
3435

35-
if (source instanceof DecryptRequired decryptRequired) {
36-
decryptRequired.decrypt(encryptionService);
36+
if (source instanceof AfterMongodbRead afterMongodbRead) {
37+
afterMongodbRead.afterMongodbRead(new MongodbInterceptorContext(encryptionService));
3738
}
3839
}
3940

@@ -44,8 +45,8 @@ public void onAfterConvert(AfterConvertEvent<E> event) {
4445
public <T> void onBeforeSaveEvent(BeforeSaveEvent<T> beforeSaveEvent) {
4546
T source = beforeSaveEvent.source();
4647

47-
if (source instanceof EncryptRequired encryptRequired) {
48-
encryptRequired.encrypt(encryptionService);
48+
if (source instanceof BeforeMongodbWrite beforeMongodbWrite) {
49+
beforeMongodbWrite.beforeMongodbWrite(new MongodbInterceptorContext(encryptionService));
4950
}
5051
}
5152
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package com.openblocks.domain.mongodb;
2+
3+
import com.openblocks.domain.encryption.EncryptionService;
4+
5+
public record MongodbInterceptorContext(EncryptionService encryptionService) {
6+
}

server/api-service/openblocks-domain/src/main/java/com/openblocks/domain/organization/model/EnterpriseConnectionConfig.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,5 @@
66

77
public interface EnterpriseConnectionConfig {
88

9-
List<AbstractAuthConfig> getAuthConfigs();
9+
List<AbstractAuthConfig> getConfigs();
1010
}

server/api-service/openblocks-domain/src/main/java/com/openblocks/domain/organization/model/Organization.java

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@
1515

1616
import com.fasterxml.jackson.annotation.JsonIgnore;
1717
import com.fasterxml.jackson.annotation.JsonProperty;
18-
import com.openblocks.domain.encryption.DecryptRequired;
19-
import com.openblocks.domain.encryption.EncryptRequired;
20-
import com.openblocks.domain.encryption.EncryptionService;
18+
import com.openblocks.domain.mongodb.AfterMongodbRead;
19+
import com.openblocks.domain.mongodb.BeforeMongodbWrite;
20+
import com.openblocks.domain.mongodb.MongodbInterceptorContext;
2121
import com.openblocks.sdk.auth.AbstractAuthConfig;
2222
import com.openblocks.sdk.models.HasIdAndAuditing;
2323

@@ -30,7 +30,7 @@
3030
@Setter
3131
@NoArgsConstructor
3232
@Document
33-
public class Organization extends HasIdAndAuditing implements EncryptRequired, DecryptRequired {
33+
public class Organization extends HasIdAndAuditing implements BeforeMongodbWrite, AfterMongodbRead {
3434

3535
private static final OrganizationCommonSettings EMPTY_SETTINGS = new OrganizationCommonSettings();
3636

@@ -68,17 +68,15 @@ public String toString() {
6868
}
6969

7070
@Override
71-
public void decrypt(EncryptionService encryptionService) {
71+
public void afterMongodbRead(MongodbInterceptorContext context) {
7272
ofNullable(getOrganizationDomain())
73-
.map(domain -> domain.doDecrypt(encryptionService::decryptString))
74-
.ifPresent(this::setOrganizationDomain);
73+
.ifPresent(domain -> domain.afterMongodbRead(context));
7574
}
7675

7776
@Override
78-
public void encrypt(EncryptionService encryptionService) {
77+
public void beforeMongodbWrite(MongodbInterceptorContext context) {
7978
ofNullable(getOrganizationDomain())
80-
.map(domain -> domain.doEncrypt(encryptionService::encryptString))
81-
.ifPresent(this::setOrganizationDomain);
79+
.ifPresent(domain -> domain.beforeMongodbWrite(context));
8280
}
8381

8482
public OrganizationCommonSettings getCommonSettings() {
@@ -99,7 +97,7 @@ public long getCreateTime() {
9997

10098
public List<AbstractAuthConfig> getAuthConfigs() {
10199
return Optional.ofNullable(organizationDomain)
102-
.map(OrganizationDomain::getAuthConfigs)
100+
.map(OrganizationDomain::getConfigs)
103101
.orElse(Collections.emptyList());
104102
}
105103
}

server/api-service/openblocks-domain/src/main/java/com/openblocks/domain/organization/model/OrganizationDomain.java

Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,35 +2,43 @@
22

33
import java.util.ArrayList;
44
import java.util.List;
5-
import java.util.function.Function;
65

6+
import org.springframework.data.annotation.Transient;
7+
8+
import com.fasterxml.jackson.core.type.TypeReference;
9+
import com.openblocks.domain.mongodb.MongodbInterceptorContext;
710
import com.openblocks.sdk.auth.AbstractAuthConfig;
11+
import com.openblocks.sdk.config.SerializeConfig.JsonViews;
12+
import com.openblocks.sdk.util.JsonUtils;
813

914
import lombok.Getter;
1015
import lombok.Setter;
1116

12-
@Getter
13-
@Setter
1417
public class OrganizationDomain implements EnterpriseConnectionConfig {
1518

19+
@Getter
20+
@Setter
1621
private String domain;
17-
private List<AbstractAuthConfig> authConfigs;
18-
19-
@Override
20-
public List<AbstractAuthConfig> getAuthConfigs() {
21-
if (authConfigs == null) {
22-
authConfigs = new ArrayList<>();
23-
}
24-
return authConfigs;
25-
}
2622

27-
OrganizationDomain doEncrypt(Function<String, String> encryptFunc) {
28-
getAuthConfigs().forEach(authConfig -> authConfig.doEncrypt(encryptFunc));
29-
return this;
23+
@Setter
24+
@Getter
25+
@Transient
26+
private List<AbstractAuthConfig> configs = new ArrayList<>();
27+
28+
/**
29+
* Only used for mongodb (de)serialization
30+
*/
31+
private List<Object> authConfigs = new ArrayList<>();
32+
33+
void beforeMongodbWrite(MongodbInterceptorContext context) {
34+
this.configs.forEach(authConfig -> authConfig.doEncrypt(s -> context.encryptionService().encryptString(s)));
35+
authConfigs = JsonUtils.fromJsonSafely(JsonUtils.toJsonSafely(configs, JsonViews.Internal.class), new TypeReference<>() {
36+
}, new ArrayList<>());
3037
}
3138

32-
OrganizationDomain doDecrypt(Function<String, String> decryptFunc) {
33-
getAuthConfigs().forEach(authConfig -> authConfig.doDecrypt(decryptFunc));
34-
return this;
39+
void afterMongodbRead(MongodbInterceptorContext context) {
40+
this.configs = JsonUtils.fromJsonSafely(JsonUtils.toJson(authConfigs), new TypeReference<>() {
41+
}, new ArrayList<>());
42+
this.configs.forEach(authConfig -> authConfig.doDecrypt(s -> context.encryptionService().decryptString(s)));
3543
}
3644
}

server/api-service/openblocks-domain/src/main/java/com/openblocks/domain/organization/service/OrganizationServiceImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ public Mono<Organization> createDefault(User user) {
106106
return Mono.empty();
107107
}
108108
OrganizationDomain organizationDomain = new OrganizationDomain();
109-
organizationDomain.setAuthConfigs(List.of(DEFAULT_AUTH_CONFIG));
109+
organizationDomain.setConfigs(List.of(DEFAULT_AUTH_CONFIG));
110110
organization.setOrganizationDomain(organizationDomain);
111111
return create(organization, user.getId());
112112
});

server/api-service/openblocks-infra/src/main/java/com/openblocks/infra/constant/NewUrl.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ private NewUrl() {
2727
public static final String FOLDER_URL = PREFIX + "/folders";
2828

2929
public static final String GITHUB_STAR = PREFIX + "/misc/github-star";
30+
public static final String JS_LIBRARY = PREFIX + "/misc/js-library";
3031
public static final String MATERIAL_URL = PREFIX + "/materials";
3132
public static final String CONTACT_SYNC = PREFIX + "/sync";
3233
}

server/api-service/openblocks-sdk/pom.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,5 +163,9 @@
163163
<groupId>org.springframework.boot</groupId>
164164
<artifactId>spring-boot-autoconfigure</artifactId>
165165
</dependency>
166+
<dependency>
167+
<groupId>jakarta.annotation</groupId>
168+
<artifactId>jakarta.annotation-api</artifactId>
169+
</dependency>
166170
</dependencies>
167171
</project>

server/api-service/openblocks-sdk/src/main/java/com/openblocks/sdk/auth/AbstractAuthConfig.java

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,15 @@
77
import org.apache.commons.lang3.BooleanUtils;
88
import org.apache.commons.lang3.ObjectUtils;
99

10+
import com.fasterxml.jackson.annotation.JsonTypeInfo;
11+
import com.fasterxml.jackson.annotation.JsonTypeInfo.Id;
12+
1013
import lombok.Getter;
1114
import lombok.Setter;
1215

1316
@Getter
1417
@Setter
18+
@JsonTypeInfo(use = Id.NAME, property = "authType", visible = true)
1519
public abstract class AbstractAuthConfig {
1620

1721
protected String id;
@@ -24,12 +28,15 @@ public abstract class AbstractAuthConfig {
2428
protected Boolean enable;
2529
protected Boolean enableRegister;
2630

27-
protected AbstractAuthConfig(@Nullable String id, String source, String sourceName, Boolean enable, Boolean enableRegister) {
31+
protected String authType;
32+
33+
protected AbstractAuthConfig(@Nullable String id, String source, String sourceName, Boolean enable, Boolean enableRegister, String authType) {
2834
this.id = id;
2935
this.source = source;
3036
this.sourceName = sourceName;
3137
this.enable = enable;
3238
this.enableRegister = enableRegister;
39+
this.authType = authType;
3340
}
3441

3542
/**
@@ -48,11 +55,6 @@ public void setSource(String source) {
4855
this.source = source;
4956
}
5057

51-
/**
52-
* @see com.openblocks.sdk.auth.constants.AuthTypeConstants
53-
*/
54-
public abstract String getAuthType();
55-
5658
public final boolean isEnable() {
5759
return BooleanUtils.isTrue(enable);
5860
}
@@ -61,6 +63,10 @@ public final boolean isEnableRegister() {
6163
return BooleanUtils.isTrue(enableRegister);
6264
}
6365

66+
public final String getAuthType() {
67+
return this.authType;
68+
}
69+
6470
public void doEncrypt(Function<String, String> encryptFunc) {
6571
}
6672

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
package com.openblocks.sdk.auth;
22

3+
import static com.openblocks.sdk.auth.constants.AuthTypeConstants.FORM;
34
import static com.openblocks.sdk.constants.AuthSourceConstants.EMAIL;
45

56
import javax.annotation.Nullable;
67

78
import com.fasterxml.jackson.annotation.JsonCreator;
8-
import com.openblocks.sdk.auth.constants.AuthTypeConstants;
99

1010
import lombok.Getter;
1111

@@ -14,11 +14,6 @@ public class EmailAuthConfig extends AbstractAuthConfig {
1414

1515
@JsonCreator
1616
public EmailAuthConfig(@Nullable String id, boolean enable, boolean enableRegister) {
17-
super(id, EMAIL, EMAIL, enable, enableRegister);
18-
}
19-
20-
@Override
21-
public String getAuthType() {
22-
return AuthTypeConstants.FORM;
17+
super(id, EMAIL, EMAIL, enable, enableRegister, FORM);
2318
}
2419
}

0 commit comments

Comments
 (0)