From 99f554cafd2de7ef032763012e80949fbc96edd3 Mon Sep 17 00:00:00 2001 From: th37star Date: Thu, 24 Jul 2025 16:04:47 -0400 Subject: [PATCH 1/2] Fixed GrantApplicationPermission endpoint. Jira: https://lowcoder.atlassian.net/jira/software/projects/LCS/boards/1?assignee=633f22d48b75455be4592c12&selectedIssue=LCS-73 --- .../infra/birelation/BiRelationServiceImpl.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/birelation/BiRelationServiceImpl.java b/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/birelation/BiRelationServiceImpl.java index 56592e1d2..acf96b97d 100644 --- a/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/birelation/BiRelationServiceImpl.java +++ b/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/birelation/BiRelationServiceImpl.java @@ -36,7 +36,8 @@ public Mono addBiRelation(BiRelation biRelation) { @Override public Mono> batchAddBiRelation(Collection biRelations) { - return biRelationRepository.saveAll(biRelations) + return Flux.fromIterable(biRelations) + .flatMap(this::upsertAndReturn) .collectList(); } @@ -232,4 +233,12 @@ public Mono removeBiRelationById(String id) { .thenReturn(true) .onErrorReturn(false); } + + private Mono upsertAndReturn(BiRelation biRelation) { + Criteria criteria = Criteria.where("bizType").is(biRelation.getBizType()) + .and("sourceId").is(biRelation.getSourceId()) + .and("targetId").is(biRelation.getTargetId()); + return mongoUpsertHelper.upsertWithAuditingParams(biRelation, criteria) + .onErrorResume(ex -> Mono.empty()); + } } From abed14309f721a7eba6cc07ab58f725eae752232 Mon Sep 17 00:00:00 2001 From: th37star Date: Fri, 25 Jul 2025 16:27:12 -0400 Subject: [PATCH 2/2] Fixed GrantApplicationPermission endpoint. Jira: https://lowcoder.atlassian.net/jira/software/projects/LCS/boards/1?assignee=633f22d48b75455be4592c12&selectedIssue=LCS-73 --- .../birelation/BiRelationServiceImpl.java | 56 ++++++++++++------- .../org/lowcoder/sdk/exception/BizError.java | 5 +- .../src/main/resources/locale_de.properties | 1 + .../src/main/resources/locale_en.properties | 3 +- .../src/main/resources/locale_zh.properties | 3 +- .../application/ApplicationController.java | 32 +++++++---- 6 files changed, 65 insertions(+), 35 deletions(-) diff --git a/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/birelation/BiRelationServiceImpl.java b/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/birelation/BiRelationServiceImpl.java index acf96b97d..b9a09eec2 100644 --- a/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/birelation/BiRelationServiceImpl.java +++ b/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/birelation/BiRelationServiceImpl.java @@ -1,21 +1,27 @@ package org.lowcoder.infra.birelation; -import com.google.common.base.Preconditions; -import lombok.RequiredArgsConstructor; +import static com.google.common.base.Strings.nullToEmpty; +import static org.apache.commons.lang3.StringUtils.isNotBlank; +import static org.springframework.data.mongodb.core.query.Criteria.where; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + import org.lowcoder.infra.mongo.MongoUpsertHelper; +import org.lowcoder.sdk.exception.BizError; +import org.lowcoder.sdk.exception.BizException; +import org.springframework.dao.DuplicateKeyException; import org.springframework.data.domain.Pageable; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.stereotype.Service; -import reactor.core.publisher.Flux; -import reactor.core.publisher.Mono; -import java.util.Collection; -import java.util.List; +import com.google.common.base.Preconditions; -import static com.google.common.base.Strings.nullToEmpty; -import static org.apache.commons.lang3.StringUtils.isNotBlank; -import static org.springframework.data.mongodb.core.query.Criteria.where; +import lombok.RequiredArgsConstructor; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; @Service @RequiredArgsConstructor @@ -36,9 +42,27 @@ public Mono addBiRelation(BiRelation biRelation) { @Override public Mono> batchAddBiRelation(Collection biRelations) { - return Flux.fromIterable(biRelations) - .flatMap(this::upsertAndReturn) - .collectList(); + List> tasks = new ArrayList<>(); + List alreadyGranted = new ArrayList<>(); + + for (BiRelation relation : biRelations) { + tasks.add( + biRelationRepository.insert(relation) + .onErrorResume(DuplicateKeyException.class, ex -> { + alreadyGranted.add(relation); + return Mono.empty(); + }) + ); + } + + return Flux.merge(tasks) + .collectList() + .map(inserted -> { + if (!alreadyGranted.isEmpty()) { + throw new BizException(BizError.APPLICATION_GRANTED_PERMISSION_CONFLICT, "APPLICATION_GRANTED_PERMISSION_CONFLICT", alreadyGranted); + } + return inserted; + }); } @Override @@ -233,12 +257,4 @@ public Mono removeBiRelationById(String id) { .thenReturn(true) .onErrorReturn(false); } - - private Mono upsertAndReturn(BiRelation biRelation) { - Criteria criteria = Criteria.where("bizType").is(biRelation.getBizType()) - .and("sourceId").is(biRelation.getSourceId()) - .and("targetId").is(biRelation.getTargetId()); - return mongoUpsertHelper.upsertWithAuditingParams(biRelation, criteria) - .onErrorResume(ex -> Mono.empty()); - } } diff --git a/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/exception/BizError.java b/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/exception/BizError.java index 631923766..d1d8763a2 100644 --- a/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/exception/BizError.java +++ b/server/api-service/lowcoder-sdk/src/main/java/org/lowcoder/sdk/exception/BizError.java @@ -1,11 +1,11 @@ package org.lowcoder.sdk.exception; -import lombok.Getter; - import static org.lowcoder.sdk.exception.ErrorLogType.SIMPLE; import static org.lowcoder.sdk.exception.ErrorLogType.VERBOSE; import static org.lowcoder.sdk.util.EnumUtils.checkDuplicates; +import lombok.Getter; + @Getter public enum BizError { @@ -64,6 +64,7 @@ public enum BizError { NO_PERMISSION_TO_REQUEST_APP(403, 5308), APPLICATION_AND_ORG_NOT_MATCH(400, 5309), + APPLICATION_GRANTED_PERMISSION_CONFLICT(409, 5310), // datasource related, code range 5500 - 5600 DATASOURCE_NOT_FOUND(500, 5500), diff --git a/server/api-service/lowcoder-sdk/src/main/resources/locale_de.properties b/server/api-service/lowcoder-sdk/src/main/resources/locale_de.properties index ed265a080..c6cc19d42 100644 --- a/server/api-service/lowcoder-sdk/src/main/resources/locale_de.properties +++ b/server/api-service/lowcoder-sdk/src/main/resources/locale_de.properties @@ -103,3 +103,4 @@ EMAIL_PROVIDER_DISABLED=E-Mail-Anbieter ist deaktiviert. SLUG_DUPLICATE_ENTRY=Slug existiert bereits. SLUG_INVALID=Slug-Format ist ungültig. FLOW_ERROR=Flow-Fehlermeldung: {0}. +APPLICATION_GRANTED_PERMISSION_CONFLICT=Das Recht wurde bereits gewhrt. \ No newline at end of file diff --git a/server/api-service/lowcoder-sdk/src/main/resources/locale_en.properties b/server/api-service/lowcoder-sdk/src/main/resources/locale_en.properties index f72df80a6..5b53d31e1 100644 --- a/server/api-service/lowcoder-sdk/src/main/resources/locale_en.properties +++ b/server/api-service/lowcoder-sdk/src/main/resources/locale_en.properties @@ -286,4 +286,5 @@ EMAIL_PROVIDER_DISABLED=Email provider is disabled. SLUG_DUPLICATE_ENTRY=Slug already exists SLUG_INVALID=Slug format is invalid FLOW_ERROR=Flow error message: {0} -ORGANIZATION_NOT_FOUND=Organization not found. \ No newline at end of file +ORGANIZATION_NOT_FOUND=Organization not found. +APPLICATION_GRANTED_PERMISSION_CONFLICT=Right was already granted. \ No newline at end of file diff --git a/server/api-service/lowcoder-sdk/src/main/resources/locale_zh.properties b/server/api-service/lowcoder-sdk/src/main/resources/locale_zh.properties index fbb259836..36a812bbc 100644 --- a/server/api-service/lowcoder-sdk/src/main/resources/locale_zh.properties +++ b/server/api-service/lowcoder-sdk/src/main/resources/locale_zh.properties @@ -285,4 +285,5 @@ DUPLICATE_AUTH_CONFIG_ADDITION=提供商身份验证类型已添加到组织中 EMAIL_PROVIDER_DISABLED=电子邮件提供商已禁用。 SLUG_DUPLICATE_ENTRY=蛞蝓已经存在 SLUG_INVALID=Slug 格式无效 -FLOW_ERROR=流程错误消息:{0} \ No newline at end of file +FLOW_ERROR=流程错误消息:{0} +APPLICATION_GRANTED_PERMISSION_CONFLICT=权限已被提交。 \ No newline at end of file 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 cfec54a13..deffe6477 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 @@ -1,7 +1,24 @@ package org.lowcoder.api.application; -import lombok.RequiredArgsConstructor; -import org.lowcoder.api.application.view.*; +import static org.apache.commons.collections4.SetUtils.emptyIfNull; +import static org.lowcoder.plugin.api.event.LowcoderEvent.EventType.APPLICATION_CREATE; +import static org.lowcoder.plugin.api.event.LowcoderEvent.EventType.APPLICATION_DELETE; +import static org.lowcoder.plugin.api.event.LowcoderEvent.EventType.APPLICATION_RECYCLED; +import static org.lowcoder.plugin.api.event.LowcoderEvent.EventType.APPLICATION_RESTORE; +import static org.lowcoder.plugin.api.event.LowcoderEvent.EventType.APPLICATION_UPDATE; +import static org.lowcoder.plugin.api.event.LowcoderEvent.EventType.APPLICATION_VIEW; +import static org.lowcoder.sdk.exception.BizError.INVALID_PARAMETER; +import static org.lowcoder.sdk.util.ExceptionUtils.ofError; + +import java.util.List; +import java.util.Map; +import java.util.Objects; + +import org.lowcoder.api.application.view.ApplicationInfoView; +import org.lowcoder.api.application.view.ApplicationPermissionView; +import org.lowcoder.api.application.view.ApplicationPublishRequest; +import org.lowcoder.api.application.view.ApplicationView; +import org.lowcoder.api.application.view.MarketplaceApplicationInfoView; import org.lowcoder.api.framework.view.PageResponseView; import org.lowcoder.api.framework.view.ResponseView; import org.lowcoder.api.home.UserHomeApiService; @@ -18,17 +35,10 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import reactor.core.publisher.Mono; -import java.util.List; -import java.util.Objects; - -import static org.apache.commons.collections4.SetUtils.emptyIfNull; -import static org.lowcoder.plugin.api.event.LowcoderEvent.EventType.*; -import static org.lowcoder.sdk.exception.BizError.INVALID_PARAMETER; -import static org.lowcoder.sdk.util.ExceptionUtils.ofError; +import lombok.RequiredArgsConstructor; import reactor.core.publisher.Flux; -import java.util.Map; +import reactor.core.publisher.Mono; @RequiredArgsConstructor @RestController