Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit9d33fb2

Browse files
authored
Merge pull requestlowcoder-org#679 from lowcoder-org/agency-profile-feature
Feature To Set Application AS Agency Profile
2 parentsad537a3 +10643ce commit9d33fb2

File tree

9 files changed

+172
-8
lines changed

9 files changed

+172
-8
lines changed

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ public class Application extends HasIdAndAuditing {
4141
privatefinalBooleanpublicToAll;
4242
privatefinalBooleanpublicToMarketplace;
4343

44+
privatefinalBooleanagencyProfile;
45+
4446
privateMap<String,Object>editingApplicationDSL;
4547

4648
@Transient
@@ -78,6 +80,7 @@ public Application(@JsonProperty("orgId") String organizationId,
7880
@JsonProperty("publishedApplicationDSL")Map<String,Object>publishedApplicationDSL,
7981
@JsonProperty("publicToAll")BooleanpublicToAll,
8082
@JsonProperty("publicToMarketplace")BooleanpublicToMarketplace,
83+
@JsonProperty("agencyProfile")BooleanagencyProfile,
8184
@JsonProperty("editingApplicationDSL")Map<String,Object>editingApplicationDSL) {
8285
this.organizationId =organizationId;
8386
this.name =name;
@@ -86,6 +89,7 @@ public Application(@JsonProperty("orgId") String organizationId,
8689
this.publishedApplicationDSL =publishedApplicationDSL;
8790
this.publicToAll =publicToAll;
8891
this.publicToMarketplace =publicToMarketplace;
92+
this.agencyProfile =agencyProfile;
8993
this.editingApplicationDSL =editingApplicationDSL;
9094
}
9195

@@ -113,6 +117,10 @@ public boolean isPublicToMarketplace() {
113117
returnBooleanUtils.toBooleanDefaultIfNull(publicToMarketplace,false);
114118
}
115119

120+
publicbooleanagencyProfile() {
121+
returnBooleanUtils.toBooleanDefaultIfNull(agencyProfile,false);
122+
}
123+
116124
publicApplicationQuerygetQueryByViewModeAndQueryId(booleanisViewMode,StringqueryId) {
117125
return (isViewMode ?getLiveQueries() :getEditingQueries())
118126
.stream()

‎server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/application/repository/ApplicationRepository.java‎

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,12 @@ public interface ApplicationRepository extends ReactiveMongoRepository<Applicati
3434

3535
Flux<Application>findByIdIn(List<String>ids);
3636

37-
@Query(fields ="{_id : 1}")
38-
Flux<Application>findByPublicToAllIsTrueAndPublicToMarketplaceIsAndIdIn(BooleanpublicToMarketplace,Collection<String>ids);
37+
@Query(value ="{$and:[{'publicToAll':true},{'$or':[{'publicToMarketplace':?0},{'agencyProfile':?1}]}, {'_id': { $in: ?2}}]}",fields ="{_id : 1}")
38+
Flux<Application>findByPublicToAllIsTrueAndPublicToMarketplaceIsOrAgencyProfileIsAndIdIn
39+
(BooleanpublicToMarketplace,BooleanagencyProfile,Collection<String>ids);
3940

4041
Flux<Application>findByPublicToAllIsTrueAndPublicToMarketplaceIsTrue();
4142

43+
Flux<Application>findByPublicToAllIsTrueAndAgencyProfileIsTrue();
44+
4245
}

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

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,10 @@ public Flux<Application> findAllMarketplaceApps() {
107107
returnrepository.findByPublicToAllIsTrueAndPublicToMarketplaceIsTrue();
108108
}
109109

110+
publicFlux<Application>findAllAgencyProfileApps() {
111+
returnrepository.findByPublicToAllIsTrueAndAgencyProfileIsTrue();
112+
}
113+
110114
publicMono<Long>countByOrganizationId(StringorgId,ApplicationStatusapplicationStatus) {
111115
returnrepository.countByOrganizationIdAndApplicationStatus(orgId,applicationStatus);
112116
}
@@ -158,10 +162,17 @@ public Mono<Boolean> setApplicationPublicToMarketplace(String applicationId, boo
158162
returnmongoUpsertHelper.updateById(application,applicationId);
159163
}
160164

165+
publicMono<Boolean>setApplicationAsAgencyProfile(StringapplicationId,booleanagencyProfile) {
166+
Applicationapplication =Application.builder()
167+
.agencyProfile(agencyProfile)
168+
.build();
169+
returnmongoUpsertHelper.updateById(application,applicationId);
170+
}
171+
161172
@NonEmptyMono
162173
@SuppressWarnings("ReactiveStreamsNullableInLambdaInTransform")
163174
publicMono<Set<String>>getPublicApplicationIds(Collection<String>applicationIds,BooleanisAnonymous) {
164-
returnrepository.findByPublicToAllIsTrueAndPublicToMarketplaceIsAndIdIn(!isAnonymous,applicationIds)
175+
returnrepository.findByPublicToAllIsTrueAndPublicToMarketplaceIsOrAgencyProfileIsAndIdIn(!isAnonymous,!isAnonymous,applicationIds)
165176
.map(HasIdAndAuditing::getId)
166177
.collect(Collectors.toSet());
167178

‎server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/permission/model/ResourceAction.java‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ public enum ResourceAction {
2525

2626
SET_APPLICATIONS_PUBLIC(ResourceRole.EDITOR,ResourceType.APPLICATION),
2727
SET_APPLICATIONS_PUBLIC_TO_MARKETPLACE(ResourceRole.EDITOR,ResourceType.APPLICATION),
28+
SET_APPLICATIONS_AS_AGENCY_PROFILE(ResourceRole.EDITOR,ResourceType.APPLICATION),
2829

2930
// datasource action
3031
MANAGE_DATASOURCES(ResourceRole.OWNER,ResourceType.DATASOURCE),

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

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ public Mono<ApplicationView> create(CreateApplicationRequest createApplicationRe
141141
createApplicationRequest.applicationType(),
142142
NORMAL,
143143
createApplicationRequest.publishedApplicationDSL(),
144-
false,false,createApplicationRequest.editingApplicationDSL());
144+
false,false,false,createApplicationRequest.editingApplicationDSL());
145145

146146
if (StringUtils.isBlank(application.getOrganizationId())) {
147147
returndeferredError(INVALID_PARAMETER,"ORG_ID_EMPTY");
@@ -248,6 +248,19 @@ private Mono<Void> checkApplicationStatus(Application application, ApplicationSt
248248
returnMono.error(newBizException(BizError.UNSUPPORTED_OPERATION,"BAD_REQUEST"));
249249
}
250250

251+
privateMono<Void>checkApplicationViewRequest(Applicationapplication,ApplicationEndpoints.ApplicationRequestTypeexpected) {
252+
if (expected ==ApplicationEndpoints.ApplicationRequestType.PUBLIC_TO_ALL &&application.isPublicToAll()) {
253+
returnMono.empty();
254+
}
255+
if (expected ==ApplicationEndpoints.ApplicationRequestType.PUBLIC_TO_MARKETPLACE &&application.isPublicToMarketplace()) {
256+
returnMono.empty();
257+
}
258+
if (expected ==ApplicationEndpoints.ApplicationRequestType.AGENCY_PROFILE &&application.agencyProfile()) {
259+
returnMono.empty();
260+
}
261+
returnMono.error(newBizException(BizError.UNSUPPORTED_OPERATION,"BAD_REQUEST"));
262+
}
263+
251264
privateMono<Boolean>updateApplicationStatus(StringapplicationId,ApplicationStatusapplicationStatus) {
252265
returncheckCurrentUserApplicationPermission(applicationId,MANAGE_APPLICATIONS)
253266
.then(Mono.defer(() -> {
@@ -280,10 +293,11 @@ public Mono<ApplicationView> getEditingApplication(String applicationId) {
280293
});
281294
}
282295

283-
publicMono<ApplicationView>getPublishedApplication(StringapplicationId) {
296+
publicMono<ApplicationView>getPublishedApplication(StringapplicationId,ApplicationEndpoints.ApplicationRequestTyperequestType) {
284297
returncheckPermissionWithReadableErrorMsg(applicationId,READ_APPLICATIONS)
285298
.zipWhen(permission ->applicationService.findById(applicationId)
286-
.delayUntil(application ->checkApplicationStatus(application,NORMAL)))
299+
.delayUntil(application ->checkApplicationStatus(application,NORMAL))
300+
.delayUntil(application ->checkApplicationViewRequest(application,requestType)))
287301
.zipWhen(tuple ->applicationService.getAllDependentModulesFromApplication(tuple.getT2(),true),TupleUtils::merge)
288302
.zipWhen(tuple ->organizationService.getOrgCommonSettings(tuple.getT2().getOrganizationId()),TupleUtils::merge)
289303
.zipWith(getTemplateIdFromApplicationId(applicationId),TupleUtils::merge)
@@ -506,6 +520,12 @@ public Mono<Boolean> setApplicationPublicToMarketplace(String applicationId, boo
506520
.then(applicationService.setApplicationPublicToMarketplace(applicationId,publicToMarketplace));
507521
}
508522

523+
publicMono<Boolean>setApplicationAsAgencyProfile(StringapplicationId,booleanagencyProfile) {
524+
returncheckCurrentUserApplicationPermission(applicationId,ResourceAction.SET_APPLICATIONS_AS_AGENCY_PROFILE)
525+
.then(checkApplicationStatus(applicationId,NORMAL))
526+
.then(applicationService.setApplicationAsAgencyProfile(applicationId,agencyProfile));
527+
}
528+
509529
privateMap<String,Object>sanitizeDsl(Map<String,Object>applicationDsl) {
510530
if (applicationDsl.get("queries")instanceofList<?>queries) {
511531
List<Map<String,Object>>list =queries.stream().map(this::doSanitizeQuery).toList();

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

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,15 +91,23 @@ public Mono<ResponseView<ApplicationView>> getEditingApplication(@PathVariable S
9191

9292
@Override
9393
publicMono<ResponseView<ApplicationView>>getPublishedApplication(@PathVariableStringapplicationId) {
94-
returnapplicationApiService.getPublishedApplication(applicationId)
94+
returnapplicationApiService.getPublishedApplication(applicationId,ApplicationRequestType.PUBLIC_TO_ALL)
9595
.delayUntil(applicationView ->applicationApiService.updateUserApplicationLastViewTime(applicationId))
9696
.delayUntil(applicationView ->businessEventPublisher.publishApplicationCommonEvent(applicationView,VIEW))
9797
.map(ResponseView::success);
9898
}
9999

100100
@Override
101101
publicMono<ResponseView<ApplicationView>>getPublishedMarketPlaceApplication(@PathVariableStringapplicationId) {
102-
returnapplicationApiService.getPublishedApplication(applicationId)
102+
returnapplicationApiService.getPublishedApplication(applicationId,ApplicationRequestType.PUBLIC_TO_MARKETPLACE)
103+
.delayUntil(applicationView ->applicationApiService.updateUserApplicationLastViewTime(applicationId))
104+
.delayUntil(applicationView ->businessEventPublisher.publishApplicationCommonEvent(applicationView,VIEW))
105+
.map(ResponseView::success);
106+
}
107+
108+
@Override
109+
publicMono<ResponseView<ApplicationView>>getAgencyProfileApplication(@PathVariableStringapplicationId) {
110+
returnapplicationApiService.getPublishedApplication(applicationId,ApplicationRequestType.AGENCY_PROFILE)
103111
.delayUntil(applicationView ->applicationApiService.updateUserApplicationLastViewTime(applicationId))
104112
.delayUntil(applicationView ->businessEventPublisher.publishApplicationCommonEvent(applicationView,VIEW))
105113
.map(ResponseView::success);
@@ -144,6 +152,14 @@ public Mono<ResponseView<List<MarketplaceApplicationInfoView>>> getMarketplaceAp
144152
.map(ResponseView::success);
145153
}
146154

155+
@Override
156+
publicMono<ResponseView<List<MarketplaceApplicationInfoView>>>getAgencyProfileApplications(@RequestParam(required =false)IntegerapplicationType) {
157+
ApplicationTypeapplicationTypeEnum =applicationType ==null ?null :ApplicationType.fromValue(applicationType);
158+
returnuserHomeApiService.getAllMarketplaceApplications(applicationTypeEnum)
159+
.collectList()
160+
.map(ResponseView::success);
161+
}
162+
147163
@Override
148164
publicMono<ResponseView<Boolean>>updatePermission(@PathVariableStringapplicationId,
149165
@PathVariableStringpermissionId,
@@ -201,4 +217,13 @@ public Mono<ResponseView<Boolean>> setApplicationPublicToMarketplace(@PathVariab
201217
returnapplicationApiService.setApplicationPublicToMarketplace(applicationId,request.publicToMarketplace())
202218
.map(ResponseView::success);
203219
}
220+
221+
@Override
222+
publicMono<ResponseView<Boolean>>setApplicationAsAgencyProfile(@PathVariableStringapplicationId,
223+
@RequestBodyApplicationAsAgencyProfileRequestrequest) {
224+
returnapplicationApiService.setApplicationAsAgencyProfile(applicationId,request.agencyProfile())
225+
.map(ResponseView::success);
226+
}
227+
228+
204229
}

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

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,15 @@ public interface ApplicationEndpoints
120120
@GetMapping("/{applicationId}/view_marketplace")
121121
publicMono<ResponseView<ApplicationView>>getPublishedMarketPlaceApplication(@PathVariableStringapplicationId);
122122

123+
@Operation(
124+
tags =TAG_APPLICATION_MANAGEMENT,
125+
operationId ="getAgencyProfileApplicationDataInViewMode",
126+
summary ="Get Agency profile Application data in view mode",
127+
description ="Retrieve the DSL data of a Lowcoder Application in view-mode by its ID marked as agency profile."
128+
)
129+
@GetMapping("/{applicationId}/view_agency")
130+
publicMono<ResponseView<ApplicationView>>getAgencyProfileApplication(@PathVariableStringapplicationId);
131+
123132
@Operation(
124133
tags =TAG_APPLICATION_MANAGEMENT,
125134
operationId ="updateApplication",
@@ -168,6 +177,15 @@ public Mono<ResponseView<List<ApplicationInfoView>>> getApplications(@RequestPar
168177
@GetMapping("/marketplace-apps")
169178
publicMono<ResponseView<List<MarketplaceApplicationInfoView>>>getMarketplaceApplications(@RequestParam(required =false)IntegerapplicationType);
170179

180+
@Operation(
181+
tags =TAG_APPLICATION_MANAGEMENT,
182+
operationId ="listAgencyProfileApplications",
183+
summary ="List agency profile Applications",
184+
description ="Retrieve a list of Lowcoder Applications that are set as agency profiles"
185+
)
186+
@GetMapping("/agency-profiles")
187+
publicMono<ResponseView<List<MarketplaceApplicationInfoView>>>getAgencyProfileApplications(@RequestParam(required =false)IntegerapplicationType);
188+
171189
@Operation(
172190
tags =TAG_APPLICATION_PERMISSIONS,
173191
operationId ="updateApplicationPermissions",
@@ -231,6 +249,16 @@ public Mono<ResponseView<Boolean>> setApplicationPublicToAll(@PathVariable Strin
231249
publicMono<ResponseView<Boolean>>setApplicationPublicToMarketplace(@PathVariableStringapplicationId,
232250
@RequestBodyApplicationPublicToMarketplaceRequestrequest);
233251

252+
@Operation(
253+
tags =TAG_APPLICATION_MANAGEMENT,
254+
operationId ="setApplicationAsAgencyProfile",
255+
summary ="Set Application as agency profile",
256+
description ="Set a Lowcoder Application identified by its ID as as agency profile but to only logged in users."
257+
)
258+
@PutMapping("/{applicationId}/agency-profile")
259+
publicMono<ResponseView<Boolean>>setApplicationAsAgencyProfile(@PathVariableStringapplicationId,
260+
@RequestBodyApplicationAsAgencyProfileRequestrequest);
261+
234262

235263
publicrecordBatchAddPermissionRequest(Stringrole,Set<String>userIds,Set<String>groupIds) {
236264
}
@@ -249,6 +277,19 @@ public Boolean publicToMarketplace() {
249277
}
250278
}
251279

280+
publicrecordApplicationAsAgencyProfileRequest(BooleanagencyProfile) {
281+
@Override
282+
publicBooleanagencyProfile() {
283+
returnBooleanUtils.isTrue(agencyProfile);
284+
}
285+
}
286+
287+
publicenumApplicationRequestType {
288+
PUBLIC_TO_ALL,
289+
PUBLIC_TO_MARKETPLACE,
290+
AGENCY_PROFILE,
291+
}
292+
252293
publicrecordUpdatePermissionRequest(Stringrole) {
253294
}
254295

‎server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/home/UserHomeApiService.java‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,6 @@ Flux<ApplicationInfoView> getAllAuthorisedApplications4CurrentOrgMember(@Nullabl
2525
@NullableApplicationStatusapplicationStatus,booleanwithContainerSize);
2626

2727
publicFlux<MarketplaceApplicationInfoView>getAllMarketplaceApplications(@NullableApplicationTypeapplicationType);
28+
29+
publicFlux<MarketplaceApplicationInfoView>getAllAgencyProfileApplications(@NullableApplicationTypeapplicationType);
2830
}

‎server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/home/UserHomeApiServiceImpl.java‎

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,59 @@ public Flux<MarketplaceApplicationInfoView> getAllMarketplaceApplications(@Nulla
310310
});
311311
}
312312

313+
@Override
314+
publicFlux<MarketplaceApplicationInfoView>getAllAgencyProfileApplications(@NullableApplicationTypeapplicationType) {
315+
316+
returnsessionUserService.getVisitorOrgMemberCache()
317+
.flatMapMany(orgMember -> {
318+
// application flux
319+
Flux<Application>applicationFlux =Flux.defer(() ->applicationService.findAllAgencyProfileApps())
320+
.filter(application ->isNull(applicationType) ||application.getApplicationType() ==applicationType.getValue())
321+
.cache();
322+
323+
// user map
324+
Mono<Map<String,User>>userMapMono =applicationFlux
325+
.flatMap(application ->emptyIfNull(application.getCreatedBy()))
326+
.collectList()
327+
.flatMap(creatorIds ->userService.getByIds(creatorIds))
328+
.cache();
329+
330+
// org map
331+
Mono<Map<String,Organization>>orgMapMono =applicationFlux
332+
.flatMap(application ->emptyIfNull(application.getOrganizationId()))
333+
.collectList()
334+
.flatMap(orgIds ->organizationService.getByIds(orgIds)
335+
.collectList()
336+
.map(it ->it.stream().collect(Collectors.toMap(Organization::getId,Function.identity())))
337+
)
338+
.cache();
339+
340+
341+
returnapplicationFlux
342+
.flatMap(application ->Mono.zip(Mono.just(application),userMapMono,orgMapMono))
343+
.map(tuple -> {
344+
// build view
345+
Applicationapplication =tuple.getT1();
346+
Map<String,User>userMap =tuple.getT2();
347+
Map<String,Organization>orgMap =tuple.getT3();
348+
returnMarketplaceApplicationInfoView.builder()
349+
.applicationId(application.getId())
350+
.name(application.getName())
351+
.applicationType(application.getApplicationType())
352+
.applicationStatus(application.getApplicationStatus())
353+
.orgId(application.getOrganizationId())
354+
.orgName(orgMap.get(application.getOrganizationId()).getName())
355+
.creatorEmail(Optional.ofNullable(userMap.get(application.getCreatedBy()))
356+
.map(User::getName)
357+
.orElse(""))
358+
.createAt(application.getCreatedAt().toEpochMilli())
359+
.createBy(application.getCreatedBy())
360+
.build();
361+
});
362+
363+
});
364+
}
365+
313366
privateApplicationInfoViewbuildView(Applicationapplication,ResourceRolemaxRole,Map<String,User>userMap,@NullableInstantlastViewTime,
314367
booleanwithContainerSize) {
315368
ApplicationInfoViewBuilderapplicationInfoViewBuilder =ApplicationInfoView.builder()

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp