|
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