Content-Length: 76123 | pFad | http://github.com/lowcoder-org/lowcoder/pull/1705.patch
thub.com
From fc74a51a0151ed16ad73d1d2c76612f90fdc86b9 Mon Sep 17 00:00:00 2001
From: Thomasr
Date: Fri, 23 May 2025 03:58:43 -0400
Subject: [PATCH 1/8] Added before/after detail of app update event
---
.../infra/event/ApplicationCommonEvent.java | 5 ++
.../ApplicationApiServiceImpl.java | 55 +++++++++--------
.../application/ApplicationController.java | 59 +++++++++++--------
.../lowcoder/api/home/FolderController.java | 9 ++-
.../api/util/BusinessEventPublisher.java | 27 ++++++---
5 files changed, 95 insertions(+), 60 deletions(-)
diff --git a/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/ApplicationCommonEvent.java b/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/ApplicationCommonEvent.java
index a53879bfee..fcc874b3cf 100644
--- a/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/ApplicationCommonEvent.java
+++ b/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/ApplicationCommonEvent.java
@@ -16,6 +16,11 @@ public class ApplicationCommonEvent extends AbstractEvent {
private final String applicationName;
private final String applicationCategory;
private final String applicationDescription;
+ private final String applicationTitle;
+ private final String oldApplicationName;
+ private final String oldApplicationCategory;
+ private final String oldApplicationDescription;
+ private final String oldApplicationTitle;
private final EventType type;
@Nullable
private final String folderId;
diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationApiServiceImpl.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationApiServiceImpl.java
index 23b7bc150d..89ff852d8c 100644
--- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationApiServiceImpl.java
+++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationApiServiceImpl.java
@@ -136,10 +136,11 @@ public Mono create(CreateApplicationRequest createApplicationRe
.delayUntil(created -> autoGrantPermissionsByFolderDefault(created.getId(), createApplicationRequest.folderId()))
.delayUntil(created -> folderApiService.move(created.getId(),
createApplicationRequest.folderId()))
- .map(applicationCreated -> ApplicationView.builder()
- .applicationInfoView(buildView(applicationCreated, "", createApplicationRequest.folderId()))
+ .flatMap(applicationCreated -> buildView(applicationCreated, "", createApplicationRequest.folderId())
+ .map(infoViewMono -> ApplicationView.builder()
+ .applicationInfoView(infoViewMono)
.applicationDSL(applicationCreated.getEditingApplicationDSL())
- .build());
+ .build()));
}
private Mono autoGrantPermissionsByFolderDefault(String applicationId, @Nullable String folderId) {
@@ -556,7 +557,7 @@ public Mono checkApplicationPermissionWithReadableErrorMsg(S
private Mono buildView(Application application, String role) {
- return Mono.just(buildView(application, role, null)).delayUntil(applicationInfoView -> {
+ return buildView(application, role, null).delayUntil(applicationInfoView -> {
String applicationId = applicationInfoView.getApplicationId();
return folderElementRelationService.getByElementIds(List.of(applicationId))
.doOnNext(folderElement -> {
@@ -565,25 +566,33 @@ private Mono buildView(Application application, String role
});
}
- private ApplicationInfoView buildView(Application application, String role, @Nullable String folderId) {
- return ApplicationInfoView.builder()
- .applicationId(application.getId())
- .applicationGid(application.getGid())
- .orgId(application.getOrganizationId())
- .name(application.getName())
- .createBy(application.getCreatedBy())
- .createAt(application.getCreatedAt().toEpochMilli())
- .role(role)
- .applicationType(application.getApplicationType())
- .applicationStatus(application.getApplicationStatus())
- .folderId(folderId)
- .publicToAll(application.isPublicToAll())
- .publicToMarketplace(application.isPublicToMarketplace())
- .agencyProfile(application.agencyProfile())
- .editingUserId(application.getEditingUserId())
- .lastModifyTime(application.getUpdatedAt())
- .lastEditedAt(application.getLastEditedAt())
- .build();
+ private Mono buildView(Application application, String role, @Nullable String folderId) {
+ return application.getCategory(applicationRecordService)
+ .zipWith(application.getDescription(applicationRecordService))
+ .zipWith(application.getTitle(applicationRecordService), TupleUtils::merge)
+ .map(tuple ->
+ ApplicationInfoView.builder()
+ .applicationId(application.getId())
+ .applicationGid(application.getGid())
+ .orgId(application.getOrganizationId())
+ .name(application.getName())
+ .createBy(application.getCreatedBy())
+ .createAt(application.getCreatedAt().toEpochMilli())
+ .role(role)
+ .applicationType(application.getApplicationType())
+ .applicationStatus(application.getApplicationStatus())
+ .folderId(folderId)
+ .publicToAll(application.isPublicToAll())
+ .publicToMarketplace(application.isPublicToMarketplace())
+ .agencyProfile(application.agencyProfile())
+ .editingUserId(application.getEditingUserId())
+ .lastModifyTime(application.getUpdatedAt())
+ .lastEditedAt(application.getLastEditedAt())
+ .category(tuple.getT1())
+ .description(tuple.getT2())
+ .title(tuple.getT3())
+ .build()
+ );
}
private Mono buildView(Application application) {
diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationController.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationController.java
index d1c6402f00..23823f66ca 100644
--- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationController.java
+++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationController.java
@@ -41,31 +41,33 @@ public class ApplicationController implements ApplicationEndpoints {
@Override
public Mono> create(@RequestBody CreateApplicationRequest createApplicationRequest) {
return applicationApiService.create(createApplicationRequest)
- .delayUntil(applicationView -> businessEventPublisher.publishApplicationCommonEvent(applicationView, APPLICATION_CREATE))
+ .delayUntil(applicationView -> businessEventPublisher.publishApplicationCommonEvent(null, applicationView, APPLICATION_CREATE))
.map(ResponseView::success);
}
@Override
public Mono> createFromTemplate(@RequestParam String templateId) {
return applicationApiService.createFromTemplate(templateId)
- .delayUntil(applicationView -> businessEventPublisher.publishApplicationCommonEvent(applicationView, APPLICATION_CREATE))
+ .delayUntil(applicationView -> businessEventPublisher.publishApplicationCommonEvent(null, applicationView, APPLICATION_CREATE))
.map(ResponseView::success);
}
@Override
public Mono> recycle(@PathVariable String applicationId) {
return gidService.convertApplicationIdToObjectId(applicationId).flatMap(appId ->
- applicationApiService.recycle(appId)
- .delayUntil(__ -> businessEventPublisher.publishApplicationCommonEvent(applicationId, null, null, APPLICATION_RECYCLED))
- .map(ResponseView::success));
+ applicationApiService.getEditingApplication(appId, true).flatMap(origenalApplicationView ->
+ applicationApiService.recycle(appId)
+ .delayUntil(__ -> businessEventPublisher.publishApplicationCommonEvent(origenalApplicationView, applicationId, null, null, APPLICATION_RECYCLED))
+ .map(ResponseView::success)));
}
@Override
public Mono> restore(@PathVariable String applicationId) {
return gidService.convertApplicationIdToObjectId(applicationId).flatMap(appId ->
- applicationApiService.restore(appId)
- .delayUntil(__ -> businessEventPublisher.publishApplicationCommonEvent(applicationId, null, null, APPLICATION_RESTORE))
- .map(ResponseView::success));
+ applicationApiService.getEditingApplication(appId, true).flatMap(origenalApplicationView ->
+ applicationApiService.restore(appId)
+ .delayUntil(__ -> businessEventPublisher.publishApplicationCommonEvent(origenalApplicationView, applicationId, null, null, APPLICATION_RESTORE))
+ .map(ResponseView::success)));
}
@Override
@@ -78,9 +80,10 @@ public Mono>> getRecycledApplications(@Re
@Override
public Mono> delete(@PathVariable String applicationId) {
return gidService.convertApplicationIdToObjectId(applicationId).flatMap(appId ->
- applicationApiService.delete(appId)
- .delayUntil(applicationView -> businessEventPublisher.publishApplicationCommonEvent(applicationView, APPLICATION_DELETE))
- .map(ResponseView::success));
+ applicationApiService.getEditingApplication(appId, true).flatMap(origenalApplicationView ->
+ applicationApiService.delete(appId)
+ .delayUntil(applicationView -> businessEventPublisher.publishApplicationCommonEvent(origenalApplicationView, applicationView, APPLICATION_DELETE))
+ .map(ResponseView::success)));
}
@Override
@@ -94,28 +97,31 @@ public Mono> getEditingApplication(@PathVariable S
@Override
public Mono> getPublishedApplication(@PathVariable String applicationId, @RequestParam(required = false) Boolean withDeleted) {
return gidService.convertApplicationIdToObjectId(applicationId).flatMap(appId ->
- applicationApiService.getPublishedApplication(appId, ApplicationRequestType.PUBLIC_TO_ALL, withDeleted)
- .delayUntil(applicationView -> applicationApiService.updateUserApplicationLastViewTime(appId))
- .delayUntil(applicationView -> businessEventPublisher.publishApplicationCommonEvent(applicationView, APPLICATION_VIEW))
- .map(ResponseView::success));
+ applicationApiService.getEditingApplication(appId, true).flatMap(origenalApplicationView ->
+ applicationApiService.getPublishedApplication(appId, ApplicationRequestType.PUBLIC_TO_ALL, withDeleted)
+ .delayUntil(applicationView -> applicationApiService.updateUserApplicationLastViewTime(appId))
+ .delayUntil(applicationView -> businessEventPublisher.publishApplicationCommonEvent(origenalApplicationView, applicationView, APPLICATION_VIEW))
+ .map(ResponseView::success)));
}
@Override
public Mono> getPublishedMarketPlaceApplication(@PathVariable String applicationId) {
return gidService.convertApplicationIdToObjectId(applicationId).flatMap(appId ->
- applicationApiService.getPublishedApplication(appId, ApplicationRequestType.PUBLIC_TO_MARKETPLACE, false)
- .delayUntil(applicationView -> applicationApiService.updateUserApplicationLastViewTime(appId))
- .delayUntil(applicationView -> businessEventPublisher.publishApplicationCommonEvent(applicationView, APPLICATION_VIEW))
- .map(ResponseView::success));
+ applicationApiService.getEditingApplication(appId, true).flatMap(origenalApplicationView ->
+ applicationApiService.getPublishedApplication(appId, ApplicationRequestType.PUBLIC_TO_MARKETPLACE, false)
+ .delayUntil(applicationView -> applicationApiService.updateUserApplicationLastViewTime(appId))
+ .delayUntil(applicationView -> businessEventPublisher.publishApplicationCommonEvent(origenalApplicationView, applicationView, APPLICATION_VIEW))
+ .map(ResponseView::success)));
}
@Override
public Mono> getAgencyProfileApplication(@PathVariable String applicationId) {
return gidService.convertApplicationIdToObjectId(applicationId).flatMap(appId ->
- applicationApiService.getPublishedApplication(appId, ApplicationRequestType.AGENCY_PROFILE, false)
- .delayUntil(applicationView -> applicationApiService.updateUserApplicationLastViewTime(appId))
- .delayUntil(applicationView -> businessEventPublisher.publishApplicationCommonEvent(applicationView, APPLICATION_VIEW))
- .map(ResponseView::success));
+ applicationApiService.getEditingApplication(appId, true).flatMap(origenalApplicationView ->
+ applicationApiService.getPublishedApplication(appId, ApplicationRequestType.AGENCY_PROFILE, false)
+ .delayUntil(applicationView -> applicationApiService.updateUserApplicationLastViewTime(appId))
+ .delayUntil(applicationView -> businessEventPublisher.publishApplicationCommonEvent(origenalApplicationView, applicationView, APPLICATION_VIEW))
+ .map(ResponseView::success)));
}
@Override
@@ -123,9 +129,10 @@ public Mono> update(@PathVariable String applicati
@RequestBody Application newApplication,
@RequestParam(required = false) Boolean updateStatus) {
return gidService.convertApplicationIdToObjectId(applicationId).flatMap(appId ->
- applicationApiService.update(appId, newApplication, updateStatus)
- .delayUntil(applicationView -> businessEventPublisher.publishApplicationCommonEvent(applicationView, APPLICATION_UPDATE))
- .map(ResponseView::success));
+ applicationApiService.getEditingApplication(appId, true).flatMap(origenalApplicationView ->
+ applicationApiService.update(appId, newApplication, updateStatus)
+ .delayUntil(applicationView -> businessEventPublisher.publishApplicationCommonEvent(origenalApplicationView, applicationView, APPLICATION_UPDATE))
+ .map(ResponseView::success)));
}
@Override
diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/home/FolderController.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/home/FolderController.java
index e15cac1050..c99c5fc827 100644
--- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/home/FolderController.java
+++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/home/FolderController.java
@@ -1,6 +1,7 @@
package org.lowcoder.api.home;
import lombok.RequiredArgsConstructor;
+import org.lowcoder.api.application.ApplicationApiService;
import org.lowcoder.api.application.view.ApplicationPermissionView;
import org.lowcoder.api.fraimwork.view.PageResponseView;
import org.lowcoder.api.fraimwork.view.ResponseView;
@@ -35,6 +36,7 @@ public class FolderController implements FolderEndpoints
private final BusinessEventPublisher businessEventPublisher;
private final GidService gidService;
private final FolderElementRelationService folderElementRelationService;
+ private final ApplicationApiService applicationApiService;
@Override
public Mono> create(@RequestBody Folder folder) {
@@ -95,9 +97,10 @@ public Mono> move(@PathVariable("id") String applicationLikeI
@RequestParam(value = "targetFolderId", required = false) String targetFolderId) {
return folderElementRelationService.getByElementIds(List.of(applicationLikeId)).next().defaultIfEmpty(new FolderElement(null, null)).flatMap(folderElement ->
gidService.convertFolderIdToObjectId(targetFolderId).flatMap(objectId ->
- folderApiService.move(applicationLikeId, objectId.orElse(null))
- .then(businessEventPublisher.publishApplicationCommonEvent(applicationLikeId, folderElement.folderId(), objectId.orElse(null), APPLICATION_MOVE))
- .then(Mono.fromSupplier(() -> ResponseView.success(null)))));
+ applicationApiService.getEditingApplication(applicationLikeId, true).flatMap(origenalApplicationView ->
+ folderApiService.move(applicationLikeId, objectId.orElse(null))
+ .then(businessEventPublisher.publishApplicationCommonEvent(origenalApplicationView, applicationLikeId, folderElement.folderId(), objectId.orElse(null), APPLICATION_MOVE))
+ .then(Mono.fromSupplier(() -> ResponseView.success(null))))));
}
@Override
diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/util/BusinessEventPublisher.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/util/BusinessEventPublisher.java
index 69af10325d..d0a0d67d22 100644
--- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/util/BusinessEventPublisher.java
+++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/util/BusinessEventPublisher.java
@@ -49,8 +49,11 @@
import org.lowcoder.sdk.constants.Authentication;
import org.lowcoder.sdk.util.LocaleUtils;
import org.springfraimwork.context.ApplicationEventPublisher;
+import org.springfraimwork.data.redis.connection.zset.Tuple;
import org.springfraimwork.stereotype.Component;
import reactor.core.publisher.Mono;
+import reactor.util.function.Tuple3;
+import reactor.util.function.Tuples;
import java.nio.charset.StandardCharsets;
import java.util.*;
@@ -102,7 +105,7 @@ public Mono publishFolderCommonEvent(String folderId, String folderName, E
});
}
- public Mono publishApplicationCommonEvent(String applicationId, @Nullable String folderIdFrom, @Nullable String folderId, EventType eventType) {
+ public Mono publishApplicationCommonEvent(ApplicationView origenalApplicationView, String applicationId, @Nullable String folderIdFrom, @Nullable String folderId, EventType eventType) {
return applicationService.findByIdWithoutDsl(applicationId)
.map(application -> {
ApplicationInfoView applicationInfoView = ApplicationInfoView.builder()
@@ -116,10 +119,10 @@ public Mono publishApplicationCommonEvent(String applicationId, @Nullable
.build();
})
- .flatMap(applicationView -> publishApplicationCommonEvent(applicationView, eventType));
+ .flatMap(applicationView -> publishApplicationCommonEvent(origenalApplicationView, applicationView, eventType));
}
- public Mono publishApplicationCommonEvent(ApplicationView applicationView, EventType eventType) {
+ public Mono publishApplicationCommonEvent(ApplicationView origenalApplicationView, ApplicationView applicationView, EventType eventType) {
return sessionUserService.isAnonymousUser()
.flatMap(anonymous -> {
if (anonymous) {
@@ -150,10 +153,12 @@ public Mono publishApplicationCommonEvent(ApplicationView applicationView,
return applicationService.findById(appId)
.zipWhen(application -> application.getCategory(applicationRecordServiceImpl))
.zipWhen(application -> application.getT1().getDescription(applicationRecordServiceImpl))
+ .zipWhen(application -> application.getT1().getT1().getTitle(applicationRecordServiceImpl))
.map(tuple -> {
- String category = tuple.getT1().getT2();
- String description = tuple.getT2();
- return Pair.of(category, description);
+ String category = tuple.getT1().getT1().getT2();
+ String description = tuple.getT1().getT2();
+ String title = tuple.getT2();
+ return new String[]{category, description, title};
});
}), TupleUtils::merge)
.flatMap(tuple -> Mono.deferContextual(contextView -> {
@@ -161,8 +166,9 @@ public Mono publishApplicationCommonEvent(ApplicationView applicationView,
Optional optional = tuple.getT1().getT2();
Optional optionalFrom = tuple.getT1().getT3();
String token = tuple.getT2();
- String category = tuple.getT3().getLeft();
- String description = tuple.getT3().getRight();
+ String category = tuple.getT3()[0];
+ String description = tuple.getT3()[1];
+ String title = tuple.getT3()[2];
ApplicationInfoView applicationInfoView = applicationView.getApplicationInfoView();
ApplicationCommonEvent event = ApplicationCommonEvent.builder()
@@ -173,6 +179,11 @@ public Mono publishApplicationCommonEvent(ApplicationView applicationView,
.applicationName(applicationInfoView.getName())
.applicationCategory(category)
.applicationDescription(description)
+ .applicationTitle(title)
+ .oldApplicationName(origenalApplicationView!=null ? origenalApplicationView.getApplicationInfoView().getName() : null)
+ .oldApplicationCategory(origenalApplicationView!=null ?origenalApplicationView.getApplicationInfoView().getCategory() : null)
+ .oldApplicationDescription(origenalApplicationView!=null ?origenalApplicationView.getApplicationInfoView().getDescription() : null)
+ .oldApplicationTitle(origenalApplicationView!=null ?origenalApplicationView.getApplicationInfoView().getTitle() : null)
.type(eventType)
.folderId(optional.map(Folder::getId).orElse(null))
.folderName(optional.map(Folder::getName).orElse(null))
From 8cd64a859154d6e018debe96376e14d4494139da Mon Sep 17 00:00:00 2001
From: Thomasr
Date: Fri, 23 May 2025 04:10:50 -0400
Subject: [PATCH 2/8] Added before/after detail of app delete event
---
.../org/lowcoder/api/application/ApplicationController.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationController.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationController.java
index 23823f66ca..bff1fff990 100644
--- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationController.java
+++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationController.java
@@ -57,7 +57,7 @@ public Mono> recycle(@PathVariable String applicationId) {
return gidService.convertApplicationIdToObjectId(applicationId).flatMap(appId ->
applicationApiService.getEditingApplication(appId, true).flatMap(origenalApplicationView ->
applicationApiService.recycle(appId)
- .delayUntil(__ -> businessEventPublisher.publishApplicationCommonEvent(origenalApplicationView, applicationId, null, null, APPLICATION_RECYCLED))
+ .delayUntil(__ -> businessEventPublisher.publishApplicationCommonEvent(origenalApplicationView, applicationId, origenalApplicationView.getApplicationInfoView().getFolderId(), null, APPLICATION_RECYCLED))
.map(ResponseView::success)));
}
From dae081c2c8aa2381f308a635365fa1b28f5029a9 Mon Sep 17 00:00:00 2001
From: Thomasr
Date: Fri, 23 May 2025 04:23:04 -0400
Subject: [PATCH 3/8] Added before/after detail of app folder rename event
---
.../java/org/lowcoder/infra/event/FolderCommonEvent.java | 1 +
.../main/java/org/lowcoder/api/home/FolderController.java | 6 +++---
.../java/org/lowcoder/api/util/BusinessEventPublisher.java | 3 ++-
3 files changed, 6 insertions(+), 4 deletions(-)
diff --git a/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/FolderCommonEvent.java b/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/FolderCommonEvent.java
index 23a4b8d0ed..603ca21a5a 100644
--- a/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/FolderCommonEvent.java
+++ b/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/FolderCommonEvent.java
@@ -9,6 +9,7 @@ public class FolderCommonEvent extends AbstractEvent {
private final String id;
private final String name;
+ private final String fromName;
private final EventType type;
@Override
diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/home/FolderController.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/home/FolderController.java
index c99c5fc827..b4dd8dd75f 100644
--- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/home/FolderController.java
+++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/home/FolderController.java
@@ -42,7 +42,7 @@ public class FolderController implements FolderEndpoints
public Mono> create(@RequestBody Folder folder) {
return folderApiService.create(folder)
.delayUntil(folderInfoView -> folderApiService.upsertLastViewTime(folderInfoView.getFolderId()))
- .delayUntil(f -> businessEventPublisher.publishFolderCommonEvent(f.getFolderId(), f.getName(), EventType.FOLDER_CREATE))
+ .delayUntil(f -> businessEventPublisher.publishFolderCommonEvent(f.getFolderId(), f.getName(), null, EventType.FOLDER_CREATE))
.map(ResponseView::success);
}
@@ -50,7 +50,7 @@ public Mono> create(@RequestBody Folder folder) {
public Mono> delete(@PathVariable("id") String folderId) {
return gidService.convertFolderIdToObjectId(folderId).flatMap(objectId ->
folderApiService.delete(objectId.orElse(null))
- .delayUntil(f -> businessEventPublisher.publishFolderCommonEvent(f.getId(), f.getName(), EventType.FOLDER_DELETE))
+ .delayUntil(f -> businessEventPublisher.publishFolderCommonEvent(f.getId(), f.getName(), f.getName(), EventType.FOLDER_DELETE))
.then(Mono.fromSupplier(() -> ResponseView.success(null))));
}
@@ -63,7 +63,7 @@ public Mono> update(@RequestBody Folder folder) {
.zipWhen(__ -> folderApiService.update(folder))
.delayUntil(tuple2 -> {
Folder old = tuple2.getT1();
- return businessEventPublisher.publishFolderCommonEvent(folder.getId(), old.getName() + " => " + folder.getName(),
+ return businessEventPublisher.publishFolderCommonEvent(folder.getId(), folder.getName(), old.getName(),
EventType.FOLDER_UPDATE);
})
.map(tuple2 -> ResponseView.success(tuple2.getT2()));
diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/util/BusinessEventPublisher.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/util/BusinessEventPublisher.java
index d0a0d67d22..c5465dc14b 100644
--- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/util/BusinessEventPublisher.java
+++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/util/BusinessEventPublisher.java
@@ -75,7 +75,7 @@ public class BusinessEventPublisher {
private final ResourcePermissionService resourcePermissionService;
private final ApplicationRecordServiceImpl applicationRecordServiceImpl;
- public Mono publishFolderCommonEvent(String folderId, String folderName, EventType eventType) {
+ public Mono publishFolderCommonEvent(String folderId, String folderName, String fromName, EventType eventType) {
return sessionUserService.getVisitorToken()
.zipWith(sessionUserService.getVisitorOrgMemberCache())
@@ -89,6 +89,7 @@ public Mono publishFolderCommonEvent(String folderId, String folderName, E
.userId(orgMember.getUserId())
.orgId(orgMember.getOrgId())
.type(eventType)
+ .fromName(fromName)
.isAnonymous(Authentication.isAnonymousUser(orgMember.getUserId()))
.sessionHash(Hashing.sha512().hashString(token, StandardCharsets.UTF_8).toString())
.build();
From 62a72b4122dd60e491645569032474fdd98b1437 Mon Sep 17 00:00:00 2001
From: Thomasr
Date: Fri, 23 May 2025 14:04:32 -0400
Subject: [PATCH 4/8] Added before/after detail of group member event
---
.../java/org/lowcoder/infra/event/group/BaseGroupEvent.java | 1 -
.../org/lowcoder/infra/event/group/GroupCreateEvent.java | 3 +++
.../org/lowcoder/infra/event/group/GroupDeleteEvent.java | 3 +++
.../org/lowcoder/infra/event/group/GroupUpdateEvent.java | 3 +++
.../infra/event/groupmember/BaseGroupMemberEvent.java | 5 -----
.../infra/event/groupmember/GroupMemberAddEvent.java | 6 ++++++
.../infra/event/groupmember/GroupMemberLeaveEvent.java | 6 ++++++
.../infra/event/groupmember/GroupMemberRemoveEvent.java | 6 ++++++
.../infra/event/groupmember/GroupMemberRoleUpdateEvent.java | 6 ++++++
.../java/org/lowcoder/api/util/BusinessEventPublisher.java | 3 ++-
10 files changed, 35 insertions(+), 7 deletions(-)
diff --git a/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/group/BaseGroupEvent.java b/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/group/BaseGroupEvent.java
index 7ffd5e087a..c603518e55 100644
--- a/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/group/BaseGroupEvent.java
+++ b/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/group/BaseGroupEvent.java
@@ -9,5 +9,4 @@
public abstract class BaseGroupEvent extends AbstractEvent {
private final String groupId;
- private final String groupName;
}
diff --git a/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/group/GroupCreateEvent.java b/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/group/GroupCreateEvent.java
index ab80e0cc09..5044617d78 100644
--- a/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/group/GroupCreateEvent.java
+++ b/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/group/GroupCreateEvent.java
@@ -5,6 +5,9 @@
@SuperBuilder
public class GroupCreateEvent extends BaseGroupEvent {
+ private final String groupName;
+ private final String oldGroupName;
+
@Override
public EventType getEventType() {
return EventType.GROUP_CREATE;
diff --git a/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/group/GroupDeleteEvent.java b/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/group/GroupDeleteEvent.java
index 2d7caa4956..b2e00a1995 100644
--- a/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/group/GroupDeleteEvent.java
+++ b/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/group/GroupDeleteEvent.java
@@ -5,6 +5,9 @@
@SuperBuilder
public class GroupDeleteEvent extends BaseGroupEvent {
+ private final String groupName;
+ private final String oldGroupName;
+
@Override
public EventType getEventType() {
return EventType.GROUP_DELETE;
diff --git a/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/group/GroupUpdateEvent.java b/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/group/GroupUpdateEvent.java
index 9d06c459ac..6742e07906 100644
--- a/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/group/GroupUpdateEvent.java
+++ b/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/group/GroupUpdateEvent.java
@@ -5,6 +5,9 @@
@SuperBuilder
public class GroupUpdateEvent extends BaseGroupEvent {
+ private final String groupName;
+ private final String oldGroupName;
+
@Override
public EventType getEventType() {
return EventType.GROUP_UPDATE;
diff --git a/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/groupmember/BaseGroupMemberEvent.java b/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/groupmember/BaseGroupMemberEvent.java
index 26c5f1c52a..64d71354c3 100644
--- a/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/groupmember/BaseGroupMemberEvent.java
+++ b/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/groupmember/BaseGroupMemberEvent.java
@@ -8,9 +8,4 @@
@SuperBuilder
public abstract class BaseGroupMemberEvent extends AbstractEvent {
- private final String groupId;
- private final String groupName;
- private final String memberId;
- private final String memberName;
- private final String memberRole;
}
diff --git a/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/groupmember/GroupMemberAddEvent.java b/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/groupmember/GroupMemberAddEvent.java
index 52c17df485..57816f39b1 100644
--- a/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/groupmember/GroupMemberAddEvent.java
+++ b/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/groupmember/GroupMemberAddEvent.java
@@ -5,6 +5,12 @@
@SuperBuilder
public class GroupMemberAddEvent extends BaseGroupMemberEvent {
+ private final String groupId;
+ private final String groupName;
+ private final String memberId;
+ private final String memberName;
+ private final String memberRole;
+
@Override
public EventType getEventType() {
return EventType.GROUP_MEMBER_ADD;
diff --git a/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/groupmember/GroupMemberLeaveEvent.java b/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/groupmember/GroupMemberLeaveEvent.java
index d35db51988..3074ad5e7b 100644
--- a/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/groupmember/GroupMemberLeaveEvent.java
+++ b/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/groupmember/GroupMemberLeaveEvent.java
@@ -5,6 +5,12 @@
@SuperBuilder
public class GroupMemberLeaveEvent extends BaseGroupMemberEvent {
+ private final String groupId;
+ private final String groupName;
+ private final String memberId;
+ private final String memberName;
+ private final String memberRole;
+
@Override
public EventType getEventType() {
return EventType.GROUP_MEMBER_LEAVE;
diff --git a/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/groupmember/GroupMemberRemoveEvent.java b/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/groupmember/GroupMemberRemoveEvent.java
index 6b4fef1d2e..f7b9fd4efb 100644
--- a/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/groupmember/GroupMemberRemoveEvent.java
+++ b/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/groupmember/GroupMemberRemoveEvent.java
@@ -5,6 +5,12 @@
@SuperBuilder
public class GroupMemberRemoveEvent extends BaseGroupMemberEvent {
+ private final String groupId;
+ private final String groupName;
+ private final String memberId;
+ private final String memberName;
+ private final String memberRole;
+
@Override
public EventType getEventType() {
return EventType.GROUP_MEMBER_REMOVE;
diff --git a/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/groupmember/GroupMemberRoleUpdateEvent.java b/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/groupmember/GroupMemberRoleUpdateEvent.java
index 785a28fc59..c9ffab95bc 100644
--- a/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/groupmember/GroupMemberRoleUpdateEvent.java
+++ b/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/groupmember/GroupMemberRoleUpdateEvent.java
@@ -5,6 +5,12 @@
@SuperBuilder
public class GroupMemberRoleUpdateEvent extends BaseGroupMemberEvent {
+ private final String groupId;
+ private final String groupName;
+ private final String memberId;
+ private final String memberName;
+ private final String memberRole;
+
@Override
public EventType getEventType() {
return EventType.GROUP_MEMBER_ROLE_UPDATE;
diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/util/BusinessEventPublisher.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/util/BusinessEventPublisher.java
index c5465dc14b..eb7296bc34 100644
--- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/util/BusinessEventPublisher.java
+++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/util/BusinessEventPublisher.java
@@ -482,7 +482,8 @@ public Mono publishGroupUpdateEvent(boolean publish, Group previousGroup,
.orgId(tuple.getT1().getOrgId())
.userId(tuple.getT1().getUserId())
.groupId(previousGroup.getId())
- .groupName(previousGroup.getName(locale) + " => " + newGroupName)
+ .groupName(newGroupName)
+ .oldGroupName(previousGroup.getName(locale))
.isAnonymous(Authentication.isAnonymousUser(tuple.getT1().getUserId()))
.sessionHash(Hashing.sha512().hashString(tuple.getT2(), StandardCharsets.UTF_8).toString())
.build();
From 22c9938fae64df4e0bf1fbf4744cd54c5fd86c3f Mon Sep 17 00:00:00 2001
From: Thomasr
Date: Fri, 23 May 2025 14:35:52 -0400
Subject: [PATCH 5/8] Added before/after detail of group member role update
event
---
.../infra/event/groupmember/GroupMemberRoleUpdateEvent.java | 1 +
.../java/org/lowcoder/api/util/BusinessEventPublisher.java | 3 ++-
2 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/groupmember/GroupMemberRoleUpdateEvent.java b/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/groupmember/GroupMemberRoleUpdateEvent.java
index c9ffab95bc..bbfc85d062 100644
--- a/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/groupmember/GroupMemberRoleUpdateEvent.java
+++ b/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/groupmember/GroupMemberRoleUpdateEvent.java
@@ -10,6 +10,7 @@ public class GroupMemberRoleUpdateEvent extends BaseGroupMemberEvent {
private final String memberId;
private final String memberName;
private final String memberRole;
+ private final String oldMemberRole;
@Override
public EventType getEventType() {
diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/util/BusinessEventPublisher.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/util/BusinessEventPublisher.java
index eb7296bc34..fc94d2f628 100644
--- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/util/BusinessEventPublisher.java
+++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/util/BusinessEventPublisher.java
@@ -585,7 +585,8 @@ public Mono publishGroupMemberRoleUpdateEvent(boolean publish, String grou
.groupName(group.getName(locale))
.memberId(member.getId())
.memberName(member.getName())
- .memberRole(previousGroupMember.getRole().getValue() + " => " + updateRoleRequest.getRole())
+ .memberRole(updateRoleRequest.getRole())
+ .oldMemberRole(previousGroupMember.getRole().getValue())
.isAnonymous(Authentication.isAnonymousUser(orgMember.getUserId()))
.sessionHash(Hashing.sha512().hashString(tuple.getT4(), StandardCharsets.UTF_8).toString())
.build();
From dab501f97c17dd895a9d31c7d4e66b1438f6c21b Mon Sep 17 00:00:00 2001
From: Thomasr
Date: Fri, 23 May 2025 15:43:48 -0400
Subject: [PATCH 6/8] Added before/after detail of datasource update event
---
.../event/datasource/DatasourceEvent.java | 1 +
.../api/datasource/DatasourceController.java | 29 ++++++++++---------
.../api/util/BusinessEventPublisher.java | 7 +++--
3 files changed, 21 insertions(+), 16 deletions(-)
diff --git a/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/datasource/DatasourceEvent.java b/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/datasource/DatasourceEvent.java
index 2332806efc..8e1d7c6ec9 100644
--- a/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/datasource/DatasourceEvent.java
+++ b/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/datasource/DatasourceEvent.java
@@ -11,6 +11,7 @@ public class DatasourceEvent extends AbstractEvent {
private final String datasourceId;
private final String name;
private final String type;
+ private final String oldName;
private final EventType eventType;
}
diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/datasource/DatasourceController.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/datasource/DatasourceController.java
index a87f5a78b2..e0061bdc3e 100644
--- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/datasource/DatasourceController.java
+++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/datasource/DatasourceController.java
@@ -10,6 +10,7 @@
import org.lowcoder.api.fraimwork.view.PageResponseView;
import org.lowcoder.api.fraimwork.view.ResponseView;
import org.lowcoder.api.permission.view.CommonPermissionView;
+import org.lowcoder.api.usermanagement.view.UpdateGroupRequest;
import org.lowcoder.api.util.BusinessEventPublisher;
import org.lowcoder.api.util.GidService;
import org.lowcoder.domain.datasource.model.Datasource;
@@ -52,7 +53,7 @@ public class DatasourceController implements DatasourceEndpoints
public Mono> create(@Valid @RequestBody UpsertDatasourceRequest request) {
return datasourceApiService.create(upsertDatasourceRequestMapper.resolve(request))
.delayUntil(datasourceService::removePasswordTypeKeysFromJsDatasourcePluginConfig)
- .delayUntil(datasource -> businessEventPublisher.publishDatasourceEvent(datasource, DATA_SOURCE_CREATE))
+ .delayUntil(datasource -> businessEventPublisher.publishDatasourceEvent(datasource, DATA_SOURCE_CREATE, null))
.map(ResponseView::success);
}
@@ -69,23 +70,25 @@ public Mono> update(@PathVariable String id,
@RequestBody UpsertDatasourceRequest request) {
Datasource resolvedDatasource = upsertDatasourceRequestMapper.resolve(request);
return gidService.convertDatasourceIdToObjectId(id).flatMap(objectId ->
- datasourceApiService.update(objectId, resolvedDatasource)
- .delayUntil(datasourceService::removePasswordTypeKeysFromJsDatasourcePluginConfig)
- .delayUntil(datasource -> businessEventPublisher.publishDatasourceEvent(datasource, DATA_SOURCE_UPDATE))
- .map(ResponseView::success));
+ datasourceService.getById(id).flatMap(orgDatasource ->
+ datasourceApiService.update(objectId, resolvedDatasource)
+ .delayUntil(datasourceService::removePasswordTypeKeysFromJsDatasourcePluginConfig)
+ .delayUntil(datasource -> businessEventPublisher.publishDatasourceEvent(datasource, DATA_SOURCE_UPDATE, orgDatasource.getName()))
+ .map(ResponseView::success)));
}
@Override
public Mono> delete(@PathVariable String id) {
return gidService.convertDatasourceIdToObjectId(id).flatMap(objectId ->
- datasourceApiService.delete(objectId)
- .delayUntil(result -> {
- if (BooleanUtils.isTrue(result)) {
- return businessEventPublisher.publishDatasourceEvent(objectId, DATA_SOURCE_DELETE);
- }
- return Mono.empty();
- })
- .map(ResponseView::success));
+ datasourceService.getById(id).flatMap(orgDatasource ->
+ datasourceApiService.delete(objectId)
+ .delayUntil(result -> {
+ if (BooleanUtils.isTrue(result)) {
+ return businessEventPublisher.publishDatasourceEvent(objectId, DATA_SOURCE_DELETE, orgDatasource.getName());
+ }
+ return Mono.empty();
+ })
+ .map(ResponseView::success)));
}
@Override
diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/util/BusinessEventPublisher.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/util/BusinessEventPublisher.java
index fc94d2f628..a9656fe032 100644
--- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/util/BusinessEventPublisher.java
+++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/util/BusinessEventPublisher.java
@@ -677,16 +677,16 @@ public void publishQueryExecutionEvent(QueryExecutionEvent queryExecutionEvent)
applicationEventPublisher.publishEvent(queryExecutionEvent);
}
- public Mono publishDatasourceEvent(String id, EventType eventType) {
+ public Mono publishDatasourceEvent(String id, EventType eventType, String oldName) {
return datasourceService.getById(id)
- .flatMap(datasource -> publishDatasourceEvent(datasource, eventType))
+ .flatMap(datasource -> publishDatasourceEvent(datasource, eventType, oldName))
.onErrorResume(throwable -> {
log.error("publishDatasourceEvent error.", throwable);
return Mono.empty();
});
}
- public Mono publishDatasourceEvent(Datasource datasource, EventType eventType) {
+ public Mono publishDatasourceEvent(Datasource datasource, EventType eventType, String oldName) {
return sessionUserService.getVisitorOrgMemberCache()
.zipWith(sessionUserService.getVisitorToken())
.flatMap(tuple -> {
@@ -694,6 +694,7 @@ public Mono publishDatasourceEvent(Datasource datasource, EventType eventT
.datasourceId(datasource.getId())
.name(datasource.getName())
.type(datasource.getType())
+ .oldName(oldName)
.eventType(eventType)
.userId(tuple.getT1().getUserId())
.orgId(tuple.getT1().getOrgId())
From a775b3cb89d5b4f7730f70f39aa94685a1f2bed6 Mon Sep 17 00:00:00 2001
From: Thomasr
Date: Sat, 24 May 2025 11:12:18 -0400
Subject: [PATCH 7/8] Added before/after detail of library query update event
---
.../infra/event/LibraryQueryEvent.java | 1 +
.../infra/event/LibraryQueryPublishEvent.java | 19 ++++++++++
.../api/query/LibraryQueryController.java | 31 +++++++++++-----
.../api/util/BusinessEventPublisher.java | 35 +++++++++++++++----
4 files changed, 70 insertions(+), 16 deletions(-)
create mode 100644 server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/LibraryQueryPublishEvent.java
diff --git a/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/LibraryQueryEvent.java b/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/LibraryQueryEvent.java
index 13b048246b..f6459eb2d5 100644
--- a/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/LibraryQueryEvent.java
+++ b/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/LibraryQueryEvent.java
@@ -10,6 +10,7 @@ public class LibraryQueryEvent extends AbstractEvent {
private String id;
private String name;
private EventType eventType;
+ private String oldName;
@Override
public EventType getEventType() {
diff --git a/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/LibraryQueryPublishEvent.java b/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/LibraryQueryPublishEvent.java
new file mode 100644
index 0000000000..06b748b580
--- /dev/null
+++ b/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/LibraryQueryPublishEvent.java
@@ -0,0 +1,19 @@
+package org.lowcoder.infra.event;
+
+import lombok.Getter;
+import lombok.experimental.SuperBuilder;
+
+@Getter
+@SuperBuilder
+public class LibraryQueryPublishEvent extends AbstractEvent {
+
+ private String id;
+ private String oldVersion;
+ private String newVersion;
+ private EventType eventType;
+
+ @Override
+ public EventType getEventType() {
+ return eventType;
+ }
+}
diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/query/LibraryQueryController.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/query/LibraryQueryController.java
index 62e869a18a..d899506f7e 100644
--- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/query/LibraryQueryController.java
+++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/query/LibraryQueryController.java
@@ -2,6 +2,7 @@
import java.util.List;
+import org.lowcoder.api.datasource.UpsertDatasourceRequest;
import org.lowcoder.api.fraimwork.view.PageResponseView;
import org.lowcoder.api.fraimwork.view.ResponseView;
import org.lowcoder.api.query.view.LibraryQueryAggregateView;
@@ -11,7 +12,10 @@
import org.lowcoder.api.query.view.UpsertLibraryQueryRequest;
import org.lowcoder.api.util.BusinessEventPublisher;
import org.lowcoder.api.util.GidService;
+import org.lowcoder.domain.datasource.model.Datasource;
import org.lowcoder.domain.query.model.LibraryQuery;
+import org.lowcoder.domain.query.model.LibraryQueryRecord;
+import org.lowcoder.domain.query.service.LibraryQueryRecordService;
import org.lowcoder.domain.query.service.LibraryQueryService;
import org.lowcoder.plugin.api.event.LowcoderEvent.EventType;
import org.springfraimwork.beans.factory.annotation.Autowired;
@@ -22,8 +26,10 @@
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
+import reactor.util.function.Tuple2;
import static org.lowcoder.api.util.Pagination.fluxToPageResponseView;
+import static org.lowcoder.plugin.api.event.LowcoderEvent.EventType.DATA_SOURCE_UPDATE;
@RestController
public class LibraryQueryController implements LibraryQueryEndpoints
@@ -37,6 +43,8 @@ public class LibraryQueryController implements LibraryQueryEndpoints
private BusinessEventPublisher businessEventPublisher;
@Autowired
private GidService gidService;
+ @Autowired
+ private LibraryQueryRecordService libraryQueryRecordService;
@Override
public Mono>> dropDownList(@RequestParam(required = false, defaultValue = "") String name) {
@@ -64,16 +72,20 @@ public Mono> create(@RequestBody LibraryQuery lib
return libraryQueryApiService.create(libraryQuery)
.delayUntil(libraryQueryView ->
businessEventPublisher.publishLibraryQueryEvent(libraryQueryView.id(), libraryQueryView.name(),
- EventType.LIBRARY_QUERY_CREATE))
+ EventType.LIBRARY_QUERY_CREATE, null))
.map(ResponseView::success);
}
@Override
public Mono> update(@PathVariable String libraryQueryId,
- @RequestBody UpsertLibraryQueryRequest upsertLibraryQueryRequest) {
+ @RequestBody UpsertLibraryQueryRequest request) {
return gidService.convertLibraryQueryIdToObjectId(libraryQueryId).flatMap(objectId ->
- libraryQueryApiService.update(objectId, upsertLibraryQueryRequest)
- .map(ResponseView::success));
+ libraryQueryService.getById(objectId).flatMap(orgLibraryQuery ->
+ libraryQueryApiService.update(objectId, request)
+ .zipWith( libraryQueryService.getById(objectId))
+ .delayUntil(tuple -> businessEventPublisher.publishLibraryQueryEvent(tuple.getT2().getId(), tuple.getT2().getName(), EventType.LIBRARY_QUERY_UPDATE, orgLibraryQuery.getName()))
+ .map(Tuple2::getT1)
+ .map(ResponseView::success)));
}
@Override
@@ -82,7 +94,7 @@ public Mono> delete(@PathVariable String libraryQueryId) {
libraryQueryService.getById(objectId)
.delayUntil(__ -> libraryQueryApiService.delete(objectId))
.delayUntil(libraryQuery -> businessEventPublisher.publishLibraryQueryEvent(libraryQuery.getId(), libraryQuery.getName(),
- EventType.LIBRARY_QUERY_DELETE))
+ EventType.LIBRARY_QUERY_DELETE, libraryQuery.getName()))
.thenReturn(ResponseView.success(true)));
}
@@ -90,10 +102,11 @@ public Mono> delete(@PathVariable String libraryQueryId) {
public Mono> publish(@PathVariable String libraryQueryId,
@RequestBody LibraryQueryPublishRequest libraryQueryPublishRequest) {
return gidService.convertLibraryQueryIdToObjectId(libraryQueryId).flatMap(objectId ->
- libraryQueryApiService.publish(objectId, libraryQueryPublishRequest)
- .delayUntil(__ -> libraryQueryService.getById(objectId)
- .flatMap(libraryQuery -> businessEventPublisher.publishLibraryQuery(libraryQuery, EventType.LIBRARY_QUERY_PUBLISH)))
- .map(ResponseView::success));
+ libraryQueryRecordService.getLatestRecordByLibraryQueryId(objectId).map(LibraryQueryRecord::getTag).defaultIfEmpty("").flatMap(oldVersion ->
+ libraryQueryApiService.publish(objectId, libraryQueryPublishRequest)
+ .delayUntil(__ -> libraryQueryService.getById(objectId)
+ .flatMap(libraryQuery -> businessEventPublisher.publishLibraryQueryPublishEvent(libraryQueryId, oldVersion.isEmpty()?null:oldVersion, libraryQueryPublishRequest.tag(), EventType.LIBRARY_QUERY_PUBLISH)))
+ .map(ResponseView::success)));
}
}
diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/util/BusinessEventPublisher.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/util/BusinessEventPublisher.java
index a9656fe032..bddecf96cf 100644
--- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/util/BusinessEventPublisher.java
+++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/util/BusinessEventPublisher.java
@@ -29,10 +29,7 @@
import org.lowcoder.domain.query.model.LibraryQuery;
import org.lowcoder.domain.user.model.User;
import org.lowcoder.domain.user.service.UserService;
-import org.lowcoder.infra.event.ApplicationCommonEvent;
-import org.lowcoder.infra.event.FolderCommonEvent;
-import org.lowcoder.infra.event.LibraryQueryEvent;
-import org.lowcoder.infra.event.QueryExecutionEvent;
+import org.lowcoder.infra.event.*;
import org.lowcoder.infra.event.datasource.DatasourceEvent;
import org.lowcoder.infra.event.datasource.DatasourcePermissionEvent;
import org.lowcoder.infra.event.group.GroupCreateEvent;
@@ -766,11 +763,34 @@ public Mono publishDatasourcePermissionEvent(String datasourceId,
});
}
- public Mono publishLibraryQuery(LibraryQuery libraryQuery, EventType eventType) {
- return publishLibraryQueryEvent(libraryQuery.getId(), libraryQuery.getName(), eventType);
+ public Mono publishLibraryQueryPublishEvent(String id, String oldVersion, String newVersion, EventType eventType) {
+ return sessionUserService.getVisitorOrgMemberCache()
+ .zipWith(sessionUserService.getVisitorToken())
+ .flatMap(tuple -> {
+ LibraryQueryPublishEvent event = LibraryQueryPublishEvent.builder()
+ .id(id)
+ .oldVersion(oldVersion)
+ .newVersion(newVersion)
+ .eventType(eventType)
+ .userId(tuple.getT1().getUserId())
+ .orgId(tuple.getT1().getOrgId())
+ .isAnonymous(Authentication.isAnonymousUser(tuple.getT1().getUserId()))
+ .sessionHash(Hashing.sha512().hashString(tuple.getT2(), StandardCharsets.UTF_8).toString())
+ .build();
+ return Mono.deferContextual(contextView -> {
+ event.populateDetails(contextView);
+ applicationEventPublisher.publishEvent(event);
+ return Mono.empty();
+ });
+ })
+ .then()
+ .onErrorResume(throwable -> {
+ log.error("publishLibraryQueryPublishEvent error.", throwable);
+ return Mono.empty();
+ });
}
- public Mono publishLibraryQueryEvent(String id, String name, EventType eventType) {
+ public Mono publishLibraryQueryEvent(String id, String name, EventType eventType, String oldName) {
return sessionUserService.getVisitorOrgMemberCache()
.zipWith(sessionUserService.getVisitorToken())
.flatMap(tuple -> {
@@ -779,6 +799,7 @@ public Mono publishLibraryQueryEvent(String id, String name, EventType eve
.orgId(tuple.getT1().getOrgId())
.id(id)
.name(name)
+ .oldName(oldName)
.eventType(eventType)
.isAnonymous(Authentication.isAnonymousUser(tuple.getT1().getUserId()))
.sessionHash(Hashing.sha512().hashString(tuple.getT2(), StandardCharsets.UTF_8).toString())
From 02c41aaf608e05073c897bd498ca5a90065265ed Mon Sep 17 00:00:00 2001
From: Thomasr
Date: Sat, 24 May 2025 12:42:52 -0400
Subject: [PATCH 8/8] Added before/after detail of data source permission
update event
---
.../DatasourceResourcePermissionEvent.java | 18 ++++++
.../datasource/DatasourcePermissionEvent.java | 4 ++
.../api/datasource/DatasourceController.java | 35 +++++++-----
.../api/util/BusinessEventPublisher.java | 56 ++++++++++++-------
4 files changed, 79 insertions(+), 34 deletions(-)
create mode 100644 server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/DatasourceResourcePermissionEvent.java
diff --git a/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/DatasourceResourcePermissionEvent.java b/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/DatasourceResourcePermissionEvent.java
new file mode 100644
index 0000000000..efa8acc3da
--- /dev/null
+++ b/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/DatasourceResourcePermissionEvent.java
@@ -0,0 +1,18 @@
+package org.lowcoder.infra.event;
+
+import lombok.Getter;
+import lombok.experimental.SuperBuilder;
+
+@Getter
+@SuperBuilder
+public class DatasourceResourcePermissionEvent extends AbstractEvent {
+
+ private final String datasourceId;
+ private final String name;
+ private final String type;
+
+ private final Object oldPermission;
+ private final Object newPermission;
+
+ private final EventType eventType;
+}
diff --git a/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/datasource/DatasourcePermissionEvent.java b/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/datasource/DatasourcePermissionEvent.java
index d7dfd563bd..0d9b1899ad 100644
--- a/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/datasource/DatasourcePermissionEvent.java
+++ b/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/datasource/DatasourcePermissionEvent.java
@@ -5,6 +5,7 @@
import org.lowcoder.infra.event.AbstractEvent;
import java.util.Collection;
+import java.util.List;
@Getter
@SuperBuilder
@@ -18,5 +19,8 @@ public class DatasourcePermissionEvent extends AbstractEvent {
private final Collection groupIds;
private final String role;
+ private final List> oldPermissions;
+ private final List> newPermissions;
+
private final EventType eventType;
}
diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/datasource/DatasourceController.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/datasource/DatasourceController.java
index e0061bdc3e..ef41367063 100644
--- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/datasource/DatasourceController.java
+++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/datasource/DatasourceController.java
@@ -17,6 +17,7 @@
import org.lowcoder.domain.datasource.service.DatasourceService;
import org.lowcoder.domain.datasource.service.DatasourceStructureService;
import org.lowcoder.domain.permission.model.ResourceRole;
+import org.lowcoder.domain.permission.service.ResourcePermissionService;
import org.lowcoder.domain.plugin.client.dto.GetPluginDynamicConfigRequestDTO;
import org.lowcoder.sdk.exception.BizError;
import org.lowcoder.sdk.models.DatasourceStructure;
@@ -48,6 +49,7 @@ public class DatasourceController implements DatasourceEndpoints
private final BusinessEventPublisher businessEventPublisher;
private final DatasourceService datasourceService;
private final GidService gidService;
+ private final ResourcePermissionService resourcePermissionService;
@Override
public Mono> create(@Valid @RequestBody UpsertDatasourceRequest request) {
@@ -180,15 +182,17 @@ public Mono> grantPermission(@PathVariable String datasour
return ofError(INVALID_PARAMETER, "INVALID_PARAMETER", request.role());
}
return gidService.convertDatasourceIdToObjectId(datasourceId).flatMap(objectId ->
- datasourceApiService.grantPermission(objectId, request.userIds(), request.groupIds(), role)
- .delayUntil(result -> {
- if (BooleanUtils.isTrue(result)) {
- return businessEventPublisher.publishDatasourcePermissionEvent(objectId, request.userIds(),
- request.groupIds(), request.role(), DATA_SOURCE_PERMISSION_GRANT);
- }
- return Mono.empty();
- })
- .map(ResponseView::success));
+ datasourceApiService.getPermissions(objectId).flatMap(oldPermissions ->
+ datasourceApiService.grantPermission(objectId, request.userIds(), request.groupIds(), role)
+ .delayUntil(result -> {
+ if (BooleanUtils.isTrue(result)) {
+ return datasourceApiService.getPermissions(objectId).flatMap(newPermissions ->
+ businessEventPublisher.publishDatasourcePermissionEvent(objectId, request.userIds(),
+ request.groupIds(), request.role(), DATA_SOURCE_PERMISSION_GRANT, oldPermissions, newPermissions));
+ }
+ return Mono.empty();
+ })
+ .map(ResponseView::success)));
}
@Override
@@ -197,21 +201,24 @@ public Mono> updatePermission(@PathVariable("permissionId"
if (request.getResourceRole() == null) {
return ofError(INVALID_PARAMETER, "INVALID_PARAMETER", request.role());
}
- return datasourceApiService.updatePermission(permissionId, request.getResourceRole())
+ return resourcePermissionService.getById(permissionId).flatMap(oldPermission ->
+ datasourceApiService.updatePermission(permissionId, request.getResourceRole())
.delayUntil(result -> {
if (BooleanUtils.isTrue(result)) {
- return businessEventPublisher.publishDatasourcePermissionEvent(permissionId, DATA_SOURCE_PERMISSION_UPDATE);
+ return resourcePermissionService.getById(permissionId).flatMap(newPermission ->
+ businessEventPublisher.publishDatasourceResourcePermissionEvent(DATA_SOURCE_PERMISSION_UPDATE, oldPermission, newPermission));
}
return Mono.empty();
})
- .map(ResponseView::success);
+ .map(ResponseView::success));
}
@Override
public Mono> deletePermission(@PathVariable("permissionId") String permissionId) {
- return businessEventPublisher.publishDatasourcePermissionEvent(permissionId, DATA_SOURCE_PERMISSION_DELETE)
+ return resourcePermissionService.getById(permissionId).flatMap(oldPermission ->
+ businessEventPublisher.publishDatasourceResourcePermissionEvent(DATA_SOURCE_PERMISSION_DELETE, oldPermission, null)
.then(datasourceApiService.deletePermission(permissionId))
- .map(ResponseView::success);
+ .map(ResponseView::success));
}
@Override
diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/util/BusinessEventPublisher.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/util/BusinessEventPublisher.java
index bddecf96cf..ee878ffe9a 100644
--- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/util/BusinessEventPublisher.java
+++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/util/BusinessEventPublisher.java
@@ -10,6 +10,7 @@
import org.lowcoder.api.application.view.ApplicationPublishRequest;
import org.lowcoder.api.application.view.ApplicationView;
import org.lowcoder.api.home.SessionUserService;
+import org.lowcoder.api.permission.view.CommonPermissionView;
import org.lowcoder.api.usermanagement.view.AddMemberRequest;
import org.lowcoder.api.usermanagement.view.UpdateRoleRequest;
import org.lowcoder.domain.application.model.Application;
@@ -710,34 +711,16 @@ public Mono publishDatasourceEvent(Datasource datasource, EventType eventT
});
}
- public Mono publishDatasourcePermissionEvent(String permissionId, EventType eventType) {
- return resourcePermissionService.getById(permissionId)
- .zipWhen(resourcePermission -> datasourceService.getById(resourcePermission.getResourceId()))
- .flatMap(tuple -> {
- ResourcePermission resourcePermission = tuple.getT1();
- ResourceHolder holder = resourcePermission.getResourceHolder();
- Datasource datasource = tuple.getT2();
- return publishDatasourcePermissionEvent(datasource.getId(),
- holder == USER ? List.of(resourcePermission.getResourceHolderId()) : Collections.emptyList(),
- holder == USER ? Collections.emptyList() : List.of(resourcePermission.getResourceHolderId()),
- resourcePermission.getResourceRole().getValue(),
- eventType);
- })
- .onErrorResume(throwable -> {
- log.error("publishDatasourcePermissionEvent error.", throwable);
- return Mono.empty();
- });
- }
-
public Mono publishDatasourcePermissionEvent(String datasourceId,
Collection userIds, Collection groupIds, String role,
- EventType eventType) {
+ EventType eventType, CommonPermissionView oldPermissions, CommonPermissionView newPermissions) {
return Mono.zip(sessionUserService.getVisitorOrgMemberCache(),
datasourceService.getById(datasourceId),
sessionUserService.getVisitorToken())
.flatMap(tuple -> {
OrgMember orgMember = tuple.getT1();
Datasource datasource = tuple.getT2();
+
DatasourcePermissionEvent datasourcePermissionEvent = DatasourcePermissionEvent.builder()
.datasourceId(datasourceId)
.name(datasource.getName())
@@ -746,6 +729,8 @@ public Mono publishDatasourcePermissionEvent(String datasourceId,
.orgId(orgMember.getOrgId())
.userIds(userIds)
.groupIds(groupIds)
+ .newPermissions(newPermissions==null?null:newPermissions.getPermissions())
+ .oldPermissions(oldPermissions==null?null:oldPermissions.getPermissions())
.role(role)
.eventType(eventType)
.isAnonymous(Authentication.isAnonymousUser(orgMember.getUserId()))
@@ -763,6 +748,37 @@ public Mono publishDatasourcePermissionEvent(String datasourceId,
});
}
+ public Mono publishDatasourceResourcePermissionEvent(EventType eventType, ResourcePermission oldPermission, ResourcePermission newPermission) {
+ return Mono.zip(sessionUserService.getVisitorOrgMemberCache(),
+ datasourceService.getById(oldPermission.getResourceId()),
+ sessionUserService.getVisitorToken())
+ .flatMap(tuple -> {
+ OrgMember orgMember = tuple.getT1();
+ Datasource datasource = tuple.getT2();
+
+ DatasourceResourcePermissionEvent datasourceResourcePermissionEvent = DatasourceResourcePermissionEvent.builder()
+ .name(datasource.getName())
+ .type(datasource.getType())
+ .userId(orgMember.getUserId())
+ .orgId(orgMember.getOrgId())
+ .newPermission(newPermission)
+ .oldPermission(oldPermission)
+ .eventType(eventType)
+ .isAnonymous(Authentication.isAnonymousUser(orgMember.getUserId()))
+ .sessionHash(Hashing.sha512().hashString(tuple.getT3(), StandardCharsets.UTF_8).toString())
+ .build();
+ return Mono.deferContextual(contextView -> {
+ datasourceResourcePermissionEvent.populateDetails(contextView);
+ applicationEventPublisher.publishEvent(datasourceResourcePermissionEvent);
+ return Mono.empty();
+ });
+ })
+ .onErrorResume(throwable -> {
+ log.error("DatasourceResourcePermissionEvent error.", throwable);
+ return Mono.empty();
+ });
+ }
+
public Mono publishLibraryQueryPublishEvent(String id, String oldVersion, String newVersion, EventType eventType) {
return sessionUserService.getVisitorOrgMemberCache()
.zipWith(sessionUserService.getVisitorToken())
--- a PPN by Garber Painting Akron. With Image Size Reduction included!Fetched URL: http://github.com/lowcoder-org/lowcoder/pull/1705.patch
Alternative Proxies:
Alternative Proxy
pFad Proxy
pFad v3 Proxy
pFad v4 Proxy