MenuController.java 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. package com.izouma.awesomeAdmin.web;
  2. import com.izouma.awesomeAdmin.domain.BaseEntity;
  3. import com.izouma.awesomeAdmin.domain.Menu;
  4. import com.izouma.awesomeAdmin.enums.AuthorityName;
  5. import com.izouma.awesomeAdmin.repo.MenuRepo;
  6. import com.izouma.awesomeAdmin.security.Authority;
  7. import lombok.AllArgsConstructor;
  8. import org.apache.commons.lang3.StringUtils;
  9. import org.springframework.data.jpa.domain.Specification;
  10. import org.springframework.security.access.prepost.PreAuthorize;
  11. import org.springframework.security.core.Authentication;
  12. import org.springframework.security.core.GrantedAuthority;
  13. import org.springframework.security.core.context.SecurityContextHolder;
  14. import org.springframework.web.bind.annotation.*;
  15. import javax.persistence.criteria.Predicate;
  16. import java.util.ArrayList;
  17. import java.util.Comparator;
  18. import java.util.List;
  19. import java.util.Map;
  20. import java.util.stream.Collectors;
  21. @RestController
  22. @RequestMapping("/menu")
  23. @AllArgsConstructor
  24. public class MenuController extends BaseController {
  25. private final MenuRepo menuRepo;
  26. @GetMapping("/userMenu")
  27. public List<Menu> userMenu() {
  28. Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
  29. List<Menu> menuList = menuRepo.authorityMenus(authentication.getAuthorities()
  30. .stream()
  31. .map(GrantedAuthority::getAuthority)
  32. .collect(Collectors.toList()))
  33. .stream()
  34. .map(Menu::from)
  35. .collect(Collectors.toList());
  36. List<Menu> root = new ArrayList<>();
  37. for (Menu menu : menuList) {
  38. if (menu.getRoot()) {
  39. root.add(menu);
  40. } else {
  41. Menu parent = menuList.stream().filter(m -> m.getId().equals(menu.getParent())).findAny().orElse(null);
  42. if (parent != null) {
  43. if (parent.getChildren() == null) {
  44. parent.setChildren(new ArrayList<>());
  45. }
  46. parent.getChildren().add(menu);
  47. }
  48. }
  49. }
  50. sortMenu(root);
  51. return root;
  52. }
  53. @GetMapping("/authority/{name}/get")
  54. public List<Long> getAuthorityMenus(@PathVariable String name) {
  55. return menuRepo.findAll((Specification<Menu>) (root, criteriaQuery, criteriaBuilder) -> {
  56. List<Predicate> predicates = new ArrayList<>();
  57. predicates.add(criteriaBuilder.isMember(Authority.get(AuthorityName.valueOf(name)), root.get("authorities")));
  58. return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
  59. }).stream().map(BaseEntity::getId).collect(Collectors.toList());
  60. }
  61. @PostMapping("/authority/{name}/save")
  62. public void saveAuthorityMenus(@PathVariable String name, @RequestBody List<Long> ids) {
  63. menuRepo.clearAuthority(name);
  64. ids.stream().parallel().forEach(id -> menuRepo.saveAuthority(name, id));
  65. }
  66. @PreAuthorize("hasRole('ADMIN')")
  67. @GetMapping("/all")
  68. public List<Menu> all(String category) {
  69. List<Menu> menuList = menuRepo.findAll((Specification<Menu>) (root, criteriaQuery, criteriaBuilder) -> {
  70. List<Predicate> predicates = new ArrayList<>();
  71. predicates.add(criteriaBuilder.equal(root.get("root"), true));
  72. if (StringUtils.isNotBlank(category)) {
  73. predicates.add(criteriaBuilder.equal(root.get("category"), category));
  74. }
  75. return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
  76. });
  77. sortMenu(menuList);
  78. return menuList;
  79. }
  80. @PreAuthorize("hasRole('ADMIN')")
  81. @PostMapping("/save")
  82. public Menu save(@RequestBody Menu menu) {
  83. if (menu.getSort() == null) {
  84. menu.setSort(menuRepo.nextSort());
  85. }
  86. menuRepo.save(menu);
  87. return menu;
  88. }
  89. @PreAuthorize("hasRole('ADMIN')")
  90. @GetMapping("/groupByCategory")
  91. public Map<String, List<Menu>> groupByCategory() {
  92. return menuRepo.findAll().stream()
  93. .filter(menu -> menu.getCategory() != null)
  94. .collect(Collectors.groupingBy(Menu::getCategory));
  95. }
  96. @PreAuthorize("hasRole('ADMIN')")
  97. @GetMapping("/categories")
  98. public List<String> categories() {
  99. return menuRepo.categories().stream().filter(StringUtils::isNotBlank).collect(Collectors.toList());
  100. }
  101. private void sortMenu(List<Menu> menus) {
  102. menus.sort(Comparator.comparingInt(Menu::getSort));
  103. for (Menu menu : menus) {
  104. if (menu.getChildren() != null) {
  105. sortMenu(menu.getChildren());
  106. }
  107. }
  108. }
  109. }