package kr.wisestone.owl.service.impl; import kr.wisestone.owl.constant.MsgConstants; import kr.wisestone.owl.domain.*; import kr.wisestone.owl.exception.OwlRuntimeException; import kr.wisestone.owl.repository.ProjectRoleRepository; import kr.wisestone.owl.service.*; 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.List; @Service public class ProjectRoleServiceImpl extends AbstractServiceImpl> implements ProjectRoleService { private static final Logger log = LoggerFactory.getLogger(ProjectRoleServiceImpl.class); @Autowired private ProjectRoleRepository projectRoleRepository; @Autowired private ProjectRoleUserService projectRoleUserService; @Autowired private ProjectRoleDepartmentService projectRoleDepartmentService; @Autowired private ProjectRolePermissionService projectRolePermissionService; @Override protected JpaRepository getRepository() { return this.projectRoleRepository; } // 기본, 관리자 프로젝트 역할을 생성한다. @Override @Transactional public void addDefaultProjectRoleUser(Project project, List managers, List users) { ProjectRole projectRole = this.addProjectRole(project, "기본 프로젝트 역할", ProjectRole.TYPE_DEFAULT, Permission.ROLE_TYPE_PROJECT_JOIN); ProjectRole managerProjectRole = this.addProjectRole(project, "프로젝트 관리자 역할", ProjectRole.TYPE_MANAGER, Permission.ROLE_TYPE_PROJECT_MANAGER); // 프로젝트 관리자 저장 this.projectRoleAssociatedUser(managers, managerProjectRole); // 프로젝트 일반 사용자 저장 this.projectRoleAssociatedUser(users, projectRole); this.projectRoleRepository.flush(); } // 프로젝트 역할 생성(관리자, 담당부서) @Override @Transactional public void addDefaultProjectRoleDepartment(Project project, List managers, List departments) { ProjectRole projectRole = this.addProjectRole(project, "기본 프로젝트 역할", ProjectRole.TYPE_DEFAULT, Permission.ROLE_TYPE_PROJECT_JOIN); ProjectRole managerProjectRole = this.addProjectRole(project, "프로젝트 관리자 역할", ProjectRole.TYPE_MANAGER, Permission.ROLE_TYPE_PROJECT_MANAGER); // 프로젝트 관리자 저장 this.projectRoleAssociatedUser(managers, managerProjectRole); // 프로젝트 일반 사용자 저장 //this.projectRoleAssociatedUser(users, projectRole); // 프로젝트 담당 부서 저장 this.projectRoleAssociatedDepartment(departments, projectRole); this.projectRoleRepository.flush(); } // 프로젝트 역할가 사용자 연결 private void projectRoleAssociatedUser(List users, ProjectRole projectRole) { for (User user : users) { this.addDefaultProjectRoleAssociatedUser(projectRole, user); } } // 해당 역할과 사용자를 연결시킨다. private void addDefaultProjectRoleAssociatedUser(ProjectRole projectRole, User user) { ProjectRoleUser projectRoleUser = this.projectRoleUserService.findByProjectRoleIdAndUserId(projectRole.getId(), user.getId()); if (projectRoleUser == null) { // 프로젝트 관리자 - 기본 프로젝트 역할에 추가. user.addProjectRole(projectRole); } } // 프로젝트 역할과 부서 연결 private void projectRoleAssociatedDepartment(List departments, ProjectRole projectRole) { for (Department department : departments) { this.addDefaultProjectRoleAssociatedDepartment(projectRole, department); } } // 해당 역할과 부서를 연결시킨다. private void addDefaultProjectRoleAssociatedDepartment(ProjectRole projectRole, Department department) { ProjectRoleDepartment projectRoleDepartment = this.projectRoleDepartmentService.findByProjectRoleIdAndDepartmentId(projectRole.getId(), department.getId()); if (projectRoleDepartment == null) { // 프로젝트 관리자 - 기본 프로젝트 역할에 추가. department.addProjectRole(projectRole); } } // 프로젝트 역할을 생성한다. private ProjectRole addProjectRole(Project project, String projectRoleName, String projectRoleType, String permissionType) { ProjectRole projectRole = new ProjectRole(project, projectRoleName, projectRoleType); this.projectRoleRepository.saveAndFlush(projectRole); this.projectRolePermissionService.addDefaultProjectRoleAssociatedPermissions(projectRole, permissionType); return projectRole; } // 해당 프로젝트 역할을 조회한다. @Override @Transactional(readOnly = true) public ProjectRole findByProjectIdAndRoleType(Long projectId, String roleType) { ProjectRole projectRole = this.projectRoleRepository.findByProjectIdAndRoleType(projectId, roleType); if (projectRole == null) { throw new OwlRuntimeException(this.messageAccessor.getMessage(MsgConstants.PROJECT_ROLE_NOT_EXIST)); } return projectRole; } }