Skip to content

Commit 6806d43

Browse files
author
chengluo
committed
refactor SQL executor with HikariSqlExecutor & implement group sync feature
1 parent 7b0c376 commit 6806d43

File tree

31 files changed

+361
-148
lines changed

31 files changed

+361
-148
lines changed

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

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ public class Group extends HasIdAndAuditing implements Comparable<Group> {
3131
if (group.isDevGroup()) {
3232
return 2;
3333
}
34+
if (group.isSyncGroup()) {
35+
return 3;
36+
}
3437
return group.getCreatedAt().toEpochMilli();
3538
});
3639

@@ -48,6 +51,12 @@ public class Group extends HasIdAndAuditing implements Comparable<Group> {
4851

4952
private String dynamicRule;
5053

54+
private String source; // sync group source
55+
56+
private String rawDepartmentId; // sync group departmentId
57+
58+
private boolean syncDeleted;
59+
5160
public String getName(Locale locale) {
5261
return isSystemGroup() ? SystemGroups.getName(getType(), locale) : name;
5362
}
@@ -64,6 +73,22 @@ public boolean isDevGroup() {
6473
return SystemGroups.DEV.equals(type);
6574
}
6675

76+
public boolean isSyncGroup() {
77+
return StringUtils.isNotBlank(source);
78+
}
79+
80+
public String getSource() {
81+
return source;
82+
}
83+
84+
public String getRawDepartmentId() {
85+
return rawDepartmentId;
86+
}
87+
88+
public boolean isSyncDeleted() {
89+
return syncDeleted;
90+
}
91+
6792
@Transient
6893
@JsonIgnore
6994
public boolean isSystemGroup() {
@@ -92,7 +117,7 @@ public String getDynamicRule() {
92117

93118
@Transient
94119
@JsonIgnore
95-
public boolean isDynamic(){
120+
public boolean isDynamic() {
96121
return StringUtils.isNotBlank(dynamicRule);
97122
}
98123
}

server/api-service/openblocks-domain/src/main/java/com/openblocks/domain/group/repository/GroupRepository.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,5 +24,7 @@ public interface GroupRepository extends ReactiveMongoRepository<Group, String>
2424
Mono<Group> findByOrganizationIdAndAllUsersGroup(String organizationId, boolean allUsersGroup);
2525

2626
Mono<Group> findByOrganizationIdAndType(String organizationId, String type);
27+
28+
Flux<Group> findBySourceAndOrganizationId(String source, String organizationId);
2729
}
2830

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
package com.openblocks.domain.group.service;
22

3+
import java.util.Collection;
34
import java.util.List;
45

56
import com.openblocks.domain.group.model.Group;
67
import com.openblocks.domain.group.model.GroupMember;
78
import com.openblocks.domain.organization.model.MemberRole;
9+
import com.openblocks.infra.birelation.BiRelation;
810

911
import reactor.core.publisher.Mono;
1012

@@ -34,4 +36,9 @@ public interface GroupMemberService {
3436
Mono<Boolean> deleteGroupMembers(String groupId);
3537

3638
Mono<Boolean> isMember(Group group, String userId);
39+
40+
Mono<List<GroupMember>> bulkAddMember(Collection<GroupMember> groupMembers);
41+
42+
Mono<Boolean> bulkRemoveMember(String groupId, Collection<String> userIds);
43+
3744
}

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

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,22 @@
22

33
import static com.openblocks.infra.birelation.BiRelationBizType.GROUP_MEMBER;
44

5+
import java.util.Collection;
56
import java.util.List;
7+
import java.util.Map;
68

79
import org.apache.commons.lang3.StringUtils;
10+
import org.bson.Document;
811
import org.springframework.beans.factory.annotation.Autowired;
912
import org.springframework.stereotype.Service;
1013

1114
import com.openblocks.domain.group.model.Group;
1215
import com.openblocks.domain.group.model.GroupMember;
1316
import com.openblocks.domain.organization.model.MemberRole;
1417
import com.openblocks.domain.organization.model.OrgMemberState;
18+
import com.openblocks.infra.birelation.BiRelation;
1519
import com.openblocks.infra.birelation.BiRelationService;
20+
import com.openblocks.infra.mongo.MongoUpsertHelper;
1621

1722
import reactor.core.publisher.Mono;
1823

@@ -22,6 +27,9 @@ public class GroupMemberServiceImpl implements GroupMemberService {
2227
@Autowired
2328
private BiRelationService biRelationService;
2429

30+
@Autowired
31+
private MongoUpsertHelper mongoUpsertHelper;
32+
2533
@Override
2634
public Mono<List<GroupMember>> getGroupMembers(String groupId, int page, int count) {
2735
return biRelationService.getBySourceId(GROUP_MEMBER, groupId)
@@ -93,4 +101,27 @@ public Mono<List<String>> getNonDynamicUserGroupIdsInOrg(String orgId, String us
93101
.collectList();
94102
}
95103

104+
@Override
105+
public Mono<List<GroupMember>> bulkAddMember(Collection<GroupMember> groupMembers) {
106+
List<BiRelation> biRelations = groupMembers.stream()
107+
.map(groupMember -> BiRelation.builder()
108+
.bizType(GROUP_MEMBER)
109+
.sourceId(groupMember.getGroupId())
110+
.targetId(groupMember.getUserId())
111+
.relation(MemberRole.MEMBER.getValue())
112+
.state(OrgMemberState.NORMAL.getValue())
113+
.extParam1(groupMember.getOrgId())
114+
.build())
115+
.toList();
116+
return biRelationService.batchAddBiRelation(biRelations)
117+
.map(r -> r.stream().map(GroupMember::from).toList());
118+
}
119+
120+
@Override
121+
public Mono<Boolean> bulkRemoveMember(String groupId, Collection<String> userIds) {
122+
List<Document> filters = userIds.stream()
123+
.map(userId -> new Document(Map.of("bizType", GROUP_MEMBER.name(), "sourceId", groupId, "targetId", userId)))
124+
.toList();
125+
return mongoUpsertHelper.bulkRemove(filters, BiRelation.class);
126+
}
96127
}

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import java.util.Collection;
44

55
import com.openblocks.domain.group.model.Group;
6+
import com.openblocks.infra.mongo.MongoUpsertHelper.PartialResourceWithId;
67

78
import reactor.core.publisher.Flux;
89
import reactor.core.publisher.Mono;
@@ -33,4 +34,12 @@ default Mono<Long> getOrgGroupCount(String organizationId) {
3334
Mono<Group> createDevGroup(String orgId);
3435

3536
Mono<Group> createAllUserGroup(String orgId);
37+
38+
Flux<Group> getAllGroupsBySource(String orgId, String source);
39+
40+
Mono<Boolean> bulkCreateSyncGroup(Collection<Group> groups);
41+
42+
Mono<Boolean> bulkUpdateGroup(Collection<PartialResourceWithId<Group>> groups);
43+
44+
3645
}

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import com.openblocks.domain.group.util.SystemGroups;
1818
import com.openblocks.domain.organization.model.MemberRole;
1919
import com.openblocks.infra.mongo.MongoUpsertHelper;
20+
import com.openblocks.infra.mongo.MongoUpsertHelper.PartialResourceWithId;
2021

2122
import lombok.extern.slf4j.Slf4j;
2223
import reactor.core.publisher.Flux;
@@ -114,4 +115,19 @@ public Mono<Group> createDevGroup(String orgId) {
114115
public Mono<Group> createAllUserGroup(String orgId) {
115116
return createSystemGroup(orgId, ALL_USER);
116117
}
118+
119+
@Override
120+
public Mono<Boolean> bulkCreateSyncGroup(Collection<Group> groups) {
121+
return repository.saveAll(groups).hasElements();
122+
}
123+
124+
@Override
125+
public Flux<Group> getAllGroupsBySource(String orgId, String source) {
126+
return repository.findBySourceAndOrganizationId(source, orgId);
127+
}
128+
129+
@Override
130+
public Mono<Boolean> bulkUpdateGroup(Collection<PartialResourceWithId<Group>> groups) {
131+
return mongoUpsertHelper.bulkUpdate(groups);
132+
}
117133
}

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,10 @@ public interface OrgMemberService {
4848

4949
Mono<List<OrgMember>> getAllOrgAdmins(String orgId);
5050

51+
Mono<Void> bulkAddMember(String orgId, Collection<String> userIds, MemberRole memberRole);
52+
53+
Mono<Boolean> bulkRemoveMember(String orgId, Collection<String> userIds);
54+
5155
record UserOrgMemberInfo(OrgMember currentOrgMember, List<OrgMember> orgMembers) {
5256
}
5357

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

Lines changed: 40 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
11
package com.openblocks.domain.organization.service;
22

33
import static com.openblocks.infra.birelation.BiRelationBizType.ORG_MEMBER;
4-
import static com.openblocks.infra.util.MonoUtils.emptyMonoIfEmptyList;
54

65
import java.util.Collection;
76
import java.util.HashSet;
87
import java.util.List;
98
import java.util.Map;
109

1110
import org.apache.commons.lang3.StringUtils;
11+
import org.bson.Document;
1212
import org.springframework.beans.factory.annotation.Autowired;
1313
import org.springframework.stereotype.Service;
1414

15+
import com.openblocks.domain.group.model.GroupMember;
1516
import com.openblocks.domain.group.service.GroupMemberService;
1617
import com.openblocks.domain.group.service.GroupService;
1718
import com.openblocks.domain.organization.model.MemberRole;
@@ -22,6 +23,7 @@
2223
import com.openblocks.infra.annotation.PossibleEmptyMono;
2324
import com.openblocks.infra.birelation.BiRelation;
2425
import com.openblocks.infra.birelation.BiRelationService;
26+
import com.openblocks.infra.mongo.MongoUpsertHelper;
2527
import com.openblocks.sdk.config.CommonConfig;
2628
import com.openblocks.sdk.config.CommonConfig.Workspace;
2729
import com.openblocks.sdk.constants.WorkspaceMode;
@@ -49,11 +51,14 @@ public class OrgMemberServiceImpl implements OrgMemberService {
4951
@Autowired
5052
private CommonConfig commonConfig;
5153

54+
@Autowired
55+
private MongoUpsertHelper mongoUpsertHelper;
56+
5257
@Override
5358
public Mono<List<OrgMember>> getOrganizationMembers(String orgId, int page, int count) {
54-
return emptyMonoIfEmptyList(biRelationService.getBySourceId(ORG_MEMBER, orgId)
59+
return biRelationService.getBySourceId(ORG_MEMBER, orgId)
5560
.map(OrgMember::from)
56-
.collectList());
61+
.collectList();
5762
}
5863

5964
/**
@@ -221,4 +226,36 @@ public Mono<List<OrgMember>> getAllOrgAdmins(String orgId) {
221226
.map(OrgMember::from)
222227
.collectList();
223228
}
229+
230+
@Override
231+
public Mono<Void> bulkAddMember(String orgId, Collection<String> userIds, MemberRole memberRole) {
232+
List<BiRelation> biRelations = userIds.stream()
233+
.map(userId -> BiRelation.builder()
234+
.bizType(ORG_MEMBER)
235+
.sourceId(orgId)
236+
.targetId(userId)
237+
.relation(memberRole.getValue())
238+
.state(OrgMemberState.NORMAL.getValue())
239+
.build())
240+
.toList();
241+
return biRelationService.batchAddBiRelation(biRelations)
242+
.then(bulkAddToAllUserGroup(orgId, userIds));
243+
}
244+
245+
private Mono<Void> bulkAddToAllUserGroup(String orgId, Collection<String> userIds) {
246+
return groupService.getAllUsersGroup(orgId)
247+
.map(group -> userIds.stream()
248+
.map(userId -> new GroupMember(group.getId(), userId, MemberRole.MEMBER, orgId, System.currentTimeMillis()))
249+
.toList())
250+
.flatMap(groupMemberService::bulkAddMember)
251+
.then();
252+
}
253+
254+
@Override
255+
public Mono<Boolean> bulkRemoveMember(String orgId, Collection<String> userIds) {
256+
List<Document> filters = userIds.stream()
257+
.map(userId -> new Document(Map.of("bizType", ORG_MEMBER.name(), "sourceId", orgId, "targetId", userId)))
258+
.toList();
259+
return mongoUpsertHelper.bulkRemove(filters, BiRelation.class);
260+
}
224261
}

server/api-service/openblocks-domain/src/main/java/com/openblocks/domain/user/repository/UserRepository.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,6 @@ public interface UserRepository extends ReactiveMongoRepository<User, String> {
1717

1818
Mono<User> findByConnections_SourceAndConnections_RawId(String source, String rawId);
1919

20+
Flux<User> findByConnections_SourceAndConnections_RawIdIn(String source, Collection<String> rawIds);
21+
2022
}

server/api-service/openblocks-domain/src/main/java/com/openblocks/domain/user/service/UserService.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@
1111
import com.openblocks.domain.user.model.User;
1212
import com.openblocks.domain.user.model.UserDetail;
1313
import com.openblocks.infra.annotation.NonEmptyMono;
14+
import com.openblocks.infra.mongo.MongoUpsertHelper.PartialResourceWithId;
1415

16+
import reactor.core.publisher.Flux;
1517
import reactor.core.publisher.Mono;
1618

1719
public interface UserService {
@@ -52,5 +54,12 @@ public interface UserService {
5254
Mono<UserDetail> buildUserDetail(User user, boolean withoutDynamicGroups);
5355

5456
Mono<Boolean> markUserDeletedAndInvalidConnectionsAtEnterpriseMode(String userId);
57+
58+
Flux<User> bulkCreateUser(Collection<User> users);
59+
60+
Mono<Void> bulkUpdateUser(Collection<PartialResourceWithId<User>> users);
61+
62+
Flux<User> findBySourceAndIds(String connectionSource, Collection<String> connectionSourceUuids);
63+
5564
}
5665

server/api-service/openblocks-domain/src/main/java/com/openblocks/domain/user/service/UserServiceImpl.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
import com.openblocks.domain.user.model.UserState;
4747
import com.openblocks.domain.user.repository.UserRepository;
4848
import com.openblocks.infra.mongo.MongoUpsertHelper;
49+
import com.openblocks.infra.mongo.MongoUpsertHelper.PartialResourceWithId;
4950
import com.openblocks.sdk.config.CommonConfig;
5051
import com.openblocks.sdk.config.dynamic.Conf;
5152
import com.openblocks.sdk.config.dynamic.ConfigCenter;
@@ -364,4 +365,20 @@ protected String convertEmail(Set<Connection> connections) {
364365
.map(Connection::getName)
365366
.orElse("");
366367
}
368+
369+
@Override
370+
public Flux<User> bulkCreateUser(Collection<User> users) {
371+
return repository.saveAll(users);
372+
}
373+
374+
@Override
375+
public Mono<Void> bulkUpdateUser(Collection<PartialResourceWithId<User>> partialResourceWithIds) {
376+
return mongoUpsertHelper.bulkUpdate(partialResourceWithIds).then();
377+
}
378+
379+
@Override
380+
public Flux<User> findBySourceAndIds(String connectionSource, Collection<String> connectionSourceUuids) {
381+
return repository.findByConnections_SourceAndConnections_RawIdIn(connectionSource, connectionSourceUuids);
382+
}
383+
367384
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,11 @@
4545
<artifactId>spring-data-mongodb</artifactId>
4646
</dependency>
4747

48+
<dependency>
49+
<groupId>org.springframework.boot</groupId>
50+
<artifactId>spring-boot-starter-data-mongodb-reactive</artifactId>
51+
</dependency>
52+
4853
<dependency>
4954
<groupId>org.projectlombok</groupId>
5055
<artifactId>lombok</artifactId>

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
@@ -28,4 +28,5 @@ private NewUrl() {
2828

2929
public static final String GITHUB_STAR = PREFIX + "/misc/github-star";
3030
public static final String MATERIAL_URL = PREFIX + "/materials";
31+
public static final String CONTACT_SYNC = PREFIX + "/sync";
3132
}

0 commit comments

Comments
 (0)