Skip to content

Commit f5eeb28

Browse files
committed
1.feat(workspace): default enterprise
2.fix(graphql): fix serialize body variables 3.feat(mongo): setMapKeyDotReplacement: #79853#
1 parent b6efbe0 commit f5eeb28

File tree

10 files changed

+109
-30
lines changed

10 files changed

+109
-30
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ public class MongoConfig {
4747

4848
@PostConstruct
4949
public void init() {
50-
mappingMongoConverter.setMapKeyDotReplacement("_");
50+
mappingMongoConverter.setMapKeyDotReplacement("##OB_REPLACE##");
5151
}
5252

5353
@Bean

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

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import java.util.List;
99
import java.util.Map;
1010

11+
import org.apache.commons.lang3.StringUtils;
1112
import org.springframework.beans.factory.annotation.Autowired;
1213
import org.springframework.stereotype.Service;
1314

@@ -21,6 +22,9 @@
2122
import com.openblocks.infra.annotation.PossibleEmptyMono;
2223
import com.openblocks.infra.birelation.BiRelation;
2324
import com.openblocks.infra.birelation.BiRelationService;
25+
import com.openblocks.sdk.config.CommonConfig;
26+
import com.openblocks.sdk.config.CommonConfig.Workspace;
27+
import com.openblocks.sdk.constants.WorkspaceMode;
2428

2529
import lombok.extern.slf4j.Slf4j;
2630
import reactor.core.publisher.Flux;
@@ -42,6 +46,9 @@ public class OrgMemberServiceImpl implements OrgMemberService {
4246
@Autowired
4347
private OrganizationService organizationService;
4448

49+
@Autowired
50+
private CommonConfig commonConfig;
51+
4552
@Override
4653
public Mono<List<OrgMember>> getOrganizationMembers(String orgId, int page, int count) {
4754
return emptyMonoIfEmptyList(biRelationService.getBySourceId(ORG_MEMBER, orgId)
@@ -66,6 +73,23 @@ public Flux<OrgMember> getAllActiveOrgs(String userId) {
6673
.filter(organization -> organization.getState() != OrganizationState.DELETED)
6774
.map(Organization::getId)
6875
.collectList()
76+
// enterprise mode
77+
.flatMap(orgIds -> {
78+
Workspace workspace = commonConfig.getWorkspace();
79+
if (workspace.getMode() == WorkspaceMode.ENTERPRISE) {
80+
if (StringUtils.isNotBlank(workspace.getEnterpriseOrgId())) {
81+
if (orgIds.contains(workspace.getEnterpriseOrgId())) {
82+
return Mono.just(List.of(workspace.getEnterpriseOrgId()));
83+
}
84+
return addMember(workspace.getEnterpriseOrgId(), userId, MemberRole.MEMBER)
85+
.thenReturn(List.of(workspace.getEnterpriseOrgId()));
86+
}
87+
if (orgIds.size() > 1) {
88+
return Mono.just(orgIds.subList(0, 1));
89+
}
90+
}
91+
return Mono.just(orgIds);
92+
})
6993
.map(HashSet::new)
7094
.cache();
7195

server/openblocks-plugins/graphqlPlugin/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@
107107
<dependency>
108108
<groupId>org.springframework.boot</groupId>
109109
<artifactId>spring-boot-starter-webflux</artifactId>
110-
<version>2.5.12</version>
110+
<version>2.5.5</version>
111111
<scope>test</scope>
112112
</dependency>
113113
<dependency>

server/openblocks-plugins/graphqlPlugin/src/main/java/com/openblocks/plugin/graphql/GraphQLExecutor.java

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import static com.google.common.base.MoreObjects.firstNonNull;
44
import static com.openblocks.plugin.graphql.GraphQLError.GRAPHQL_EXECUTION_ERROR;
5-
import static com.openblocks.plugin.graphql.utils.GraphQLBodyUtils.convertToGraphQLPOSTBodyFormat;
5+
import static com.openblocks.plugin.graphql.utils.GraphQLBodyUtils.convertToGraphQLBody;
66
import static com.openblocks.sdk.exception.PluginCommonError.JSON_PARSE_ERROR;
77
import static com.openblocks.sdk.exception.PluginCommonError.QUERY_ARGUMENT_ERROR;
88
import static com.openblocks.sdk.exception.PluginCommonError.QUERY_EXECUTION_ERROR;
@@ -264,11 +264,7 @@ public Mono<QueryExecutionResult> executeQuery(Object o, GraphQLQueryExecutionCo
264264
.exchangeStrategies(EXCHANGE_STRATEGIES)
265265
.build();
266266
if (!GRAPHQL_TYPE.equalsIgnoreCase(contentType)) {
267-
try {
268-
context.setQueryBody(convertToGraphQLPOSTBodyFormat(context));
269-
} catch (PluginException e) {
270-
return Mono.error(e);
271-
}
267+
context.setQueryBody(convertToGraphQLBody(context));
272268
}
273269
BodyInserter<?, ? super ClientHttpRequest> bodyInserter = buildBodyInserter(
274270
context.isEncodeParams(),
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,21 @@
11
package com.openblocks.plugin.graphql.utils;
22

3-
import org.json.JSONObject;
3+
import java.util.HashMap;
4+
import java.util.Map;
45

5-
import com.fasterxml.jackson.databind.JsonNode;
66
import com.openblocks.plugin.graphql.model.GraphQLQueryExecutionContext;
7-
import com.openblocks.sdk.exception.PluginException;
7+
import com.openblocks.sdk.util.JsonUtils;
88

99

1010
public class GraphQLBodyUtils {
1111

1212
public static final String QUERY_KEY = "query";
1313
public static final String VARIABLES_KEY = "variables";
1414

15-
public static String convertToGraphQLPOSTBodyFormat(GraphQLQueryExecutionContext graphQLQueryExecutionContext) throws PluginException {
16-
JSONObject query = new JSONObject();
17-
query.put(QUERY_KEY, graphQLQueryExecutionContext.getQueryBody());
18-
JsonNode variables = graphQLQueryExecutionContext.getVariablesParams();
19-
query.put(VARIABLES_KEY, variables);
20-
return query.toString();
15+
public static String convertToGraphQLBody(GraphQLQueryExecutionContext graphQLQueryExecutionContext) {
16+
Map<String, Object> map = new HashMap<>();
17+
map.put(QUERY_KEY, graphQLQueryExecutionContext.getQueryBody());
18+
map.put(VARIABLES_KEY, graphQLQueryExecutionContext.getVariablesParams());
19+
return JsonUtils.toJson(map);
2120
}
2221
}

server/openblocks-plugins/restApiPlugin/src/main/java/com/openblocks/plugin/restapi/RestApiExecutor.java

Lines changed: 34 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -39,17 +39,17 @@
3939
import static com.openblocks.sdk.util.MustacheHelper.renderMustacheJsonString;
4040
import static com.openblocks.sdk.util.MustacheHelper.renderMustacheString;
4141
import static com.openblocks.sdk.util.StreamUtils.collectList;
42-
import static com.openblocks.sdk.util.StreamUtils.distinctByKey;
4342
import static org.apache.commons.collections4.MapUtils.emptyIfNull;
44-
import static org.apache.commons.lang3.StringUtils.firstNonBlank;
4543
import static org.apache.commons.lang3.StringUtils.trimToEmpty;
4644

4745
import java.io.IOException;
4846
import java.net.URI;
4947
import java.net.URISyntaxException;
5048
import java.nio.charset.StandardCharsets;
5149
import java.text.ParseException;
50+
import java.util.ArrayList;
5251
import java.util.HashMap;
52+
import java.util.HashSet;
5353
import java.util.List;
5454
import java.util.Map;
5555
import java.util.Set;
@@ -96,6 +96,7 @@
9696
import com.openblocks.sdk.plugin.restapi.auth.BasicAuthConfig;
9797
import com.openblocks.sdk.plugin.restapi.auth.RestApiAuthType;
9898
import com.openblocks.sdk.query.QueryVisitorContext;
99+
import com.openblocks.sdk.util.JsonUtils;
99100
import com.openblocks.sdk.webclient.WebClients;
100101

101102
import lombok.Builder;
@@ -125,7 +126,6 @@ public RestApiQueryExecutionContext buildQueryExecutionContext(RestApiDatasource
125126

126127
// from datasource config
127128
String urlDomain = datasourceConfig.getUrl();
128-
String datasourceBody = datasourceConfig.getBody();
129129
List<Property> datasourceHeaders = datasourceConfig.getHeaders();
130130
List<Property> datasourceUrlParams = datasourceConfig.getParams();
131131
List<Property> datasourceBodyFormData = datasourceConfig.getBodyFormData();
@@ -162,7 +162,7 @@ public RestApiQueryExecutionContext buildQueryExecutionContext(RestApiDatasource
162162
}
163163

164164
Map<String, String> urlParams = buildUrlParams(datasourceUrlParams, updatedQueryParams);
165-
List<Property> bodyParams = buildBodyParams(datasourceBodyFormData, updatedQueryBodyParams);
165+
List<Property> bodyParams = mergeBody(datasourceBodyFormData, updatedQueryBodyParams);
166166

167167
URI uri = RestApiUriBuilder.buildUri(urlDomain, updatedQueryPath, requestParams, urlParams, encodeParams);
168168

@@ -174,7 +174,7 @@ public RestApiQueryExecutionContext buildQueryExecutionContext(RestApiDatasource
174174
.urlParams(urlParams)
175175
.bodyParams(bodyParams)
176176
.encodeParams(encodeParams)
177-
.queryBody(firstNonBlank(updatedQueryBody, datasourceBody))
177+
.queryBody(mergeBody(updatedQueryBody, datasourceBodyFormData, contentType))
178178
.forwardCookies(forwardCookies)
179179
.forwardAllCookies(forwardAllCookies)
180180
.requestCookies(queryVisitorContext.getCookies())
@@ -183,6 +183,23 @@ public RestApiQueryExecutionContext buildQueryExecutionContext(RestApiDatasource
183183
.build();
184184
}
185185

186+
private String mergeBody(String queryBody, List<Property> datasourceBody, String contentType) {
187+
if (CollectionUtils.isEmpty(datasourceBody)) {
188+
return queryBody;
189+
}
190+
if (!isJsonContentType(contentType)) {
191+
return queryBody;
192+
}
193+
Map<String, Object> map = JsonUtils.fromJsonMap(queryBody);
194+
if (map == null) {
195+
return queryBody;
196+
}
197+
for (Property property : datasourceBody) {
198+
map.putIfAbsent(property.getKey(), property.getValue());
199+
}
200+
return JsonUtils.toJson(map);
201+
}
202+
186203
@Override
187204
public Mono<QueryExecutionResult> executeQuery(Object webClientFilter, RestApiQueryExecutionContext context) {
188205

@@ -395,12 +412,18 @@ private JsonNode parseExecuteResultHeaders(HttpHeaders headers) {
395412
}
396413
}
397414

398-
private List<Property> buildBodyParams(List<Property> datasourceBodyFormData, List<Property> updatedQueryBodyParams) {
399-
return Stream.concat(datasourceBodyFormData.stream(),
400-
updatedQueryBodyParams.stream())
401-
.filter(it -> it.getKey() != null)
402-
.filter(distinctByKey(Property::getKey))
403-
.toList();
415+
private List<Property> mergeBody(List<Property> datasourceBodyFormData, List<Property> updatedQueryBodyParams) {
416+
Set<String> keySet = updatedQueryBodyParams.stream()
417+
.map(Property::getKey)
418+
.collect(Collectors.toCollection(HashSet::new));
419+
List<Property> merge = new ArrayList<>(updatedQueryBodyParams);
420+
for (Property property : datasourceBodyFormData) {
421+
if (!keySet.contains(property.getKey())) {
422+
merge.add(property);
423+
keySet.add(property.getKey());
424+
}
425+
}
426+
return merge;
404427
}
405428

406429
private Map<String, String> buildUrlParams(List<Property> datasourceUrlParams, List<Property> updatedQueryParams) {

server/openblocks-plugins/restApiPlugin/src/main/java/com/openblocks/plugin/restapi/helpers/ContentTypeHelper.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,9 @@ public static boolean isPicture(MediaType contentType) {
3232
}
3333

3434
public static boolean isJson(MediaType contentType) {
35-
return contentType.includes(MediaType.APPLICATION_JSON);
35+
return StringUtils.equalsIgnoreCase("application", contentType.getType())
36+
&& (StringUtils.equalsIgnoreCase(contentType.getSubtype(), "json") ||
37+
StringUtils.contains(contentType.getSubtype(), "+json"));
3638
}
3739

3840
public static String parseContentType(Map<String, String> allHeaders) {

server/openblocks-plugins/restApiPlugin/src/test/java/com/openblocks/plugin/restapi/RestApiEngineTest.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,32 @@ public void testDigestAuth() {
291291
.verifyComplete();
292292
}
293293

294+
@Test
295+
public void responseJsonTypeTest() {
296+
RestApiDatasourceConfig datasourceConfig = RestApiDatasourceConfig.builder()
297+
.url("https://postman-echo.com/response-headers?key=value")
298+
.build();
299+
for (String contentType : List.of("application/hal+json",
300+
"application/problem+json",
301+
"application/json",
302+
"application/json;charset=UTF-8",
303+
"application/graphql+json",
304+
"application/stream+json"
305+
)) {
306+
Map<String, Object> queryConfig = ImmutableMap.of("httpMethod", "GET",
307+
"params", List.of(new Property("Content-Type", contentType))
308+
);
309+
StepVerifier.create(execute(datasourceConfig, queryConfig, emptyMap()))
310+
.assertNext(result -> {
311+
assertTrue(result.isSuccess());
312+
assertNotNull(result.getData());
313+
JsonNode value = ((ObjectNode) result.getData()).get("key");
314+
assertEquals("value", value.asText());
315+
})
316+
.verifyComplete();
317+
}
318+
}
319+
294320
private Mono<QueryExecutionResult> execute(RestApiDatasourceConfig datasourceConfig, Map<String, Object> queryConfig,
295321
Map<String, Object> params) {
296322
QueryExecutionContext context = executor.doBuildQueryExecutionContext(datasourceConfig,

server/openblocks-server/src/main/java/com/openblocks/api/usermanagement/OrgApiServiceImpl.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import com.openblocks.domain.user.model.User;
4141
import com.openblocks.domain.user.service.UserService;
4242
import com.openblocks.sdk.config.CommonConfig;
43+
import com.openblocks.sdk.config.CommonConfig.Workspace;
4344
import com.openblocks.sdk.constants.WorkspaceMode;
4445
import com.openblocks.sdk.exception.BizError;
4546
import com.openblocks.sdk.exception.BizException;
@@ -228,7 +229,13 @@ public Mono<Boolean> removeUserFromOrg(String orgId, String userId) {
228229
@Override
229230
public Mono<Boolean> removeOrg(String orgId) {
230231
return checkVisitorAdminRole(orgId)
231-
.then(checkIfSaasMode())
232+
.then(Mono.defer(() -> {
233+
Workspace workspace = commonConfig.getWorkspace();
234+
if (workspace.getMode() == WorkspaceMode.ENTERPRISE && orgId.equals(workspace.getEnterpriseOrgId())) {
235+
return Mono.error(new BizException(UNSUPPORTED_OPERATION, "BAD_REQUEST"));
236+
}
237+
return Mono.empty();
238+
}))
232239
.then(organizationService.delete(orgId));
233240
}
234241

server/openblocks-server/src/main/resources/selfhost/ce/application-selfhost.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ common:
66
cors-allowed-domains: ${CORS_ALLOWED_DOMAINS:*}
77
max-query-request-size-in-mb: 20
88
max-query-response-size-in-mb: 20
9+
workspace:
10+
mode: ENTERPRISE
911

1012
spring:
1113
data:

0 commit comments

Comments
 (0)