Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 05a1fb3

Browse files
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‎

Lines changed: 9 additions & 0 deletions
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‎

Lines changed: 13 additions & 3 deletions
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‎

Lines changed: 170 additions & 0 deletions
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)

AltStyle によって変換されたページ (->オリジナル) /