Skip to content

Added more application events #1542

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 3 commits into from
Feb 22, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
import lombok.Getter;
import lombok.experimental.SuperBuilder;

import java.util.Set;

@Getter
@SuperBuilder
public class ApplicationCommonEvent extends AbstractEvent {
Expand All @@ -23,6 +25,13 @@ public class ApplicationCommonEvent extends AbstractEvent {
private final String oldFolderId;
@Nullable
private final String oldFolderName;
private final String permissionId;
private final String role;
private final Set<String> userIds;
private final Set<String> groupIds;
private final String shareType;
private final String tag;
private final String commitMessage;

@Override
public EventType getEventType() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
import org.lowcoder.api.application.view.*;
import org.lowcoder.api.framework.view.PageResponseView;
import org.lowcoder.api.framework.view.ResponseView;
import org.lowcoder.api.home.SessionUserService;
import org.lowcoder.api.home.UserHomeApiService;
import org.lowcoder.api.home.UserHomepageView;
import org.lowcoder.api.util.BusinessEventPublisher;
Expand All @@ -14,7 +13,6 @@
import org.lowcoder.domain.application.model.ApplicationStatus;
import org.lowcoder.domain.application.model.ApplicationType;
import org.lowcoder.domain.application.service.ApplicationRecordService;
import org.lowcoder.domain.folder.service.FolderElementRelationService;
import org.lowcoder.domain.permission.model.ResourceRole;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
Expand All @@ -37,7 +35,6 @@ public class ApplicationController implements ApplicationEndpoints {
private final UserHomeApiService userHomeApiService;
private final ApplicationApiService applicationApiService;
private final BusinessEventPublisher businessEventPublisher;
private final SessionUserService sessionUserService;
private final GidService gidService;
private final ApplicationRecordService applicationRecordService;

Expand Down Expand Up @@ -152,6 +149,14 @@ public Mono<ResponseView<ApplicationView>> publish(@PathVariable String applicat
return newtag;
})
.switchIfEmpty(Mono.just("1.0.0"))
.delayUntil(newtag -> {
ApplicationPublishRequest req = Objects.requireNonNullElse(applicationPublishRequest, new ApplicationPublishRequest("", newtag));
return businessEventPublisher.publishApplicationPublishEvent(appId, req).then(Mono.defer(() -> {
if(newtag.equals(req.tag())) {
return businessEventPublisher.publishApplicationVersionChangeEvent(appId, newtag);
} else return Mono.empty();
}));
})
.flatMap(newtag -> applicationApiService.publish(appId, Objects.requireNonNullElse(applicationPublishRequest, new ApplicationPublishRequest("", newtag))))
.map(ResponseView::success));
}
Expand Down Expand Up @@ -221,6 +226,7 @@ public Mono<ResponseView<Boolean>> updatePermission(@PathVariable String applica
}
return gidService.convertApplicationIdToObjectId(applicationId).flatMap(appId ->
applicationApiService.updatePermission(appId, permissionId, role)
.delayUntil(__ -> businessEventPublisher.publishApplicationPermissionEvent(applicationId, null, null, permissionId, role.getValue()))
.map(ResponseView::success));
}

Expand All @@ -230,6 +236,7 @@ public Mono<ResponseView<Boolean>> removePermission(
@PathVariable String permissionId) {
return gidService.convertApplicationIdToObjectId(applicationId).flatMap(appId ->
applicationApiService.removePermission(appId, permissionId)
.delayUntil(__ -> businessEventPublisher.publishApplicationPermissionEvent(applicationId, null, null, permissionId, null))
.map(ResponseView::success));
}

Expand All @@ -246,6 +253,7 @@ public Mono<ResponseView<Boolean>> grantPermission(
emptyIfNull(request.userIds()),
emptyIfNull(request.groupIds()),
role)
.delayUntil(__ -> businessEventPublisher.publishApplicationPermissionEvent(applicationId, emptyIfNull(request.userIds()), emptyIfNull(request.groupIds()), null, role.getValue()))
.map(ResponseView::success));
}

Expand All @@ -262,6 +270,7 @@ public Mono<ResponseView<Boolean>> setApplicationPublicToAll(@PathVariable Strin
@RequestBody ApplicationPublicToAllRequest request) {
return gidService.convertApplicationIdToObjectId(applicationId).flatMap(appId ->
applicationApiService.setApplicationPublicToAll(appId, request.publicToAll())
.delayUntil(__ -> businessEventPublisher.publishApplicationSharingEvent(applicationId, "PublicToAll"))
.map(ResponseView::success));
}

Expand All @@ -270,6 +279,7 @@ public Mono<ResponseView<Boolean>> setApplicationPublicToMarketplace(@PathVariab
@RequestBody ApplicationPublicToMarketplaceRequest request) {
return gidService.convertApplicationIdToObjectId(applicationId).flatMap(appId ->
applicationApiService.setApplicationPublicToMarketplace(appId, request)
.delayUntil(__ -> businessEventPublisher.publishApplicationSharingEvent(applicationId, "PublicToMarketplace"))
.map(ResponseView::success));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,12 @@
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.ApplicationPublishRequest;
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.model.Application;
import org.lowcoder.domain.application.service.ApplicationRecordServiceImpl;
import org.lowcoder.domain.application.service.ApplicationService;
import org.lowcoder.domain.datasource.model.Datasource;
Expand Down Expand Up @@ -186,6 +188,174 @@ public Mono<Void> publishApplicationCommonEvent(ApplicationView applicationView,
});
}

public Mono<Void> publishApplicationPermissionEvent(String applicationId, Set<String> userIds, Set<String> groupIds, String permissionId, String role) {
return sessionUserService.isAnonymousUser()
.flatMap(anonymous -> {
if (anonymous) {
return Mono.empty();
}
return sessionUserService.getVisitorOrgMemberCache()
.zipWith(sessionUserService.getVisitorToken())
.zipWith(Mono.defer(() -> applicationService.findById(applicationId)
.zipWhen(application -> application.getCategory(applicationRecordServiceImpl))
.zipWhen(application -> application.getT1().getDescription(applicationRecordServiceImpl))))
.doOnNext(tuple -> {
OrgMember orgMember = tuple.getT1().getT1();
String token = tuple.getT1().getT2();
String category = tuple.getT2().getT1().getT2();
String description = tuple.getT2().getT2();
Application application = tuple.getT2().getT1().getT1();
ApplicationCommonEvent event = ApplicationCommonEvent.builder()
.orgId(orgMember.getOrgId())
.userId(orgMember.getUserId())
.applicationId(application.getId())
.applicationGid(application.getGid())
.applicationName(application.getName())
.applicationCategory(category)
.applicationDescription(description)
.type(EventType.APPLICATION_PERMISSION_CHANGE)
.permissionId(permissionId)
.role(role)
.userIds(userIds)
.groupIds(groupIds)
.isAnonymous(anonymous)
.sessionHash(Hashing.sha512().hashString(token, StandardCharsets.UTF_8).toString())
.build();
event.populateDetails();
applicationEventPublisher.publishEvent(event);
})
.then()
.onErrorResume(throwable -> {
log.error("publishApplicationPermissionEvent error. {}, {}, {}", applicationId, permissionId, role, throwable);
return Mono.empty();
});
});
}

public Mono<Void> publishApplicationSharingEvent(String applicationId, String shareType) {
return sessionUserService.isAnonymousUser()
.flatMap(anonymous -> {
if (anonymous) {
return Mono.empty();
}
return sessionUserService.getVisitorOrgMemberCache()
.zipWith(sessionUserService.getVisitorToken())
.zipWith(Mono.defer(() -> applicationService.findById(applicationId)
.zipWhen(application -> application.getCategory(applicationRecordServiceImpl))
.zipWhen(application -> application.getT1().getDescription(applicationRecordServiceImpl))))
.doOnNext(tuple -> {
OrgMember orgMember = tuple.getT1().getT1();
String token = tuple.getT1().getT2();
String category = tuple.getT2().getT1().getT2();
String description = tuple.getT2().getT2();
Application application = tuple.getT2().getT1().getT1();
ApplicationCommonEvent event = ApplicationCommonEvent.builder()
.orgId(orgMember.getOrgId())
.userId(orgMember.getUserId())
.applicationId(application.getId())
.applicationGid(application.getGid())
.applicationName(application.getName())
.applicationCategory(category)
.applicationDescription(description)
.type(EventType.APPLICATION_SHARING_CHANGE)
.shareType(shareType)
.isAnonymous(anonymous)
.sessionHash(Hashing.sha512().hashString(token, StandardCharsets.UTF_8).toString())
.build();
event.populateDetails();
applicationEventPublisher.publishEvent(event);
})
.then()
.onErrorResume(throwable -> {
log.error("publishApplicationSharingEvent error. {}, {}", applicationId, shareType, throwable);
return Mono.empty();
});
});
}

public Mono<Void> publishApplicationPublishEvent(String applicationId, ApplicationPublishRequest request) {
return sessionUserService.isAnonymousUser()
.flatMap(anonymous -> {
if (anonymous) {
return Mono.empty();
}
return sessionUserService.getVisitorOrgMemberCache()
.zipWith(sessionUserService.getVisitorToken())
.zipWith(Mono.defer(() -> applicationService.findById(applicationId)
.zipWhen(application -> application.getCategory(applicationRecordServiceImpl))
.zipWhen(application -> application.getT1().getDescription(applicationRecordServiceImpl))))
.doOnNext(tuple -> {
OrgMember orgMember = tuple.getT1().getT1();
String token = tuple.getT1().getT2();
String category = tuple.getT2().getT1().getT2();
String description = tuple.getT2().getT2();
Application application = tuple.getT2().getT1().getT1();
ApplicationCommonEvent event = ApplicationCommonEvent.builder()
.orgId(orgMember.getOrgId())
.userId(orgMember.getUserId())
.applicationId(application.getId())
.applicationGid(application.getGid())
.applicationName(application.getName())
.applicationCategory(category)
.applicationDescription(description)
.type(EventType.APPLICATION_SHARING_CHANGE)
.commitMessage(request.commitMessage())
.tag(request.tag())
.isAnonymous(anonymous)
.sessionHash(Hashing.sha512().hashString(token, StandardCharsets.UTF_8).toString())
.build();
event.populateDetails();
applicationEventPublisher.publishEvent(event);
})
.then()
.onErrorResume(throwable -> {
log.error("publishApplicationPublishEvent error. {}, {}, {}", applicationId, request.tag(), request.commitMessage(), throwable);
return Mono.empty();
});
});
}

public Mono<Void> publishApplicationVersionChangeEvent(String applicationId, String newtag) {
return sessionUserService.isAnonymousUser()
.flatMap(anonymous -> {
if (anonymous) {
return Mono.empty();
}
return sessionUserService.getVisitorOrgMemberCache()
.zipWith(sessionUserService.getVisitorToken())
.zipWith(Mono.defer(() -> applicationService.findById(applicationId)
.zipWhen(application -> application.getCategory(applicationRecordServiceImpl))
.zipWhen(application -> application.getT1().getDescription(applicationRecordServiceImpl))))
.doOnNext(tuple -> {
OrgMember orgMember = tuple.getT1().getT1();
String token = tuple.getT1().getT2();
String category = tuple.getT2().getT1().getT2();
String description = tuple.getT2().getT2();
Application application = tuple.getT2().getT1().getT1();
ApplicationCommonEvent event = ApplicationCommonEvent.builder()
.orgId(orgMember.getOrgId())
.userId(orgMember.getUserId())
.applicationId(application.getId())
.applicationGid(application.getGid())
.applicationName(application.getName())
.applicationCategory(category)
.applicationDescription(description)
.type(EventType.APPLICATION_SHARING_CHANGE)
.tag(newtag)
.isAnonymous(anonymous)
.sessionHash(Hashing.sha512().hashString(token, StandardCharsets.UTF_8).toString())
.build();
event.populateDetails();
applicationEventPublisher.publishEvent(event);
})
.then()
.onErrorResume(throwable -> {
log.error("publishApplicationPublishEvent error. {}, {}", applicationId, newtag, throwable);
return Mono.empty();
});
});
}

public Mono<Void> publishUserLoginEvent(String source) {
return sessionUserService.getVisitorOrgMember().zipWith(sessionUserService.getVisitorToken())
.doOnNext(tuple -> {
Expand Down
Loading