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
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
@@ -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;
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import org.lowcoder.infra.event.AbstractEvent;

import java.util.Collection;
import java.util.List;

@Getter
@SuperBuilder
Expand All @@ -18,5 +19,8 @@ public class DatasourcePermissionEvent extends AbstractEvent {
private final Collection<String> groupIds;
private final String role;

private final List<?> oldPermissions;
private final List<?> newPermissions;

private final EventType eventType;
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,4 @@
public abstract class BaseGroupEvent extends AbstractEvent {

private final String groupId;
private final String groupName;
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,13 @@
@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;
private final String oldMemberRole;

@Override
public EventType getEventType() {
return EventType.GROUP_MEMBER_ROLE_UPDATE;
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, originalApplicationView.getApplicationInfoView().getFolderId(), 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
Loading
Loading