Skip to content

Commit 2977b16

Browse files
dragonpooludomikula
authored andcommitted
Added meta api for db objects
1 parent e96bf13 commit 2977b16

File tree

18 files changed

+212
-0
lines changed

18 files changed

+212
-0
lines changed

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

+1
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ public class Application extends HasIdAndAuditing {
4747
private Integer applicationType;
4848
private ApplicationStatus applicationStatus;
4949

50+
@Setter
5051
private Map<String, Object> editingApplicationDSL;
5152

5253
@Setter

server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/bundle/repository/BundleRepository.java

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
public interface BundleRepository extends ReactiveMongoRepository<Bundle, String> {
1414
Mono<Void> deleteAllByGid(Collection<String> gids);
1515
Flux<Bundle> findByGid(@Nonnull String gid);
16+
Flux<Bundle> findAllByGid(Collection<String> gids);
1617

1718
Flux<Bundle> findByCreatedBy(String userId);
1819
/**

server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/bundle/service/BundleService.java

+1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ public interface BundleService {
1616
Mono<Boolean> updateById(String id, Bundle resource);
1717

1818
Mono<Bundle> findById(String id);
19+
Flux<Bundle> findByIdIn(Collection<String> ids);
1920

2021
Mono<Bundle> findByIdWithoutDsl(String id);
2122

server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/bundle/service/BundleServiceImpl.java

+10
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
import java.util.Collection;
2222
import java.util.Map;
23+
import java.util.Optional;
2324
import java.util.Set;
2425
import java.util.stream.Collectors;
2526

@@ -56,6 +57,15 @@ public Mono<Bundle> findById(String id) {
5657
.switchIfEmpty(Mono.error(new BizException(BizError.NO_RESOURCE_FOUND, "BUNDLE_NOT_FOUND", id)));
5758
}
5859

60+
@Override
61+
public Flux<Bundle> findByIdIn(Collection<String> ids) {
62+
Optional<String> first = ids.stream().findFirst();
63+
if(first.isPresent() && FieldName.isGID(first.get()))
64+
return repository.findAllByGid(ids);
65+
66+
return repository.findAllById(ids);
67+
}
68+
5969
@Override
6070
public Mono<Bundle> findByIdWithoutDsl(String id) {
6171
if (id == null) {

server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/datasource/repository/DatasourceRepository.java

+9
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,15 @@ public Mono<Datasource> findById(String datasourceId) {
6262
.flatMap(this::convertToDomainObjectAndDecrypt);
6363
}
6464

65+
public Flux<Datasource> findByIds(Collection<String> datasourceIds) {
66+
Optional<String> first = datasourceIds.stream().findAny();
67+
if(first.isPresent() && FieldName.isGID(first.get()))
68+
return repository.findAllByGidIn(datasourceIds)
69+
.flatMap(this::convertToDomainObjectAndDecrypt);
70+
return repository.findAllById(datasourceIds)
71+
.flatMap(this::convertToDomainObjectAndDecrypt);
72+
}
73+
6574
public Mono<Datasource> findWorkspacePredefinedDatasourceByOrgIdAndType(String organizationId, String type) {
6675
return repository.findByOrganizationIdAndTypeAndCreationSource(organizationId, type,
6776
DatasourceCreationSource.LEGACY_WORKSPACE_PREDEFINED.getValue())

server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/datasource/service/DatasourceService.java

+1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ public interface DatasourceService {
1515
Mono<Datasource> update(String id, Datasource resource);
1616

1717
Mono<Datasource> getById(String id);
18+
Flux<Datasource> getByIds(Collection<String> ids);
1819

1920
Mono<Boolean> delete(String id);
2021

server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/datasource/service/impl/DatasourceServiceImpl.java

+26
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,32 @@ public Mono<Datasource> getById(String id) {
101101
return repository.findById(id);
102102
}
103103

104+
@Override
105+
public Flux<Datasource> getByIds(Collection<String> ids) {
106+
Flux<Datasource> builtDatasourceFlux = Flux.fromStream(ids.stream().filter(id-> StringUtils.equals(id, Datasource.QUICK_REST_API_ID)
107+
|| StringUtils.equals(id, Datasource.QUICK_GRAPHQL_ID)
108+
|| StringUtils.equals(id, Datasource.LOWCODER_API_ID)
109+
).map(id-> {
110+
if (StringUtils.equals(id, Datasource.QUICK_REST_API_ID)) {
111+
return Datasource.QUICK_REST_API;
112+
}
113+
114+
if (StringUtils.equals(id, Datasource.QUICK_GRAPHQL_ID)) {
115+
return Datasource.QUICK_GRAPHQL_API;
116+
}
117+
118+
if (StringUtils.equals(id, Datasource.LOWCODER_API_ID)) {
119+
return Datasource.LOWCODER_API;
120+
}
121+
return Datasource.LOWCODER_API;
122+
}));
123+
124+
return Flux.concat(builtDatasourceFlux, repository.findByIds(ids.stream().filter(id-> !(StringUtils.equals(id, Datasource.QUICK_REST_API_ID)
125+
|| StringUtils.equals(id, Datasource.QUICK_GRAPHQL_ID)
126+
|| StringUtils.equals(id, Datasource.LOWCODER_API_ID))
127+
).toList()));
128+
}
129+
104130
private Mono<Datasource> validateDatasource(Datasource datasource) {
105131

106132
if (datasource.getOrganizationId() == null) {

server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/folder/repository/FolderRepository.java

+1
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,6 @@ public interface FolderRepository extends ReactiveMongoRepository<Folder, String
1414

1515
Flux<Folder> findByOrganizationId(String organizationId);
1616
Flux<Folder> findByGid(String organizationGid);
17+
Flux<Folder> findByGidIn(Collection<String> ids);
1718
Mono<Void> deleteAllByGid(Collection<String> gids);
1819
}

server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/folder/service/FolderService.java

+2
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ public interface FolderService {
1111

1212
Mono<Folder> findById(String id);
1313

14+
Flux<Folder> findByIds(Collection<String> ids);
15+
1416
Mono<Folder> create(Folder folder);
1517

1618
Flux<Folder> findByOrganizationId(String organizationId);

server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/folder/service/FolderServiceImpl.java

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

3+
import static org.lowcoder.domain.organization.model.OrganizationState.ACTIVE;
34
import static org.lowcoder.sdk.exception.BizError.NO_RESOURCE_FOUND;
45

56
import java.util.Collection;
@@ -46,6 +47,13 @@ public Mono<Folder> findById(String id) {
4647
.switchIfEmpty(Mono.error(new BizException(BizError.NO_RESOURCE_FOUND, "FOLDER_NOT_FOUND", id)));
4748
}
4849

50+
@Override
51+
public Flux<Folder> findByIds(Collection<String> ids) {
52+
if(!ids.isEmpty() && FieldName.isGID(ids.stream().findFirst().get()))
53+
return repository.findByGidIn(ids);
54+
return repository.findByGidIn(ids);
55+
}
56+
4957
@Override
5058
public Mono<Folder> create(Folder folder) {
5159
return repository.save(folder);

server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/query/repository/LibraryQueryRepository.java

+3
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
import reactor.core.publisher.Flux;
77
import reactor.core.publisher.Mono;
88

9+
import java.util.Collection;
10+
911
@Repository
1012
public interface LibraryQueryRepository extends ReactiveMongoRepository<LibraryQuery, String> {
1113

@@ -14,4 +16,5 @@ public interface LibraryQueryRepository extends ReactiveMongoRepository<LibraryQ
1416
Mono<LibraryQuery> findByName(String name);
1517
Mono<Void> deleteByGid(String gid);
1618
Flux<LibraryQuery> findByGid(String gid);
19+
Flux<LibraryQuery> findByGidIn(Collection<String> gids);
1720
}

server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/query/service/LibraryQueryService.java

+2
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,12 @@
55
import reactor.core.publisher.Flux;
66
import reactor.core.publisher.Mono;
77

8+
import java.util.Collection;
89
import java.util.Map;
910

1011
public interface LibraryQueryService {
1112
Mono<LibraryQuery> getById(String libraryQueryId);
13+
Flux<LibraryQuery> getByIds(Collection<String> libraryQueryIds);
1214

1315
Mono<LibraryQuery> getByName(String libraryQueryName);
1416

server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/query/service/LibraryQueryServiceImpl.java

+10
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@
1313
import reactor.core.publisher.Flux;
1414
import reactor.core.publisher.Mono;
1515

16+
import java.util.Collection;
1617
import java.util.Map;
18+
import java.util.Optional;
1719

1820
import static org.lowcoder.sdk.exception.BizError.LIBRARY_QUERY_NOT_FOUND;
1921
import static org.lowcoder.sdk.util.ExceptionUtils.deferredError;
@@ -35,6 +37,14 @@ public Mono<LibraryQuery> getById(String libraryQueryId) {
3537
.switchIfEmpty(deferredError(LIBRARY_QUERY_NOT_FOUND, "LIBRARY_QUERY_NOT_FOUND"));
3638
}
3739

40+
@Override
41+
public Flux<LibraryQuery> getByIds(Collection<String> libraryQueryIds) {
42+
Optional<String> first = libraryQueryIds.stream().findFirst();
43+
if(first.isPresent() && FieldName.isGID(first.get()))
44+
return libraryQueryRepository.findByGidIn(libraryQueryIds);
45+
return libraryQueryRepository.findAllById(libraryQueryIds);
46+
}
47+
3848
@Override
3949
public Mono<LibraryQuery> getByName(String libraryQueryName) {
4050
return libraryQueryRepository.findByName(libraryQueryName)

server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/constant/NewUrl.java

+1
Original file line numberDiff line numberDiff line change
@@ -37,4 +37,5 @@ private NewUrl() {
3737
public static final String NPM_REGISTRY = PREFIX + "/npm";
3838

3939
public static final String PLUGINS_URL = PREFIX + "/plugins";
40+
public static final String META_URL = PREFIX + "/meta";
4041
}

server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/constant/Url.java

+1
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,6 @@ public final class Url {
1717
public static final String APPLICATION_URL = BASE_URL + VERSION + "/applications";
1818
public static final String QUERY_URL = BASE_URL + VERSION + "/query";
1919
public static final String STATE_URL = BASE_URL + VERSION + "/state";
20+
public static final String META_URL = BASE_URL + VERSION + "/meta";
2021

2122
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package org.lowcoder.api.meta;
2+
3+
import lombok.RequiredArgsConstructor;
4+
import org.lowcoder.api.application.ApplicationApiService;
5+
import org.lowcoder.api.framework.view.ResponseView;
6+
import org.lowcoder.api.meta.view.MetaView;
7+
import org.lowcoder.domain.application.model.Application;
8+
import org.lowcoder.domain.application.service.ApplicationServiceImpl;
9+
import org.lowcoder.domain.bundle.model.Bundle;
10+
import org.lowcoder.domain.bundle.service.BundleServiceImpl;
11+
import org.lowcoder.domain.datasource.model.Datasource;
12+
import org.lowcoder.domain.datasource.service.impl.DatasourceServiceImpl;
13+
import org.lowcoder.domain.folder.model.Folder;
14+
import org.lowcoder.domain.folder.service.FolderServiceImpl;
15+
import org.lowcoder.domain.group.model.Group;
16+
import org.lowcoder.domain.group.service.GroupServiceImpl;
17+
import org.lowcoder.domain.organization.model.Organization;
18+
import org.lowcoder.domain.organization.service.OrganizationServiceImpl;
19+
import org.lowcoder.domain.query.model.LibraryQuery;
20+
import org.lowcoder.domain.query.service.LibraryQueryServiceImpl;
21+
import org.lowcoder.domain.user.model.User;
22+
import org.lowcoder.domain.user.service.UserServiceImpl;
23+
import org.springframework.web.bind.annotation.RequestBody;
24+
import org.springframework.web.bind.annotation.RestController;
25+
import reactor.core.publisher.Flux;
26+
import reactor.core.publisher.Mono;
27+
28+
@RequiredArgsConstructor
29+
@RestController
30+
public class MetaController implements MetaEndpoints {
31+
private final ApplicationApiService applicationApiService;
32+
private final ApplicationServiceImpl applicationServiceImpl;
33+
private final UserServiceImpl userServiceImpl;
34+
private final OrganizationServiceImpl organizationServiceImpl;
35+
private final FolderServiceImpl folderServiceImpl;
36+
private final DatasourceServiceImpl datasourceServiceImpl;
37+
private final BundleServiceImpl bundleServiceImpl;
38+
private final GroupServiceImpl groupServiceImpl;
39+
private final LibraryQueryServiceImpl libraryQueryServiceImpl;
40+
41+
@Override
42+
public Mono<ResponseView<MetaView>> getMetaData(@RequestBody GetMetaDataRequest param) {
43+
Flux<Application> appsFlux = applicationServiceImpl.findByIdIn(param.appIds());
44+
Flux<User> usersFlux = userServiceImpl.getByIds(param.userIds()).flatMapMany(map -> Flux.fromIterable(map.values()));
45+
Flux<Organization> orgsFlux = organizationServiceImpl.getByIds(param.orgIds());
46+
Flux<Folder> foldersFlux = folderServiceImpl.findByIds(param.folderIds());
47+
Flux<Datasource> datasourcesFlux = datasourceServiceImpl.getByIds(param.datasourceIds());
48+
Flux<Bundle> bundlesFlux = bundleServiceImpl.findByIdIn(param.bundleIds());
49+
Flux<Group> groupsFlux = groupServiceImpl.getByIds(param.groupIds());
50+
Flux<LibraryQuery> queriesFlux = libraryQueryServiceImpl.getByIds(param.libraryQueryIds());
51+
return Mono.zip(
52+
appsFlux.collectList(),
53+
usersFlux.collectList(),
54+
orgsFlux.collectList(),
55+
foldersFlux.collectList(),
56+
datasourcesFlux.collectList(),
57+
bundlesFlux.collectList(),
58+
groupsFlux.collectList(),
59+
queriesFlux.collectList()
60+
).map(tuple -> MetaView.builder()
61+
.apps(tuple.getT1())
62+
.users(tuple.getT2())
63+
.orgs(tuple.getT3())
64+
.folders(tuple.getT4())
65+
.datasources(tuple.getT5())
66+
.bundles(tuple.getT6())
67+
.groups(tuple.getT7())
68+
.queries(tuple.getT8())
69+
.build())
70+
.map(ResponseView::success);
71+
}
72+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package org.lowcoder.api.meta;
2+
3+
import io.swagger.v3.oas.annotations.Operation;
4+
import org.lowcoder.api.framework.view.ResponseView;
5+
import org.lowcoder.api.meta.view.MetaView;
6+
import org.lowcoder.infra.constant.NewUrl;
7+
import org.lowcoder.infra.constant.Url;
8+
import org.springframework.web.bind.annotation.*;
9+
import reactor.core.publisher.Mono;
10+
11+
import java.util.List;
12+
13+
@RestController
14+
@RequestMapping(value = {Url.META_URL, NewUrl.META_URL})
15+
public interface MetaEndpoints
16+
{
17+
public static final String TAG_META_MANAGEMENT = "Meta APIs";
18+
19+
@Operation(
20+
tags = TAG_META_MANAGEMENT,
21+
operationId = "getMetaData",
22+
summary = "Get metadata by ids",
23+
description = "Get all metadatas by ids"
24+
)
25+
@PostMapping("/")
26+
public Mono<ResponseView<MetaView>> getMetaData(@RequestBody GetMetaDataRequest param);
27+
28+
public record GetMetaDataRequest(List<String> appIds,
29+
List<String> orgIds,
30+
List<String> userIds,
31+
List<String> groupIds,
32+
List<String> bundleIds,
33+
List<String> datasourceIds,
34+
List<String> folderIds,
35+
List<String> libraryQueryIds) {}
36+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package org.lowcoder.api.meta.view;
2+
3+
import lombok.Builder;
4+
import lombok.Getter;
5+
import org.lowcoder.domain.application.model.Application;
6+
import org.lowcoder.domain.bundle.model.Bundle;
7+
import org.lowcoder.domain.datasource.model.Datasource;
8+
import org.lowcoder.domain.folder.model.Folder;
9+
import org.lowcoder.domain.group.model.Group;
10+
import org.lowcoder.domain.organization.model.Organization;
11+
import org.lowcoder.domain.query.model.LibraryQuery;
12+
import org.lowcoder.domain.user.model.User;
13+
14+
import java.util.List;
15+
16+
@Builder
17+
@Getter
18+
public class MetaView {
19+
private final List<Application> apps;
20+
private final List<User> users;
21+
private final List<Organization> orgs;
22+
private final List<Folder> folders;
23+
private final List<Datasource> datasources;
24+
private final List<Bundle> bundles;
25+
private final List<Group> groups;
26+
private final List<LibraryQuery> queries;
27+
}

0 commit comments

Comments
 (0)