Skip to content

Commit 05a1fb3

Browse files
authored
Merge pull request #1542 from lowcoder-org/feat/application_events
Added more application events
2 parents 26a7749 + d80527f commit 05a1fb3

File tree

3 files changed

+192
-3
lines changed

3 files changed

+192
-3
lines changed

server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/event/ApplicationCommonEvent.java

+9
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
import lombok.Getter;
66
import lombok.experimental.SuperBuilder;
77

8+
import java.util.Set;
9+
810
@Getter
911
@SuperBuilder
1012
public class ApplicationCommonEvent extends AbstractEvent {
@@ -23,6 +25,13 @@ public class ApplicationCommonEvent extends AbstractEvent {
2325
private final String oldFolderId;
2426
@Nullable
2527
private final String oldFolderName;
28+
private final String permissionId;
29+
private final String role;
30+
private final Set<String> userIds;
31+
private final Set<String> groupIds;
32+
private final String shareType;
33+
private final String tag;
34+
private final String commitMessage;
2635

2736
@Override
2837
public EventType getEventType() {

server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationController.java

+13-3
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import org.lowcoder.api.application.view.*;
55
import org.lowcoder.api.framework.view.PageResponseView;
66
import org.lowcoder.api.framework.view.ResponseView;
7-
import org.lowcoder.api.home.SessionUserService;
87
import org.lowcoder.api.home.UserHomeApiService;
98
import org.lowcoder.api.home.UserHomepageView;
109
import org.lowcoder.api.util.BusinessEventPublisher;
@@ -14,7 +13,6 @@
1413
import org.lowcoder.domain.application.model.ApplicationStatus;
1514
import org.lowcoder.domain.application.model.ApplicationType;
1615
import org.lowcoder.domain.application.service.ApplicationRecordService;
17-
import org.lowcoder.domain.folder.service.FolderElementRelationService;
1816
import org.lowcoder.domain.permission.model.ResourceRole;
1917
import org.springframework.web.bind.annotation.PathVariable;
2018
import org.springframework.web.bind.annotation.RequestBody;
@@ -37,7 +35,6 @@ public class ApplicationController implements ApplicationEndpoints {
3735
private final UserHomeApiService userHomeApiService;
3836
private final ApplicationApiService applicationApiService;
3937
private final BusinessEventPublisher businessEventPublisher;
40-
private final SessionUserService sessionUserService;
4138
private final GidService gidService;
4239
private final ApplicationRecordService applicationRecordService;
4340

@@ -152,6 +149,14 @@ public Mono<ResponseView<ApplicationView>> publish(@PathVariable String applicat
152149
return newtag;
153150
})
154151
.switchIfEmpty(Mono.just("1.0.0"))
152+
.delayUntil(newtag -> {
153+
ApplicationPublishRequest req = Objects.requireNonNullElse(applicationPublishRequest, new ApplicationPublishRequest("", newtag));
154+
return businessEventPublisher.publishApplicationPublishEvent(appId, req).then(Mono.defer(() -> {
155+
if(newtag.equals(req.tag())) {
156+
return businessEventPublisher.publishApplicationVersionChangeEvent(appId, newtag);
157+
} else return Mono.empty();
158+
}));
159+
})
155160
.flatMap(newtag -> applicationApiService.publish(appId, Objects.requireNonNullElse(applicationPublishRequest, new ApplicationPublishRequest("", newtag))))
156161
.map(ResponseView::success));
157162
}
@@ -221,6 +226,7 @@ public Mono<ResponseView<Boolean>> updatePermission(@PathVariable String applica
221226
}
222227
return gidService.convertApplicationIdToObjectId(applicationId).flatMap(appId ->
223228
applicationApiService.updatePermission(appId, permissionId, role)
229+
.delayUntil(__ -> businessEventPublisher.publishApplicationPermissionEvent(applicationId, null, null, permissionId, role.getValue()))
224230
.map(ResponseView::success));
225231
}
226232

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

@@ -246,6 +253,7 @@ public Mono<ResponseView<Boolean>> grantPermission(
246253
emptyIfNull(request.userIds()),
247254
emptyIfNull(request.groupIds()),
248255
role)
256+
.delayUntil(__ -> businessEventPublisher.publishApplicationPermissionEvent(applicationId, emptyIfNull(request.userIds()), emptyIfNull(request.groupIds()), null, role.getValue()))
249257
.map(ResponseView::success));
250258
}
251259

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

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

server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/util/BusinessEventPublisher.java

+170
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,12 @@
77
import org.apache.commons.lang3.StringUtils;
88
import org.apache.commons.lang3.tuple.Pair;
99
import org.lowcoder.api.application.view.ApplicationInfoView;
10+
import org.lowcoder.api.application.view.ApplicationPublishRequest;
1011
import org.lowcoder.api.application.view.ApplicationView;
1112
import org.lowcoder.api.home.SessionUserService;
1213
import org.lowcoder.api.usermanagement.view.AddMemberRequest;
1314
import org.lowcoder.api.usermanagement.view.UpdateRoleRequest;
15+
import org.lowcoder.domain.application.model.Application;
1416
import org.lowcoder.domain.application.service.ApplicationRecordServiceImpl;
1517
import org.lowcoder.domain.application.service.ApplicationService;
1618
import org.lowcoder.domain.datasource.model.Datasource;
@@ -186,6 +188,174 @@ public Mono<Void> publishApplicationCommonEvent(ApplicationView applicationView,
186188
});
187189
}
188190

191+
public Mono<Void> publishApplicationPermissionEvent(String applicationId, Set<String> userIds, Set<String> groupIds, String permissionId, String role) {
192+
return sessionUserService.isAnonymousUser()
193+
.flatMap(anonymous -> {
194+
if (anonymous) {
195+
return Mono.empty();
196+
}
197+
return sessionUserService.getVisitorOrgMemberCache()
198+
.zipWith(sessionUserService.getVisitorToken())
199+
.zipWith(Mono.defer(() -> applicationService.findById(applicationId)
200+
.zipWhen(application -> application.getCategory(applicationRecordServiceImpl))
201+
.zipWhen(application -> application.getT1().getDescription(applicationRecordServiceImpl))))
202+
.doOnNext(tuple -> {
203+
OrgMember orgMember = tuple.getT1().getT1();
204+
String token = tuple.getT1().getT2();
205+
String category = tuple.getT2().getT1().getT2();
206+
String description = tuple.getT2().getT2();
207+
Application application = tuple.getT2().getT1().getT1();
208+
ApplicationCommonEvent event = ApplicationCommonEvent.builder()
209+
.orgId(orgMember.getOrgId())
210+
.userId(orgMember.getUserId())
211+
.applicationId(application.getId())
212+
.applicationGid(application.getGid())
213+
.applicationName(application.getName())
214+
.applicationCategory(category)
215+
.applicationDescription(description)
216+
.type(EventType.APPLICATION_PERMISSION_CHANGE)
217+
.permissionId(permissionId)
218+
.role(role)
219+
.userIds(userIds)
220+
.groupIds(groupIds)
221+
.isAnonymous(anonymous)
222+
.sessionHash(Hashing.sha512().hashString(token, StandardCharsets.UTF_8).toString())
223+
.build();
224+
event.populateDetails();
225+
applicationEventPublisher.publishEvent(event);
226+
})
227+
.then()
228+
.onErrorResume(throwable -> {
229+
log.error("publishApplicationPermissionEvent error. {}, {}, {}", applicationId, permissionId, role, throwable);
230+
return Mono.empty();
231+
});
232+
});
233+
}
234+
235+
public Mono<Void> publishApplicationSharingEvent(String applicationId, String shareType) {
236+
return sessionUserService.isAnonymousUser()
237+
.flatMap(anonymous -> {
238+
if (anonymous) {
239+
return Mono.empty();
240+
}
241+
return sessionUserService.getVisitorOrgMemberCache()
242+
.zipWith(sessionUserService.getVisitorToken())
243+
.zipWith(Mono.defer(() -> applicationService.findById(applicationId)
244+
.zipWhen(application -> application.getCategory(applicationRecordServiceImpl))
245+
.zipWhen(application -> application.getT1().getDescription(applicationRecordServiceImpl))))
246+
.doOnNext(tuple -> {
247+
OrgMember orgMember = tuple.getT1().getT1();
248+
String token = tuple.getT1().getT2();
249+
String category = tuple.getT2().getT1().getT2();
250+
String description = tuple.getT2().getT2();
251+
Application application = tuple.getT2().getT1().getT1();
252+
ApplicationCommonEvent event = ApplicationCommonEvent.builder()
253+
.orgId(orgMember.getOrgId())
254+
.userId(orgMember.getUserId())
255+
.applicationId(application.getId())
256+
.applicationGid(application.getGid())
257+
.applicationName(application.getName())
258+
.applicationCategory(category)
259+
.applicationDescription(description)
260+
.type(EventType.APPLICATION_SHARING_CHANGE)
261+
.shareType(shareType)
262+
.isAnonymous(anonymous)
263+
.sessionHash(Hashing.sha512().hashString(token, StandardCharsets.UTF_8).toString())
264+
.build();
265+
event.populateDetails();
266+
applicationEventPublisher.publishEvent(event);
267+
})
268+
.then()
269+
.onErrorResume(throwable -> {
270+
log.error("publishApplicationSharingEvent error. {}, {}", applicationId, shareType, throwable);
271+
return Mono.empty();
272+
});
273+
});
274+
}
275+
276+
public Mono<Void> publishApplicationPublishEvent(String applicationId, ApplicationPublishRequest request) {
277+
return sessionUserService.isAnonymousUser()
278+
.flatMap(anonymous -> {
279+
if (anonymous) {
280+
return Mono.empty();
281+
}
282+
return sessionUserService.getVisitorOrgMemberCache()
283+
.zipWith(sessionUserService.getVisitorToken())
284+
.zipWith(Mono.defer(() -> applicationService.findById(applicationId)
285+
.zipWhen(application -> application.getCategory(applicationRecordServiceImpl))
286+
.zipWhen(application -> application.getT1().getDescription(applicationRecordServiceImpl))))
287+
.doOnNext(tuple -> {
288+
OrgMember orgMember = tuple.getT1().getT1();
289+
String token = tuple.getT1().getT2();
290+
String category = tuple.getT2().getT1().getT2();
291+
String description = tuple.getT2().getT2();
292+
Application application = tuple.getT2().getT1().getT1();
293+
ApplicationCommonEvent event = ApplicationCommonEvent.builder()
294+
.orgId(orgMember.getOrgId())
295+
.userId(orgMember.getUserId())
296+
.applicationId(application.getId())
297+
.applicationGid(application.getGid())
298+
.applicationName(application.getName())
299+
.applicationCategory(category)
300+
.applicationDescription(description)
301+
.type(EventType.APPLICATION_SHARING_CHANGE)
302+
.commitMessage(request.commitMessage())
303+
.tag(request.tag())
304+
.isAnonymous(anonymous)
305+
.sessionHash(Hashing.sha512().hashString(token, StandardCharsets.UTF_8).toString())
306+
.build();
307+
event.populateDetails();
308+
applicationEventPublisher.publishEvent(event);
309+
})
310+
.then()
311+
.onErrorResume(throwable -> {
312+
log.error("publishApplicationPublishEvent error. {}, {}, {}", applicationId, request.tag(), request.commitMessage(), throwable);
313+
return Mono.empty();
314+
});
315+
});
316+
}
317+
318+
public Mono<Void> publishApplicationVersionChangeEvent(String applicationId, String newtag) {
319+
return sessionUserService.isAnonymousUser()
320+
.flatMap(anonymous -> {
321+
if (anonymous) {
322+
return Mono.empty();
323+
}
324+
return sessionUserService.getVisitorOrgMemberCache()
325+
.zipWith(sessionUserService.getVisitorToken())
326+
.zipWith(Mono.defer(() -> applicationService.findById(applicationId)
327+
.zipWhen(application -> application.getCategory(applicationRecordServiceImpl))
328+
.zipWhen(application -> application.getT1().getDescription(applicationRecordServiceImpl))))
329+
.doOnNext(tuple -> {
330+
OrgMember orgMember = tuple.getT1().getT1();
331+
String token = tuple.getT1().getT2();
332+
String category = tuple.getT2().getT1().getT2();
333+
String description = tuple.getT2().getT2();
334+
Application application = tuple.getT2().getT1().getT1();
335+
ApplicationCommonEvent event = ApplicationCommonEvent.builder()
336+
.orgId(orgMember.getOrgId())
337+
.userId(orgMember.getUserId())
338+
.applicationId(application.getId())
339+
.applicationGid(application.getGid())
340+
.applicationName(application.getName())
341+
.applicationCategory(category)
342+
.applicationDescription(description)
343+
.type(EventType.APPLICATION_SHARING_CHANGE)
344+
.tag(newtag)
345+
.isAnonymous(anonymous)
346+
.sessionHash(Hashing.sha512().hashString(token, StandardCharsets.UTF_8).toString())
347+
.build();
348+
event.populateDetails();
349+
applicationEventPublisher.publishEvent(event);
350+
})
351+
.then()
352+
.onErrorResume(throwable -> {
353+
log.error("publishApplicationPublishEvent error. {}, {}", applicationId, newtag, throwable);
354+
return Mono.empty();
355+
});
356+
});
357+
}
358+
189359
public Mono<Void> publishUserLoginEvent(String source) {
190360
return sessionUserService.getVisitorOrgMember().zipWith(sessionUserService.getVisitorToken())
191361
.doOnNext(tuple -> {

0 commit comments

Comments
 (0)