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<ProjectRoleUser, Long, JpaRepository<ProjectRoleUser, Long>> 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<ProjectRoleUser, Long> getRepository() {
|
return this.projectRoleUserRepository;
|
}
|
|
@Override
|
@Transactional(readOnly = true)
|
public List<ProjectRoleUser> 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
|
public void withDrawWorkspaceManagerModifyProjectRole(Workspace workspace, User user) {
|
List<UserWorkspace> 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<ProjectRoleUser> 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<Map<String, Long>> projectRoleUserMaps = Lists.newArrayList();
|
Map<String, Long> 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<String, Long> 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<Map<String, Object>> findProjectRoleUser(Map<String, Object> projectRoleUserMap) {
|
return this.projectRoleUserMapper.findProjectRoleUser(projectRoleUserMap);
|
}
|
|
// 프로젝트 관리자 조회
|
@Override
|
@Transactional(readOnly = true)
|
public Map<String, Object> findProjectManager(Long userId) {
|
return this.projectRoleUserMapper.findProjectManager(userId);
|
}
|
|
// 프로젝트 관리자 여부를 확인한다.
|
@Override
|
@Transactional(readOnly = true)
|
public boolean checkProjectManager(Project project, User user) {
|
ProjectRole projectManagerRole = this.projectRoleService.findByProjectIdAndRoleType(project.getId(), ProjectRole.TYPE_MANAGER);
|
// 해당 사용자가 특정 역할에 소속되어 있는지 확인한다.
|
ProjectRoleUser projectRoleUser = this.findByProjectRoleIdAndUserId(projectManagerRole.getId(), user.getId());
|
|
return projectRoleUser != null;
|
}
|
}
|