Skip to content

Audit log before after detail #1705

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 9 commits into from
May 24, 2025
Next Next commit
Added before/after detail of app update event
  • Loading branch information
dragonpoo committed May 23, 2025
commit fc74a51a0151ed16ad73d1d2c76612f90fdc86b9
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -136,10 +136,11 @@ public Mono<ApplicationView> 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<Void> autoGrantPermissionsByFolderDefault(String applicationId, @Nullable String folderId) {
Expand Down Expand Up @@ -556,7 +557,7 @@ public Mono<ResourcePermission> checkApplicationPermissionWithReadableErrorMsg(S


private Mono<ApplicationInfoView> 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 -> {
Expand All @@ -565,25 +566,33 @@ private Mono<ApplicationInfoView> 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<ApplicationInfoView> 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<ApplicationInfoView> buildView(Application application) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,31 +41,33 @@ public class ApplicationController implements ApplicationEndpoints {
@Override
public Mono<ResponseView<ApplicationView>> 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<ResponseView<ApplicationView>> 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<ResponseView<Boolean>> 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(originalApplicationView ->
applicationApiService.recycle(appId)
.delayUntil(__ -> businessEventPublisher.publishApplicationCommonEvent(originalApplicationView, applicationId, null, null, APPLICATION_RECYCLED))
.map(ResponseView::success)));
}

@Override
public Mono<ResponseView<Boolean>> 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(originalApplicationView ->
applicationApiService.restore(appId)
.delayUntil(__ -> businessEventPublisher.publishApplicationCommonEvent(originalApplicationView, applicationId, null, null, APPLICATION_RESTORE))
.map(ResponseView::success)));
}

@Override
Expand All @@ -78,9 +80,10 @@ public Mono<ResponseView<List<ApplicationInfoView>>> getRecycledApplications(@Re
@Override
public Mono<ResponseView<ApplicationView>> 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(originalApplicationView ->
applicationApiService.delete(appId)
.delayUntil(applicationView -> businessEventPublisher.publishApplicationCommonEvent(originalApplicationView, applicationView, APPLICATION_DELETE))
.map(ResponseView::success)));
}

@Override
Expand All @@ -94,38 +97,42 @@ public Mono<ResponseView<ApplicationView>> getEditingApplication(@PathVariable S
@Override
public Mono<ResponseView<ApplicationView>> 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(originalApplicationView ->
applicationApiService.getPublishedApplication(appId, ApplicationRequestType.PUBLIC_TO_ALL, withDeleted)
.delayUntil(applicationView -> applicationApiService.updateUserApplicationLastViewTime(appId))
.delayUntil(applicationView -> businessEventPublisher.publishApplicationCommonEvent(originalApplicationView, applicationView, APPLICATION_VIEW))
.map(ResponseView::success)));
}

@Override
public Mono<ResponseView<ApplicationView>> 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(originalApplicationView ->
applicationApiService.getPublishedApplication(appId, ApplicationRequestType.PUBLIC_TO_MARKETPLACE, false)
.delayUntil(applicationView -> applicationApiService.updateUserApplicationLastViewTime(appId))
.delayUntil(applicationView -> businessEventPublisher.publishApplicationCommonEvent(originalApplicationView, applicationView, APPLICATION_VIEW))
.map(ResponseView::success)));
}

@Override
public Mono<ResponseView<ApplicationView>> 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(originalApplicationView ->
applicationApiService.getPublishedApplication(appId, ApplicationRequestType.AGENCY_PROFILE, false)
.delayUntil(applicationView -> applicationApiService.updateUserApplicationLastViewTime(appId))
.delayUntil(applicationView -> businessEventPublisher.publishApplicationCommonEvent(originalApplicationView, applicationView, APPLICATION_VIEW))
.map(ResponseView::success)));
}

@Override
public Mono<ResponseView<ApplicationView>> update(@PathVariable String applicationId,
@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(originalApplicationView ->
applicationApiService.update(appId, newApplication, updateStatus)
.delayUntil(applicationView -> businessEventPublisher.publishApplicationCommonEvent(originalApplicationView, applicationView, APPLICATION_UPDATE))
.map(ResponseView::success)));
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -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.framework.view.PageResponseView;
import org.lowcoder.api.framework.view.ResponseView;
Expand Down Expand Up @@ -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<ResponseView<FolderInfoView>> create(@RequestBody Folder folder) {
Expand Down Expand Up @@ -95,9 +97,10 @@ public Mono<ResponseView<Void>> 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(originalApplicationView ->
folderApiService.move(applicationLikeId, objectId.orElse(null))
.then(businessEventPublisher.publishApplicationCommonEvent(originalApplicationView, applicationLikeId, folderElement.folderId(), objectId.orElse(null), APPLICATION_MOVE))
.then(Mono.fromSupplier(() -> ResponseView.success(null))))));
}

@Override
Expand Down
Loading