From e5f2d297dc58d6f877fe72adbfe85258f54de7f0 Mon Sep 17 00:00:00 2001 From: Abdul Qadir Date: Fri, 23 Feb 2024 17:54:52 +0500 Subject: [PATCH 1/4] Move ptm apps data to application dsl --- .../service/ApplicationService.java | 45 +++++++++++++++---- .../application/ApplicationApiService.java | 4 +- .../application/ApplicationController.java | 2 +- .../api/application/ApplicationEndpoints.java | 18 +++++++- 4 files changed, 56 insertions(+), 13 deletions(-) diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/application/service/ApplicationService.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/application/service/ApplicationService.java index a97f8ca67..cfbbe0a37 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/application/service/ApplicationService.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/application/service/ApplicationService.java @@ -3,10 +3,7 @@ import static org.lowcoder.domain.application.ApplicationUtil.getDependentModulesFromDsl; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; import org.lowcoder.domain.application.model.Application; @@ -155,11 +152,41 @@ public Mono setApplicationPublicToAll(String applicationId, boolean pub return mongoUpsertHelper.updateById(application, applicationId); } - public Mono setApplicationPublicToMarketplace(String applicationId, boolean publicToMarketplace) { - Application application = Application.builder() - .publicToMarketplace(publicToMarketplace) - .build(); - return mongoUpsertHelper.updateById(application, applicationId); + public Mono setApplicationPublicToMarketplace(String applicationId, Boolean publicToMarketplace, String title, String category, String description) { + + return findById(applicationId) + .map(application -> { + Map applicationDsl = application.getEditingApplicationDSL(); + if (applicationDsl.containsKey("ui")) { + Map dataObject = (Map) applicationDsl.get("ui"); + + if(publicToMarketplace) { + Map marketplaceMeta = new HashMap<>(); + marketplaceMeta.put("title", title); + marketplaceMeta.put("description", description); + marketplaceMeta.put("category", category); + if (dataObject.containsKey("marketplaceMeta")) { + dataObject.replace("marketplaceMeta", marketplaceMeta); + } else { + dataObject.put("marketplaceMeta", marketplaceMeta); + } + } else { + dataObject.remove("marketplaceMeta"); + } + + applicationDsl.replace("ui", dataObject); + + } + + return Application.builder() + .publicToMarketplace(publicToMarketplace) + .editingApplicationDSL(applicationDsl) + .build(); + + }) + .flatMap(application -> mongoUpsertHelper.updateById(application, applicationId)); + + } public Mono setApplicationAsAgencyProfile(String applicationId, boolean agencyProfile) { diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationApiService.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationApiService.java index f1eaad172..29dc3b8a9 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationApiService.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationApiService.java @@ -514,10 +514,10 @@ public Mono setApplicationPublicToAll(String applicationId, boolean pub .then(applicationService.setApplicationPublicToAll(applicationId, publicToAll)); } - public Mono setApplicationPublicToMarketplace(String applicationId, boolean publicToMarketplace) { + public Mono setApplicationPublicToMarketplace(String applicationId, ApplicationEndpoints.ApplicationPublicToMarketplaceRequest request) { return checkCurrentUserApplicationPermission(applicationId, ResourceAction.SET_APPLICATIONS_PUBLIC_TO_MARKETPLACE) .then(checkApplicationStatus(applicationId, NORMAL)) - .then(applicationService.setApplicationPublicToMarketplace(applicationId, publicToMarketplace)); + .then(applicationService.setApplicationPublicToMarketplace(applicationId, request.publicToMarketplace(), request.title(), request.category(), request.description())); } public Mono setApplicationAsAgencyProfile(String applicationId, boolean agencyProfile) { diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationController.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationController.java index e75de598d..1b6bf34a5 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationController.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationController.java @@ -214,7 +214,7 @@ public Mono> setApplicationPublicToAll(@PathVariable Strin @Override public Mono> setApplicationPublicToMarketplace(@PathVariable String applicationId, @RequestBody ApplicationPublicToMarketplaceRequest request) { - return applicationApiService.setApplicationPublicToMarketplace(applicationId, request.publicToMarketplace()) + return applicationApiService.setApplicationPublicToMarketplace(applicationId, request) .map(ResponseView::success); } diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationEndpoints.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationEndpoints.java index eae901f21..5da9cf827 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationEndpoints.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationEndpoints.java @@ -270,11 +270,27 @@ public Boolean publicToAll() { } } - public record ApplicationPublicToMarketplaceRequest(Boolean publicToMarketplace) { + public record ApplicationPublicToMarketplaceRequest(Boolean publicToMarketplace, String title, String description, String category) { @Override public Boolean publicToMarketplace() { return BooleanUtils.isTrue(publicToMarketplace); } + + @Override + public String title() { + return title; + } + + @Override + public String description() { + return description; + } + + @Override + public String category() { + return category; + } + } public record ApplicationAsAgencyProfileRequest(Boolean agencyProfile) { From 060851e16f84a949b3be6a5a52713bc11384976c Mon Sep 17 00:00:00 2001 From: Abdul Qadir Date: Sat, 24 Feb 2024 00:33:42 +0500 Subject: [PATCH 2/4] PTM apps enhancements --- .../repository/ApplicationRepository.java | 2 ++ .../service/ApplicationService.java | 22 +++++++++++++++---- .../service/ApplicationPermissionHandler.java | 4 ++-- .../service/ResourcePermissionHandler.java | 4 ++++ .../org/lowcoder/sdk/config/CommonConfig.java | 7 ++++++ .../application/ApplicationController.java | 2 +- .../view/MarketplaceApplicationInfoView.java | 7 ++++++ .../framework/security/SecurityConfig.java | 4 ++++ .../api/home/UserHomeApiServiceImpl.java | 12 +++++++++- .../main/resources/application-lowcoder.yml | 2 ++ .../resources/selfhost/ce/application.yml | 2 ++ 11 files changed, 60 insertions(+), 8 deletions(-) diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/application/repository/ApplicationRepository.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/application/repository/ApplicationRepository.java index ac37c6e9d..7c42ccc73 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/application/repository/ApplicationRepository.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/application/repository/ApplicationRepository.java @@ -38,6 +38,8 @@ public interface ApplicationRepository extends ReactiveMongoRepository findByPublicToAllIsTrueAndPublicToMarketplaceIsOrAgencyProfileIsAndIdIn (Boolean publicToMarketplace, Boolean agencyProfile, Collection ids); + Flux findByPublicToAllIsTrueAndPublicToMarketplaceIsAndAgencyProfileIsAndIdIn(Boolean publicToMarketplace, Boolean agencyProfile, Collection ids); + Flux findByPublicToAllIsTrueAndPublicToMarketplaceIsTrue(); Flux findByPublicToAllIsTrueAndAgencyProfileIsTrue(); diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/application/service/ApplicationService.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/application/service/ApplicationService.java index cfbbe0a37..e19895c7c 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/application/service/ApplicationService.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/application/service/ApplicationService.java @@ -198,10 +198,24 @@ public Mono setApplicationAsAgencyProfile(String applicationId, boolean @NonEmptyMono @SuppressWarnings("ReactiveStreamsNullableInLambdaInTransform") - public Mono> getPublicApplicationIds(Collection applicationIds, Boolean isAnonymous) { - return repository.findByPublicToAllIsTrueAndPublicToMarketplaceIsOrAgencyProfileIsAndIdIn(!isAnonymous, !isAnonymous, applicationIds) - .map(HasIdAndAuditing::getId) - .collect(Collectors.toSet()); + public Mono> getPublicApplicationIds(Collection applicationIds, Boolean isAnonymous, Boolean isPrivateMarketplace) { + + if(isAnonymous) { + if(isPrivateMarketplace) { + return repository.findByPublicToAllIsTrueAndPublicToMarketplaceIsAndAgencyProfileIsAndIdIn(false, false, applicationIds) + .map(HasIdAndAuditing::getId) + .collect(Collectors.toSet()); + } else { + return repository.findByPublicToAllIsTrueAndPublicToMarketplaceIsAndAgencyProfileIsAndIdIn(true, false, applicationIds) + .map(HasIdAndAuditing::getId) + .collect(Collectors.toSet()); + } + } else { + return repository.findByPublicToAllIsTrueAndPublicToMarketplaceIsOrAgencyProfileIsAndIdIn(true, true, applicationIds) + .map(HasIdAndAuditing::getId) + .collect(Collectors.toSet()); + } + } } diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/permission/service/ApplicationPermissionHandler.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/permission/service/ApplicationPermissionHandler.java index d93585bb0..5d6448d13 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/permission/service/ApplicationPermissionHandler.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/permission/service/ApplicationPermissionHandler.java @@ -46,7 +46,7 @@ protected Mono>> getAnonymousUserPermission } Set applicationIds = newHashSet(resourceIds); - return Mono.zip(applicationService.getPublicApplicationIds(applicationIds, Boolean.TRUE), + return Mono.zip(applicationService.getPublicApplicationIds(applicationIds, Boolean.TRUE, config.getMarketplace().isPrivateMode()), templateSolution.getTemplateApplicationIds(applicationIds)) .map(tuple -> { Set publicAppIds = tuple.getT1(); @@ -61,7 +61,7 @@ protected Mono>> getAnonymousUserPermission (Collection resourceIds, ResourceAction resourceAction) { Set applicationIds = newHashSet(resourceIds); - return Mono.zip(applicationService.getPublicApplicationIds(applicationIds, Boolean.FALSE), + return Mono.zip(applicationService.getPublicApplicationIds(applicationIds, Boolean.FALSE, config.getMarketplace().isPrivateMode()), templateSolution.getTemplateApplicationIds(applicationIds)) .map(tuple -> { Set publicAppIds = tuple.getT1(); diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/permission/service/ResourcePermissionHandler.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/permission/service/ResourcePermissionHandler.java index 762e9bcb1..09efd31f2 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/permission/service/ResourcePermissionHandler.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/permission/service/ResourcePermissionHandler.java @@ -26,6 +26,7 @@ import org.lowcoder.domain.permission.model.ResourceRole; import org.lowcoder.domain.permission.model.ResourceType; import org.lowcoder.domain.permission.model.UserPermissionOnResourceStatus; +import org.lowcoder.sdk.config.CommonConfig; import org.springframework.beans.factory.annotation.Autowired; import com.google.common.collect.Maps; @@ -44,6 +45,9 @@ abstract class ResourcePermissionHandler { @Autowired private OrgMemberService orgMemberService; + @Autowired + protected CommonConfig config; + public Mono>> getAllMatchingPermissions(String userId, Collection resourceIds, ResourceAction resourceAction) { diff --git a/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/config/CommonConfig.java b/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/config/CommonConfig.java index 7d32ed0d8..d1fcf3ea8 100644 --- a/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/config/CommonConfig.java +++ b/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/config/CommonConfig.java @@ -44,6 +44,7 @@ public class CommonConfig { private Cookie cookie = new Cookie(); private JsExecutor jsExecutor = new JsExecutor(); private Set disallowedHosts = new HashSet<>(); + private Marketplace marketplace = new Marketplace(); public boolean isSelfHost() { return !isCloud(); @@ -145,6 +146,12 @@ public static class JsExecutor { private String host; } + @Data + public static class Marketplace { + + private boolean privateMode = Boolean.TRUE; + } + @Getter @Setter diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationController.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationController.java index 1b6bf34a5..f412bed4d 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationController.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationController.java @@ -155,7 +155,7 @@ public Mono>> getMarketplaceAp @Override public Mono>> getAgencyProfileApplications(@RequestParam(required = false) Integer applicationType) { ApplicationType applicationTypeEnum = applicationType == null ? null : ApplicationType.fromValue(applicationType); - return userHomeApiService.getAllMarketplaceApplications(applicationTypeEnum) + return userHomeApiService.getAllAgencyProfileApplications(applicationTypeEnum) .collectList() .map(ResponseView::success); } diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/view/MarketplaceApplicationInfoView.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/view/MarketplaceApplicationInfoView.java index b45ffd499..973c4caac 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/view/MarketplaceApplicationInfoView.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/view/MarketplaceApplicationInfoView.java @@ -2,12 +2,19 @@ import lombok.Builder; import lombok.Getter; +import lombok.Setter; import org.lowcoder.domain.application.model.ApplicationStatus; @Builder @Getter +@Setter public class MarketplaceApplicationInfoView { + // marketplace specific details + private String title; + private String description; + private String category; + // org details private final String orgId; private final String orgName; diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/framework/security/SecurityConfig.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/framework/security/SecurityConfig.java index 376fc3c4b..b4010257b 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/framework/security/SecurityConfig.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/framework/security/SecurityConfig.java @@ -108,6 +108,7 @@ SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) { ServerWebExchangeMatchers.pathMatchers(HttpMethod.GET, CONFIG_URL), // system config ServerWebExchangeMatchers.pathMatchers(HttpMethod.GET, CONFIG_URL + "/deploymentId"), // system config ServerWebExchangeMatchers.pathMatchers(HttpMethod.GET, APPLICATION_URL + "/*/view"), // application view + ServerWebExchangeMatchers.pathMatchers(HttpMethod.GET, APPLICATION_URL + "/*/view_marketplace"), // application view ServerWebExchangeMatchers.pathMatchers(HttpMethod.GET, USER_URL + "/me"), ServerWebExchangeMatchers.pathMatchers(HttpMethod.GET, USER_URL + "/currentUser"), @@ -132,6 +133,7 @@ SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) { ServerWebExchangeMatchers.pathMatchers(HttpMethod.GET, NewUrl.CONFIG_URL + "/deploymentId"), ServerWebExchangeMatchers.pathMatchers(HttpMethod.HEAD, NewUrl.STATE_URL + "/healthCheck"), ServerWebExchangeMatchers.pathMatchers(HttpMethod.GET, NewUrl.APPLICATION_URL + "/*/view"), + ServerWebExchangeMatchers.pathMatchers(HttpMethod.GET, NewUrl.APPLICATION_URL + "/*/view_marketplace"), ServerWebExchangeMatchers.pathMatchers(HttpMethod.GET, NewUrl.USER_URL + "/me"), ServerWebExchangeMatchers.pathMatchers(HttpMethod.GET, NewUrl.USER_URL + "/currentUser"), ServerWebExchangeMatchers.pathMatchers(HttpMethod.GET, NewUrl.GROUP_URL + "/list"), @@ -177,6 +179,7 @@ private CorsConfigurationSource buildCorsConfigurationSource() { source.registerCorsConfiguration(GROUP_URL + "/list", skipCheckCorsForAll); source.registerCorsConfiguration(QUERY_URL + "/execute", skipCheckCorsForAll); source.registerCorsConfiguration(APPLICATION_URL + "/*/view", skipCheckCorsForAll); + source.registerCorsConfiguration(APPLICATION_URL + "/*/view_marketplace", skipCheckCorsForAll); source.registerCorsConfiguration(GITHUB_STAR, skipCheckCorsForAll); source.registerCorsConfiguration(ORGANIZATION_URL + "/*/datasourceTypes", skipCheckCorsForAll); source.registerCorsConfiguration(DATASOURCE_URL + "/jsDatasourcePlugins", skipCheckCorsForAll); @@ -186,6 +189,7 @@ private CorsConfigurationSource buildCorsConfigurationSource() { source.registerCorsConfiguration(NewUrl.GROUP_URL + "/list", skipCheckCorsForAll); source.registerCorsConfiguration(NewUrl.QUERY_URL + "/execute", skipCheckCorsForAll); source.registerCorsConfiguration(NewUrl.APPLICATION_URL + "/*/view", skipCheckCorsForAll); + source.registerCorsConfiguration(NewUrl.APPLICATION_URL + "/*/view_marketplace", skipCheckCorsForAll); source.registerCorsConfiguration(NewUrl.ORGANIZATION_URL + "/*/datasourceTypes", skipCheckCorsForAll); source.registerCorsConfiguration(NewUrl.DATASOURCE_URL + "/jsDatasourcePlugins", skipCheckCorsForAll); diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/home/UserHomeApiServiceImpl.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/home/UserHomeApiServiceImpl.java index e10fe0ea1..64ece33d6 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/home/UserHomeApiServiceImpl.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/home/UserHomeApiServiceImpl.java @@ -292,7 +292,7 @@ public Flux getAllMarketplaceApplications(@Nulla Application application = tuple.getT1(); Map userMap = tuple.getT2(); Map orgMap = tuple.getT3(); - return MarketplaceApplicationInfoView.builder() + MarketplaceApplicationInfoView marketplaceApplicationInfoView = MarketplaceApplicationInfoView.builder() .applicationId(application.getId()) .name(application.getName()) .applicationType(application.getApplicationType()) @@ -305,6 +305,16 @@ public Flux getAllMarketplaceApplications(@Nulla .createAt(application.getCreatedAt().toEpochMilli()) .createBy(application.getCreatedBy()) .build(); + + // marketplace specific fields + Map marketplaceMeta = (Map) + ((Map)application.getEditingApplicationDSL().get("ui")).get("marketplaceMeta"); + marketplaceApplicationInfoView.setTitle((String)marketplaceMeta.get("title")); + marketplaceApplicationInfoView.setCategory((String)marketplaceMeta.get("category")); + marketplaceApplicationInfoView.setDescription((String)marketplaceMeta.get("description")); + + return marketplaceApplicationInfoView; + }); }); diff --git a/server/api-service/lowcoder-server/src/main/resources/application-lowcoder.yml b/server/api-service/lowcoder-server/src/main/resources/application-lowcoder.yml index 75ae0dba9..66d022e68 100644 --- a/server/api-service/lowcoder-server/src/main/resources/application-lowcoder.yml +++ b/server/api-service/lowcoder-server/src/main/resources/application-lowcoder.yml @@ -44,6 +44,8 @@ common: block-hound-enable: false js-executor: host: http://127.0.0.1:6060 + marketplace: + private-mode: false material: mongodb-grid-fs: diff --git a/server/api-service/lowcoder-server/src/main/resources/selfhost/ce/application.yml b/server/api-service/lowcoder-server/src/main/resources/selfhost/ce/application.yml index df8301982..11c0511c2 100644 --- a/server/api-service/lowcoder-server/src/main/resources/selfhost/ce/application.yml +++ b/server/api-service/lowcoder-server/src/main/resources/selfhost/ce/application.yml @@ -53,6 +53,8 @@ common: max-query-timeout: ${LOWCODER_MAX_QUERY_TIMEOUT:120} workspace: mode: ${LOWCODER_WORKSPACE_MODE:SAAS} + marketplace: + private-mode: ${MARKETPLACE_PRIVATE_MODE:true} material: mongodb-grid-fs: From d4ea385aaa4f9d35afde2e24ddb5d92a3c5fcfac Mon Sep 17 00:00:00 2001 From: Abdul Qadir Date: Sat, 24 Feb 2024 17:41:07 +0500 Subject: [PATCH 3/4] Handle marketplace-apps api handling for public marketplace --- .../application/ApplicationController.java | 2 ++ .../framework/security/SecurityConfig.java | 5 +++++ .../api/home/UserHomeApiServiceImpl.java | 21 +++++++++++++------ 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationController.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationController.java index f412bed4d..86be1e576 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationController.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationController.java @@ -17,6 +17,7 @@ import org.lowcoder.api.application.view.ApplicationView; import org.lowcoder.api.application.view.MarketplaceApplicationInfoView; import org.lowcoder.api.framework.view.ResponseView; +import org.lowcoder.api.home.SessionUserService; import org.lowcoder.api.home.UserHomeApiService; import org.lowcoder.api.home.UserHomepageView; import org.lowcoder.api.util.BusinessEventPublisher; @@ -39,6 +40,7 @@ public class ApplicationController implements ApplicationEndpoints { private final UserHomeApiService userHomeApiService; private final ApplicationApiService applicationApiService; private final BusinessEventPublisher businessEventPublisher; + private final SessionUserService sessionUserService; @Override public Mono> create(@RequestBody CreateApplicationRequest createApplicationRequest) { diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/framework/security/SecurityConfig.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/framework/security/SecurityConfig.java index b4010257b..b933a63e1 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/framework/security/SecurityConfig.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/framework/security/SecurityConfig.java @@ -109,6 +109,8 @@ SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) { ServerWebExchangeMatchers.pathMatchers(HttpMethod.GET, CONFIG_URL + "/deploymentId"), // system config ServerWebExchangeMatchers.pathMatchers(HttpMethod.GET, APPLICATION_URL + "/*/view"), // application view ServerWebExchangeMatchers.pathMatchers(HttpMethod.GET, APPLICATION_URL + "/*/view_marketplace"), // application view + ServerWebExchangeMatchers.pathMatchers(HttpMethod.GET, APPLICATION_URL + "/marketplace-apps"), // marketplace apps + ServerWebExchangeMatchers.pathMatchers(HttpMethod.GET, USER_URL + "/me"), ServerWebExchangeMatchers.pathMatchers(HttpMethod.GET, USER_URL + "/currentUser"), @@ -134,6 +136,7 @@ SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) { ServerWebExchangeMatchers.pathMatchers(HttpMethod.HEAD, NewUrl.STATE_URL + "/healthCheck"), ServerWebExchangeMatchers.pathMatchers(HttpMethod.GET, NewUrl.APPLICATION_URL + "/*/view"), ServerWebExchangeMatchers.pathMatchers(HttpMethod.GET, NewUrl.APPLICATION_URL + "/*/view_marketplace"), + ServerWebExchangeMatchers.pathMatchers(HttpMethod.GET, NewUrl.APPLICATION_URL + "/marketplace-apps"), // marketplace apps ServerWebExchangeMatchers.pathMatchers(HttpMethod.GET, NewUrl.USER_URL + "/me"), ServerWebExchangeMatchers.pathMatchers(HttpMethod.GET, NewUrl.USER_URL + "/currentUser"), ServerWebExchangeMatchers.pathMatchers(HttpMethod.GET, NewUrl.GROUP_URL + "/list"), @@ -180,6 +183,7 @@ private CorsConfigurationSource buildCorsConfigurationSource() { source.registerCorsConfiguration(QUERY_URL + "/execute", skipCheckCorsForAll); source.registerCorsConfiguration(APPLICATION_URL + "/*/view", skipCheckCorsForAll); source.registerCorsConfiguration(APPLICATION_URL + "/*/view_marketplace", skipCheckCorsForAll); + source.registerCorsConfiguration(APPLICATION_URL + "/marketplace-apps", skipCheckCorsForAll); source.registerCorsConfiguration(GITHUB_STAR, skipCheckCorsForAll); source.registerCorsConfiguration(ORGANIZATION_URL + "/*/datasourceTypes", skipCheckCorsForAll); source.registerCorsConfiguration(DATASOURCE_URL + "/jsDatasourcePlugins", skipCheckCorsForAll); @@ -190,6 +194,7 @@ private CorsConfigurationSource buildCorsConfigurationSource() { source.registerCorsConfiguration(NewUrl.QUERY_URL + "/execute", skipCheckCorsForAll); source.registerCorsConfiguration(NewUrl.APPLICATION_URL + "/*/view", skipCheckCorsForAll); source.registerCorsConfiguration(NewUrl.APPLICATION_URL + "/*/view_marketplace", skipCheckCorsForAll); + source.registerCorsConfiguration(NewUrl.APPLICATION_URL + "/marketplace-apps", skipCheckCorsForAll); source.registerCorsConfiguration(NewUrl.ORGANIZATION_URL + "/*/datasourceTypes", skipCheckCorsForAll); source.registerCorsConfiguration(NewUrl.DATASOURCE_URL + "/jsDatasourcePlugins", skipCheckCorsForAll); diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/home/UserHomeApiServiceImpl.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/home/UserHomeApiServiceImpl.java index 64ece33d6..079e831ee 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/home/UserHomeApiServiceImpl.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/home/UserHomeApiServiceImpl.java @@ -40,6 +40,7 @@ import org.lowcoder.domain.user.service.UserService; import org.lowcoder.domain.user.service.UserStatusService; import org.lowcoder.infra.util.NetworkUtils; +import org.lowcoder.sdk.config.CommonConfig; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; @@ -80,6 +81,9 @@ public class UserHomeApiServiceImpl implements UserHomeApiService { @Autowired private UserApplicationInteractionService userApplicationInteractionService; + @Autowired + private CommonConfig config; + @Override public Mono buildUserProfileView(User user, ServerWebExchange exchange) { @@ -260,8 +264,13 @@ public Flux getAllAuthorisedApplications4CurrentOrgMember(@ @Override public Flux getAllMarketplaceApplications(@Nullable ApplicationType applicationType) { - return sessionUserService.getVisitorOrgMemberCache() - .flatMapMany(orgMember -> { + return sessionUserService.isAnonymousUser() + .flatMapMany(isAnonymousUser -> { + + if(config.getMarketplace().isPrivateMode() && isAnonymousUser) { + return Mono.empty(); + } + // application flux Flux applicationFlux = Flux.defer(() -> applicationService.findAllMarketplaceApps()) .filter(application -> isNull(applicationType) || application.getApplicationType() == applicationType.getValue()) @@ -287,11 +296,11 @@ public Flux getAllMarketplaceApplications(@Nulla return applicationFlux .flatMap(application -> Mono.zip(Mono.just(application), userMapMono, orgMapMono)) - .map(tuple -> { + .map(tuple2 -> { // build view - Application application = tuple.getT1(); - Map userMap = tuple.getT2(); - Map orgMap = tuple.getT3(); + Application application = tuple2.getT1(); + Map userMap = tuple2.getT2(); + Map orgMap = tuple2.getT3(); MarketplaceApplicationInfoView marketplaceApplicationInfoView = MarketplaceApplicationInfoView.builder() .applicationId(application.getId()) .name(application.getName()) From 7aa74fbe0b530ba9a9ed94062ba516dbd678347e Mon Sep 17 00:00:00 2001 From: Abdul Qadir Date: Sat, 24 Feb 2024 18:16:31 +0500 Subject: [PATCH 4/4] Add image field to ptm apps meta --- .../domain/application/service/ApplicationService.java | 4 +++- .../lowcoder/api/application/ApplicationApiService.java | 3 ++- .../lowcoder/api/application/ApplicationEndpoints.java | 8 +++++++- .../application/view/MarketplaceApplicationInfoView.java | 1 + .../org/lowcoder/api/home/UserHomeApiServiceImpl.java | 1 + 5 files changed, 14 insertions(+), 3 deletions(-) diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/application/service/ApplicationService.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/application/service/ApplicationService.java index e19895c7c..917d0762e 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/application/service/ApplicationService.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/application/service/ApplicationService.java @@ -152,7 +152,8 @@ public Mono setApplicationPublicToAll(String applicationId, boolean pub return mongoUpsertHelper.updateById(application, applicationId); } - public Mono setApplicationPublicToMarketplace(String applicationId, Boolean publicToMarketplace, String title, String category, String description) { + public Mono setApplicationPublicToMarketplace(String applicationId, Boolean publicToMarketplace, + String title, String category, String description, String image) { return findById(applicationId) .map(application -> { @@ -165,6 +166,7 @@ public Mono setApplicationPublicToMarketplace(String applicationId, Boo marketplaceMeta.put("title", title); marketplaceMeta.put("description", description); marketplaceMeta.put("category", category); + marketplaceMeta.put("image", image); if (dataObject.containsKey("marketplaceMeta")) { dataObject.replace("marketplaceMeta", marketplaceMeta); } else { diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationApiService.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationApiService.java index 29dc3b8a9..fb05dcf87 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationApiService.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationApiService.java @@ -517,7 +517,8 @@ public Mono setApplicationPublicToAll(String applicationId, boolean pub public Mono setApplicationPublicToMarketplace(String applicationId, ApplicationEndpoints.ApplicationPublicToMarketplaceRequest request) { return checkCurrentUserApplicationPermission(applicationId, ResourceAction.SET_APPLICATIONS_PUBLIC_TO_MARKETPLACE) .then(checkApplicationStatus(applicationId, NORMAL)) - .then(applicationService.setApplicationPublicToMarketplace(applicationId, request.publicToMarketplace(), request.title(), request.category(), request.description())); + .then(applicationService.setApplicationPublicToMarketplace + (applicationId, request.publicToMarketplace(), request.title(), request.category(), request.description(), request.image())); } public Mono setApplicationAsAgencyProfile(String applicationId, boolean agencyProfile) { diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationEndpoints.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationEndpoints.java index 5da9cf827..2ac323289 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationEndpoints.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationEndpoints.java @@ -270,7 +270,8 @@ public Boolean publicToAll() { } } - public record ApplicationPublicToMarketplaceRequest(Boolean publicToMarketplace, String title, String description, String category) { + public record ApplicationPublicToMarketplaceRequest(Boolean publicToMarketplace, String title, + String description, String category, String image) { @Override public Boolean publicToMarketplace() { return BooleanUtils.isTrue(publicToMarketplace); @@ -291,6 +292,11 @@ public String category() { return category; } + @Override + public String image() { + return image; + } + } public record ApplicationAsAgencyProfileRequest(Boolean agencyProfile) { diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/view/MarketplaceApplicationInfoView.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/view/MarketplaceApplicationInfoView.java index 973c4caac..0de5a6aaf 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/view/MarketplaceApplicationInfoView.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/view/MarketplaceApplicationInfoView.java @@ -14,6 +14,7 @@ public class MarketplaceApplicationInfoView { private String title; private String description; private String category; + private String image; // org details private final String orgId; diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/home/UserHomeApiServiceImpl.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/home/UserHomeApiServiceImpl.java index 079e831ee..2662900dd 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/home/UserHomeApiServiceImpl.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/home/UserHomeApiServiceImpl.java @@ -321,6 +321,7 @@ public Flux getAllMarketplaceApplications(@Nulla marketplaceApplicationInfoView.setTitle((String)marketplaceMeta.get("title")); marketplaceApplicationInfoView.setCategory((String)marketplaceMeta.get("category")); marketplaceApplicationInfoView.setDescription((String)marketplaceMeta.get("description")); + marketplaceApplicationInfoView.setImage((String)marketplaceMeta.get("image")); return marketplaceApplicationInfoView;