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; } 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..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 @@ -12,11 +12,17 @@ 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; @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 8ce67c774..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 @@ -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) { @@ -93,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) @@ -125,11 +130,34 @@ 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(); + 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(); + Optional optionalFrom = tuple.getT1().getT3(); 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,9 +165,13 @@ 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)) + .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();