refactor: reformat code(menu)

This commit is contained in:
shinmj
2021-12-30 15:36:03 +09:00
parent de4fb43472
commit 016cb069a9
14 changed files with 315 additions and 211 deletions

View File

@@ -1,5 +1,6 @@
package org.egovframe.cloud.portalservice.api.menu.dto; package org.egovframe.cloud.portalservice.api.menu.dto;
import java.util.Objects;
import lombok.Builder; import lombok.Builder;
import lombok.Getter; import lombok.Getter;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
@@ -50,4 +51,8 @@ public class MenuDnDRequestDto {
this.icon = icon; this.icon = icon;
this.children = children == null ? null : new ArrayList<>(children); this.children = children == null ? null : new ArrayList<>(children);
} }
public boolean hasParentId() {
return Objects.nonNull(parentId);
}
} }

View File

@@ -1,6 +1,7 @@
package org.egovframe.cloud.portalservice.api.menu.dto; package org.egovframe.cloud.portalservice.api.menu.dto;
import java.util.Objects;
import lombok.Builder; import lombok.Builder;
import lombok.Getter; import lombok.Getter;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
@@ -56,4 +57,8 @@ public class MenuRoleRequestDto {
this.level = level; this.level = level;
this.children = children == null ? null : new ArrayList<>(children); this.children = children == null ? null : new ArrayList<>(children);
} }
public boolean hasMenuRoleId() {
return Objects.nonNull(menuRoleId);
}
} }

View File

@@ -1,5 +1,6 @@
package org.egovframe.cloud.portalservice.api.menu.dto; package org.egovframe.cloud.portalservice.api.menu.dto;
import java.util.Optional;
import lombok.Getter; import lombok.Getter;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.ToString; import lombok.ToString;
@@ -54,20 +55,21 @@ public class MenuRoleResponseDto {
*/ */
public MenuRoleResponseDto (Menu menu, String roleId) { public MenuRoleResponseDto (Menu menu, String roleId) {
MenuRole menuRole = menu.getMenuRole(roleId); Optional<MenuRole> menuRole = menu.getMenuRole(roleId);
if (menuRole == null) {
this.isChecked = false; this.isChecked = false;
this.roleId = roleId; this.roleId = roleId;
}else {
this.menuRoleId = menuRole.getId(); if (menuRole.isPresent()) {
this.roleId = menuRole.getRoleId(); this.menuRoleId = menuRole.get().getId();
this.roleId = menuRole.get().getRoleId();
this.isChecked = true; this.isChecked = true;
} }
this.id = menu.getId(); this.id = menu.getId();
this.korName = menu.getMenuKorName(); this.korName = menu.getMenuKorName();
this.engName = menu.getMenuEngName(); this.engName = menu.getMenuEngName();
if (menu.getParent() != null) { if (menu.hasParent()) {
this.parentId = menu.getParent().getId(); this.parentId = menu.getParent().getId();
} }

View File

@@ -1,5 +1,7 @@
package org.egovframe.cloud.portalservice.api.menu.dto; package org.egovframe.cloud.portalservice.api.menu.dto;
import java.util.Objects;
import java.util.Optional;
import lombok.Getter; import lombok.Getter;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.ToString; import lombok.ToString;
@@ -7,6 +9,7 @@ import org.egovframe.cloud.portalservice.domain.menu.Menu;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import org.egovframe.cloud.portalservice.domain.menu.MenuRole;
/** /**
* org.egovframe.cloud.portalservice.api.menu.dto.MenuSideResponseDto * org.egovframe.cloud.portalservice.api.menu.dto.MenuSideResponseDto
@@ -65,8 +68,8 @@ public class MenuSideResponseDto {
this.isShow = menu.getIsShow(); this.isShow = menu.getIsShow();
this.children = menu.getChildren().stream() this.children = menu.getChildren().stream()
.filter(children -> children.getIsUse()) .filter(Menu::getIsUse)
.filter(children -> children.getMenuRole(roleId) != null) .filter(children -> children.getMenuRole(roleId).isPresent())
.map(children -> new MenuSideResponseDto(children, roleId)) .map(children -> new MenuSideResponseDto(children, roleId))
.collect(Collectors.toList()); .collect(Collectors.toList());
} }
@@ -79,4 +82,12 @@ public class MenuSideResponseDto {
public void setUrlPath(String urlPath) { public void setUrlPath(String urlPath) {
this.urlPath = urlPath; this.urlPath = urlPath;
} }
public boolean hasChildren() {
return Objects.nonNull(children) || children.size() > 0;
}
public boolean isRequiredUrlPath() {
return "board".equals(menuType) || "contents".equals(menuType);
}
} }

View File

@@ -1,5 +1,7 @@
package org.egovframe.cloud.portalservice.api.menu.dto; package org.egovframe.cloud.portalservice.api.menu.dto;
import java.util.Objects;
import java.util.Optional;
import lombok.Builder; import lombok.Builder;
import lombok.Getter; import lombok.Getter;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
@@ -8,6 +10,7 @@ import org.egovframe.cloud.portalservice.domain.menu.Menu;
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import org.egovframe.cloud.portalservice.domain.menu.Site;
/** /**
* org.egovframe.cloud.portalservice.api.menu.dto.MenuTreeRequestDto * org.egovframe.cloud.portalservice.api.menu.dto.MenuTreeRequestDto
@@ -48,4 +51,16 @@ public class MenuTreeRequestDto {
this.isShow = isShow; this.isShow = isShow;
this.isUse = isUse; this.isUse = isUse;
} }
public Menu toEntity(Optional<Menu> parent, Site site) {
return Menu.builder()
.parent(parent)
.site(site)
.menuKorName(name)
.sortSeq(sortSeq)
.level(level)
.isShow(isShow)
.isUse(isUse)
.build();
}
} }

View File

@@ -1,11 +1,14 @@
package org.egovframe.cloud.portalservice.api.menu.dto; package org.egovframe.cloud.portalservice.api.menu.dto;
import java.util.Objects;
import lombok.Builder; import lombok.Builder;
import lombok.Getter; import lombok.Getter;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.ToString; import lombok.ToString;
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotBlank;
import org.egovframe.cloud.common.exception.BusinessMessageException;
import org.springframework.util.StringUtils;
/** /**
* org.egovframe.cloud.portalservice.api.menu.dto.MenuUpdateRequestDto * org.egovframe.cloud.portalservice.api.menu.dto.MenuUpdateRequestDto
@@ -58,4 +61,18 @@ public class MenuUpdateRequestDto {
this.description = description; this.description = description;
this.icon = icon; this.icon = icon;
} }
public boolean hasConnectId() {
if ("contents".equals(menuType) || "board".equals(menuType)) {
return Objects.nonNull(connectId);
}
return true;
}
public boolean hasUrlPath() {
if ("inside".equals(menuType) || "outside".equals(menuType)) {
return Objects.nonNull(urlPath) || StringUtils.hasText(urlPath);
}
return true;
}
} }

View File

@@ -1,5 +1,7 @@
package org.egovframe.cloud.portalservice.domain.menu; package org.egovframe.cloud.portalservice.domain.menu;
import java.util.Objects;
import java.util.Optional;
import lombok.Builder; import lombok.Builder;
import lombok.Getter; import lombok.Getter;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
@@ -96,14 +98,16 @@ public class Menu extends BaseEntity {
@Builder @Builder
public Menu(String menuKorName, Menu parent, Integer sortSeq, Site site, Integer level, Boolean isUse, Boolean isShow) { public Menu(String menuKorName, Optional<Menu> parent, Integer sortSeq, Site site, Integer level, Boolean isUse, Boolean isShow) {
this.menuKorName = menuKorName; this.menuKorName = menuKorName;
this.parent = parent;
this.sortSeq = sortSeq; this.sortSeq = sortSeq;
this.site = site; this.site = site;
this.level = level; this.level = level;
this.isShow = isShow; this.isShow = isShow;
this.isUse = isUse; this.isUse = isUse;
if (Objects.nonNull(parent)) {
parent.ifPresent(it -> this.parent = it);
}
} }
/** /**
@@ -124,11 +128,11 @@ public class Menu extends BaseEntity {
* @param sortSeq * @param sortSeq
* @return * @return
*/ */
public Menu updateDnD(Menu parent, Integer sortSeq, Integer level) { public Menu updateDnD(Optional<Menu> parent, Integer sortSeq, Integer level) {
this.sortSeq = sortSeq; this.sortSeq = sortSeq;
this.level = level; this.level = level;
if (parent == null) { if (!parent.isPresent()) {
return updateOldParent(); return updateOldParent();
} }
@@ -136,22 +140,21 @@ public class Menu extends BaseEntity {
return this; return this;
} }
this.parent = parent; this.parent = parent.get();
parent.getChildren().add(this); parent.get().getChildren().add(this);
return this; return this;
} }
private Menu updateOldParent() { private Menu updateOldParent() {
Menu oldParent = this.getParent(); if (Objects.isNull(this.parent)) {
if (oldParent == null) {
return this; return this;
} }
Menu old = oldParent.getChildren().stream().filter(item -> item.getId().equals(this.id)).findAny().orElse(null); Optional<Menu> oldMenu = this.parent.getChildren().stream()
if (old != null) { .filter(it -> it.getId().equals(this.id))
oldParent.getChildren().remove(old); .findAny();
}
oldMenu.ifPresent(it -> this.parent.getChildren().remove(it));
this.parent = null; this.parent = null;
return this; return this;
} }
@@ -195,12 +198,16 @@ public class Menu extends BaseEntity {
* @param roleId * @param roleId
* @return * @return
*/ */
public MenuRole getMenuRole(String roleId) { public Optional<MenuRole> getMenuRole(String roleId) {
return this.getMenuRoles() return this.getMenuRoles()
.stream() .stream()
.filter(menuRole -> .filter(menuRole ->
menuRole.getRoleId().equals(roleId)) menuRole.getRoleId().equals(roleId))
.findAny().orElse(null); .findAny();
}
public boolean hasParent() {
return Objects.nonNull(this.parent);
} }
} }

View File

@@ -1,5 +1,9 @@
package org.egovframe.cloud.portalservice.service.menu; package org.egovframe.cloud.portalservice.service.menu;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.egovframe.cloud.common.exception.EntityNotFoundException; import org.egovframe.cloud.common.exception.EntityNotFoundException;
@@ -9,11 +13,13 @@ import org.egovframe.cloud.portalservice.api.menu.dto.MenuRoleResponseDto;
import org.egovframe.cloud.portalservice.api.menu.dto.MenuSideResponseDto; import org.egovframe.cloud.portalservice.api.menu.dto.MenuSideResponseDto;
import org.egovframe.cloud.portalservice.client.BoardServiceClient; import org.egovframe.cloud.portalservice.client.BoardServiceClient;
import org.egovframe.cloud.portalservice.client.dto.BoardResponseDto; import org.egovframe.cloud.portalservice.client.dto.BoardResponseDto;
import org.egovframe.cloud.portalservice.domain.menu.*; import org.egovframe.cloud.portalservice.domain.menu.Menu;
import org.egovframe.cloud.portalservice.domain.menu.MenuRepository;
import org.egovframe.cloud.portalservice.domain.menu.MenuRole;
import org.egovframe.cloud.portalservice.domain.menu.MenuRoleRepository;
import org.egovframe.cloud.portalservice.domain.user.Role; import org.egovframe.cloud.portalservice.domain.user.Role;
import org.springframework.cloud.client.circuitbreaker.CircuitBreaker; import org.springframework.cloud.client.circuitbreaker.CircuitBreaker;
import org.springframework.cloud.client.circuitbreaker.CircuitBreakerFactory; import org.springframework.cloud.client.circuitbreaker.CircuitBreakerFactory;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.security.authentication.AnonymousAuthenticationToken; import org.springframework.security.authentication.AnonymousAuthenticationToken;
import org.springframework.security.core.Authentication; import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.GrantedAuthority;
@@ -21,9 +27,6 @@ import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.stream.Collectors;
/** /**
* org.egovframe.cloud.portalservice.service.menu.MenuRoleService * org.egovframe.cloud.portalservice.service.menu.MenuRoleService
* <p> * <p>
@@ -63,55 +66,6 @@ public class MenuRoleService extends AbstractService {
return menuRoleRepository.findTree(roleId, siteId); return menuRoleRepository.findTree(roleId, siteId);
} }
/**
* 권한별 메뉴 저장
* children 데이터 재귀 호출
* checked 인 경우 저장
* unchecked 인 경우 삭제
*
* @param menuRoleRequestDto
*/
private void recursiveSave( MenuRoleRequestDto menuRoleRequestDto) {
if (menuRoleRequestDto.getIsChecked()) {
// checked 인 경우 menuRole 저장
Menu menu = menuRepository.findById(menuRoleRequestDto.getId())
.orElseThrow(() -> new EntityNotFoundException(getMessage("valid.notexists.format", new Object[]{getMessage("menu")}) + " ID= " + menuRoleRequestDto.getId()));
if (menuRoleRequestDto.getMenuRoleId() == null) {
MenuRole menuRole = MenuRole.builder()
.roleId(menuRoleRequestDto.getRoleId())
.menu(menu)
.build();
menuRole.setMenu(menu);
menuRoleRepository.save(menuRole);
}else {
MenuRole menuRole = menuRoleRepository.findById(menuRoleRequestDto.getMenuRoleId()).orElse(null);
if (menuRole != null) {
menuRole.setMenu(menu);
}
}
} else {
//unchecked 인 경우 menurole 삭제
if (menuRoleRequestDto.getMenuRoleId() != null) {
MenuRole menuRole = menuRoleRepository.findById(menuRoleRequestDto.getMenuRoleId()).orElse(null);
if (menuRole != null) {
menuRoleRepository.delete(menuRole);
}
}
}
if (menuRoleRequestDto.getChildren() == null || menuRoleRequestDto.getChildren().size() <= 0) {
return;
}
for (int i = 0; i < menuRoleRequestDto.getChildren().size(); i++) {
MenuRoleRequestDto child = menuRoleRequestDto.getChildren().get(i);
recursiveSave( child);
}
}
/** /**
* 권한별 메뉴 저장 * 권한별 메뉴 저장
* *
@@ -128,55 +82,6 @@ public class MenuRoleService extends AbstractService {
return "Success"; return "Success";
} }
/**
* 계층구조 메뉴 조회
* 로그인 사용자의 권한으로 조회하고
* 로그인 사용자가 없는 경우 손님(ROLE_ANONYMOUS) 로 조회한다.
*
* @param siteId
* @return
*/
private List<MenuSideResponseDto> findMenu(Long siteId) {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (authentication == null || !authentication.isAuthenticated() || authentication instanceof AnonymousAuthenticationToken) {
return menuRoleRepository.findMenu(Role.ANONYMOUS.getKey(), siteId);
}
String role = authentication.getAuthorities().stream().map(GrantedAuthority::toString).collect(Collectors.toList()).get(0);
return menuRoleRepository.findMenu(role, siteId);
}
/**
* 메뉴 유형이 게시판인 경우
* 해당 게시판의 스킨타입으로 url을 만들어 준다.
*
* @param menuSideResponseDto
*/
private void recursiveSetUrlPath(MenuSideResponseDto menuSideResponseDto) {
if (menuSideResponseDto.getConnectId() != null) {
if ("board".equals(menuSideResponseDto.getMenuType())) {
//connectid 로 board 조회
//board 의 skinTypeCode로 url 지정
// BoardResponseDto board = boardServiceClient.findById(menuSideResponseDto.getConnectId());
CircuitBreaker circuitBreaker = circuitBreakerFactory.create("board");
BoardResponseDto board = circuitBreaker.run(() ->
boardServiceClient.findById(menuSideResponseDto.getConnectId()),
throwable -> new BoardResponseDto());
menuSideResponseDto.setUrlPath("/board/"+board.getSkinTypeCode()+"/"+menuSideResponseDto.getConnectId());
} else if ("contents".equals(menuSideResponseDto.getMenuType())) {
menuSideResponseDto.setUrlPath("/content/"+menuSideResponseDto.getConnectId());
}
}
if (menuSideResponseDto.getChildren() == null || menuSideResponseDto.getChildren().size() <= 0) {
return;
}
for (int i = 0; i < menuSideResponseDto.getChildren().size(); i++) {
MenuSideResponseDto child = menuSideResponseDto.getChildren().get(i);
recursiveSetUrlPath(child);
}
}
/** /**
* 로그인한 사용자의 권한에 맞는 메뉴 조회 * 로그인한 사용자의 권한에 맞는 메뉴 조회
@@ -193,4 +98,133 @@ public class MenuRoleService extends AbstractService {
return menuSideResponseDtoList; return menuSideResponseDtoList;
} }
/**
* 계층구조 메뉴 조회 로그인 사용자의 권한으로 조회하고 로그인 사용자가 없는 경우 손님(ROLE_ANONYMOUS) 로 조회한다.
*
* @param siteId
* @return
*/
private List<MenuSideResponseDto> findMenu(Long siteId) {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (authentication == null || !authentication.isAuthenticated()
|| authentication instanceof AnonymousAuthenticationToken) {
return menuRoleRepository.findMenu(Role.ANONYMOUS.getKey(), siteId);
}
String role = authentication.getAuthorities().stream()
.map(GrantedAuthority::toString)
.collect(Collectors.toList())
.get(0);
return menuRoleRepository.findMenu(role, siteId);
}
/**
* 메뉴 유형이 게시판인 경우 해당 게시판의 스킨타입으로 url을 만들어 준다.
*
* @param menuSideResponseDto
*/
private void recursiveSetUrlPath(MenuSideResponseDto menuSideResponseDto) {
if (Objects.nonNull(menuSideResponseDto.getConnectId()) &&
menuSideResponseDto.isRequiredUrlPath()) {
menuSideResponseDto.setUrlPath(getUrlPath(menuSideResponseDto));
}
if (!menuSideResponseDto.hasChildren()) {
return;
}
for (MenuSideResponseDto child : menuSideResponseDto.getChildren()) {
recursiveSetUrlPath(child);
}
}
/**
* 권한별 메뉴 저장 children 데이터 재귀 호출 checked 인 경우 저장 unchecked 인 경우 삭제
*
* @param menuRoleRequestDto
*/
private void recursiveSave(MenuRoleRequestDto menuRoleRequestDto) {
saveMenu(menuRoleRequestDto);
if (Objects.isNull(menuRoleRequestDto.getChildren())
|| menuRoleRequestDto.getChildren().size() <= 0) {
return;
}
for (int i = 0; i < menuRoleRequestDto.getChildren().size(); i++) {
MenuRoleRequestDto child = menuRoleRequestDto.getChildren().get(i);
recursiveSave(child);
}
}
/**
* urlPath 설정
*
* @param responseDto
* @return
*/
private String getUrlPath(MenuSideResponseDto responseDto) {
if ("contents".equals(responseDto.getMenuType())) {
return "/content/" + responseDto.getConnectId();
}
CircuitBreaker circuitBreaker = circuitBreakerFactory.create("board");
BoardResponseDto board = circuitBreaker.run(() ->
boardServiceClient.findById(responseDto.getConnectId()),
throwable -> new BoardResponseDto());
return "/board/" + board.getSkinTypeCode() + "/" + responseDto.getConnectId();
}
private Menu findMenuById(Long id) {
return menuRepository.findById(id)
.orElseThrow(() -> new EntityNotFoundException(
getMessage("valid.notexists.format", new Object[]{getMessage("menu")}) + " ID= "
+ id));
}
/**
* menuRole 저장
*
* @param menuRoleRequestDto
*/
private void saveMenu(MenuRoleRequestDto menuRoleRequestDto) {
if (menuRoleRequestDto.getIsChecked()) {
saveCheckedMenu(menuRoleRequestDto);
return;
}
//unchecked 인 경우 menurole 삭제
if (menuRoleRequestDto.hasMenuRoleId()) {
Optional<MenuRole> menuRole = menuRoleRepository
.findById(menuRoleRequestDto.getMenuRoleId());
menuRole.ifPresent(it -> menuRoleRepository.delete(it));
}
}
/**
* checked 인 경우 menuRole 저장
*
* @param menuRoleRequestDto
*/
private void saveCheckedMenu(MenuRoleRequestDto menuRoleRequestDto) {
Menu menu = findMenuById(menuRoleRequestDto.getId());
if (!menuRoleRequestDto.hasMenuRoleId()) {
MenuRole menuRole = MenuRole.builder()
.roleId(menuRoleRequestDto.getRoleId())
.menu(menu)
.build();
menuRole.setMenu(menu);
menuRoleRepository.save(menuRole);
return;
}
Optional<MenuRole> menuRole = menuRoleRepository
.findById(menuRoleRequestDto.getMenuRoleId());
menuRole.ifPresent(it -> it.setMenu(menu));
}
} }

View File

@@ -1,12 +1,18 @@
package org.egovframe.cloud.portalservice.service.menu; package org.egovframe.cloud.portalservice.service.menu;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.egovframe.cloud.common.exception.BusinessException;
import org.egovframe.cloud.common.exception.BusinessMessageException; import org.egovframe.cloud.common.exception.BusinessMessageException;
import org.egovframe.cloud.common.exception.EntityNotFoundException; import org.egovframe.cloud.common.exception.EntityNotFoundException;
import org.egovframe.cloud.common.service.AbstractService; import org.egovframe.cloud.common.service.AbstractService;
import org.egovframe.cloud.portalservice.api.menu.dto.*; import org.egovframe.cloud.portalservice.api.menu.dto.MenuDnDRequestDto;
import org.egovframe.cloud.portalservice.api.menu.dto.MenuResponseDto;
import org.egovframe.cloud.portalservice.api.menu.dto.MenuTreeRequestDto;
import org.egovframe.cloud.portalservice.api.menu.dto.MenuTreeResponseDto;
import org.egovframe.cloud.portalservice.api.menu.dto.MenuUpdateRequestDto;
import org.egovframe.cloud.portalservice.domain.menu.Menu; import org.egovframe.cloud.portalservice.domain.menu.Menu;
import org.egovframe.cloud.portalservice.domain.menu.MenuRepository; import org.egovframe.cloud.portalservice.domain.menu.MenuRepository;
import org.egovframe.cloud.portalservice.domain.menu.Site; import org.egovframe.cloud.portalservice.domain.menu.Site;
@@ -14,8 +20,6 @@ import org.egovframe.cloud.portalservice.domain.menu.SiteRepository;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/** /**
* org.egovframe.cloud.portalservice.service.menu.MenuService * org.egovframe.cloud.portalservice.service.menu.MenuService
* <p> * <p>
@@ -71,25 +75,11 @@ public class MenuService extends AbstractService {
* @return * @return
*/ */
public MenuTreeResponseDto save(MenuTreeRequestDto menuTreeRequestDto) { public MenuTreeResponseDto save(MenuTreeRequestDto menuTreeRequestDto) {
Site site = siteRepository.findById(menuTreeRequestDto.getSiteId()) Site site = findSite(menuTreeRequestDto.getSiteId());
.orElseThrow(() ->
new EntityNotFoundException(getMessage("valid.notexists.format", new Object[]{getMessage("menu.site")}) + " ID= " + menuTreeRequestDto.getSiteId()));
Menu parent = null; Optional<Menu> parentMenu = findParentMenu(menuTreeRequestDto.getParentId());
if (menuTreeRequestDto.getParentId() != null) { Menu menu = menuRepository.save(menuTreeRequestDto.toEntity(parentMenu, site));
parent = findById(menuTreeRequestDto.getParentId());
}
Menu menu = menuRepository.save(Menu.builder()
.parent(parent)
.site(site)
.menuKorName(menuTreeRequestDto.getName())
.sortSeq(menuTreeRequestDto.getSortSeq())
.level(menuTreeRequestDto.getLevel())
.isShow(menuTreeRequestDto.getIsShow())
.isUse(menuTreeRequestDto.getIsUse())
.build());
return MenuTreeResponseDto.builder() return MenuTreeResponseDto.builder()
.entity(menu).build(); .entity(menu).build();
} }
@@ -120,20 +110,7 @@ public class MenuService extends AbstractService {
public MenuResponseDto update(Long menuId, MenuUpdateRequestDto updateRequestDto) throws EntityNotFoundException, BusinessMessageException { public MenuResponseDto update(Long menuId, MenuUpdateRequestDto updateRequestDto) throws EntityNotFoundException, BusinessMessageException {
Menu menu = findById(menuId); Menu menu = findById(menuId);
//컨텐츠 or 게시판인 경우 connectId 필수 validateUpdate(updateRequestDto);
if ("contents".equals(updateRequestDto.getMenuType()) || "board".equals(updateRequestDto.getMenuType())) {
if (updateRequestDto.getConnectId() == null || updateRequestDto.getConnectId().equals("")) {
//컨텐츠 or 게시판을 선택해 주세요
throw new BusinessMessageException(getMessage("valid.selection.format", new Object[]{updateRequestDto.getMenuTypeName()}));
}
}else if ("inside".equals(updateRequestDto.getMenuType()) || "outside".equals(updateRequestDto.getMenuType())) {
// 내부링크 or 외부링크인 경우 링크 url 필수
if (updateRequestDto.getUrlPath() == null || updateRequestDto.getUrlPath().equals("")) {
//링크 Url 값은 필수 입니다.
throw new BusinessMessageException(getMessage("valid.required", new Object[]{getMessage("menu.url_path")}));
}
}
menu.updateDetail(updateRequestDto); menu.updateDetail(updateRequestDto);
@@ -147,31 +124,7 @@ public class MenuService extends AbstractService {
* @param menuId * @param menuId
*/ */
public void delete(Long menuId) { public void delete(Long menuId) {
Menu menu = findById(menuId); menuRepository.delete(findById(menuId));
menuRepository.delete(menu);
}
/**
* 트리 드래그 앤드 드랍 시 children 데이터 재귀호출 저장
*
* @param dto
* @param parent
* @param sortSeq
* @param level
*/
private void recursive(MenuDnDRequestDto dto, Menu parent, Integer sortSeq, Integer level) {
Menu menu = findById(dto.getMenuId());
menu.updateDnD(parent, sortSeq, level);
if (dto.getChildren() == null || dto.getChildren().size() <= 0) {
return;
}
for (int i = 0; i < dto.getChildren().size(); i++) {
MenuDnDRequestDto child = dto.getChildren().get(i);
recursive(child, menu, child.getSortSeq(), menu.getLevel()+1);
}
} }
/** /**
@@ -184,18 +137,71 @@ public class MenuService extends AbstractService {
public Long updateDnD(Long siteId, List<MenuDnDRequestDto> menuDnDRequestDtoList) { public Long updateDnD(Long siteId, List<MenuDnDRequestDto> menuDnDRequestDtoList) {
for (int i = 0; i < menuDnDRequestDtoList.size(); i++) { for (int i = 0; i < menuDnDRequestDtoList.size(); i++) {
MenuDnDRequestDto requestDto = menuDnDRequestDtoList.get(i); MenuDnDRequestDto requestDto = menuDnDRequestDtoList.get(i);
Menu parent = null; Optional<Menu> parentMenu = findParentMenu(requestDto.getParentId());
if (requestDto.getParentId() != null) {
parent = findById(requestDto.getParentId()); recursive(requestDto, parentMenu, requestDto.getSortSeq(), requestDto.getLevel());
}
recursive(requestDto, parent, requestDto.getSortSeq(), requestDto.getLevel());
} }
return siteId; return siteId;
} }
private Optional<Menu> findParentMenu(Long parentId) {
if (Objects.isNull(parentId)) {
return Optional.empty();
}
return menuRepository.findById(parentId);
}
private Menu findById(Long id) { private Menu findById(Long id) {
return menuRepository.findById(id) return menuRepository.findById(id)
.orElseThrow(() -> .orElseThrow(() ->
new EntityNotFoundException(getMessage("valid.notexists.format", new Object[]{getMessage("menu")}) + " ID= " + id)); new EntityNotFoundException(getMessage("valid.notexists.format", new Object[]{getMessage("menu")}) + " ID= " + id));
} }
private Site findSite(Long id) {
return siteRepository.findById(id)
.orElseThrow(() ->
new EntityNotFoundException(getMessage("valid.notexists.format", new Object[]{getMessage("menu.site")}) + " ID= " + id));
}
/**
* 메뉴 정합성 체크
*
* @param updateRequestDto
*/
private void validateUpdate(MenuUpdateRequestDto updateRequestDto) {
//컨텐츠 or 게시판인 경우 connectId 필수
if (!updateRequestDto.hasConnectId()) {
//컨텐츠 or 게시판을 선택해 주세요
throw new BusinessMessageException(getMessage("valid.selection.format", new Object[]{updateRequestDto.getMenuTypeName()}));
}
// 내부링크 or 외부링크인 경우 링크 url 필수
if (!updateRequestDto.hasUrlPath()) {
//링크 Url 값은 필수 입니다.
throw new BusinessMessageException(getMessage("valid.required", new Object[]{getMessage("menu.url_path")}));
}
}
/**
* 트리 드래그 앤드 드랍 시 children 데이터 재귀호출 저장
*
* @param dto
* @param parent
* @param sortSeq
* @param level
*/
private void recursive(MenuDnDRequestDto dto, Optional<Menu> parent, Integer sortSeq, Integer level) {
Menu menu = findById(dto.getMenuId());
menu.updateDnD(parent, sortSeq, level);
if (Objects.isNull(dto.getChildren()) || dto.getChildren().size() <= 0) {
return;
}
for (int i = 0; i < dto.getChildren().size(); i++) {
MenuDnDRequestDto child = dto.getChildren().get(i);
recursive(child, Optional.of(menu), child.getSortSeq(), menu.getLevel()+1);
}
}
} }

View File

@@ -34,7 +34,6 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.web.client.TestRestTemplate; import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.boot.web.server.LocalServerPort;
import org.springframework.core.ParameterizedTypeReference; import org.springframework.core.ParameterizedTypeReference;
import org.springframework.core.io.FileSystemResource; import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource; import org.springframework.core.io.Resource;

View File

@@ -77,7 +77,7 @@ class MenuApiControllerTest {
Menu childMenu = Menu.builder() Menu childMenu = Menu.builder()
.menuKorName("child_" + i) .menuKorName("child_" + i)
.site(site) .site(site)
.parent(parentMenu) .parent(Optional.of(parentMenu))
.sortSeq(i + 1) .sortSeq(i + 1)
.build(); .build();
childMenu.setParentMenu(parentMenu); childMenu.setParentMenu(parentMenu);
@@ -141,7 +141,7 @@ class MenuApiControllerTest {
Menu childMenu1 = Menu.builder() Menu childMenu1 = Menu.builder()
.menuKorName("child_1_" + i) .menuKorName("child_1_" + i)
.site(site) .site(site)
.parent(parentMenu1) .parent(Optional.of(parentMenu1))
.sortSeq(i + 1) .sortSeq(i + 1)
.build(); .build();
childMenu1.setParentMenu(parentMenu1); childMenu1.setParentMenu(parentMenu1);
@@ -150,7 +150,7 @@ class MenuApiControllerTest {
Menu childChildMenu = Menu.builder() Menu childChildMenu = Menu.builder()
.menuKorName("child_child_1") .menuKorName("child_child_1")
.site(site) .site(site)
.parent(childMenu1) .parent(Optional.of(childMenu1))
.sortSeq(1) .sortSeq(1)
.build(); .build();
childChildMenu.setParentMenu(childMenu1); childChildMenu.setParentMenu(childMenu1);
@@ -158,7 +158,7 @@ class MenuApiControllerTest {
Menu childChildMenu2 = Menu.builder() Menu childChildMenu2 = Menu.builder()
.menuKorName("child_child_1") .menuKorName("child_child_1")
.site(site) .site(site)
.parent(childMenu1) .parent(Optional.of(childMenu1))
.sortSeq(2) .sortSeq(2)
.build(); .build();
childChildMenu2.setParentMenu(childMenu1); childChildMenu2.setParentMenu(childMenu1);
@@ -168,7 +168,7 @@ class MenuApiControllerTest {
Menu childMenu2 = Menu.builder() Menu childMenu2 = Menu.builder()
.menuKorName("child_2_" + i) .menuKorName("child_2_" + i)
.site(site) .site(site)
.parent(parentMenu2) .parent(Optional.of(parentMenu2))
.sortSeq(i + 1) .sortSeq(i + 1)
.build(); .build();
childMenu1.setParentMenu(parentMenu2); childMenu1.setParentMenu(parentMenu2);
@@ -259,7 +259,7 @@ class MenuApiControllerTest {
Menu childMenu1 = Menu.builder() Menu childMenu1 = Menu.builder()
.menuKorName("child_1_" + i) .menuKorName("child_1_" + i)
.site(site) .site(site)
.parent(parentMenu1) .parent(Optional.of(parentMenu1))
.sortSeq(i + 1) .sortSeq(i + 1)
.build(); .build();
childMenu1.setParentMenu(parentMenu1); childMenu1.setParentMenu(parentMenu1);
@@ -306,7 +306,7 @@ class MenuApiControllerTest {
Menu childMenu1 = Menu.builder() Menu childMenu1 = Menu.builder()
.menuKorName("child_1_" + i) .menuKorName("child_1_" + i)
.site(site) .site(site)
.parent(parentMenu1) .parent(Optional.of(parentMenu1))
.sortSeq(i + 1) .sortSeq(i + 1)
.build(); .build();
childMenu1.setParentMenu(parentMenu1); childMenu1.setParentMenu(parentMenu1);
@@ -380,7 +380,7 @@ class MenuApiControllerTest {
Menu childMenu1 = Menu.builder() Menu childMenu1 = Menu.builder()
.menuKorName("child_1_" + i) .menuKorName("child_1_" + i)
.site(site) .site(site)
.parent(parentMenu1) .parent(Optional.of(parentMenu1))
.sortSeq(i + 1) .sortSeq(i + 1)
.build(); .build();
childMenu1.setParentMenu(parentMenu1); childMenu1.setParentMenu(parentMenu1);
@@ -414,7 +414,7 @@ class MenuApiControllerTest {
Menu childMenu1 = Menu.builder() Menu childMenu1 = Menu.builder()
.menuKorName("child_1_" + i) .menuKorName("child_1_" + i)
.site(site) .site(site)
.parent(parentMenu1) .parent(Optional.of(parentMenu1))
.sortSeq(i + 1) .sortSeq(i + 1)
.build(); .build();
childMenu1.setParentMenu(parentMenu1); childMenu1.setParentMenu(parentMenu1);

View File

@@ -4,6 +4,7 @@ import static org.assertj.core.api.Assertions.assertThat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import org.egovframe.cloud.portalservice.api.menu.dto.MenuRoleRequestDto; import org.egovframe.cloud.portalservice.api.menu.dto.MenuRoleRequestDto;
@@ -69,7 +70,7 @@ class MenuRoleApiControllerTest {
Menu childMenu = Menu.builder() Menu childMenu = Menu.builder()
.menuKorName("child_" + i) .menuKorName("child_" + i)
.site(site) .site(site)
.parent(parentMenu) .parent(Optional.of(parentMenu))
.sortSeq(i + 1) .sortSeq(i + 1)
.build(); .build();
childMenu.setParentMenu(parentMenu); childMenu.setParentMenu(parentMenu);
@@ -219,7 +220,7 @@ class MenuRoleApiControllerTest {
Menu childMenu = Menu.builder() Menu childMenu = Menu.builder()
.menuKorName("child-any_" + i) .menuKorName("child-any_" + i)
.site(site) .site(site)
.parent(parentMenu) .parent(Optional.of(parentMenu))
.sortSeq(i + 1) .sortSeq(i + 1)
.isUse(true) .isUse(true)
.build(); .build();

View File

@@ -1,5 +1,6 @@
package org.egovframe.cloud.portalservice.domain.menu; package org.egovframe.cloud.portalservice.domain.menu;
import java.util.Optional;
import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
@@ -90,7 +91,7 @@ class MenuRepositoryTest {
Menu child = Menu.builder() Menu child = Menu.builder()
.menuKorName("child_" + i) .menuKorName("child_" + i)
.site(site) .site(site)
.parent(parentMenu) .parent(Optional.of(parentMenu))
.sortSeq(i + 1) .sortSeq(i + 1)
.build(); .build();
child.setParentMenu(parentMenu); child.setParentMenu(parentMenu);
@@ -125,7 +126,7 @@ class MenuRepositoryTest {
Menu childMenu = Menu.builder() Menu childMenu = Menu.builder()
.menuKorName("child_" + i) .menuKorName("child_" + i)
.site(site) .site(site)
.parent(parentMenu) .parent(Optional.of(parentMenu))
.sortSeq(i + 1) .sortSeq(i + 1)
.build(); .build();
childMenu.setParentMenu(parentMenu); childMenu.setParentMenu(parentMenu);

View File

@@ -1,5 +1,6 @@
package org.egovframe.cloud.portalservice.domain.menu; package org.egovframe.cloud.portalservice.domain.menu;
import java.util.Optional;
import org.assertj.core.api.Assertions; import org.assertj.core.api.Assertions;
import org.egovframe.cloud.portalservice.api.menu.dto.MenuRoleResponseDto; import org.egovframe.cloud.portalservice.api.menu.dto.MenuRoleResponseDto;
import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.AfterEach;
@@ -75,7 +76,7 @@ class MenuRoleRepositoryTest {
Menu child = Menu.builder() Menu child = Menu.builder()
.menuKorName("child_" + i) .menuKorName("child_" + i)
.site(site) .site(site)
.parent(parent) .parent(Optional.of(parent))
.sortSeq(i + 1) .sortSeq(i + 1)
.level(2) .level(2)
.build(); .build();