Browse Source

fix(接口缺失): 添加菜单和权限数据验证接口 (#245)

bestfeng1020 2 years ago
parent
commit
d2262e278a

+ 28 - 0
jetlinks-manager/authentication-manager/src/main/java/org/jetlinks/community/auth/web/MenuController.java

@@ -15,8 +15,10 @@ import org.hswebframework.web.authorization.annotation.*;
 import org.hswebframework.web.authorization.exception.UnAuthorizedException;
 import org.hswebframework.web.crud.service.ReactiveCrudService;
 import org.hswebframework.web.crud.web.reactive.ReactiveServiceCrudController;
+import org.hswebframework.web.exception.ValidationException;
 import org.hswebframework.web.i18n.LocaleUtils;
 import org.hswebframework.web.system.authorization.defaults.service.DefaultPermissionService;
+import org.hswebframework.web.validator.CreateGroup;
 import org.jetlinks.community.auth.configuration.MenuProperties;
 import org.jetlinks.community.auth.entity.MenuEntity;
 import org.jetlinks.community.auth.entity.MenuView;
@@ -24,6 +26,7 @@ import org.jetlinks.community.auth.service.DefaultMenuService;
 import org.jetlinks.community.auth.service.MenuGrantService;
 import org.jetlinks.community.auth.service.request.MenuGrantRequest;
 import org.jetlinks.community.auth.web.request.AuthorizationSettingDetail;
+import org.jetlinks.community.web.response.ValidationResult;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
 import reactor.core.publisher.Flux;
@@ -263,6 +266,31 @@ public class MenuController implements ReactiveServiceCrudController<MenuEntity,
             );
     }
 
+
+    @GetMapping("/code/_validate")
+    @QueryAction
+    @Operation(summary = "验证菜单编码是否合法", description = "同一所有者的相同应用下的菜单,编码不能重复")
+    public Mono<ValidationResult> codeValidate(@RequestParam @Parameter(description = "菜单编码") String code,
+                                               @RequestParam(required = false)
+                                               @Parameter(description = "外部菜单所属应用ID") String appId,
+                                               @RequestParam @Parameter(description = "菜单所有者") String owner) {
+        return LocaleUtils.currentReactive()
+                          .flatMap(locale -> {
+                              MenuEntity entity = new MenuEntity();
+                              entity.setCode(code);
+                              entity.setOwner(owner);
+                              entity.tryValidate("code", CreateGroup.class);
+
+                              return defaultMenuService
+                                  .findById(entity.getId())
+                                  .map(menu -> ValidationResult
+                                      .error(LocaleUtils.resolveMessage("error.id_already_exists", locale)));
+                          })
+                          .defaultIfEmpty(ValidationResult.success())
+                          .onErrorResume(ValidationException.class, e -> Mono.just(e.getI18nCode())
+                                                                             .map(ValidationResult::error));
+    }
+
     private Mono<AuthorizationSettingDetail> getAuthorizationSettingDetail(Flux<MenuView> menus) {
         return Mono
             .zip(menus

+ 56 - 0
jetlinks-manager/authentication-manager/src/main/java/org/jetlinks/community/auth/web/PermissionController.java

@@ -0,0 +1,56 @@
+package org.jetlinks.community.auth.web;
+
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.AllArgsConstructor;
+import org.hswebframework.web.authorization.annotation.Authorize;
+import org.hswebframework.web.authorization.annotation.QueryAction;
+import org.hswebframework.web.authorization.annotation.Resource;
+import org.hswebframework.web.exception.ValidationException;
+import org.hswebframework.web.i18n.LocaleUtils;
+import org.hswebframework.web.system.authorization.api.entity.PermissionEntity;
+import org.hswebframework.web.system.authorization.defaults.service.DefaultPermissionService;
+import org.hswebframework.web.validator.CreateGroup;
+import org.jetlinks.community.web.response.ValidationResult;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import reactor.core.publisher.Mono;
+
+/**
+ * 权限管理.
+ *
+ * @author zhangji 2022/12/23
+ */
+@RestController
+@RequestMapping("/permission")
+@Authorize
+@Resource(id = "permission", name = "权限管理", group = "system")
+@Tag(name = "权限管理")
+@AllArgsConstructor
+public class PermissionController {
+
+    private final DefaultPermissionService permissionService;
+
+    @GetMapping("/id/_validate")
+    @QueryAction
+    @Operation(summary = "验证权限ID是否合法")
+    public Mono<ValidationResult> permissionIdValidate2(@RequestParam @Parameter(description = "权限ID") String id) {
+        return LocaleUtils.currentReactive()
+            .flatMap(locale -> {
+                PermissionEntity entity = new PermissionEntity();
+                entity.setId(id);
+                entity.tryValidate("id", CreateGroup.class);
+
+                return permissionService
+                    .findById(id)
+                    .map(permission -> ValidationResult
+                        .error(LocaleUtils.resolveMessage("error.id_already_exists", locale)));
+            })
+            .defaultIfEmpty(ValidationResult.success())
+            .onErrorResume(ValidationException.class, e -> Mono.just(e.getI18nCode())
+                .map(ValidationResult::error));
+    }
+}