Skip to content

Commit 55fbff9

Browse files
committed
Add handling for PTM apps
1 parent d33f51a commit 55fbff9

File tree

8 files changed

+63
-8
lines changed

8 files changed

+63
-8
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public interface ApplicationRepository extends ReactiveMongoRepository<Applicati
3535
Flux<Application> findByIdIn(List<String> ids);
3636

3737
@Query(fields = "{_id : 1}")
38-
Flux<Application> findByPublicToAllIsTrueAndIdIn(Collection<String> ids);
38+
Flux<Application> findByPublicToAllIsTrueAndPublicToMarketplaceAndIdIn(Collection<String> ids, Boolean publicToMarketplace);
3939

4040
Flux<Application> findByPublicToAllIsTrueAndPublicToMarketplaceIsTrue();
4141

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -160,9 +160,10 @@ public Mono<Boolean> setApplicationPublicToMarketplace(String applicationId, boo
160160

161161
@NonEmptyMono
162162
@SuppressWarnings("ReactiveStreamsNullableInLambdaInTransform")
163-
public Mono<Set<String>> getPublicApplicationIds(Collection<String> applicationIds) {
164-
return repository.findByPublicToAllIsTrueAndIdIn(applicationIds)
163+
public Mono<Set<String>> getPublicApplicationIds(Collection<String> applicationIds, Boolean isAnonymous) {
164+
return repository.findByPublicToAllIsTrueAndPublicToMarketplaceAndIdIn(applicationIds, !isAnonymous)
165165
.map(HasIdAndAuditing::getId)
166166
.collect(Collectors.toSet());
167+
167168
}
168169
}

server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/permission/service/ApplicationPermissionHandler.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,22 @@ protected Mono<Map<String, List<ResourcePermission>>> getAnonymousUserPermission
4646
}
4747

4848
Set<String> applicationIds = newHashSet(resourceIds);
49-
return Mono.zip(applicationService.getPublicApplicationIds(applicationIds),
49+
return Mono.zip(applicationService.getPublicApplicationIds(applicationIds, Boolean.TRUE),
50+
templateSolution.getTemplateApplicationIds(applicationIds))
51+
.map(tuple -> {
52+
Set<String> publicAppIds = tuple.getT1();
53+
Set<String> templateAppIds = tuple.getT2();
54+
return collectMap(union(publicAppIds, templateAppIds), identity(), this::getAnonymousUserPermission);
55+
});
56+
}
57+
58+
// This is for PTM apps that are public but only available to logged-in users
59+
@Override
60+
protected Mono<Map<String, List<ResourcePermission>>> getNonAnonymousUserPublicResourcePermissions
61+
(Collection<String> resourceIds, ResourceAction resourceAction) {
62+
63+
Set<String> applicationIds = newHashSet(resourceIds);
64+
return Mono.zip(applicationService.getPublicApplicationIds(applicationIds, Boolean.FALSE),
5065
templateSolution.getTemplateApplicationIds(applicationIds))
5166
.map(tuple -> {
5267
Set<String> publicAppIds = tuple.getT1();

server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/permission/service/DatasourcePermissionHandler.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package org.lowcoder.domain.permission.service;
22

33
import static org.lowcoder.domain.permission.model.ResourceHolder.USER;
4-
import static org.lowcoder.sdk.constants.Authentication.ANONYMOUS_USER_ID;
54

65
import java.util.Collection;
76
import java.util.Collections;
@@ -39,6 +38,11 @@ protected Mono<Map<String, List<ResourcePermission>>> getAnonymousUserPermission
3938
return Mono.just(Collections.emptyMap());
4039
}
4140

41+
@Override
42+
protected Mono<Map<String, List<ResourcePermission>>> getNonAnonymousUserPublicResourcePermissions(Collection<String> resourceIds, ResourceAction resourceAction) {
43+
return Mono.just(Collections.emptyMap());
44+
}
45+
4246
@Override
4347
protected Mono<String> getOrgId(String resourceId) {
4448
return datasourceService.getById(resourceId)

server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/permission/service/ResourcePermissionHandler.java

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,16 @@ public Mono<UserPermissionOnResourceStatus> checkUserPermissionStatusOnResource(
9494
return publicResourcePermissionMono;
9595
}
9696

97+
Mono<UserPermissionOnResourceStatus> nonAnonymousPublicResourcePermissionMono = getNonAnonymousUserPublicResourcePermissions(singletonList(resourceId), resourceAction)
98+
.map(it -> it.getOrDefault(resourceId, emptyList()))
99+
.map(it -> {
100+
if (!it.isEmpty()) {
101+
return UserPermissionOnResourceStatus.success(it.get(0));
102+
}
103+
return isAnonymousUser(userId) ? UserPermissionOnResourceStatus.anonymousUser() : UserPermissionOnResourceStatus.notInOrg();
104+
});
105+
106+
97107
Mono<UserPermissionOnResourceStatus> orgUserPermissionMono = getOrgId(resourceId)
98108
.flatMap(orgId -> orgMemberService.getOrgMember(orgId, userId))
99109
.flatMap(orgMember -> {
@@ -107,13 +117,17 @@ public Mono<UserPermissionOnResourceStatus> checkUserPermissionStatusOnResource(
107117
})
108118
.defaultIfEmpty(UserPermissionOnResourceStatus.notInOrg());
109119

110-
return Mono.zip(publicResourcePermissionMono, orgUserPermissionMono)
120+
return Mono.zip(publicResourcePermissionMono, nonAnonymousPublicResourcePermissionMono, orgUserPermissionMono)
111121
.map(tuple -> {
112122
UserPermissionOnResourceStatus publicResourcePermission = tuple.getT1();
113-
UserPermissionOnResourceStatus orgUserPermission = tuple.getT2();
123+
UserPermissionOnResourceStatus nonAnonymousPublicResourcePermission = tuple.getT2();
124+
UserPermissionOnResourceStatus orgUserPermission = tuple.getT3();
114125
if (orgUserPermission.hasPermission()) {
115126
return orgUserPermission;
116127
}
128+
if(nonAnonymousPublicResourcePermission.hasPermission()) {
129+
return nonAnonymousPublicResourcePermission;
130+
}
117131
if (publicResourcePermission.hasPermission()) {
118132
return publicResourcePermission;
119133
}
@@ -132,6 +146,9 @@ private ResourcePermission getMaxPermission(List<ResourcePermission> permissions
132146
protected abstract Mono<Map<String, List<ResourcePermission>>> getAnonymousUserPermissions(Collection<String> resourceIds,
133147
ResourceAction resourceAction);
134148

149+
protected abstract Mono<Map<String, List<ResourcePermission>>> getNonAnonymousUserPublicResourcePermissions
150+
(Collection<String> resourceIds, ResourceAction resourceAction);
151+
135152
private Mono<Map<String, List<ResourcePermission>>> getAllMatchingPermissions0(String userId, String orgId, ResourceType resourceType,
136153
Collection<String> resourceIds,
137154
ResourceAction resourceAction) {

server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/permission/service/ResourcePermissionService.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,8 @@ public Mono<ResourcePermission> checkAndReturnMaxPermission(String userId, Strin
214214
});
215215
}
216216

217-
public Mono<UserPermissionOnResourceStatus> checkUserPermissionStatusOnResource(String userId, String resourceId, ResourceAction resourceAction) {
217+
public Mono<UserPermissionOnResourceStatus> checkUserPermissionStatusOnResource
218+
(String userId, String resourceId, ResourceAction resourceAction) {
218219
ResourceType resourceType = resourceAction.getResourceType();
219220
var resourcePermissionHandler = getResourcePermissionHandler(resourceType);
220221
return resourcePermissionHandler.checkUserPermissionStatusOnResource(userId, resourceId, resourceAction);

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,14 @@ public Mono<ResponseView<ApplicationView>> getPublishedApplication(@PathVariable
9797
.map(ResponseView::success);
9898
}
9999

100+
@Override
101+
public Mono<ResponseView<ApplicationView>> getPublishedMarketPlaceApplication(@PathVariable String applicationId) {
102+
return applicationApiService.getPublishedApplication(applicationId)
103+
.delayUntil(applicationView -> applicationApiService.updateUserApplicationLastViewTime(applicationId))
104+
.delayUntil(applicationView -> businessEventPublisher.publishApplicationCommonEvent(applicationView, VIEW))
105+
.map(ResponseView::success);
106+
}
107+
100108
@Override
101109
public Mono<ResponseView<ApplicationView>> update(@PathVariable String applicationId,
102110
@RequestBody Application newApplication) {

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,15 @@ public interface ApplicationEndpoints
111111
@GetMapping("/{applicationId}/view")
112112
public Mono<ResponseView<ApplicationView>> getPublishedApplication(@PathVariable String applicationId);
113113

114+
@Operation(
115+
tags = TAG_APPLICATION_MANAGEMENT,
116+
operationId = "getMarketplaceApplicationDataInViewMode",
117+
summary = "Get Marketplace Application data in view mode",
118+
description = "Retrieve the DSL data of a Lowcoder Application in view-mode by its ID for the marketplace."
119+
)
120+
@GetMapping("/{applicationId}/view_marketplace")
121+
public Mono<ResponseView<ApplicationView>> getPublishedMarketPlaceApplication(@PathVariable String applicationId);
122+
114123
@Operation(
115124
tags = TAG_APPLICATION_MANAGEMENT,
116125
operationId = "updateApplication",

0 commit comments

Comments
 (0)