Skip to content

Commit 4d8ac38

Browse files
dragonpooludomikula
authored andcommitted
add new endpoint to retrieve archived snapshot list
1 parent 449f1fd commit 4d8ac38

File tree

7 files changed

+141
-13
lines changed

7 files changed

+141
-13
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package org.lowcoder.domain.application.repository;
2+
3+
import org.lowcoder.domain.application.model.ApplicationHistorySnapshot;
4+
import org.springframework.data.domain.Pageable;
5+
import org.springframework.data.mongodb.repository.Query;
6+
import org.springframework.data.mongodb.repository.ReactiveMongoRepository;
7+
import org.springframework.stereotype.Repository;
8+
import reactor.core.publisher.Flux;
9+
import reactor.core.publisher.Mono;
10+
11+
import java.time.Instant;
12+
13+
@Repository
14+
public interface ApplicationHistoryArchivedSnapshotRepository extends ReactiveMongoRepository<ApplicationHistorySnapshot, String> {
15+
16+
@Query(value = "{ 'applicationId': ?0, $and: [" +
17+
"{$or: [ { 'context.operations': { $elemMatch: { 'compName': ?1 } } }, { $expr: { $eq: [?1, null] } } ]}, " +
18+
"{$or: [ { 'dsl.settings.themeId': ?2 }, { $expr: { $eq: [?2, null] } } ] }, " +
19+
"{$or: [ { 'createdAt': { $gte: ?3} }, { $expr: { $eq: [?3, null] } } ] }, " +
20+
"{$or: [ { 'createdAt': { $lte: ?4} }, { $expr: { $eq: [?4, null] } } ] } " +
21+
"]}",
22+
fields = "{applicationId : 1, context: 1, createdBy : 1, createdAt : 1}")
23+
Flux<ApplicationHistorySnapshot> findAllByApplicationId(String applicationId, String compName, String theme, Instant createdAtFrom, Instant createdAtTo, Pageable pageable);
24+
25+
Mono<Long> countByApplicationId(String applicationId);
26+
}

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

+4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.lowcoder.domain.application.service;
22

3+
import org.lowcoder.domain.application.model.ApplicationHistorySnapshot;
34
import org.lowcoder.domain.application.model.ApplicationHistorySnapshotTS;
45
import org.springframework.data.domain.PageRequest;
56
import reactor.core.publisher.Mono;
@@ -13,8 +14,11 @@ public interface ApplicationHistorySnapshotService {
1314
Mono<Boolean> createHistorySnapshot(String applicationId, Map<String, Object> dsl, Map<String, Object> context, String userId);
1415

1516
Mono<List<ApplicationHistorySnapshotTS>> listAllHistorySnapshotBriefInfo(String applicationId, String compName, String theme, Instant from, Instant to, PageRequest pageRequest);
17+
Mono<List<ApplicationHistorySnapshot>> listAllHistorySnapshotBriefInfoArchived(String applicationId, String compName, String theme, Instant from, Instant to, PageRequest pageRequest);
1618

1719
Mono<Long> countByApplicationId(String applicationId);
1820

1921
Mono<ApplicationHistorySnapshotTS> getHistorySnapshotDetail(String historySnapshotId);
22+
23+
Mono<ApplicationHistorySnapshot> getHistorySnapshotDetailArchived(String historySnapshotId);
2024
}

server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/application/service/impl/ApplicationHistorySnapshotServiceImpl.java

+17
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package org.lowcoder.domain.application.service.impl;
22

33
import lombok.RequiredArgsConstructor;
4+
import org.lowcoder.domain.application.model.ApplicationHistorySnapshot;
45
import org.lowcoder.domain.application.model.ApplicationHistorySnapshotTS;
6+
import org.lowcoder.domain.application.repository.ApplicationHistoryArchivedSnapshotRepository;
57
import org.lowcoder.domain.application.repository.ApplicationHistorySnapshotRepository;
68
import org.lowcoder.domain.application.service.ApplicationHistorySnapshotService;
79
import org.lowcoder.sdk.exception.BizError;
@@ -23,6 +25,7 @@
2325
public class ApplicationHistorySnapshotServiceImpl implements ApplicationHistorySnapshotService {
2426

2527
private final ApplicationHistorySnapshotRepository repository;
28+
private final ApplicationHistoryArchivedSnapshotRepository repositoryArchived;
2629

2730
@Override
2831
public Mono<Boolean> createHistorySnapshot(String applicationId, Map<String, Object> dsl, Map<String, Object> context, String userId) {
@@ -42,6 +45,13 @@ public Mono<List<ApplicationHistorySnapshotTS>> listAllHistorySnapshotBriefInfo(
4245
.onErrorMap(Exception.class, e -> ofException(BizError.FETCH_HISTORY_SNAPSHOT_FAILURE, "FETCH_HISTORY_SNAPSHOT_FAILURE"));
4346
}
4447

48+
@Override
49+
public Mono<List<ApplicationHistorySnapshot>> listAllHistorySnapshotBriefInfoArchived(String applicationId, String compName, String theme, Instant from, Instant to, PageRequest pageRequest) {
50+
return repositoryArchived.findAllByApplicationId(applicationId, compName, theme, from, to, pageRequest.withSort(Direction.DESC, "id"))
51+
.collectList()
52+
.onErrorMap(Exception.class, e -> ofException(BizError.FETCH_HISTORY_SNAPSHOT_FAILURE, "FETCH_HISTORY_SNAPSHOT_FAILURE"));
53+
}
54+
4555
@Override
4656
public Mono<Long> countByApplicationId(String applicationId) {
4757
return repository.countByApplicationId(applicationId)
@@ -55,4 +65,11 @@ public Mono<ApplicationHistorySnapshotTS> getHistorySnapshotDetail(String histor
5565
return repository.findById(historySnapshotId)
5666
.switchIfEmpty(deferredError(INVALID_HISTORY_SNAPSHOT, "INVALID_HISTORY_SNAPSHOT", historySnapshotId));
5767
}
68+
69+
70+
@Override
71+
public Mono<ApplicationHistorySnapshot> getHistorySnapshotDetailArchived(String historySnapshotId) {
72+
return repositoryArchived.findById(historySnapshotId)
73+
.switchIfEmpty(deferredError(INVALID_HISTORY_SNAPSHOT, "INVALID_HISTORY_SNAPSHOT", historySnapshotId));
74+
}
5875
}

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

+69-11
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,13 @@
11
package org.lowcoder.api.application;
22

3-
import static org.lowcoder.api.util.ViewBuilder.multiBuild;
4-
5-
import java.time.Instant;
6-
import java.util.List;
7-
import java.util.Map;
8-
import java.util.stream.Collectors;
9-
3+
import com.google.common.collect.ImmutableMap;
4+
import lombok.RequiredArgsConstructor;
105
import org.lowcoder.api.application.view.HistorySnapshotDslView;
116
import org.lowcoder.api.framework.view.ResponseView;
127
import org.lowcoder.api.home.SessionUserService;
138
import org.lowcoder.api.util.Pagination;
149
import org.lowcoder.domain.application.model.Application;
10+
import org.lowcoder.domain.application.model.ApplicationHistorySnapshot;
1511
import org.lowcoder.domain.application.model.ApplicationHistorySnapshotTS;
1612
import org.lowcoder.domain.application.service.ApplicationHistorySnapshotService;
1713
import org.lowcoder.domain.application.service.ApplicationService;
@@ -22,11 +18,14 @@
2218
import org.springframework.web.bind.annotation.RequestBody;
2319
import org.springframework.web.bind.annotation.RequestParam;
2420
import org.springframework.web.bind.annotation.RestController;
21+
import reactor.core.publisher.Mono;
2522

26-
import com.google.common.collect.ImmutableMap;
23+
import java.time.Instant;
24+
import java.util.List;
25+
import java.util.Map;
26+
import java.util.stream.Collectors;
2727

28-
import lombok.RequiredArgsConstructor;
29-
import reactor.core.publisher.Mono;
28+
import static org.lowcoder.api.util.ViewBuilder.multiBuild;
3029

3130
@RequiredArgsConstructor
3231
@RestController
@@ -90,6 +89,43 @@ public Mono<ResponseView<Map<String, Object>>> listAllHistorySnapshotBriefInfo(@
9089
.map(ResponseView::success);
9190
}
9291

92+
@Override
93+
public Mono<ResponseView<Map<String, Object>>> listAllHistorySnapshotBriefInfoArchived(@PathVariable String applicationId,
94+
@RequestParam(defaultValue = "0") int page,
95+
@RequestParam(defaultValue = "10") int size,
96+
@RequestParam String compName,
97+
@RequestParam String theme,
98+
@RequestParam Instant from,
99+
@RequestParam Instant to) {
100+
101+
Pagination pagination = Pagination.of(page, size).check();
102+
103+
return sessionUserService.getVisitorId()
104+
.delayUntil(visitor -> resourcePermissionService.checkResourcePermissionWithError(visitor, applicationId,
105+
ResourceAction.EDIT_APPLICATIONS))
106+
.flatMap(__ -> applicationHistorySnapshotService.listAllHistorySnapshotBriefInfoArchived(applicationId, compName, theme, from, to, pagination.toPageRequest()))
107+
.flatMap(snapshotList -> {
108+
Mono<List<ApplicationHistorySnapshotBriefInfo>> snapshotBriefInfoList = multiBuild(snapshotList,
109+
ApplicationHistorySnapshot::getCreatedBy,
110+
userService::getByIds,
111+
(applicationHistorySnapshot, user) -> new ApplicationHistorySnapshotBriefInfo(
112+
applicationHistorySnapshot.getId(),
113+
applicationHistorySnapshot.getContext(),
114+
applicationHistorySnapshot.getCreatedBy(),
115+
user.getName(),
116+
user.getAvatarUrl(),
117+
applicationHistorySnapshot.getCreatedAt().toEpochMilli()
118+
)
119+
);
120+
121+
Mono<Long> applicationHistorySnapshotCount = applicationHistorySnapshotService.countByApplicationId(applicationId);
122+
123+
return Mono.zip(snapshotBriefInfoList, applicationHistorySnapshotCount)
124+
.map(tuple -> ImmutableMap.of("list", tuple.getT1(), "count", tuple.getT2()));
125+
})
126+
.map(ResponseView::success);
127+
}
128+
93129
@Override
94130
public Mono<ResponseView<HistorySnapshotDslView>> getHistorySnapshotDsl(@PathVariable String applicationId,
95131
@PathVariable String snapshotId) {
@@ -98,7 +134,29 @@ public Mono<ResponseView<HistorySnapshotDslView>> getHistorySnapshotDsl(@PathVar
98134
ResourceAction.EDIT_APPLICATIONS))
99135
.flatMap(__ -> applicationHistorySnapshotService.getHistorySnapshotDetail(snapshotId))
100136
.map(ApplicationHistorySnapshotTS::getDsl)
101-
.zipWhen(dsl -> applicationService.getAllDependentModulesFromDsl(dsl))
137+
.zipWhen(applicationService::getAllDependentModulesFromDsl)
138+
.map(tuple -> {
139+
Map<String, Object> applicationDsl = tuple.getT1();
140+
List<Application> dependentModules = tuple.getT2();
141+
Map<String, Map<String, Object>> dependentModuleDsl = dependentModules.stream()
142+
.collect(Collectors.toMap(Application::getId, Application::getLiveApplicationDsl, (a, b) -> b));
143+
return HistorySnapshotDslView.builder()
144+
.applicationsDsl(applicationDsl)
145+
.moduleDSL(dependentModuleDsl)
146+
.build();
147+
})
148+
.map(ResponseView::success);
149+
}
150+
151+
@Override
152+
public Mono<ResponseView<HistorySnapshotDslView>> getHistorySnapshotDslArchived(@PathVariable String applicationId,
153+
@PathVariable String snapshotId) {
154+
return sessionUserService.getVisitorId()
155+
.delayUntil(visitor -> resourcePermissionService.checkResourcePermissionWithError(visitor, applicationId,
156+
ResourceAction.EDIT_APPLICATIONS))
157+
.flatMap(__ -> applicationHistorySnapshotService.getHistorySnapshotDetailArchived(snapshotId))
158+
.map(ApplicationHistorySnapshot::getDsl)
159+
.zipWhen(applicationService::getAllDependentModulesFromDsl)
102160
.map(tuple -> {
103161
Map<String, Object> applicationDsl = tuple.getT1();
104162
List<Application> dependentModules = tuple.getT2();

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

+23
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,19 @@ public Mono<ResponseView<Map<String, Object>>> listAllHistorySnapshotBriefInfo(@
4646
@RequestParam(required = false ) @Nullable Instant from,
4747
@RequestParam(required = false ) @Nullable Instant to);
4848

49+
@Operation(
50+
tags = TAG_APPLICATION_HISTORY_MANAGEMENT,
51+
operationId = "listApplicationSnapshotsArchived",
52+
summary = "List Archived Application Snapshots",
53+
description = "Retrieve a list of Archived Snapshots associated with a specific Application within Lowcoder."
54+
)
55+
@GetMapping("/archive/{applicationId}")
56+
public Mono<ResponseView<Map<String, Object>>> listAllHistorySnapshotBriefInfoArchived(@PathVariable String applicationId,
57+
@RequestParam(defaultValue = "0") int page, @RequestParam(defaultValue = "10") int size,
58+
@RequestParam(required = false ) @Nullable String compName, @RequestParam(required = false ) @Nullable String theme,
59+
@RequestParam(required = false ) @Nullable Instant from,
60+
@RequestParam(required = false ) @Nullable Instant to);
61+
4962
@Operation(
5063
tags = TAG_APPLICATION_HISTORY_MANAGEMENT,
5164
operationId = "getApplicationSnapshot",
@@ -56,6 +69,16 @@ public Mono<ResponseView<Map<String, Object>>> listAllHistorySnapshotBriefInfo(@
5669
public Mono<ResponseView<HistorySnapshotDslView>> getHistorySnapshotDsl(@PathVariable String applicationId,
5770
@PathVariable String snapshotId);
5871

72+
@Operation(
73+
tags = TAG_APPLICATION_HISTORY_MANAGEMENT,
74+
operationId = "getApplicationSnapshotArchived",
75+
summary = "Retrieve Archived Application Snapshot",
76+
description = "Retrieve a specific Archived Application Snapshot within Lowcoder using the Application and Snapshot IDs."
77+
)
78+
@GetMapping("/archive/{applicationId}/{snapshotId}")
79+
public Mono<ResponseView<HistorySnapshotDslView>> getHistorySnapshotDslArchived(@PathVariable String applicationId,
80+
@PathVariable String snapshotId);
81+
5982
public record ApplicationHistorySnapshotBriefInfo(String snapshotId, Map<String, Object> context,
6083
String userId, String userName,
6184
String userAvatar, long createTime) {

server/api-service/lowcoder-server/src/main/resources/application-debug.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ common:
4848
cookie:
4949
max-age-in-hours: ${LOWCODER_COOKIE_MAX_AGE:24}
5050
query:
51-
app-snapshot-keep-duration: ${LOWCODER_QUERY_SNAPSHOT_ACTIVE_DURATION:30}
51+
app-snapshot-keep-duration: ${LOWCODER_APP_SNAPSHOT_RETENTIONTIME:30}
5252

5353
debug: true
5454

server/api-service/lowcoder-server/src/main/resources/application.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ common:
8989
cookie:
9090
max-age-in-hours: ${LOWCODER_COOKIE_MAX_AGE:24}
9191
query:
92-
app-snapshot-keep-duration: ${LOWCODER_QUERY_SNAPSHOT_ACTIVE_DURATION:30}
92+
app-snapshot-keep-duration: ${LOWCODER_APP_SNAPSHOT_RETENTIONTIME:30}
9393

9494
material:
9595
mongodb-grid-fs:

0 commit comments

Comments
 (0)