Movatterモバイル変換


[0]ホーム

URL:


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

Commitd06a720

Browse files
committed
feat: add application version rollback capability
- Add rollbackToVersionId to ApplicationPublishRequest- Implement publishWithRollback method for DSL restoration- Add version DSL preview endpoint- Update controller logic to handle rollback requests
1 parent9a52ed3 commitd06a720

File tree

10 files changed

+207
-95
lines changed

10 files changed

+207
-95
lines changed

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

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
packageorg.lowcoder.api.application;
22

3-
importjakarta.annotation.Nonnull;
3+
importjava.util.List;
4+
importjava.util.Map;
5+
importjava.util.Set;
6+
47
importorg.lowcoder.api.application.view.ApplicationInfoView;
58
importorg.lowcoder.api.application.view.ApplicationPermissionView;
69
importorg.lowcoder.api.application.view.ApplicationPublishRequest;
@@ -10,14 +13,11 @@
1013
importorg.lowcoder.domain.permission.model.ResourceAction;
1114
importorg.lowcoder.domain.permission.model.ResourcePermission;
1215
importorg.lowcoder.domain.permission.model.ResourceRole;
13-
importorg.springframework.web.bind.annotation.PathVariable;
1416

17+
importjakarta.annotation.Nonnull;
1518
importreactor.core.publisher.Flux;
1619
importreactor.core.publisher.Mono;
1720

18-
importjava.util.List;
19-
importjava.util.Set;
20-
2121
publicinterfaceApplicationApiService {
2222
Mono<ApplicationView>create(ApplicationEndpoints.CreateApplicationRequestcreateApplicationRequest);
2323

@@ -39,6 +39,8 @@ public interface ApplicationApiService {
3939

4040
Mono<ApplicationView>publish(StringapplicationId,ApplicationPublishRequestapplicationPublishRequest);
4141

42+
Mono<ApplicationView>publishWithRollback(StringapplicationId,ApplicationPublishRequestapplicationPublishRequest,Map<String,Object>rollbackDsl);
43+
4244
Mono<Boolean>updateEditState(StringapplicationId,ApplicationEndpoints.UpdateEditStateRequestupdateEditStateRequest);
4345

4446
Mono<Boolean>grantPermission(StringapplicationId,

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

Lines changed: 64 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,30 @@
11
packageorg.lowcoder.api.application;
22

3-
importcom.github.f4b6a3.uuid.UuidCreator;
4-
importcom.google.common.collect.Maps;
5-
importcom.google.common.collect.Sets;
6-
importjakarta.annotation.Nonnull;
7-
importjakarta.annotation.Nullable;
8-
importlombok.RequiredArgsConstructor;
9-
importlombok.extern.slf4j.Slf4j;
3+
importstaticorg.lowcoder.domain.application.model.ApplicationStatus.NORMAL;
4+
importstaticorg.lowcoder.domain.permission.model.ResourceAction.EDIT_APPLICATIONS;
5+
importstaticorg.lowcoder.domain.permission.model.ResourceAction.MANAGE_APPLICATIONS;
6+
importstaticorg.lowcoder.domain.permission.model.ResourceAction.PUBLISH_APPLICATIONS;
7+
importstaticorg.lowcoder.domain.permission.model.ResourceAction.READ_APPLICATIONS;
8+
importstaticorg.lowcoder.domain.permission.model.ResourceAction.USE_DATASOURCES;
9+
importstaticorg.lowcoder.sdk.exception.BizError.ILLEGAL_APPLICATION_PERMISSION_ID;
10+
importstaticorg.lowcoder.sdk.exception.BizError.INVALID_PARAMETER;
11+
importstaticorg.lowcoder.sdk.exception.BizError.NOT_AUTHORIZED;
12+
importstaticorg.lowcoder.sdk.exception.BizError.NO_PERMISSION_TO_REQUEST_APP;
13+
importstaticorg.lowcoder.sdk.exception.BizError.USER_NOT_SIGNED_IN;
14+
importstaticorg.lowcoder.sdk.util.ExceptionUtils.deferredError;
15+
importstaticorg.lowcoder.sdk.util.ExceptionUtils.ofError;
16+
importstaticorg.lowcoder.sdk.util.ExceptionUtils.ofErrorWithHeaders;
17+
18+
importjava.time.Duration;
19+
importjava.time.Instant;
20+
importjava.util.ArrayList;
21+
importjava.util.HashMap;
22+
importjava.util.HashSet;
23+
importjava.util.List;
24+
importjava.util.Map;
25+
importjava.util.Set;
26+
importjava.util.stream.Collectors;
27+
1028
importorg.apache.commons.collections4.CollectionUtils;
1129
importorg.apache.commons.collections4.SetUtils;
1230
importorg.apache.commons.lang3.ObjectUtils;
@@ -27,21 +45,26 @@
2745
importorg.lowcoder.api.usermanagement.OrgDevChecker;
2846
importorg.lowcoder.api.usermanagement.view.GroupView;
2947
importorg.lowcoder.api.usermanagement.view.OrgMemberListView;
30-
importorg.lowcoder.domain.application.model.*;
48+
importorg.lowcoder.domain.application.model.Application;
49+
importorg.lowcoder.domain.application.model.ApplicationRequestType;
50+
importorg.lowcoder.domain.application.model.ApplicationStatus;
51+
importorg.lowcoder.domain.application.model.ApplicationType;
52+
importorg.lowcoder.domain.application.model.ApplicationVersion;
3153
importorg.lowcoder.domain.application.service.ApplicationHistorySnapshotService;
3254
importorg.lowcoder.domain.application.service.ApplicationRecordService;
3355
importorg.lowcoder.domain.application.service.ApplicationService;
3456
importorg.lowcoder.domain.datasource.model.Datasource;
3557
importorg.lowcoder.domain.datasource.service.DatasourceService;
3658
importorg.lowcoder.domain.folder.service.FolderElementRelationService;
37-
importorg.lowcoder.domain.group.model.Group;
38-
importorg.lowcoder.domain.group.model.GroupMember;
3959
importorg.lowcoder.domain.interaction.UserApplicationInteractionService;
40-
importorg.lowcoder.domain.organization.model.OrgMember;
4160
importorg.lowcoder.domain.organization.model.Organization;
4261
importorg.lowcoder.domain.organization.service.OrgMemberService;
4362
importorg.lowcoder.domain.organization.service.OrganizationService;
44-
importorg.lowcoder.domain.permission.model.*;
63+
importorg.lowcoder.domain.permission.model.ResourceAction;
64+
importorg.lowcoder.domain.permission.model.ResourceHolder;
65+
importorg.lowcoder.domain.permission.model.ResourcePermission;
66+
importorg.lowcoder.domain.permission.model.ResourceRole;
67+
importorg.lowcoder.domain.permission.model.ResourceType;
4568
importorg.lowcoder.domain.permission.service.ResourcePermissionService;
4669
importorg.lowcoder.domain.permission.solution.SuggestAppAdminSolutionService;
4770
importorg.lowcoder.domain.plugin.service.DatasourceMetaInfoService;
@@ -56,22 +79,18 @@
5679
importorg.lowcoder.sdk.util.ExceptionUtils;
5780
importorg.springframework.http.HttpHeaders;
5881
importorg.springframework.stereotype.Service;
59-
importorg.springframework.web.bind.annotation.PathVariable;
6082

83+
importcom.github.f4b6a3.uuid.UuidCreator;
84+
importcom.google.common.collect.Maps;
85+
importcom.google.common.collect.Sets;
86+
87+
importjakarta.annotation.Nonnull;
88+
importjakarta.annotation.Nullable;
89+
importlombok.RequiredArgsConstructor;
90+
importlombok.extern.slf4j.Slf4j;
6191
importreactor.core.publisher.Flux;
6292
importreactor.core.publisher.Mono;
6393
importreactor.core.scheduler.Schedulers;
64-
importreactor.util.function.Tuple2;
65-
66-
importjava.time.Duration;
67-
importjava.time.Instant;
68-
importjava.util.*;
69-
importjava.util.stream.Collectors;
70-
71-
importstaticorg.lowcoder.domain.application.model.ApplicationStatus.NORMAL;
72-
importstaticorg.lowcoder.domain.permission.model.ResourceAction.*;
73-
importstaticorg.lowcoder.sdk.exception.BizError.*;
74-
importstaticorg.lowcoder.sdk.util.ExceptionUtils.*;
7594

7695
@RequiredArgsConstructor
7796
@Service
@@ -398,6 +417,27 @@ public Mono<ApplicationView> publish(String applicationId, ApplicationPublishReq
398417
.build())));
399418
}
400419

420+
@Override
421+
publicMono<ApplicationView>publishWithRollback(StringapplicationId,ApplicationPublishRequestapplicationPublishRequest,Map<String,Object>rollbackDsl) {
422+
returncheckApplicationStatus(applicationId,NORMAL)
423+
.then(sessionUserService.getVisitorId())
424+
.flatMap(userId ->resourcePermissionService.checkAndReturnMaxPermission(userId,
425+
applicationId,PUBLISH_APPLICATIONS))
426+
.delayUntil(__ ->applicationService.findById(applicationId)
427+
.map(application ->ApplicationVersion.builder()
428+
.tag(applicationPublishRequest.tag())
429+
.commitMessage(applicationPublishRequest.commitMessage())
430+
.applicationId(application.getId())
431+
.applicationDSL(rollbackDsl)// Use the rollback DSL instead of current editing DSL
432+
.build())
433+
.flatMap(applicationRecordService::insert))
434+
.flatMap(permission ->applicationService.findById(applicationId)
435+
.flatMap(applicationUpdated ->buildView(applicationUpdated,permission.getResourceRole().getValue()).map(appInfoView ->ApplicationView.builder()
436+
.applicationInfoView(appInfoView)
437+
.applicationDSL(rollbackDsl)// Return the rollback DSL in the response
438+
.build())));
439+
}
440+
401441
@Override
402442
publicMono<Boolean>updateEditState(StringapplicationId,ApplicationEndpoints.UpdateEditStateRequestupdateEditStateRequest) {
403443
returncheckApplicationStatus(applicationId,NORMAL)

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

Lines changed: 41 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,24 @@
11
packageorg.lowcoder.api.application;
22

3-
importlombok.RequiredArgsConstructor;
4-
importorg.lowcoder.api.application.view.*;
3+
importstaticorg.apache.commons.collections4.SetUtils.emptyIfNull;
4+
importstaticorg.lowcoder.plugin.api.event.LowcoderEvent.EventType.APPLICATION_CREATE;
5+
importstaticorg.lowcoder.plugin.api.event.LowcoderEvent.EventType.APPLICATION_DELETE;
6+
importstaticorg.lowcoder.plugin.api.event.LowcoderEvent.EventType.APPLICATION_RECYCLED;
7+
importstaticorg.lowcoder.plugin.api.event.LowcoderEvent.EventType.APPLICATION_RESTORE;
8+
importstaticorg.lowcoder.plugin.api.event.LowcoderEvent.EventType.APPLICATION_UPDATE;
9+
importstaticorg.lowcoder.plugin.api.event.LowcoderEvent.EventType.APPLICATION_VIEW;
10+
importstaticorg.lowcoder.sdk.exception.BizError.INVALID_PARAMETER;
11+
importstaticorg.lowcoder.sdk.util.ExceptionUtils.ofError;
12+
13+
importjava.util.List;
14+
importjava.util.Map;
15+
importjava.util.Objects;
16+
17+
importorg.lowcoder.api.application.view.ApplicationInfoView;
18+
importorg.lowcoder.api.application.view.ApplicationPermissionView;
19+
importorg.lowcoder.api.application.view.ApplicationPublishRequest;
20+
importorg.lowcoder.api.application.view.ApplicationView;
21+
importorg.lowcoder.api.application.view.MarketplaceApplicationInfoView;
522
importorg.lowcoder.api.framework.view.PageResponseView;
623
importorg.lowcoder.api.framework.view.ResponseView;
724
importorg.lowcoder.api.home.UserHomeApiService;
@@ -18,17 +35,10 @@
1835
importorg.springframework.web.bind.annotation.RequestBody;
1936
importorg.springframework.web.bind.annotation.RequestParam;
2037
importorg.springframework.web.bind.annotation.RestController;
21-
importreactor.core.publisher.Mono;
2238

23-
importjava.util.List;
24-
importjava.util.Objects;
25-
26-
importstaticorg.apache.commons.collections4.SetUtils.emptyIfNull;
27-
importstaticorg.lowcoder.plugin.api.event.LowcoderEvent.EventType.*;
28-
importstaticorg.lowcoder.sdk.exception.BizError.INVALID_PARAMETER;
29-
importstaticorg.lowcoder.sdk.util.ExceptionUtils.ofError;
39+
importlombok.RequiredArgsConstructor;
3040
importreactor.core.publisher.Flux;
31-
importjava.util.Map;
41+
importreactor.core.publisher.Mono;
3242

3343
@RequiredArgsConstructor
3444
@RestController
@@ -157,14 +167,32 @@ public Mono<ResponseView<ApplicationView>> publish(@PathVariable String applicat
157167
})
158168
.switchIfEmpty(Mono.just("1.0.0"))
159169
.delayUntil(newtag -> {
160-
ApplicationPublishRequestreq =Objects.requireNonNullElse(applicationPublishRequest,newApplicationPublishRequest("",newtag));
170+
ApplicationPublishRequestreq =Objects.requireNonNullElse(applicationPublishRequest,newApplicationPublishRequest("",newtag,null));
161171
returnbusinessEventPublisher.publishApplicationPublishEvent(appId,req).then(Mono.defer(() -> {
162172
if(newtag.equals(req.tag())) {
163173
returnbusinessEventPublisher.publishApplicationVersionChangeEvent(appId,newtag);
164174
}elsereturnMono.empty();
165175
}));
166176
})
167-
.flatMap(newtag ->applicationApiService.publish(appId,Objects.requireNonNullElse(applicationPublishRequest,newApplicationPublishRequest("",newtag))))
177+
.flatMap(newtag -> {
178+
ApplicationPublishRequestreq =Objects.requireNonNullElse(applicationPublishRequest,newApplicationPublishRequest("",newtag,null));
179+
180+
// If rollback is requested, get the DSL from the specified version
181+
if (req.rollbackToVersionId() !=null && !req.rollbackToVersionId().isEmpty()) {
182+
returnapplicationRecordService.getById(req.rollbackToVersionId())
183+
.flatMap(rollbackVersion -> {
184+
// Create a new request with the rollback DSL
185+
ApplicationPublishRequestrollbackRequest =newApplicationPublishRequest(
186+
req.commitMessage(),
187+
req.tag(),
188+
req.rollbackToVersionId()
189+
);
190+
returnapplicationApiService.publishWithRollback(appId,rollbackRequest,rollbackVersion.getApplicationDSL());
191+
});
192+
}else {
193+
returnapplicationApiService.publish(appId,req);
194+
}
195+
})
168196
.map(ResponseView::success));
169197
}
170198

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,19 @@
11
packageorg.lowcoder.api.application;
22

3+
importjava.util.List;
4+
importjava.util.Map;
5+
36
importorg.lowcoder.api.application.view.ApplicationRecordMetaView;
47
importorg.lowcoder.domain.application.model.ApplicationCombineId;
5-
importreactor.core.publisher.Mono;
68

7-
importjava.util.List;
8-
importjava.util.Map;
9+
importreactor.core.publisher.Mono;
910

1011
publicinterfaceApplicationRecordApiService {
1112
Mono<Map<String,Object>>getRecordDSLFromApplicationCombineId(ApplicationCombineIdapplicationCombineId);
1213

1314
Mono<Void>delete(Stringid);
1415

1516
Mono<List<ApplicationRecordMetaView>>getByApplicationId(StringapplicationId);
17+
18+
Mono<Map<String,Object>>getVersionDsl(StringapplicationRecordId);
1619
}

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

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,26 @@
11
packageorg.lowcoder.api.application;
22

3-
importlombok.RequiredArgsConstructor;
4-
importorg.lowcoder.api.home.SessionUserService;
3+
importstaticorg.lowcoder.api.util.ViewBuilder.multiBuild;
4+
importstaticorg.lowcoder.sdk.exception.BizError.APPLICATION_AND_ORG_NOT_MATCH;
5+
importstaticorg.lowcoder.sdk.util.ExceptionUtils.ofError;
6+
7+
importjava.util.List;
8+
importjava.util.Map;
9+
510
importorg.lowcoder.api.application.view.ApplicationRecordMetaView;
11+
importorg.lowcoder.api.home.SessionUserService;
612
importorg.lowcoder.api.usermanagement.OrgDevChecker;
7-
importorg.lowcoder.domain.application.model.ApplicationVersion;
8-
importorg.lowcoder.domain.organization.model.OrgMember;
913
importorg.lowcoder.domain.application.model.Application;
1014
importorg.lowcoder.domain.application.model.ApplicationCombineId;
15+
importorg.lowcoder.domain.application.model.ApplicationVersion;
1116
importorg.lowcoder.domain.application.service.ApplicationRecordService;
1217
importorg.lowcoder.domain.application.service.ApplicationService;
18+
importorg.lowcoder.domain.organization.model.OrgMember;
1319
importorg.lowcoder.domain.user.service.UserService;
1420
importorg.springframework.stereotype.Service;
15-
importreactor.core.publisher.Mono;
1621

17-
importjava.util.List;
18-
importjava.util.Map;
19-
20-
importstaticorg.lowcoder.api.util.ViewBuilder.multiBuild;
21-
importstaticorg.lowcoder.sdk.exception.BizError.APPLICATION_AND_ORG_NOT_MATCH;
22-
importstaticorg.lowcoder.sdk.util.ExceptionUtils.ofError;
22+
importlombok.RequiredArgsConstructor;
23+
importreactor.core.publisher.Mono;
2324

2425
@RequiredArgsConstructor
2526
@Service
@@ -60,6 +61,13 @@ public Mono<List<ApplicationRecordMetaView>> getByApplicationId(String applicati
6061
));
6162
}
6263

64+
@Override
65+
publicMono<Map<String,Object>>getVersionDsl(StringapplicationRecordId) {
66+
returncheckApplicationRecordViewPermission(newApplicationCombineId(null,applicationRecordId))
67+
.then(applicationRecordService.getById(applicationRecordId))
68+
.map(ApplicationVersion::getApplicationDSL);
69+
}
70+
6371

6472
Mono<Void>checkApplicationRecordManagementPermission(StringapplicationRecordId) {
6573
returnorgDevChecker.checkCurrentOrgDev()

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

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
packageorg.lowcoder.api.application;
22

3-
importlombok.RequiredArgsConstructor;
4-
importorg.lowcoder.api.framework.view.ResponseView;
5-
importorg.lowcoder.api.application.ApplicationRecordApiService;
3+
importjava.util.List;
4+
importjava.util.Map;
5+
66
importorg.lowcoder.api.application.view.ApplicationRecordMetaView;
7+
importorg.lowcoder.api.framework.view.ResponseView;
78
importorg.lowcoder.domain.application.model.ApplicationCombineId;
89
importorg.springframework.web.bind.annotation.PathVariable;
910
importorg.springframework.web.bind.annotation.RequestParam;
1011
importorg.springframework.web.bind.annotation.RestController;
11-
importreactor.core.publisher.Mono;
1212

13-
importjava.util.List;
14-
importjava.util.Map;
13+
importlombok.RequiredArgsConstructor;
14+
importreactor.core.publisher.Mono;
1515

1616
@RequiredArgsConstructor
1717
@RestController
@@ -38,4 +38,9 @@ public Mono<ResponseView<Map<String, Object>>> dslById(@RequestParam(name = "app
3838
.map(ResponseView::success);
3939
}
4040

41+
@Override
42+
publicMono<ResponseView<Map<String,Object>>>getVersionDsl(@PathVariableStringapplicationRecordId) {
43+
returnapplicationRecordApiService.getVersionDsl(applicationRecordId)
44+
.map(ResponseView::success);
45+
}
4146
}

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

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,21 @@
11
packageorg.lowcoder.api.application;
22

3-
importio.swagger.v3.oas.annotations.Operation;
4-
importorg.lowcoder.api.framework.view.ResponseView;
5-
importorg.lowcoder.api.application.view.ApplicationRecordMetaView;
6-
importorg.springframework.web.bind.annotation.*;
7-
importreactor.core.publisher.Mono;
3+
importstaticorg.lowcoder.infra.constant.NewUrl.APPLICATION_RECORD_URL;
84

95
importjava.util.List;
106
importjava.util.Map;
117

12-
importstaticorg.lowcoder.infra.constant.NewUrl.APPLICATION_RECORD_URL;
8+
importorg.lowcoder.api.application.view.ApplicationRecordMetaView;
9+
importorg.lowcoder.api.framework.view.ResponseView;
10+
importorg.springframework.web.bind.annotation.DeleteMapping;
11+
importorg.springframework.web.bind.annotation.GetMapping;
12+
importorg.springframework.web.bind.annotation.PathVariable;
13+
importorg.springframework.web.bind.annotation.RequestMapping;
14+
importorg.springframework.web.bind.annotation.RequestParam;
15+
importorg.springframework.web.bind.annotation.RestController;
16+
17+
importio.swagger.v3.oas.annotations.Operation;
18+
importreactor.core.publisher.Mono;
1319

1420
@RestController
1521
@RequestMapping(value =APPLICATION_RECORD_URL)
@@ -45,4 +51,13 @@ public interface ApplicationRecordEndpoints
4551
publicMono<ResponseView<Map<String,Object>>>dslById(@RequestParam(name ="applicationId")StringapplicationId,
4652
@RequestParam(name ="applicationRecordId")StringapplicationRecordId);
4753

54+
@Operation(
55+
tags =TAG_APPLICATION_RECORDS,
56+
operationId ="getVersionDsl",
57+
summary ="Get DSL from specific version",
58+
description ="Retrieve the DSL data from a specific application version for rollback preview"
59+
)
60+
@GetMapping("/{applicationRecordId}/dsl")
61+
publicMono<ResponseView<Map<String,Object>>>getVersionDsl(@PathVariableStringapplicationRecordId);
62+
4863
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp