From bf5ba69bcb497eb60104d5dcda1aa3232b0e799f Mon Sep 17 00:00:00 2001 From: fighter-wang <118291973+fighter-wang@users.noreply.github.com> Date: Thu, 29 Aug 2024 15:50:38 +0800 Subject: [PATCH 1/6] =?UTF-8?q?fix(=E5=9C=BA=E6=99=AF=E8=81=94=E5=8A=A8):?= =?UTF-8?q?=20=E4=BF=AE=E5=A4=8D=E5=9C=BA=E6=99=AF=E8=81=94=E5=8A=A8?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E6=8C=87=E6=A0=87=E5=80=BC=E6=97=A0=E6=B3=95?= =?UTF-8?q?=E8=A7=A6=E5=8F=91=E9=97=AE=E9=A2=98=20(#562)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: fighter-wang <11291691+fighter-wang@user.noreply.gitee.com> --- .../reactorql/term/FixedTermTypeSupport.java | 26 +++++++++---------- .../metric/AbstractPropertyMetricManager.java | 3 +-- 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/jetlinks-components/common-component/src/main/java/org/jetlinks/community/reactorql/term/FixedTermTypeSupport.java b/jetlinks-components/common-component/src/main/java/org/jetlinks/community/reactorql/term/FixedTermTypeSupport.java index 21928e43..e4f2ac67 100644 --- a/jetlinks-components/common-component/src/main/java/org/jetlinks/community/reactorql/term/FixedTermTypeSupport.java +++ b/jetlinks-components/common-component/src/main/java/org/jetlinks/community/reactorql/term/FixedTermTypeSupport.java @@ -1,5 +1,6 @@ package org.jetlinks.community.reactorql.term; +import com.google.common.collect.Sets; import lombok.Getter; import org.hswebframework.ezorm.core.param.Term; import org.hswebframework.ezorm.rdb.operator.builder.fragments.NativeSql; @@ -106,14 +107,16 @@ public enum FixedTermTypeSupport implements TermTypeSupport { }; private final String text; + private final boolean needValue; private final Set supportTypes; private final String function; - private FixedTermTypeSupport(String text, String function, String... supportTypes) { + FixedTermTypeSupport(String text, String function, String... supportTypes) { this.text = text; this.function = function; - this.supportTypes = new HashSet<>(Arrays.asList(supportTypes)); + this.needValue = true; + this.supportTypes = Sets.newHashSet(supportTypes); } @Override @@ -140,21 +143,18 @@ public enum FixedTermTypeSupport implements TermTypeSupport { PrepareSqlFragments fragments = PrepareSqlFragments.of(); appendFunction(column, fragments); - if (term.getOptions().contains(OPTIONS_NATIVE_SQL)) { - value = NativeSql.of(String.valueOf(value)); - } - - value = convertValue(value, term); - if (value instanceof NativeSql) { fragments .addSql(((NativeSql) value).getSql()) - .addParameter(((NativeSql) value).getParameters()); - } else { - fragments.addSql("?") - .addParameter(value); + .addParameter(((NativeSql) value).getParameters()) + .addSql(")"); + } else if (needValue) { + value = convertValue(value, term); + fragments + .addSql("?") + .addParameter(value) + .addSql(")"); } - fragments.addSql(")"); return fragments; } diff --git a/jetlinks-components/things-component/src/main/java/org/jetlinks/community/things/metric/AbstractPropertyMetricManager.java b/jetlinks-components/things-component/src/main/java/org/jetlinks/community/things/metric/AbstractPropertyMetricManager.java index aa6af027..8fb36350 100644 --- a/jetlinks-components/things-component/src/main/java/org/jetlinks/community/things/metric/AbstractPropertyMetricManager.java +++ b/jetlinks-components/things-component/src/main/java/org/jetlinks/community/things/metric/AbstractPropertyMetricManager.java @@ -36,8 +36,7 @@ public abstract class AbstractPropertyMetricManager implements PropertyMetricMan private Mono loadFromTemplate(ThingId thingId, String property, String metric) { return registry .getThing(thingId.getType(), thingId.getId()) - .flatMap(Thing::getTemplate) - .flatMap(ThingTemplate::getMetadata) + .flatMap(Thing::getMetadata) .flatMap(metadata -> Mono .justOrEmpty( metadata From 594b2937d5d9ad44718fc0cba6cf52b0bb351db4 Mon Sep 17 00:00:00 2001 From: jk9991xx <152269778+jk9991xx@users.noreply.github.com> Date: Mon, 2 Sep 2024 09:32:15 +0800 Subject: [PATCH 2/6] =?UTF-8?q?refactor:=20=E7=A7=BB=E9=99=A4=E9=87=8D?= =?UTF-8?q?=E5=A4=8D=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: lmx <18570651508@wo.cn> --- .../mqtt/server/vertx/DefaultVertxMqttServerProvider.java | 1 - 1 file changed, 1 deletion(-) diff --git a/jetlinks-components/network-component/mqtt-component/src/main/java/org/jetlinks/community/network/mqtt/server/vertx/DefaultVertxMqttServerProvider.java b/jetlinks-components/network-component/mqtt-component/src/main/java/org/jetlinks/community/network/mqtt/server/vertx/DefaultVertxMqttServerProvider.java index 4e55f317..b9dd3bf1 100755 --- a/jetlinks-components/network-component/mqtt-component/src/main/java/org/jetlinks/community/network/mqtt/server/vertx/DefaultVertxMqttServerProvider.java +++ b/jetlinks-components/network-component/mqtt-component/src/main/java/org/jetlinks/community/network/mqtt/server/vertx/DefaultVertxMqttServerProvider.java @@ -106,7 +106,6 @@ public class DefaultVertxMqttServerProvider implements NetworkProvider Date: Mon, 2 Sep 2024 09:33:12 +0800 Subject: [PATCH 3/6] =?UTF-8?q?feat(=E6=9D=83=E9=99=90=E7=AE=A1=E7=90=86):?= =?UTF-8?q?=20=E5=88=86=E9=A1=B5=E8=8E=B7=E5=8F=96=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E8=AF=A6=E6=83=85=EF=BC=8C=E6=96=B0=E5=A2=9E=E7=BB=84=E7=BB=87?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=20(#560)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../community/auth/entity/UserDetail.java | 13 +++- .../auth/service/UserDetailService.java | 74 +++++++++++-------- 2 files changed, 57 insertions(+), 30 deletions(-) diff --git a/jetlinks-manager/authentication-manager/src/main/java/org/jetlinks/community/auth/entity/UserDetail.java b/jetlinks-manager/authentication-manager/src/main/java/org/jetlinks/community/auth/entity/UserDetail.java index 438b8986..6932a651 100644 --- a/jetlinks-manager/authentication-manager/src/main/java/org/jetlinks/community/auth/entity/UserDetail.java +++ b/jetlinks-manager/authentication-manager/src/main/java/org/jetlinks/community/auth/entity/UserDetail.java @@ -36,6 +36,9 @@ public class UserDetail { @Schema(hidden = true) private UserEntityType type; + @Schema(description = "用户类型ID") + private String typeId; + @Schema(description = "用户状态。1启用,0禁用") private Byte status; @@ -63,6 +66,9 @@ public class UserDetail { @Schema(description = "所在机构(部门)信息") private List orgList; + @Schema(description = "创建者ID") + private String creatorId; + private boolean tenantDisabled; public static UserDetail of(UserEntity entity) { @@ -118,6 +124,11 @@ public class UserDetail { return this; } + public UserDetail withType() { + this.setType(UserEntityTypes.getType(this.getTypeId())); + return this; + } + public UserEntity toUserEntity() { UserEntity userEntity = new UserEntity(); userEntity.setId(id); @@ -131,7 +142,7 @@ public class UserDetail { return userEntity; } - public UserDetailEntity toDetailEntity(){ + public UserDetailEntity toDetailEntity() { return FastBeanCopier.copy(this, new UserDetailEntity()); } diff --git a/jetlinks-manager/authentication-manager/src/main/java/org/jetlinks/community/auth/service/UserDetailService.java b/jetlinks-manager/authentication-manager/src/main/java/org/jetlinks/community/auth/service/UserDetailService.java index 6660ea6c..19ba151d 100755 --- a/jetlinks-manager/authentication-manager/src/main/java/org/jetlinks/community/auth/service/UserDetailService.java +++ b/jetlinks-manager/authentication-manager/src/main/java/org/jetlinks/community/auth/service/UserDetailService.java @@ -3,8 +3,10 @@ package org.jetlinks.community.auth.service; import org.hswebframework.web.api.crud.entity.PagerResult; import org.hswebframework.web.api.crud.entity.QueryParamEntity; import org.hswebframework.web.authorization.Authentication; +import org.hswebframework.web.authorization.ReactiveAuthenticationHolder; import org.hswebframework.web.authorization.ReactiveAuthenticationManager; import org.hswebframework.web.bean.FastBeanCopier; +import org.hswebframework.web.crud.query.QueryHelper; import org.hswebframework.web.crud.service.GenericReactiveCrudService; import org.hswebframework.web.i18n.LocaleUtils; import org.hswebframework.web.system.authorization.api.entity.UserEntity; @@ -20,13 +22,14 @@ import org.jetlinks.community.auth.service.request.SaveUserRequest; import org.springframework.context.event.EventListener; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; +import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import java.util.Arrays; import java.util.Collections; import java.util.List; -import java.util.stream.Collectors; /** * 用户详情管理 @@ -44,20 +47,25 @@ public class UserDetailService extends GenericReactiveCrudService> queryUserDetail(QueryParamEntity query) { - return Mono - .zip( - userService.countUser(query), - userService.findUser(query).collectList()) - .flatMap(tp2 -> { - List userList = tp2.getT2(); - return this.createQuery() - .in(UserDetailEntity::getId, userList - .stream() - .map(UserEntity::getId) - .collect(Collectors.toList())) - .fetch() - .collectMap(UserDetailEntity::getId) - .flatMap(userDetailMap -> { - List userDetailList = userList.stream() - .map(user -> { - UserDetail userDetail = UserDetail.of(user); - UserDetailEntity entity = userDetailMap.get(user.getId()); - if (entity != null) { - userDetail = userDetail.with(entity); - } - return userDetail; - }) - .collect(Collectors.toList()); - return Mono.just(PagerResult.of(tp2.getT1(), userDetailList, query)); - }); - }); + return QueryHelper + .transformPageResult( + queryHelper + .select(UserDetail.class) + .all(UserDetailEntity.class) + .as(UserEntity::getId, UserDetail::setId) + .as(UserEntity::getName, UserDetail::setName) + .as(UserEntity::getUsername, UserDetail::setUsername) + // 兼容之前已有字段 + .as(UserEntity::getType, UserDetail::setTypeId) + .as(UserEntity::getStatus, UserDetail::setStatus) + .as(UserEntity::getCreateTime, UserDetail::setCreateTime) + .as(UserEntity::getCreatorId, UserDetail::setCreatorId) + .from(UserEntity.class) + .leftJoin(UserDetailEntity.class, j -> j.is(UserDetailEntity::getId, UserEntity::getId)) + .where(query) + .fetchPaged(), + list -> this.fillUserDetail(list). + collectList()); + } + + private Flux fillUserDetail(List users) { + if (CollectionUtils.isEmpty(users)) { + return Flux.empty(); + } + return Flux + .fromIterable(users) + .flatMap(detail -> + //维度信息 + ReactiveAuthenticationHolder + .get(detail.getId()) + .map(Authentication::getDimensions) + .defaultIfEmpty(Collections.emptyList()) + .map(dimensions -> detail.withDimension(dimensions).withType()) + ); } /** From 3ce520ebe6f1e4e5a5f381519ee5554ec0a54903 Mon Sep 17 00:00:00 2001 From: Zhang Ji <125540670@qq.com> Date: Mon, 2 Sep 2024 12:23:46 +0800 Subject: [PATCH 4/6] =?UTF-8?q?fix(=E5=9C=BA=E6=99=AF=E8=81=94=E5=8A=A8):?= =?UTF-8?q?=20=E4=BF=AE=E5=A4=8D=E9=87=8D=E5=90=AF=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E5=90=8E=EF=BC=8C=E5=9C=BA=E6=99=AF=E8=81=94=E5=8A=A8=E6=9C=AA?= =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E7=9A=84=E9=97=AE=E9=A2=98=20(#566)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/LocalRuleInstanceRepository.java | 19 ++++++++++++++++++- .../engine/service/RuleInstanceService.java | 17 +---------------- 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/jetlinks-manager/rule-engine-manager/src/main/java/org/jetlinks/community/rule/engine/service/LocalRuleInstanceRepository.java b/jetlinks-manager/rule-engine-manager/src/main/java/org/jetlinks/community/rule/engine/service/LocalRuleInstanceRepository.java index 838e372e..548ef82a 100644 --- a/jetlinks-manager/rule-engine-manager/src/main/java/org/jetlinks/community/rule/engine/service/LocalRuleInstanceRepository.java +++ b/jetlinks-manager/rule-engine-manager/src/main/java/org/jetlinks/community/rule/engine/service/LocalRuleInstanceRepository.java @@ -5,9 +5,11 @@ import lombok.extern.slf4j.Slf4j; import org.jetlinks.community.rule.engine.entity.RuleInstanceEntity; import org.jetlinks.community.rule.engine.entity.SceneEntity; import org.jetlinks.community.rule.engine.enums.RuleInstanceState; +import org.jetlinks.rule.engine.api.RuleEngine; import org.jetlinks.rule.engine.api.model.RuleEngineModelParser; import org.jetlinks.rule.engine.cluster.RuleInstance; import org.jetlinks.rule.engine.cluster.RuleInstanceRepository; +import org.springframework.boot.CommandLineRunner; import org.springframework.stereotype.Component; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -17,13 +19,15 @@ import javax.annotation.Nonnull; @Component @AllArgsConstructor @Slf4j -public class LocalRuleInstanceRepository implements RuleInstanceRepository { +public class LocalRuleInstanceRepository implements RuleInstanceRepository, CommandLineRunner { private final RuleInstanceService instanceService; private final SceneService sceneService; private final RuleEngineModelParser parser; + private final RuleEngine ruleEngine; + @Nonnull @Override public Flux findAll() { @@ -71,4 +75,17 @@ public class LocalRuleInstanceRepository implements RuleInstanceRepository { ) ; } + + @Override + public void run(String... args) throws Exception { + this + .findAll() + .flatMap(ruleInstance -> ruleEngine + .startRule(ruleInstance.getId(), ruleInstance.getModel()) + .onErrorResume(err -> { + log.warn("启动规则[{}]失败: {}", ruleInstance.getModel().getName(), ruleInstance); + return Mono.empty(); + })) + .subscribe(); + } } diff --git a/jetlinks-manager/rule-engine-manager/src/main/java/org/jetlinks/community/rule/engine/service/RuleInstanceService.java b/jetlinks-manager/rule-engine-manager/src/main/java/org/jetlinks/community/rule/engine/service/RuleInstanceService.java index 26723f36..9af52754 100644 --- a/jetlinks-manager/rule-engine-manager/src/main/java/org/jetlinks/community/rule/engine/service/RuleInstanceService.java +++ b/jetlinks-manager/rule-engine-manager/src/main/java/org/jetlinks/community/rule/engine/service/RuleInstanceService.java @@ -15,7 +15,6 @@ import org.jetlinks.rule.engine.api.model.RuleEngineModelParser; import org.jetlinks.rule.engine.api.model.RuleModel; import org.reactivestreams.Publisher; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.CommandLineRunner; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import reactor.core.publisher.Flux; @@ -23,7 +22,7 @@ import reactor.core.publisher.Mono; @Service @Slf4j -public class RuleInstanceService extends GenericReactiveCrudService implements CommandLineRunner { +public class RuleInstanceService extends GenericReactiveCrudService { @Autowired private RuleEngine ruleEngine; @@ -78,18 +77,4 @@ public class RuleInstanceService extends GenericReactiveCrudService this - .doStart(e) - .onErrorResume(err -> { - log.warn("启动规则[{}]失败", e.getName(), e); - return Mono.empty(); - })) - .subscribe(); - } } From bf7e19c92ede61394a8a85bef6be2199dc2baa43 Mon Sep 17 00:00:00 2001 From: fighter-wang <118291973+fighter-wang@users.noreply.github.com> Date: Tue, 3 Sep 2024 18:32:39 +0800 Subject: [PATCH 5/6] =?UTF-8?q?fix(=E9=82=AE=E4=BB=B6=E9=80=9A=E7=9F=A5):?= =?UTF-8?q?=20=E4=BC=98=E5=8C=96=E8=8E=B7=E5=8F=96=E9=82=AE=E4=BB=B6?= =?UTF-8?q?=E9=99=84=E4=BB=B6=EF=BC=8C=E8=BF=87=E5=A4=A7=E6=97=B6=E7=9A=84?= =?UTF-8?q?=E6=8A=9B=E9=94=99=E5=9B=BD=E9=99=85=E5=8C=96=20(#568)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(邮件通知): 优化获取邮件附件,过大时的抛错国际化 * fix(邮件通知): 优化使用通用的国际化信息 * fix(邮件通知): 代码优化 --------- Co-authored-by: fighter-wang <11291691+fighter-wang@user.noreply.gitee.com> --- .../notify/email/embedded/DefaultEmailNotifier.java | 9 ++++++++- .../src/main/resources/i18n/messages_en.properties | 1 + .../src/main/resources/i18n/messages_zh.properties | 1 + 3 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 jetlinks-components/notify-component/notify-email/src/main/resources/i18n/messages_en.properties create mode 100644 jetlinks-components/notify-component/notify-email/src/main/resources/i18n/messages_zh.properties diff --git a/jetlinks-components/notify-component/notify-email/src/main/java/org/jetlinks/community/notify/email/embedded/DefaultEmailNotifier.java b/jetlinks-components/notify-component/notify-email/src/main/java/org/jetlinks/community/notify/email/embedded/DefaultEmailNotifier.java index f264e642..bf256d41 100755 --- a/jetlinks-components/notify-component/notify-email/src/main/java/org/jetlinks/community/notify/email/embedded/DefaultEmailNotifier.java +++ b/jetlinks-components/notify-component/notify-email/src/main/java/org/jetlinks/community/notify/email/embedded/DefaultEmailNotifier.java @@ -154,7 +154,14 @@ public class DefaultEmailNotifier extends AbstractNotifier { return Flux .fromIterable(template.getAttachments().entrySet()) - .flatMap(entry -> Mono.zip(Mono.just(entry.getKey()), convertResource(entry.getValue()))) + .flatMap(entry -> Mono + .zip(Mono.just(entry.getKey()), convertResource(entry.getValue())) + .onErrorResume(err -> Mono + .error(() -> new BusinessException.NoStackTrace("error.load_attachment_failed", + 500, + entry.getKey(), + err.getMessage()))) + ) .flatMap(tp2 -> Mono .fromCallable(() -> { //添加附件 diff --git a/jetlinks-components/notify-component/notify-email/src/main/resources/i18n/messages_en.properties b/jetlinks-components/notify-component/notify-email/src/main/resources/i18n/messages_en.properties new file mode 100644 index 00000000..b6c29043 --- /dev/null +++ b/jetlinks-components/notify-component/notify-email/src/main/resources/i18n/messages_en.properties @@ -0,0 +1 @@ +error.load_attachment_failed=load attachment [{0}] failed:{1} \ No newline at end of file diff --git a/jetlinks-components/notify-component/notify-email/src/main/resources/i18n/messages_zh.properties b/jetlinks-components/notify-component/notify-email/src/main/resources/i18n/messages_zh.properties new file mode 100644 index 00000000..ab37a64c --- /dev/null +++ b/jetlinks-components/notify-component/notify-email/src/main/resources/i18n/messages_zh.properties @@ -0,0 +1 @@ +error.load_attachment_failed=\u52A0\u8F7D\u9644\u4EF6[{0}]\u5931\u8D25\uFF1A{1} \ No newline at end of file From 824466037bb23ace9ed7d522531cc5c05c7c822d Mon Sep 17 00:00:00 2001 From: fighter-wang <118291973+fighter-wang@users.noreply.github.com> Date: Fri, 6 Sep 2024 14:55:20 +0800 Subject: [PATCH 6/6] =?UTF-8?q?feat(=E8=8F=9C=E5=8D=95=E7=AE=A1=E7=90=86):?= =?UTF-8?q?=20=E6=96=B0=E5=A2=9E=E6=B8=85=E7=A9=BA=E8=8F=9C=E5=8D=95?= =?UTF-8?q?=E6=8E=88=E6=9D=83=E5=8A=9F=E8=83=BD=20(#570)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: fighter-wang <11291691+fighter-wang@user.noreply.gitee.com> --- .../community/auth/entity/MenuBindEntity.java | 8 ++++++ .../auth/service/MenuGrantService.java | 28 +++++++++++++++++++ .../community/auth/web/MenuController.java | 10 +++++++ 3 files changed, 46 insertions(+) diff --git a/jetlinks-manager/authentication-manager/src/main/java/org/jetlinks/community/auth/entity/MenuBindEntity.java b/jetlinks-manager/authentication-manager/src/main/java/org/jetlinks/community/auth/entity/MenuBindEntity.java index 90829368..4ac1cf40 100644 --- a/jetlinks-manager/authentication-manager/src/main/java/org/jetlinks/community/auth/entity/MenuBindEntity.java +++ b/jetlinks-manager/authentication-manager/src/main/java/org/jetlinks/community/auth/entity/MenuBindEntity.java @@ -49,6 +49,14 @@ public class MenuBindEntity extends GenericEntity { @NotBlank private String menuId; + /** + * @since 2.2 此前数据未记录 + */ + @Schema(description = "菜单拥有者") + @Column(length = 64, updatable = false) + @NotBlank + private String owner; + @Schema(description = "其他配置") @Column @ColumnType(jdbcType = JDBCType.LONGVARCHAR, javaType = String.class) diff --git a/jetlinks-manager/authentication-manager/src/main/java/org/jetlinks/community/auth/service/MenuGrantService.java b/jetlinks-manager/authentication-manager/src/main/java/org/jetlinks/community/auth/service/MenuGrantService.java index 480d1105..53e0e060 100644 --- a/jetlinks-manager/authentication-manager/src/main/java/org/jetlinks/community/auth/service/MenuGrantService.java +++ b/jetlinks-manager/authentication-manager/src/main/java/org/jetlinks/community/auth/service/MenuGrantService.java @@ -1,6 +1,7 @@ package org.jetlinks.community.auth.service; import lombok.AllArgsConstructor; +import org.hswebframework.ezorm.core.param.TermType; import org.hswebframework.ezorm.rdb.mapping.ReactiveRepository; import org.jetlinks.community.auth.entity.MenuBindEntity; import org.jetlinks.community.auth.entity.MenuEntity; @@ -10,6 +11,8 @@ import org.springframework.transaction.annotation.Transactional; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +import java.util.Set; + @Service @AllArgsConstructor public class MenuGrantService { @@ -54,4 +57,29 @@ public class MenuGrantService { .then() ; } + + /** + * 清空菜单授权 + * @param targetType 权限类型 + * @param targetId 权限类型对应的数据ID + * @param owner 菜单所有者 + * @return void + */ + public Mono clearGrant(String targetType, String targetId, Set owner) { + return this + .deleteMenuBind(targetType, targetId, owner) + .then(); + } + + private Mono deleteMenuBind(String targetType, String targetId, Set owner) { + return bindRepository + .createDelete() + .where(MenuBindEntity::getTargetKey, MenuBindEntity.generateTargetKey(targetType, targetId)) + .nest() + //兼容之前数据-未记录owner + .isNull(MenuBindEntity::getOwner) + .when(!owner.isEmpty(), d -> d.or(MenuBindEntity::getOwner, TermType.in, owner)) + .end() + .execute(); + } } diff --git a/jetlinks-manager/authentication-manager/src/main/java/org/jetlinks/community/auth/web/MenuController.java b/jetlinks-manager/authentication-manager/src/main/java/org/jetlinks/community/auth/web/MenuController.java index ec9614dd..fdde380a 100755 --- a/jetlinks-manager/authentication-manager/src/main/java/org/jetlinks/community/auth/web/MenuController.java +++ b/jetlinks-manager/authentication-manager/src/main/java/org/jetlinks/community/auth/web/MenuController.java @@ -31,6 +31,7 @@ import org.springframework.web.bind.annotation.*; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +import java.util.Collections; import java.util.List; import java.util.function.Function; @@ -183,6 +184,15 @@ public class MenuController implements ReactiveServiceCrudController cleargrant(@PathVariable String targetType, + @PathVariable String targetId, + @PathVariable String owner) { + return grantService.clearGrant(targetType, targetId, Collections.singleton(owner)); + } + @PutMapping("/_batch/_grant") @Operation(summary = "对菜单批量进行授权") @ResourceAction(id = "grant", name = "授权")