From 158a3a6a3da4186d8f81ca9a7cdace2077845216 Mon Sep 17 00:00:00 2001 From: Thomasr Date: Mon, 2 Jun 2025 02:24:03 -0400 Subject: [PATCH 1/4] When an anonymous user visits a published app, a log entry is added to the app_usage_log table. not sure about orgId and userId. --- .../main/java/org/lowcoder/api/util/BusinessEventPublisher.java | 1 + 1 file changed, 1 insertion(+) 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 eb2cf5d0a..28f29271e 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 @@ -127,6 +127,7 @@ public Mono publishApplicationCommonEvent(ApplicationView originalApplicat return sessionUserService.isAnonymousUser() .flatMap(anonymous -> { return sessionUserService.getVisitorOrgMemberCache() + .onErrorReturn(new OrgMember(originalApplicationView.getApplicationInfoView().getOrgId(), originalApplicationView.getApplicationInfoView().getCreateBy(), null, null, 0)) .zipWith(Mono.defer(() -> { String folderId = applicationView.getApplicationInfoView().getFolderId(); if (StringUtils.isBlank(folderId)) { From e843aab4cdbfc72f394f5023e307c293c84286fb Mon Sep 17 00:00:00 2001 From: Thomasr Date: Mon, 2 Jun 2025 04:37:20 -0400 Subject: [PATCH 2/4] When an anonymous user visits a published app, a log entry is added to the app_usage_log table that includes the org_id but not the user_id. --- .../main/java/org/lowcoder/api/util/BusinessEventPublisher.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 28f29271e..fbf43058a 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 @@ -127,7 +127,7 @@ public Mono publishApplicationCommonEvent(ApplicationView originalApplicat return sessionUserService.isAnonymousUser() .flatMap(anonymous -> { return sessionUserService.getVisitorOrgMemberCache() - .onErrorReturn(new OrgMember(originalApplicationView.getApplicationInfoView().getOrgId(), originalApplicationView.getApplicationInfoView().getCreateBy(), null, null, 0)) + .onErrorReturn(new OrgMember(originalApplicationView.getApplicationInfoView().getOrgId(), null, null, null, 0)) .zipWith(Mono.defer(() -> { String folderId = applicationView.getApplicationInfoView().getFolderId(); if (StringUtils.isBlank(folderId)) { From 61726d273ea61c2f9506ca41cd717fb3087751d9 Mon Sep 17 00:00:00 2001 From: Thomasr Date: Mon, 2 Jun 2025 05:01:50 -0400 Subject: [PATCH 3/4] Add applicationAuthor field to application event. --- .../java/org/lowcoder/infra/event/ApplicationCommonEvent.java | 1 + .../main/java/org/lowcoder/api/util/BusinessEventPublisher.java | 1 + 2 files changed, 2 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 b4d5505da..3bafd9147 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 @@ -22,6 +22,7 @@ public class ApplicationCommonEvent extends AbstractEvent { private final String oldApplicationCategory; private final String oldApplicationDescription; private final String oldApplicationTitle; + private final String applicationAuthor; private final EventType type; @Nullable @JsonInclude(JsonInclude.Include.NON_NULL) 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 fbf43058a..384c83f3f 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 @@ -176,6 +176,7 @@ public Mono publishApplicationCommonEvent(ApplicationView originalApplicat .applicationId(applicationInfoView.getApplicationId()) .applicationGid(applicationInfoView.getApplicationGid()) .applicationName(applicationInfoView.getName()) + .applicationAuthor(applicationInfoView.getCreateBy()) .applicationCategory(category) .applicationDescription(description) .applicationTitle(title) From 03ec0e98c3e36d89c0d805f482595b8f33912559 Mon Sep 17 00:00:00 2001 From: Thomasr Date: Mon, 2 Jun 2025 10:33:47 -0400 Subject: [PATCH 4/4] Add applicationAuthorOrgId field to application event. --- .../infra/event/ApplicationCommonEvent.java | 1 + .../api/util/BusinessEventPublisher.java | 153 +++++++++--------- 2 files changed, 77 insertions(+), 77 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 3bafd9147..616867bf6 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 @@ -23,6 +23,7 @@ public class ApplicationCommonEvent extends AbstractEvent { private final String oldApplicationDescription; private final String oldApplicationTitle; private final String applicationAuthor; + private final String applicationAuthorOrgId; private final EventType type; @Nullable @JsonInclude(JsonInclude.Include.NON_NULL) 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 384c83f3f..1356b891b 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 @@ -125,83 +125,82 @@ public Mono publishApplicationCommonEvent(ApplicationView originalApplicat public Mono publishApplicationCommonEvent(ApplicationView originalApplicationView, ApplicationView applicationView, EventType eventType) { return sessionUserService.isAnonymousUser() - .flatMap(anonymous -> { - return sessionUserService.getVisitorOrgMemberCache() - .onErrorReturn(new OrgMember(originalApplicationView.getApplicationInfoView().getOrgId(), null, null, null, 0)) - .zipWith(Mono.defer(() -> { - String folderId = applicationView.getApplicationInfoView().getFolderId(); - if (StringUtils.isBlank(folderId)) { - return Mono.just(Optional.empty()); - } - return folderService.findById(folderId) - .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)) - .zipWhen(application -> application.getT1().getT1().getTitle(applicationRecordServiceImpl)) - .map(tuple -> { - String category = tuple.getT1().getT1().getT2(); - String description = tuple.getT1().getT2(); - String title = tuple.getT2(); - return new String[]{category, description, title}; - }); - }), TupleUtils::merge) - .flatMap(tuple -> Mono.deferContextual(contextView -> { - OrgMember orgMember = tuple.getT1().getT1(); - Optional optional = tuple.getT1().getT2(); - Optional optionalFrom = tuple.getT1().getT3(); - String token = tuple.getT2(); - String category = tuple.getT3()[0]; - String description = tuple.getT3()[1]; - String title = tuple.getT3()[2]; - ApplicationInfoView applicationInfoView = applicationView.getApplicationInfoView(); - - ApplicationCommonEvent event = ApplicationCommonEvent.builder() - .orgId(orgMember.getOrgId()) - .userId(orgMember.getUserId()) - .applicationId(applicationInfoView.getApplicationId()) - .applicationGid(applicationInfoView.getApplicationGid()) - .applicationName(applicationInfoView.getName()) - .applicationAuthor(applicationInfoView.getCreateBy()) - .applicationCategory(category) - .applicationDescription(description) - .applicationTitle(title) - .oldApplicationName(originalApplicationView!=null ? originalApplicationView.getApplicationInfoView().getName() : null) - .oldApplicationCategory(originalApplicationView!=null ?originalApplicationView.getApplicationInfoView().getCategory() : null) - .oldApplicationDescription(originalApplicationView!=null ?originalApplicationView.getApplicationInfoView().getDescription() : null) - .oldApplicationTitle(originalApplicationView!=null ?originalApplicationView.getApplicationInfoView().getTitle() : null) - .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(); - - event.populateDetails(contextView); - applicationEventPublisher.publishEvent(event); - return Mono.empty(); - })).then() // **Ensures Mono return type** - .onErrorResume(throwable -> { - log.error("publishApplicationCommonEvent error. {}, {}", applicationView, eventType, throwable); - return Mono.empty(); - }); - }); + .flatMap(anonymous -> sessionUserService.getVisitorOrgMemberCache() + .onErrorReturn(new OrgMember(null, null, null, null, 0)) + .zipWith(Mono.defer(() -> { + String folderId = applicationView.getApplicationInfoView().getFolderId(); + if (StringUtils.isBlank(folderId)) { + return Mono.just(Optional.empty()); + } + return folderService.findById(folderId) + .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)) + .zipWhen(application -> application.getT1().getT1().getTitle(applicationRecordServiceImpl)) + .map(tuple -> { + String category = tuple.getT1().getT1().getT2(); + String description = tuple.getT1().getT2(); + String title = tuple.getT2(); + return new String[]{category, description, title}; + }); + }), TupleUtils::merge) + .flatMap(tuple -> Mono.deferContextual(contextView -> { + OrgMember orgMember = tuple.getT1().getT1(); + Optional optional = tuple.getT1().getT2(); + Optional optionalFrom = tuple.getT1().getT3(); + String token = tuple.getT2(); + String category = tuple.getT3()[0]; + String description = tuple.getT3()[1]; + String title = tuple.getT3()[2]; + ApplicationInfoView applicationInfoView = applicationView.getApplicationInfoView(); + + ApplicationCommonEvent event = ApplicationCommonEvent.builder() + .orgId(orgMember.getOrgId()) + .userId(orgMember.getUserId()) + .applicationId(applicationInfoView.getApplicationId()) + .applicationGid(applicationInfoView.getApplicationGid()) + .applicationName(applicationInfoView.getName()) + .applicationAuthor(applicationInfoView.getCreateBy()) + .applicationAuthorOrgId(applicationInfoView.getOrgId()) + .applicationCategory(category) + .applicationDescription(description) + .applicationTitle(title) + .oldApplicationName(originalApplicationView!=null ? originalApplicationView.getApplicationInfoView().getName() : null) + .oldApplicationCategory(originalApplicationView!=null ?originalApplicationView.getApplicationInfoView().getCategory() : null) + .oldApplicationDescription(originalApplicationView!=null ?originalApplicationView.getApplicationInfoView().getDescription() : null) + .oldApplicationTitle(originalApplicationView!=null ?originalApplicationView.getApplicationInfoView().getTitle() : null) + .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(); + + event.populateDetails(contextView); + applicationEventPublisher.publishEvent(event); + return Mono.empty(); + })).then() // **Ensures Mono return type** + .onErrorResume(throwable -> { + log.error("publishApplicationCommonEvent error. {}, {}", applicationView, eventType, throwable); + return Mono.empty(); + })); }