Skip to content

Commit 02c41aa

Browse files
author
Thomasr
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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy