|
1 | 1 | package org.lowcoder.domain.application.service; |
2 | 2 |
|
3 | | - |
4 | | -import static org.lowcoder.domain.application.ApplicationUtil.getDependentModulesFromDsl; |
5 | | - |
6 | | -import java.util.*; |
7 | | -import java.util.stream.Collectors; |
8 | | - |
9 | 3 | import org.lowcoder.domain.application.model.Application; |
10 | 4 | import org.lowcoder.domain.application.model.ApplicationRequestType; |
11 | 5 | 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; |
15 | 6 | 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; |
29 | 7 | import reactor.core.publisher.Flux; |
30 | 8 | import reactor.core.publisher.Mono; |
31 | 9 |
|
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; |
43 | 14 |
|
44 | | - @Autowired |
45 | | - private ApplicationRepository repository; |
| 15 | +public interface ApplicationService { |
| 16 | + Mono<Application> findById(String id); |
46 | 17 |
|
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); |
51 | 19 |
|
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); |
55 | 21 |
|
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); |
60 | 23 |
|
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); |
64 | 25 |
|
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); |
69 | 27 |
|
70 | | - return mongoUpsertHelper.updateById(application, applicationId); |
71 | | - } |
| 28 | + Flux<Application> findByOrganizationIdWithDsl(String organizationId); |
72 | 29 |
|
| 30 | + Flux<Application> findByOrganizationIdWithoutDsl(String organizationId); |
73 | 31 |
|
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(); |
78 | 33 |
|
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(); |
87 | 35 |
|
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); |
92 | 37 |
|
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); |
99 | 39 |
|
100 | | - public Flux<Application> findByOrganizationIdWithoutDsl(String organizationId) { |
101 | | - return repository.findByOrganizationId(organizationId); |
102 | | - } |
| 40 | + Mono<List<Application>> getAllDependentModulesFromApplicationId(String applicationId, boolean viewMode); |
103 | 41 |
|
104 | | - public Flux<Application> findAllMarketplaceApps() { |
105 | | - return repository.findByPublicToAllIsTrueAndPublicToMarketplaceIsTrue(); |
106 | | - } |
| 42 | + Mono<List<Application>> getAllDependentModulesFromApplication(Application application, boolean viewMode); |
107 | 43 |
|
108 | | - public Flux<Application> findAllAgencyProfileApps() { |
109 | | - return repository.findByPublicToAllIsTrueAndAgencyProfileIsTrue(); |
110 | | - } |
| 44 | + Mono<List<Application>> getAllDependentModulesFromDsl(Map<String, Object> dsl); |
111 | 45 |
|
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); |
155 | 47 |
|
156 | 48 | // 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); |
205 | 50 |
|
| 51 | + Mono<Boolean> setApplicationAsAgencyProfile(String applicationId, boolean agencyProfile); |
206 | 52 |
|
207 | 53 | @NonEmptyMono |
208 | 54 | @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); |
210 | 56 |
|
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 | | - */ |
235 | 57 | @NonEmptyMono |
236 | 58 | @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); |
244 | 60 |
|
245 | | - /** |
246 | | - * Find all private applications for viewing. |
247 | | - */ |
248 | 61 | @NonEmptyMono |
249 | 62 | @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 | + |
261 | 65 | @NonEmptyMono |
262 | 66 | @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); |
273 | 68 |
|
274 | | - /** |
275 | | - * Find all agency applications |
276 | | - */ |
277 | 69 | @NonEmptyMono |
278 | 70 | @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); |
285 | 72 |
|
286 | | - public Flux<Application> findAll() { |
287 | | - return repository.findAll(); |
288 | | - } |
| 73 | + Flux<Application> findAll(); |
289 | 74 | } |
0 commit comments