Skip to content

Commit 1b77959

Browse files
committed
fix: refactor all services to use proper proxying via interfaces
1 parent 85d6e1e commit 1b77959

File tree

65 files changed

+4485
-3705
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

65 files changed

+4485
-3705
lines changed

server/api-service/lowcoder-domain/pom.xml

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -282,32 +282,6 @@
282282
</execution>
283283
</executions>
284284
</plugin>
285-
<!-- TODO: Use when querydsl-mongodb supports jakarta annotations
286-
<plugin>
287-
<groupId>org.apache.maven.plugins</groupId>
288-
<artifactId>maven-compiler-plugin</artifactId>
289-
<configuration>
290-
<annotationProcessorPaths>
291-
<path>
292-
<groupId>com.querydsl</groupId>
293-
<artifactId>querydsl-apt</artifactId>
294-
<version>5.1.0</version>
295-
<classifier>jakarta</classifier>
296-
</path>
297-
<path>
298-
<groupId>jakarta.persistence</groupId>
299-
<artifactId>jakarta.persistence-api</artifactId>
300-
<version>3.1.0</version>
301-
</path>
302-
<path>
303-
<groupId>org.projectlombok</groupId>
304-
<artifactId>lombok</artifactId>
305-
<version>1.18.32</version>
306-
</path>
307-
</annotationProcessorPaths>
308-
</configuration>
309-
</plugin>
310-
-->
311285
</plugins>
312286
</build>
313287

Lines changed: 30 additions & 245 deletions
Original file line numberDiff line numberDiff line change
@@ -1,289 +1,74 @@
11
package org.lowcoder.domain.application.service;
22

3-
4-
import static org.lowcoder.domain.application.ApplicationUtil.getDependentModulesFromDsl;
5-
6-
import java.util.*;
7-
import java.util.stream.Collectors;
8-
93
import org.lowcoder.domain.application.model.Application;
104
import org.lowcoder.domain.application.model.ApplicationRequestType;
115
import org.lowcoder.domain.application.model.ApplicationStatus;
12-
import org.lowcoder.domain.application.repository.ApplicationRepository;
13-
import org.lowcoder.domain.permission.model.ResourceRole;
14-
import org.lowcoder.domain.permission.service.ResourcePermissionService;
156
import org.lowcoder.infra.annotation.NonEmptyMono;
16-
import org.lowcoder.infra.mongo.MongoUpsertHelper;
17-
import org.lowcoder.sdk.constants.FieldName;
18-
import org.lowcoder.sdk.exception.BizError;
19-
import org.lowcoder.sdk.exception.BizException;
20-
import org.lowcoder.sdk.models.HasIdAndAuditing;
21-
import org.springframework.beans.factory.annotation.Autowired;
22-
import org.springframework.context.annotation.Lazy;
23-
import org.springframework.stereotype.Service;
24-
25-
import com.google.common.collect.Lists;
26-
import com.google.common.collect.Sets;
27-
28-
import lombok.extern.slf4j.Slf4j;
297
import reactor.core.publisher.Flux;
308
import reactor.core.publisher.Mono;
319

32-
@Lazy
33-
@Service
34-
@Slf4j
35-
public class ApplicationService {
36-
37-
38-
@Autowired
39-
private MongoUpsertHelper mongoUpsertHelper;
40-
41-
@Autowired
42-
private ResourcePermissionService resourcePermissionService;
10+
import java.util.Collection;
11+
import java.util.List;
12+
import java.util.Map;
13+
import java.util.Set;
4314

44-
@Autowired
45-
private ApplicationRepository repository;
15+
public interface ApplicationService {
16+
Mono<Application> findById(String id);
4617

47-
public Mono<Application> findById(String id) {
48-
if (id == null) {
49-
return Mono.error(new BizException(BizError.INVALID_PARAMETER, "INVALID_PARAMETER", FieldName.ID));
50-
}
18+
Mono<Application> findByIdWithoutDsl(String id);
5119

52-
return repository.findByIdWithDsl(id)
53-
.switchIfEmpty(Mono.error(new BizException(BizError.NO_RESOURCE_FOUND, "CANT_FIND_APPLICATION", id)));
54-
}
20+
Mono<Boolean> updateById(String applicationId, Application application);
5521

56-
public Mono<Application> findByIdWithoutDsl(String id) {
57-
if (id == null) {
58-
return Mono.error(new BizException(BizError.INVALID_PARAMETER, "INVALID_PARAMETER", FieldName.ID));
59-
}
22+
Mono<Boolean> updatePublishedApplicationDSL(String applicationId, Map<String, Object> applicationDSL);
6023

61-
return repository.findById(id)
62-
.switchIfEmpty(Mono.error(new BizException(BizError.NO_RESOURCE_FOUND, "CANT_FIND_APPLICATION", id)));
63-
}
24+
Mono<Application> publish(String applicationId);
6425

65-
public Mono<Boolean> updateById(String applicationId, Application application) {
66-
if (applicationId == null) {
67-
return Mono.error(new BizException(BizError.INVALID_PARAMETER, "INVALID_PARAMETER", FieldName.ID));
68-
}
26+
Mono<Application> create(Application newApplication, String visitorId);
6927

70-
return mongoUpsertHelper.updateById(application, applicationId);
71-
}
28+
Flux<Application> findByOrganizationIdWithDsl(String organizationId);
7229

30+
Flux<Application> findByOrganizationIdWithoutDsl(String organizationId);
7331

74-
public Mono<Boolean> updatePublishedApplicationDSL(String applicationId, Map<String, Object> applicationDSL) {
75-
Application application = Application.builder().publishedApplicationDSL(applicationDSL).build();
76-
return mongoUpsertHelper.updateById(application, applicationId);
77-
}
32+
Flux<Application> findAllMarketplaceApps();
7833

79-
public Mono<Application> publish(String applicationId) {
80-
return findById(applicationId)
81-
.flatMap(newApplication -> { // copy editingApplicationDSL to publishedApplicationDSL
82-
Map<String, Object> editingApplicationDSL = newApplication.getEditingApplicationDSL();
83-
return updatePublishedApplicationDSL(applicationId, editingApplicationDSL)
84-
.thenReturn(newApplication);
85-
});
86-
}
34+
Flux<Application> findAllAgencyProfileApps();
8735

88-
public Mono<Application> create(Application newApplication, String visitorId) {
89-
return repository.save(newApplication)
90-
.delayUntil(app -> resourcePermissionService.addApplicationPermissionToUser(app.getId(), visitorId, ResourceRole.OWNER));
91-
}
36+
Mono<Long> countByOrganizationId(String orgId, ApplicationStatus applicationStatus);
9237

93-
/**
94-
* If you don't need dsl, please use {@link #findByOrganizationIdWithoutDsl(String)}
95-
*/
96-
public Flux<Application> findByOrganizationIdWithDsl(String organizationId) {
97-
return repository.findByOrganizationIdWithDsl(organizationId);
98-
}
38+
Flux<Application> findByIdIn(List<String> applicationIds);
9939

100-
public Flux<Application> findByOrganizationIdWithoutDsl(String organizationId) {
101-
return repository.findByOrganizationId(organizationId);
102-
}
40+
Mono<List<Application>> getAllDependentModulesFromApplicationId(String applicationId, boolean viewMode);
10341

104-
public Flux<Application> findAllMarketplaceApps() {
105-
return repository.findByPublicToAllIsTrueAndPublicToMarketplaceIsTrue();
106-
}
42+
Mono<List<Application>> getAllDependentModulesFromApplication(Application application, boolean viewMode);
10743

108-
public Flux<Application> findAllAgencyProfileApps() {
109-
return repository.findByPublicToAllIsTrueAndAgencyProfileIsTrue();
110-
}
44+
Mono<List<Application>> getAllDependentModulesFromDsl(Map<String, Object> dsl);
11145

112-
public Mono<Long> countByOrganizationId(String orgId, ApplicationStatus applicationStatus) {
113-
return repository.countByOrganizationIdAndApplicationStatus(orgId, applicationStatus);
114-
}
115-
116-
public Flux<Application> findByIdIn(List<String> applicationIds) {
117-
return repository.findByIdIn(applicationIds);
118-
}
119-
120-
public Mono<List<Application>> getAllDependentModulesFromApplicationId(String applicationId, boolean viewMode) {
121-
return findById(applicationId)
122-
.flatMap(app -> getAllDependentModulesFromApplication(app, viewMode));
123-
}
124-
125-
public Mono<List<Application>> getAllDependentModulesFromApplication(Application application, boolean viewMode) {
126-
Map<String, Object> dsl = viewMode ? application.getLiveApplicationDsl() : application.getEditingApplicationDSL();
127-
return getAllDependentModulesFromDsl(dsl);
128-
}
129-
130-
public Mono<List<Application>> getAllDependentModulesFromDsl(Map<String, Object> dsl) {
131-
Set<String> circularDependencyCheckSet = Sets.newHashSet();
132-
return Mono.just(getDependentModulesFromDsl(dsl))
133-
.doOnNext(circularDependencyCheckSet::addAll)
134-
.flatMapMany(moduleSet -> findByIdIn(Lists.newArrayList(moduleSet)))
135-
.onErrorContinue((e, i) -> log.warn("get dependent modules on error continue , {}", e.getMessage()))
136-
.expandDeep(module -> getDependentModules(module, circularDependencyCheckSet))
137-
.collectList();
138-
}
139-
140-
private Flux<Application> getDependentModules(Application module, Set<String> circularDependencyCheckSet) {
141-
return Flux.fromIterable(module.getLiveModules())
142-
.filter(moduleId -> !circularDependencyCheckSet.contains(moduleId))
143-
.doOnNext(circularDependencyCheckSet::add)
144-
.collectList()
145-
.flatMapMany(this::findByIdIn)
146-
.onErrorContinue((e, i) -> log.warn("get dependent modules on error continue , {}", e.getMessage()));
147-
}
148-
149-
public Mono<Boolean> setApplicationPublicToAll(String applicationId, boolean publicToAll) {
150-
Application application = Application.builder()
151-
.publicToAll(publicToAll)
152-
.build();
153-
return mongoUpsertHelper.updateById(application, applicationId);
154-
}
46+
Mono<Boolean> setApplicationPublicToAll(String applicationId, boolean publicToAll);
15547

15648
// Falk: String title, String category, String description, String image will be set in Application Settings inside DSL by Frontend
157-
public Mono<Boolean> setApplicationPublicToMarketplace(String applicationId, Boolean publicToMarketplace) {
158-
159-
return findById(applicationId)
160-
161-
.map(application -> {
162-
163-
Map<String, Object> applicationDsl = application.getEditingApplicationDSL();
164-
165-
// Falk: this logic is not needed anymore, because we set Meta Data in Settings in the UI already
166-
/* if (applicationDsl.containsKey("ui")) {
167-
Map<String, Object> dataObject = (Map<String, Object>) applicationDsl.get("ui");
168-
169-
if(publicToMarketplace) {
170-
Map<String, Object> marketplaceMeta = new HashMap<>();
171-
marketplaceMeta.put("title", title);
172-
marketplaceMeta.put("description", description);
173-
marketplaceMeta.put("category", category);
174-
marketplaceMeta.put("image", image);
175-
if (dataObject.containsKey("marketplaceMeta")) {
176-
dataObject.replace("marketplaceMeta", marketplaceMeta);
177-
} else {
178-
dataObject.put("marketplaceMeta", marketplaceMeta);
179-
}
180-
} else {
181-
dataObject.remove("marketplaceMeta");
182-
}
183-
184-
applicationDsl.replace("ui", dataObject);
185-
186-
} */
187-
188-
return Application.builder()
189-
.publicToMarketplace(publicToMarketplace)
190-
.editingApplicationDSL(applicationDsl)
191-
.build();
192-
193-
})
194-
.flatMap(application -> mongoUpsertHelper.updateById(application, applicationId));
195-
196-
197-
}
198-
199-
public Mono<Boolean> setApplicationAsAgencyProfile(String applicationId, boolean agencyProfile) {
200-
Application application = Application.builder()
201-
.agencyProfile(agencyProfile)
202-
.build();
203-
return mongoUpsertHelper.updateById(application, applicationId);
204-
}
49+
Mono<Boolean> setApplicationPublicToMarketplace(String applicationId, Boolean publicToMarketplace);
20550

51+
Mono<Boolean> setApplicationAsAgencyProfile(String applicationId, boolean agencyProfile);
20652

20753
@NonEmptyMono
20854
@SuppressWarnings("ReactiveStreamsNullableInLambdaInTransform")
209-
public Mono<Set<String>> getFilteredPublicApplicationIds(ApplicationRequestType requestType, Collection<String> applicationIds, boolean isAnonymous, Boolean isPrivateMarketplace) {
55+
Mono<Set<String>> getFilteredPublicApplicationIds(ApplicationRequestType requestType, Collection<String> applicationIds, boolean isAnonymous, Boolean isPrivateMarketplace);
21056

211-
switch(requestType)
212-
{
213-
case PUBLIC_TO_ALL:
214-
if (isAnonymous)
215-
{
216-
return getPublicApplicationIds(applicationIds);
217-
}
218-
else
219-
{
220-
return getPrivateApplicationIds(applicationIds);
221-
}
222-
case PUBLIC_TO_MARKETPLACE:
223-
return getPublicMarketplaceApplicationIds(applicationIds, isAnonymous, isPrivateMarketplace);
224-
case AGENCY_PROFILE:
225-
return getPublicAgencyApplicationIds(applicationIds);
226-
default:
227-
return Mono.empty();
228-
}
229-
}
230-
231-
232-
/**
233-
* Find all public applications - doesn't matter if user is anonymous, because these apps are public
234-
*/
23557
@NonEmptyMono
23658
@SuppressWarnings("ReactiveStreamsNullableInLambdaInTransform")
237-
public Mono<Set<String>> getPublicApplicationIds(Collection<String> applicationIds) {
238-
239-
return repository.findByPublicToAllIsTrueAndIdIn(applicationIds)
240-
.map(HasIdAndAuditing::getId)
241-
.collect(Collectors.toSet());
242-
}
243-
59+
Mono<Set<String>> getPublicApplicationIds(Collection<String> applicationIds);
24460

245-
/**
246-
* Find all private applications for viewing.
247-
*/
24861
@NonEmptyMono
24962
@SuppressWarnings("ReactiveStreamsNullableInLambdaInTransform")
250-
public Mono<Set<String>> getPrivateApplicationIds(Collection<String> applicationIds) {
251-
// TODO: in 2.4.0 we need to check whether the app was published or not
252-
return repository.findByIdIn(applicationIds)
253-
.map(HasIdAndAuditing::getId)
254-
.collect(Collectors.toSet());
255-
}
256-
257-
258-
/**
259-
* Find all marketplace applications - filter based on whether user is anonymous and whether it's a private marketplace
260-
*/
63+
Mono<Set<String>> getPrivateApplicationIds(Collection<String> applicationIds);
64+
26165
@NonEmptyMono
26266
@SuppressWarnings("ReactiveStreamsNullableInLambdaInTransform")
263-
public Mono<Set<String>> getPublicMarketplaceApplicationIds(Collection<String> applicationIds, boolean isAnonymous, boolean isPrivateMarketplace) {
264-
265-
if ((isAnonymous && !isPrivateMarketplace) || !isAnonymous)
266-
{
267-
return repository.findByPublicToAllIsTrueAndPublicToMarketplaceIsTrueAndIdIn(applicationIds)
268-
.map(HasIdAndAuditing::getId)
269-
.collect(Collectors.toSet());
270-
}
271-
return Mono.empty();
272-
}
67+
Mono<Set<String>> getPublicMarketplaceApplicationIds(Collection<String> applicationIds, boolean isAnonymous, boolean isPrivateMarketplace);
27368

274-
/**
275-
* Find all agency applications
276-
*/
27769
@NonEmptyMono
27870
@SuppressWarnings("ReactiveStreamsNullableInLambdaInTransform")
279-
public Mono<Set<String>> getPublicAgencyApplicationIds(Collection<String> applicationIds) {
280-
281-
return repository.findByPublicToAllIsTrueAndAgencyProfileIsTrueAndIdIn(applicationIds)
282-
.map(HasIdAndAuditing::getId)
283-
.collect(Collectors.toSet());
284-
}
71+
Mono<Set<String>> getPublicAgencyApplicationIds(Collection<String> applicationIds);
28572

286-
public Flux<Application> findAll() {
287-
return repository.findAll();
288-
}
73+
Flux<Application> findAll();
28974
}

0 commit comments

Comments
 (0)