Skip to content

Commit 02c41aa

Browse files
committed
Added before/after detail of data source permission update event
1 parent a775b3c commit 02c41aa

File tree

4 files changed

+79
-34
lines changed

4 files changed

+79
-34
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package org.lowcoder.infra.event;
2+
3+
import lombok.Getter;
4+
import lombok.experimental.SuperBuilder;
5+
6+
@Getter
7+
@SuperBuilder
8+
public class DatasourceResourcePermissionEvent extends AbstractEvent {
9+
10+
private final String datasourceId;
11+
private final String name;
12+
private final String type;
13+
14+
private final Object oldPermission;
15+
private final Object newPermission;
16+
17+
private final EventType eventType;
18+
}

server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/datasource/DatasourcePermissionEvent.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import org.lowcoder.infra.event.AbstractEvent;
66

77
import java.util.Collection;
8+
import java.util.List;
89

910
@Getter
1011
@SuperBuilder
@@ -18,5 +19,8 @@ public class DatasourcePermissionEvent extends AbstractEvent {
1819
private final Collection<String> groupIds;
1920
private final String role;
2021

22+
private final List<?> oldPermissions;
23+
private final List<?> newPermissions;
24+
2125
private final EventType eventType;
2226
}

server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/datasource/DatasourceController.java

Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import org.lowcoder.domain.datasource.service.DatasourceService;
1818
import org.lowcoder.domain.datasource.service.DatasourceStructureService;
1919
import org.lowcoder.domain.permission.model.ResourceRole;
20+
import org.lowcoder.domain.permission.service.ResourcePermissionService;
2021
import org.lowcoder.domain.plugin.client.dto.GetPluginDynamicConfigRequestDTO;
2122
import org.lowcoder.sdk.exception.BizError;
2223
import org.lowcoder.sdk.models.DatasourceStructure;
@@ -48,6 +49,7 @@ public class DatasourceController implements DatasourceEndpoints
4849
private final BusinessEventPublisher businessEventPublisher;
4950
private final DatasourceService datasourceService;
5051
private final GidService gidService;
52+
private final ResourcePermissionService resourcePermissionService;
5153

5254
@Override
5355
public Mono<ResponseView<Datasource>> create(@Valid @RequestBody UpsertDatasourceRequest request) {
@@ -180,15 +182,17 @@ public Mono<ResponseView<Boolean>> grantPermission(@PathVariable String datasour
180182
return ofError(INVALID_PARAMETER, "INVALID_PARAMETER", request.role());
181183
}
182184
return gidService.convertDatasourceIdToObjectId(datasourceId).flatMap(objectId ->
183-
datasourceApiService.grantPermission(objectId, request.userIds(), request.groupIds(), role)
184-
.delayUntil(result -> {
185-
if (BooleanUtils.isTrue(result)) {
186-
return businessEventPublisher.publishDatasourcePermissionEvent(objectId, request.userIds(),
187-
request.groupIds(), request.role(), DATA_SOURCE_PERMISSION_GRANT);
188-
}
189-
return Mono.empty();
190-
})
191-
.map(ResponseView::success));
185+
datasourceApiService.getPermissions(objectId).flatMap(oldPermissions ->
186+
datasourceApiService.grantPermission(objectId, request.userIds(), request.groupIds(), role)
187+
.delayUntil(result -> {
188+
if (BooleanUtils.isTrue(result)) {
189+
return datasourceApiService.getPermissions(objectId).flatMap(newPermissions ->
190+
businessEventPublisher.publishDatasourcePermissionEvent(objectId, request.userIds(),
191+
request.groupIds(), request.role(), DATA_SOURCE_PERMISSION_GRANT, oldPermissions, newPermissions));
192+
}
193+
return Mono.empty();
194+
})
195+
.map(ResponseView::success)));
192196
}
193197

194198
@Override
@@ -197,21 +201,24 @@ public Mono<ResponseView<Boolean>> updatePermission(@PathVariable("permissionId"
197201
if (request.getResourceRole() == null) {
198202
return ofError(INVALID_PARAMETER, "INVALID_PARAMETER", request.role());
199203
}
200-
return datasourceApiService.updatePermission(permissionId, request.getResourceRole())
204+
return resourcePermissionService.getById(permissionId).flatMap(oldPermission ->
205+
datasourceApiService.updatePermission(permissionId, request.getResourceRole())
201206
.delayUntil(result -> {
202207
if (BooleanUtils.isTrue(result)) {
203-
return businessEventPublisher.publishDatasourcePermissionEvent(permissionId, DATA_SOURCE_PERMISSION_UPDATE);
208+
return resourcePermissionService.getById(permissionId).flatMap(newPermission ->
209+
businessEventPublisher.publishDatasourceResourcePermissionEvent(DATA_SOURCE_PERMISSION_UPDATE, oldPermission, newPermission));
204210
}
205211
return Mono.empty();
206212
})
207-
.map(ResponseView::success);
213+
.map(ResponseView::success));
208214
}
209215

210216
@Override
211217
public Mono<ResponseView<Boolean>> deletePermission(@PathVariable("permissionId") String permissionId) {
212-
return businessEventPublisher.publishDatasourcePermissionEvent(permissionId, DATA_SOURCE_PERMISSION_DELETE)
218+
return resourcePermissionService.getById(permissionId).flatMap(oldPermission ->
219+
businessEventPublisher.publishDatasourceResourcePermissionEvent(DATA_SOURCE_PERMISSION_DELETE, oldPermission, null)
213220
.then(datasourceApiService.deletePermission(permissionId))
214-
.map(ResponseView::success);
221+
.map(ResponseView::success));
215222
}
216223

217224
@Override

server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/util/BusinessEventPublisher.java

Lines changed: 36 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import org.lowcoder.api.application.view.ApplicationPublishRequest;
1111
import org.lowcoder.api.application.view.ApplicationView;
1212
import org.lowcoder.api.home.SessionUserService;
13+
import org.lowcoder.api.permission.view.CommonPermissionView;
1314
import org.lowcoder.api.usermanagement.view.AddMemberRequest;
1415
import org.lowcoder.api.usermanagement.view.UpdateRoleRequest;
1516
import org.lowcoder.domain.application.model.Application;
@@ -710,34 +711,16 @@ public Mono<Void> publishDatasourceEvent(Datasource datasource, EventType eventT
710711
});
711712
}
712713

713-
public Mono<Void> publishDatasourcePermissionEvent(String permissionId, EventType eventType) {
714-
return resourcePermissionService.getById(permissionId)
715-
.zipWhen(resourcePermission -> datasourceService.getById(resourcePermission.getResourceId()))
716-
.flatMap(tuple -> {
717-
ResourcePermission resourcePermission = tuple.getT1();
718-
ResourceHolder holder = resourcePermission.getResourceHolder();
719-
Datasource datasource = tuple.getT2();
720-
return publishDatasourcePermissionEvent(datasource.getId(),
721-
holder == USER ? List.of(resourcePermission.getResourceHolderId()) : Collections.emptyList(),
722-
holder == USER ? Collections.emptyList() : List.of(resourcePermission.getResourceHolderId()),
723-
resourcePermission.getResourceRole().getValue(),
724-
eventType);
725-
})
726-
.onErrorResume(throwable -> {
727-
log.error("publishDatasourcePermissionEvent error.", throwable);
728-
return Mono.empty();
729-
});
730-
}
731-
732714
public Mono<Void> publishDatasourcePermissionEvent(String datasourceId,
733715
Collection<String> userIds, Collection<String> groupIds, String role,
734-
EventType eventType) {
716+
EventType eventType, CommonPermissionView oldPermissions, CommonPermissionView newPermissions) {
735717
return Mono.zip(sessionUserService.getVisitorOrgMemberCache(),
736718
datasourceService.getById(datasourceId),
737719
sessionUserService.getVisitorToken())
738720
.flatMap(tuple -> {
739721
OrgMember orgMember = tuple.getT1();
740722
Datasource datasource = tuple.getT2();
723+
741724
DatasourcePermissionEvent datasourcePermissionEvent = DatasourcePermissionEvent.builder()
742725
.datasourceId(datasourceId)
743726
.name(datasource.getName())
@@ -746,6 +729,8 @@ public Mono<Void> publishDatasourcePermissionEvent(String datasourceId,
746729
.orgId(orgMember.getOrgId())
747730
.userIds(userIds)
748731
.groupIds(groupIds)
732+
.newPermissions(newPermissions==null?null:newPermissions.getPermissions())
733+
.oldPermissions(oldPermissions==null?null:oldPermissions.getPermissions())
749734
.role(role)
750735
.eventType(eventType)
751736
.isAnonymous(Authentication.isAnonymousUser(orgMember.getUserId()))
@@ -763,6 +748,37 @@ public Mono<Void> publishDatasourcePermissionEvent(String datasourceId,
763748
});
764749
}
765750

751+
public Mono<Void> publishDatasourceResourcePermissionEvent(EventType eventType, ResourcePermission oldPermission, ResourcePermission newPermission) {
752+
return Mono.zip(sessionUserService.getVisitorOrgMemberCache(),
753+
datasourceService.getById(oldPermission.getResourceId()),
754+
sessionUserService.getVisitorToken())
755+
.flatMap(tuple -> {
756+
OrgMember orgMember = tuple.getT1();
757+
Datasource datasource = tuple.getT2();
758+
759+
DatasourceResourcePermissionEvent datasourceResourcePermissionEvent = DatasourceResourcePermissionEvent.builder()
760+
.name(datasource.getName())
761+
.type(datasource.getType())
762+
.userId(orgMember.getUserId())
763+
.orgId(orgMember.getOrgId())
764+
.newPermission(newPermission)
765+
.oldPermission(oldPermission)
766+
.eventType(eventType)
767+
.isAnonymous(Authentication.isAnonymousUser(orgMember.getUserId()))
768+
.sessionHash(Hashing.sha512().hashString(tuple.getT3(), StandardCharsets.UTF_8).toString())
769+
.build();
770+
return Mono.deferContextual(contextView -> {
771+
datasourceResourcePermissionEvent.populateDetails(contextView);
772+
applicationEventPublisher.publishEvent(datasourceResourcePermissionEvent);
773+
return Mono.<Void>empty();
774+
});
775+
})
776+
.onErrorResume(throwable -> {
777+
log.error("DatasourceResourcePermissionEvent error.", throwable);
778+
return Mono.empty();
779+
});
780+
}
781+
766782
public Mono<Void> publishLibraryQueryPublishEvent(String id, String oldVersion, String newVersion, EventType eventType) {
767783
return sessionUserService.getVisitorOrgMemberCache()
768784
.zipWith(sessionUserService.getVisitorToken())

0 commit comments

Comments
 (0)