From a88d70f4ae15ceabf14f51785e72318dff516e56 Mon Sep 17 00:00:00 2001 From: Thomasr Date: Thu, 23 Jan 2025 10:14:53 -0500 Subject: [PATCH 1/3] Add category and description to ApplicationCommonEvent --- .../infra/event/ApplicationCommonEvent.java | 2 ++ .../api/util/BusinessEventPublisher.java | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+) 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 e3cae4ac0..15b9dc384 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 @@ -12,6 +12,8 @@ public class ApplicationCommonEvent extends AbstractEvent { private final String applicationId; private final String applicationGid; private final String applicationName; + private final String applicationCategory; + private final String applicationDescription; private final EventType type; @Nullable private final String folderId; 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 8ce67c774..50e2a8a5a 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 @@ -5,11 +5,13 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.tuple.Pair; import org.lowcoder.api.application.view.ApplicationInfoView; import org.lowcoder.api.application.view.ApplicationView; import org.lowcoder.api.home.SessionUserService; import org.lowcoder.api.usermanagement.view.AddMemberRequest; import org.lowcoder.api.usermanagement.view.UpdateRoleRequest; +import org.lowcoder.domain.application.service.ApplicationRecordServiceImpl; import org.lowcoder.domain.application.service.ApplicationService; import org.lowcoder.domain.datasource.model.Datasource; import org.lowcoder.domain.datasource.service.DatasourceService; @@ -40,6 +42,7 @@ import org.lowcoder.infra.event.groupmember.GroupMemberRoleUpdateEvent; import org.lowcoder.infra.event.user.UserLoginEvent; import org.lowcoder.infra.event.user.UserLogoutEvent; +import org.lowcoder.infra.util.TupleUtils; import org.lowcoder.plugin.api.event.LowcoderEvent.EventType; import org.lowcoder.sdk.constants.Authentication; import org.lowcoder.sdk.util.LocaleUtils; @@ -65,6 +68,7 @@ public class BusinessEventPublisher { private final ApplicationService applicationService; private final DatasourceService datasourceService; private final ResourcePermissionService resourcePermissionService; + private final ApplicationRecordServiceImpl applicationRecordServiceImpl; public Mono publishFolderCommonEvent(String folderId, String folderName, EventType eventType) { @@ -126,10 +130,23 @@ public Mono publishApplicationCommonEvent(ApplicationView applicationView, .onErrorReturn(Optional.empty()); })) .zipWith(sessionUserService.getVisitorToken()) + .zipWith(Mono.defer(() -> { + String appId = applicationView.getApplicationInfoView().getApplicationId(); + return applicationService.findById(appId) + .zipWhen(application -> application.getCategory(applicationRecordServiceImpl)) + .zipWhen(application -> application.getT1().getDescription(applicationRecordServiceImpl)) + .map(tuple -> { + String category = tuple.getT1().getT2(); + String description = tuple.getT2(); + return Pair.of(category, description); + }); + }), TupleUtils::merge) .doOnNext(tuple -> { OrgMember orgMember = tuple.getT1().getT1(); Optional optional = tuple.getT1().getT2(); String token = tuple.getT2(); + String category = tuple.getT3().getLeft(); + String description = tuple.getT3().getRight(); ApplicationInfoView applicationInfoView = applicationView.getApplicationInfoView(); ApplicationCommonEvent event = ApplicationCommonEvent.builder() .orgId(orgMember.getOrgId()) @@ -137,6 +154,8 @@ public Mono publishApplicationCommonEvent(ApplicationView applicationView, .applicationId(applicationInfoView.getApplicationId()) .applicationGid(applicationInfoView.getApplicationGid()) .applicationName(applicationInfoView.getName()) + .applicationCategory(category) + .applicationDescription(description) .type(eventType) .folderId(optional.map(Folder::getId).orElse(null)) .folderName(optional.map(Folder::getName).orElse(null)) From 507b869fc8c40afabe3b2b6860f40301799998c2 Mon Sep 17 00:00:00 2001 From: Thomasr Date: Thu, 23 Jan 2025 12:15:01 -0500 Subject: [PATCH 2/3] Add from-folder to application related event --- .../infra/event/ApplicationCommonEvent.java | 4 ++++ .../application/ApplicationController.java | 4 ++-- .../application/view/ApplicationInfoView.java | 3 +++ .../lowcoder/api/home/FolderController.java | 24 +++++++++++-------- .../api/util/BusinessEventPublisher.java | 15 +++++++++++- 5 files changed, 37 insertions(+), 13 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 15b9dc384..3adb8d7d1 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 @@ -19,6 +19,10 @@ public class ApplicationCommonEvent extends AbstractEvent { private final String folderId; @Nullable private final String folderName; + @Nullable + private final String oldFolderId; + @Nullable + private final String oldFolderName; @Override public EventType getEventType() { 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 b62a6e887..582cb2803 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 @@ -59,7 +59,7 @@ public Mono> createFromTemplate(@RequestParam Stri public Mono> recycle(@PathVariable String applicationId) { return gidService.convertApplicationIdToObjectId(applicationId).flatMap(appId -> applicationApiService.recycle(appId) - .delayUntil(__ -> businessEventPublisher.publishApplicationCommonEvent(applicationId, null, APPLICATION_RECYCLED)) + .delayUntil(__ -> businessEventPublisher.publishApplicationCommonEvent(applicationId, null, null, APPLICATION_RECYCLED)) .map(ResponseView::success)); } @@ -67,7 +67,7 @@ public Mono> recycle(@PathVariable String applicationId) { public Mono> restore(@PathVariable String applicationId) { return gidService.convertApplicationIdToObjectId(applicationId).flatMap(appId -> applicationApiService.restore(appId) - .delayUntil(__ -> businessEventPublisher.publishApplicationCommonEvent(applicationId, null, APPLICATION_RESTORE)) + .delayUntil(__ -> businessEventPublisher.publishApplicationCommonEvent(applicationId, null, null, APPLICATION_RESTORE)) .map(ResponseView::success)); } diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/view/ApplicationInfoView.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/view/ApplicationInfoView.java index c8d8bfd1b..d15e0714c 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/view/ApplicationInfoView.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/view/ApplicationInfoView.java @@ -29,6 +29,9 @@ public class ApplicationInfoView { private final Object containerSize; // for module size @Nullable private String folderId; + @Nullable + @JsonInclude(Include.NON_NULL) + private String folderIdFrom; @Nullable private final Instant lastViewTime; // user last visit time for this app 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 e55b2ba69..801d0c854 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,9 +1,6 @@ package org.lowcoder.api.home; -import static org.lowcoder.plugin.api.event.LowcoderEvent.EventType.APPLICATION_MOVE; -import static org.lowcoder.sdk.exception.BizError.INVALID_PARAMETER; -import static org.lowcoder.sdk.util.ExceptionUtils.ofError; - +import lombok.RequiredArgsConstructor; import org.lowcoder.api.application.view.ApplicationPermissionView; import org.lowcoder.api.framework.view.PageResponseView; import org.lowcoder.api.framework.view.ResponseView; @@ -11,6 +8,7 @@ import org.lowcoder.api.util.GidService; import org.lowcoder.domain.application.model.ApplicationType; import org.lowcoder.domain.folder.model.Folder; +import org.lowcoder.domain.folder.service.FolderElementRelationService; import org.lowcoder.domain.folder.service.FolderService; import org.lowcoder.domain.permission.model.ResourceRole; import org.lowcoder.plugin.api.event.LowcoderEvent.EventType; @@ -18,10 +16,14 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; - -import lombok.RequiredArgsConstructor; import reactor.core.publisher.Mono; +import java.util.List; + +import static org.lowcoder.plugin.api.event.LowcoderEvent.EventType.APPLICATION_MOVE; +import static org.lowcoder.sdk.exception.BizError.INVALID_PARAMETER; +import static org.lowcoder.sdk.util.ExceptionUtils.ofError; + @RequiredArgsConstructor @RestController public class FolderController implements FolderEndpoints @@ -31,6 +33,7 @@ public class FolderController implements FolderEndpoints private final FolderApiService folderApiService; private final BusinessEventPublisher businessEventPublisher; private final GidService gidService; + private final FolderElementRelationService folderElementRelationService; @Override public Mono> create(@RequestBody Folder folder) { @@ -89,10 +92,11 @@ public Mono> getElements(@RequestParam(value = "id", require @Override public Mono> move(@PathVariable("id") String applicationLikeId, @RequestParam(value = "targetFolderId", required = false) String targetFolderId) { - return gidService.convertFolderIdToObjectId(targetFolderId).flatMap(objectId -> - folderApiService.move(applicationLikeId, objectId.orElse(null)) - .then(businessEventPublisher.publishApplicationCommonEvent(applicationLikeId, objectId.orElse(null), APPLICATION_MOVE)) - .then(Mono.fromSupplier(() -> ResponseView.success(null)))); + return folderElementRelationService.getByElementIds(List.of(applicationLikeId)).next().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))))); } @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 50e2a8a5a..fe3119d32 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 @@ -97,13 +97,14 @@ public Mono publishFolderCommonEvent(String folderId, String folderName, E }); } - public Mono publishApplicationCommonEvent(String applicationId, @Nullable String folderId, EventType eventType) { + public Mono publishApplicationCommonEvent(String applicationId, @Nullable String folderIdFrom, @Nullable String folderId, EventType eventType) { return applicationService.findByIdWithoutDsl(applicationId) .map(application -> { ApplicationInfoView applicationInfoView = ApplicationInfoView.builder() .applicationId(applicationId) .name(application.getName()) .folderId(folderId) + .folderIdFrom(folderIdFrom) .build(); return ApplicationView.builder() .applicationInfoView(applicationInfoView) @@ -129,6 +130,15 @@ public Mono publishApplicationCommonEvent(ApplicationView applicationView, .map(Optional::of) .onErrorReturn(Optional.empty()); })) + .zipWith(Mono.defer(() -> { + String folderId = applicationView.getApplicationInfoView().getFolderIdFrom(); + if (StringUtils.isBlank(folderId)) { + return Mono.just(Optional. empty()); + } + return folderService.findById(folderId) + .map(Optional::of) + .onErrorReturn(Optional.empty()); + }), TupleUtils::merge) .zipWith(sessionUserService.getVisitorToken()) .zipWith(Mono.defer(() -> { String appId = applicationView.getApplicationInfoView().getApplicationId(); @@ -144,6 +154,7 @@ public Mono publishApplicationCommonEvent(ApplicationView applicationView, .doOnNext(tuple -> { OrgMember orgMember = tuple.getT1().getT1(); Optional optional = tuple.getT1().getT2(); + Optional optionalFrom = tuple.getT1().getT3(); String token = tuple.getT2(); String category = tuple.getT3().getLeft(); String description = tuple.getT3().getRight(); @@ -159,6 +170,8 @@ public Mono publishApplicationCommonEvent(ApplicationView applicationView, .type(eventType) .folderId(optional.map(Folder::getId).orElse(null)) .folderName(optional.map(Folder::getName).orElse(null)) + .oldFolderId(optionalFrom.map(Folder::getId).orElse(null)) + .oldFolderName(optionalFrom.map(Folder::getName).orElse(null)) .isAnonymous(anonymous) .sessionHash(Hashing.sha512().hashString(token, StandardCharsets.UTF_8).toString()) .build(); From a1880a2d63182dabd332b38a4a33fba4ae6767ca Mon Sep 17 00:00:00 2001 From: Thomasr Date: Thu, 23 Jan 2025 12:28:19 -0500 Subject: [PATCH 3/3] Add environmentId always to details --- .../src/main/java/org/lowcoder/infra/event/AbstractEvent.java | 1 + 1 file changed, 1 insertion(+) diff --git a/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/AbstractEvent.java b/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/AbstractEvent.java index a866d55e6..8514624a2 100644 --- a/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/AbstractEvent.java +++ b/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/AbstractEvent.java @@ -24,6 +24,7 @@ public abstract class AbstractEvent implements LowcoderEvent public Map details() { + this.details.put("environmentId", environmentID); return this.details; }