package kr.wisestone.owl.service.impl; import com.google.common.collect.Lists; import kr.wisestone.owl.constant.MsgConstants; import kr.wisestone.owl.domain.*; import kr.wisestone.owl.exception.OwlRuntimeException; import kr.wisestone.owl.mapper.ProjectRoleUserMapper; import kr.wisestone.owl.repository.ProjectRoleUserRepository; import kr.wisestone.owl.service.ProjectRoleService; import kr.wisestone.owl.service.ProjectRoleUserService; import kr.wisestone.owl.service.UserWorkspaceService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.HashMap; import java.util.List; import java.util.Map; @Service public class ProjectRoleUserServiceImpl extends AbstractServiceImpl> implements ProjectRoleUserService { private static final Logger log = LoggerFactory.getLogger(ProjectRoleUserServiceImpl.class); @Autowired private ProjectRoleUserRepository projectRoleUserRepository; @Autowired private ProjectRoleService projectRoleService; @Autowired private UserWorkspaceService userWorkspaceService; @Autowired private ProjectRoleUserMapper projectRoleUserMapper; @Override protected JpaRepository getRepository() { return this.projectRoleUserRepository; } @Override @Transactional(readOnly = true) public List findByProjectRoleId(Long projectRoleId) { return this.projectRoleUserRepository.findByProjectRoleId(projectRoleId); } // 해당 사용자가 특정 역할에 소속되어 있는지 확인한다. @Override @Transactional(readOnly = true) public ProjectRoleUser findByProjectRoleIdAndUserId(Long projectRoleId, Long userId) { return this.projectRoleUserRepository.findByProjectRoleIdAndUserId(projectRoleId, userId); } // 해당 부서가 특정 역할에 소속되어 있는지 확인한다. @Override @Transactional(readOnly = true) public ProjectRoleUser findByProjectRoleIdAndDepartmentId(Long projectRoleId, Long departmentId) { return this.projectRoleUserRepository.findByProjectRoleIdAndDepartmentId(projectRoleId, departmentId); } // 업무 공간을 탈퇴한 사용자가 다른 업무 공간의 프로젝트 관리자, 일반 사용자로 있을 경우 제거한다. @Override @Transactional public void withDrawWorkspaceManagerModifyProjectRole(Workspace workspace, User user) { List userWorkspaces = this.userWorkspaceService.findByWorkspaceIdAndManagerYn(workspace.getId(), true); if (userWorkspaces.size() < 1) { throw new OwlRuntimeException( this.messageAccessor.getMessage(MsgConstants.USER_WORKSPACE_MANAGER_NOT_EXIST)); } User workspaceManager = userWorkspaces.get(0).getUser(); for (Project project : workspace.getProjects()) { // 일반 참여 역할 삭제 this.removeProjectRoleUser(project, ProjectRole.TYPE_DEFAULT, user, workspaceManager); // 프로젝트 관리자 역할 삭제 this.removeProjectRoleUser(project, ProjectRole.TYPE_MANAGER, user, workspaceManager); } } // 프로젝트 역할 연결 정보에서 탈퇴하는 사용자를 제거한다. private void removeProjectRoleUser(Project project, String roleType, User user, User workspaceManager) { ProjectRole projectRole = this.projectRoleService.findByProjectIdAndRoleType(project.getId(), roleType); // 프로젝트 관리자 역할일 때 if (roleType.equals(ProjectRole.TYPE_MANAGER)) { // 프로젝트 관리자 연결 정보 List projectRoleUsers = this.findByProjectRoleId(projectRole.getId()); boolean existManager = false; // 탈퇴한 사용자가 프로젝트 관리자 여부 확인 for (ProjectRoleUser projectRoleUser : projectRoleUsers) { if (projectRoleUser.getUser().getId().equals(user.getId())) { existManager = true; break; } } if (existManager) { // 업무 공간 관리자가 일반 사용자 역할에 존재할 수 있으므로 제거 로직 수행 this.removeProjectRoleUser(project, ProjectRole.TYPE_DEFAULT, workspaceManager, null); // 업무 공간 관리자에게 프로젝트 관리자 역할 부여 List> projectRoleUserMaps = Lists.newArrayList(); Map projectRoleUserMap = new HashMap<>(); projectRoleUserMap.put("projectRoleId", projectRole.getId()); projectRoleUserMap.put("userId", workspaceManager.getId()); projectRoleUserMap.put("registerId", this.webAppUtil.getLoginId()); projectRoleUserMaps.add(projectRoleUserMap); // 업무 공간 관리자를 프로젝트 관리자로 지정 this.projectRoleUserMapper.insertProjectRoleUser(projectRoleUserMaps); /*workspaceManager.addProjectRole(projectRole);*/ } } Map deleteProjectRoleUserMap = new HashMap<>(); deleteProjectRoleUserMap.put("projectRoleId", projectRole.getId()); deleteProjectRoleUserMap.put("userId", user.getId()); // 탈퇴한 사용자는 프로젝트 역할 연결 정보 삭제 this.projectRoleUserMapper.deleteProjectRoleUser(deleteProjectRoleUserMap); // 탈퇴한 사용자는 프로젝트 역할 연결 정보 삭제 // user.removeProjectRole(projectRole); } // 프로젝트에 참여하는 사용자, 프로젝트 관리자를 파라미터에 따라 조회한다. @Override @Transactional(readOnly = true) public List> findProjectRoleUser(Map projectRoleUserMap) { return this.projectRoleUserMapper.findProjectRoleUser(projectRoleUserMap); } // 프로젝트 관리자 여부를 확인한다. @Override @Transactional(readOnly = true) public boolean checkProjectManager(Project project) { ProjectRole projectManagerRole = this.projectRoleService.findByProjectIdAndRoleType(project.getId(), ProjectRole.TYPE_MANAGER); // 해당 사용자가 특정 역할에 소속되어 있는지 확인한다. ProjectRoleUser projectRoleUser = this.findByProjectRoleIdAndUserId(projectManagerRole.getId(), this.webAppUtil.getLoginId()); return projectRoleUser != null; } }