Skip to content

Commit 5e09800

Browse files
committed
1. Apply chown to /run directory not recursively
2. Add support for GraphQL data source 3. Support granular permissions for data sources 4. Support solo workspace for self-hosted instances
1 parent 05bff0b commit 5e09800

File tree

84 files changed

+2473
-380
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

84 files changed

+2473
-380
lines changed

deploy/docker/entrypoint.sh

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ add_user() {
2727
echo "Starting with UID : $USER_ID"
2828
groupadd -g $GROUP_ID $GROUP_NAME || true
2929
useradd -u $USER_ID -g $GROUP_ID $USER_NAME || true
30-
chown -R $USER_ID:$GROUP_ID /openblocks /openblocks-stacks /etc/nginx /var /etc/redis /run /etc/supervisor
30+
chown -R $USER_ID:$GROUP_ID /openblocks /openblocks-stacks /etc/nginx /var /etc/redis /etc/supervisor
31+
chown $USER_ID:$GROUP_ID /run
3132
}
3233

3334
init_mongodb

server/openblocks-domain/src/main/java/com/openblocks/domain/application/model/Application.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@
66
import static com.openblocks.domain.application.ApplicationUtil.getDependentModulesFromDsl;
77
import static java.util.Optional.ofNullable;
88

9+
import java.util.Collections;
910
import java.util.Map;
11+
import java.util.Optional;
1012
import java.util.Set;
1113
import java.util.function.Supplier;
1214

@@ -41,7 +43,10 @@ public class Application extends HasIdAndAuditing {
4143

4244
@Transient
4345
private final Supplier<Set<ApplicationQuery>> editingQueries =
44-
memoize(() -> JsonUtils.fromJsonSet(JsonUtils.toJson(editingApplicationDSL.get("queries")), ApplicationQuery.class));
46+
memoize(() -> Optional.ofNullable(editingApplicationDSL)
47+
.map(map -> map.get("queries"))
48+
.map(queries -> JsonUtils.fromJsonSet(JsonUtils.toJson(queries), ApplicationQuery.class))
49+
.orElse(Collections.emptySet()));
4550

4651
@Transient
4752
private final Supplier<Set<ApplicationQuery>> liveQueries =
@@ -80,7 +85,7 @@ public Application(@JsonProperty("orgId") String organizationId,
8085
this.editingApplicationDSL = editingApplicationDSL;
8186
}
8287

83-
private Set<ApplicationQuery> getEditingQueries() {
88+
public Set<ApplicationQuery> getEditingQueries() {
8489
return editingQueries.get();
8590
}
8691

server/openblocks-domain/src/main/java/com/openblocks/domain/datasource/repository/DatasourceRepository.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,17 @@
1414
import com.openblocks.domain.plugin.service.DatasourceMetaInfoService;
1515
import com.openblocks.infra.mongo.MongoUpsertHelper;
1616
import com.openblocks.sdk.models.DatasourceConnectionConfig;
17+
import com.openblocks.sdk.util.JsonUtils;
1718

19+
import lombok.extern.slf4j.Slf4j;
1820
import reactor.core.publisher.Flux;
1921
import reactor.core.publisher.Mono;
2022

2123
/**
2224
* all find operation must do data decryption
2325
* for update operations that try to save whole datasource object, data encryption is required
2426
*/
27+
@Slf4j
2528
@Repository
2629
public class DatasourceRepository {
2730

@@ -82,9 +85,13 @@ private Datasource convertToDomainObjectAndDecrypt(DatasourceDO datasourceDO) {
8285
result.setCreatedBy(datasourceDO.getCreatedBy());
8386
result.setModifiedBy(datasourceDO.getModifiedBy());
8487

85-
DatasourceConnectionConfig detailConfig = datasourceMetaInfoService.resolveDetailConfig(datasourceDO.getDetailConfig(), result.getType());
86-
DatasourceConnectionConfig decryptedDetailConfig = detailConfig.doDecrypt(encryptionService::decryptString);
87-
result.setDetailConfig(decryptedDetailConfig);
88+
try {
89+
DatasourceConnectionConfig detailConfig = datasourceMetaInfoService.resolveDetailConfig(datasourceDO.getDetailConfig(), result.getType());
90+
DatasourceConnectionConfig decryptedDetailConfig = detailConfig.doDecrypt(encryptionService::decryptString);
91+
result.setDetailConfig(decryptedDetailConfig);
92+
} catch (Exception e) {
93+
log.error("resolve detail config error.{},{}", result.getType(), JsonUtils.toJson(datasourceDO.getDetailConfig()), e);
94+
}
8895
return result;
8996
}
9097

server/openblocks-domain/src/main/java/com/openblocks/domain/datasource/service/DatasourceService.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
package com.openblocks.domain.datasource.service;
22

3-
import java.util.List;
4-
53
import com.openblocks.domain.datasource.model.Datasource;
64
import com.openblocks.sdk.models.DatasourceTestResult;
75

6+
import reactor.core.publisher.Flux;
87
import reactor.core.publisher.Mono;
98

109
public interface DatasourceService {
@@ -19,9 +18,7 @@ public interface DatasourceService {
1918

2019
Mono<DatasourceTestResult> testDatasource(Datasource datasource);
2120

22-
Mono<List<Datasource>> getByOrgId(String orgId);
23-
24-
Mono<List<Datasource>> getByAppId(String appId);
21+
Flux<Datasource> getByOrgId(String orgId);
2522

2623
Mono<Long> countByOrganizationId(String orgId);
2724

server/openblocks-domain/src/main/java/com/openblocks/domain/datasource/service/impl/DatasourceServiceImpl.java

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import static org.apache.commons.collections4.CollectionUtils.isNotEmpty;
77

88
import java.time.Duration;
9-
import java.util.List;
109
import java.util.Locale;
1110
import java.util.Set;
1211
import java.util.stream.Collectors;
@@ -36,6 +35,7 @@
3635
import com.openblocks.sdk.util.LocaleUtils;
3736

3837
import lombok.extern.slf4j.Slf4j;
38+
import reactor.core.publisher.Flux;
3939
import reactor.core.publisher.Mono;
4040

4141
@Slf4j
@@ -153,15 +153,8 @@ private Mono<DatasourceTestResult> testDatasourceConnection(Datasource datasourc
153153
}
154154

155155
@Override
156-
public Mono<List<Datasource>> getByOrgId(String orgId) {
157-
return repository.findAllByOrganizationId(orgId)
158-
.collectList();
159-
}
160-
161-
@Override
162-
public Mono<List<Datasource>> getByAppId(String appId) {
163-
return applicationService.findByIdWithoutDsl(appId)
164-
.flatMap(application -> repository.findAllByOrganizationId(application.getOrganizationId()).collectList());
156+
public Flux<Datasource> getByOrgId(String orgId) {
157+
return repository.findAllByOrganizationId(orgId);
165158
}
166159

167160
@Override

server/openblocks-domain/src/main/java/com/openblocks/domain/group/model/Group.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import javax.validation.constraints.NotNull;
99

1010
import org.apache.commons.lang3.BooleanUtils;
11+
import org.apache.commons.lang3.StringUtils;
1112
import org.springframework.data.mongodb.core.mapping.Document;
1213

1314
import com.fasterxml.jackson.annotation.JsonIgnore;
@@ -45,6 +46,8 @@ public class Group extends HasIdAndAuditing implements Comparable<Group> {
4546

4647
private String type;
4748

49+
private String dynamicRule;
50+
4851
public String getName(Locale locale) {
4952
return isSystemGroup() ? SystemGroups.getName(getType(), locale) : name;
5053
}
@@ -82,4 +85,14 @@ public int compareTo(@Nonnull Group o) {
8285
public long getCreateTime() {
8386
return createdAt != null ? createdAt.toEpochMilli() : 0;
8487
}
88+
89+
public String getDynamicRule() {
90+
return dynamicRule;
91+
}
92+
93+
@Transient
94+
@JsonIgnore
95+
public boolean isDynamic(){
96+
return StringUtils.isNotBlank(dynamicRule);
97+
}
8598
}

server/openblocks-domain/src/main/java/com/openblocks/domain/group/model/GroupMember.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public GroupMember(String groupId, String userId, MemberRole role, String orgId,
2929
public static GroupMember from(BiRelation biRelation) {
3030
return new GroupMember(biRelation.getSourceId(), biRelation.getTargetId(),
3131
MemberRole.fromValue(biRelation.getRelation()), biRelation.getExtParam1(),
32-
biRelation.getCreatedAt().toEpochMilli());
32+
biRelation.getCreateTime());
3333
}
3434

3535
public boolean isAdmin() {

server/openblocks-domain/src/main/java/com/openblocks/domain/group/service/GroupMemberService.java

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

33
import java.util.List;
44

5+
import com.openblocks.domain.group.model.Group;
56
import com.openblocks.domain.group.model.GroupMember;
67
import com.openblocks.domain.organization.model.MemberRole;
78

@@ -17,24 +18,20 @@ public interface GroupMemberService {
1718

1819
Mono<Boolean> removeMember(String groupId, String userId);
1920

20-
21-
/**
22-
* @return all group ids user belongs to
23-
*/
24-
Mono<List<String>> getUserAllGroupIds(String userId);
25-
2621
/**
2722
* @return all group ids user belongs to under specific org
2823
*/
2924
Mono<List<String>> getUserGroupIdsInOrg(String orgId, String userId);
3025

31-
Mono<List<GroupMember>> getUserGroupMembers(String userId);
26+
Mono<List<String>> getNonDynamicUserGroupIdsInOrg(String orgId, String userId);
27+
28+
Mono<List<GroupMember>> getUserGroupMembersInOrg(String orgId, String userId);
3229

3330
Mono<GroupMember> getGroupMember(String groupId, String userId);
3431

3532
Mono<List<GroupMember>> getAllGroupAdmin(String groupId);
3633

3734
Mono<Boolean> deleteGroupMembers(String groupId);
3835

39-
Mono<Boolean> isMember(String groupId, String userId);
36+
Mono<Boolean> isMember(Group group, String userId);
4037
}

server/openblocks-domain/src/main/java/com/openblocks/domain/group/service/GroupMemberServiceImpl.java

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@
88
import org.springframework.beans.factory.annotation.Autowired;
99
import org.springframework.stereotype.Service;
1010

11+
import com.openblocks.domain.group.model.Group;
1112
import com.openblocks.domain.group.model.GroupMember;
1213
import com.openblocks.domain.organization.model.MemberRole;
1314
import com.openblocks.domain.organization.model.OrgMemberState;
14-
import com.openblocks.infra.birelation.BiRelation;
1515
import com.openblocks.infra.birelation.BiRelationService;
1616

1717
import reactor.core.publisher.Mono;
@@ -47,26 +47,16 @@ public Mono<Boolean> removeMember(String groupId, String userId) {
4747
return biRelationService.removeBiRelation(GROUP_MEMBER, groupId, userId);
4848
}
4949

50-
@Override
51-
public Mono<List<String>> getUserAllGroupIds(String userId) {
52-
return biRelationService.getByTargetId(GROUP_MEMBER, userId)
53-
.map(BiRelation::getSourceId)
54-
.collectList();
55-
}
56-
5750
@Override
5851
public Mono<List<String>> getUserGroupIdsInOrg(String orgId, String userId) {
59-
return biRelationService.getByTargetId(GROUP_MEMBER, userId)
60-
.map(GroupMember::from)
61-
.filter(it -> StringUtils.equals(it.getOrgId(), orgId))
62-
.map(GroupMember::getGroupId)
63-
.collectList();
52+
return getNonDynamicUserGroupIdsInOrg(orgId, userId);
6453
}
6554

6655
@Override
67-
public Mono<List<GroupMember>> getUserGroupMembers(String userId) {
56+
public Mono<List<GroupMember>> getUserGroupMembersInOrg(String orgId, String userId) {
6857
return biRelationService.getByTargetId(GROUP_MEMBER, userId)
6958
.map(GroupMember::from)
59+
.filter(it -> StringUtils.equals(it.getOrgId(), orgId))
7060
.collectList();
7161
}
7262

@@ -89,8 +79,19 @@ public Mono<Boolean> deleteGroupMembers(String groupId) {
8979
}
9080

9181
@Override
92-
public Mono<Boolean> isMember(String groupId, String userId) {
93-
return biRelationService.getBiRelation(GROUP_MEMBER, groupId, userId)
82+
public Mono<Boolean> isMember(Group group, String userId) {
83+
return biRelationService.getBiRelation(GROUP_MEMBER, group.getId(), userId)
9484
.hasElement();
9585
}
86+
87+
@Override
88+
public Mono<List<String>> getNonDynamicUserGroupIdsInOrg(String orgId, String userId) {
89+
return biRelationService.getByTargetId(GROUP_MEMBER, userId)
90+
.map(GroupMember::from)
91+
.filter(it -> StringUtils.equals(it.getOrgId(), orgId))
92+
.map(GroupMember::getGroupId)
93+
.collectList();
94+
}
95+
96+
9697
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,8 @@ public OrganizationCommonSettings getCommonSettings() {
8282
}
8383

8484
public static class OrganizationCommonSettings extends HashMap<String, Object> {
85+
public static final String USER_EXTRA_TRANSFORMER = "userExtraTransformer";
86+
public static final String USER_EXTRA_TRANSFORMER_UPDATE_TIME = "userExtraTransformer_updateTime";
8587
}
8688

8789
public long getCreateTime() {

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

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,11 @@
3535
import com.openblocks.domain.plugin.DatasourceMetaInfoConstants;
3636
import com.openblocks.domain.user.model.User;
3737
import com.openblocks.infra.mongo.MongoUpsertHelper;
38+
import com.openblocks.sdk.config.CommonConfig;
3839
import com.openblocks.sdk.config.dynamic.Conf;
3940
import com.openblocks.sdk.config.dynamic.ConfigCenter;
4041
import com.openblocks.sdk.constants.FieldName;
42+
import com.openblocks.sdk.constants.WorkspaceMode;
4143
import com.openblocks.sdk.exception.BizError;
4244
import com.openblocks.sdk.exception.BizException;
4345
import com.openblocks.sdk.plugin.openblocksapi.OpenblocksApiDatasourceConfig;
@@ -77,6 +79,9 @@ public class OrganizationServiceImpl implements OrganizationService {
7779
@Autowired
7880
private ApplicationContext applicationContext;
7981

82+
@Autowired
83+
private CommonConfig commonConfig;
84+
8085
@Autowired
8186
public OrganizationServiceImpl(ConfigCenter configCenter) {
8287
logoMaxSizeInKb = configCenter.asset().ofInteger("logoMaxSizeInKb", 300);
@@ -91,10 +96,28 @@ public Mono<Organization> createDefault(User user) {
9196
Organization organization = new Organization();
9297
organization.setName(user.getName() + userOrgSuffix);
9398
organization.setIsAutoGeneratedOrganization(true);
94-
return create(organization, user.getId());
99+
// saas mode
100+
if (commonConfig.getWorkspace().getMode() == WorkspaceMode.SAAS) {
101+
return create(organization, user.getId());
102+
}
103+
// enterprise mode
104+
return joinOrgForEnterpriseMode(user.getId())
105+
.flatMap(join -> {
106+
if (join) {
107+
return Mono.empty();
108+
}
109+
return create(organization, user.getId());
110+
});
95111
});
96112
}
97113

114+
private Mono<Boolean> joinOrgForEnterpriseMode(String userId) {
115+
return repository.findAll()
116+
.next()
117+
.flatMap(organization -> orgMemberService.addMember(organization.getId(), userId, MemberRole.MEMBER))
118+
.defaultIfEmpty(false);
119+
}
120+
98121
@Override
99122
public Mono<Organization> create(Organization organization, String creatorId) {
100123

@@ -251,7 +274,13 @@ public Mono<Organization> getByDomain(String domain) {
251274

252275
@Override
253276
public Mono<Boolean> updateCommonSettings(String orgId, String key, Object value) {
254-
Update update = Update.update(fieldName(QOrganization.organization.commonSettings) + "." + key, value);
277+
long updateTime = System.currentTimeMillis();
278+
Update update = Update.update(fieldName(QOrganization.organization.commonSettings) + "." + key, value)
279+
.set(fieldName(QOrganization.organization.commonSettings) + "." + buildCommonSettingsUpdateTimeKey(key), updateTime);
255280
return mongoUpsertHelper.upsert(update, FieldName.ID, orgId, Organization.class);
256281
}
282+
283+
private String buildCommonSettingsUpdateTimeKey(String key) {
284+
return key + "_updateTime";
285+
}
257286
}

server/openblocks-domain/src/main/java/com/openblocks/domain/permission/model/ResourceAction.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,10 @@ public enum ResourceAction {
2424
EDIT_APPLICATIONS(ResourceRole.EDITOR, ResourceType.APPLICATION),
2525

2626
SET_APPLICATIONS_PUBLIC(ResourceRole.EDITOR, ResourceType.APPLICATION),
27-
MANAGE_DATASOURCES(ResourceRole.EDITOR, ResourceType.DATASOURCE),
27+
28+
// datasource action
29+
MANAGE_DATASOURCES(ResourceRole.OWNER, ResourceType.DATASOURCE),
30+
USE_DATASOURCES(ResourceRole.VIEWER, ResourceType.DATASOURCE),
2831
;
2932

3033
private static final SetMultimap<ResourceRole, ResourceAction> ROLE_PERMISSIONS;

0 commit comments

Comments
 (0)