From 86ccbf47b441a4cdefe1f494d9324d8524bb46ee Mon Sep 17 00:00:00 2001 From: bjkim Date: Mon, 4 Aug 2025 16:47:07 +0900 Subject: [PATCH] =?UTF-8?q?[ADD]=20=ED=94=84=EB=A1=9C=EC=A0=9D=ED=8A=B8=20?= =?UTF-8?q?=EA=B6=8C=ED=95=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controllers/ProjectController.java | 14 +++++++++ .../etri/autoflow/entity/ProjectEntity.java | 4 +-- .../autoflow/entity/UserProjectMapEntity.java | 2 +- .../request/UserPermissionRequest.java | 20 +++++++++++++ .../repository/UserProjectMapRepository.java | 20 +++++++++++++ .../etri/autoflow/service/ProjectService.java | 30 +++++++++++++++++++ 6 files changed, 87 insertions(+), 3 deletions(-) create mode 100644 src/main/java/kr/re/etri/autoflow/payload/request/UserPermissionRequest.java create mode 100644 src/main/java/kr/re/etri/autoflow/repository/UserProjectMapRepository.java diff --git a/src/main/java/kr/re/etri/autoflow/controllers/ProjectController.java b/src/main/java/kr/re/etri/autoflow/controllers/ProjectController.java index 7ba6145..3017322 100644 --- a/src/main/java/kr/re/etri/autoflow/controllers/ProjectController.java +++ b/src/main/java/kr/re/etri/autoflow/controllers/ProjectController.java @@ -7,6 +7,7 @@ import io.swagger.v3.oas.annotations.tags.Tag; import kr.re.etri.autoflow.entity.ProjectEntity; import kr.re.etri.autoflow.payload.request.BaseSearchRequest; import kr.re.etri.autoflow.payload.request.ProjectRequest; +import kr.re.etri.autoflow.payload.request.UserPermissionRequest; import kr.re.etri.autoflow.service.ProjectService; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; @@ -82,4 +83,17 @@ public class ProjectController { } return ResponseEntity.notFound().build(); } + + @Operation(summary = "프로젝트에 사용자 권한 추가") + @PostMapping("/{projectId}/users") + public ResponseEntity addUserPermission( + @Parameter(description = "프로젝트 ID", required = true, in = ParameterIn.PATH) + @PathVariable("projectId") Long projectId, + + @Parameter(description = "사용자 권한 요청 정보", required = true) + @RequestBody UserPermissionRequest request) { + + projectService.addUserPermission(projectId, request.getUserId(), request.getPermissions()); + return ResponseEntity.ok().build(); + } } diff --git a/src/main/java/kr/re/etri/autoflow/entity/ProjectEntity.java b/src/main/java/kr/re/etri/autoflow/entity/ProjectEntity.java index d43f16f..7ef4ec5 100644 --- a/src/main/java/kr/re/etri/autoflow/entity/ProjectEntity.java +++ b/src/main/java/kr/re/etri/autoflow/entity/ProjectEntity.java @@ -80,6 +80,6 @@ public class ProjectEntity { @Comment("수정 유저 이름") private String modUserNm; - @OneToMany(mappedBy = "project", cascade = CascadeType.ALL, orphanRemoval = true) - private List userMappings = new ArrayList<>(); +// @OneToMany(mappedBy = "project", cascade = CascadeType.ALL, orphanRemoval = true) +// private List userMappings = new ArrayList<>(); } diff --git a/src/main/java/kr/re/etri/autoflow/entity/UserProjectMapEntity.java b/src/main/java/kr/re/etri/autoflow/entity/UserProjectMapEntity.java index 5c4fab2..63d8f2b 100644 --- a/src/main/java/kr/re/etri/autoflow/entity/UserProjectMapEntity.java +++ b/src/main/java/kr/re/etri/autoflow/entity/UserProjectMapEntity.java @@ -39,6 +39,6 @@ public class UserProjectMapEntity { @CollectionTable(name = "tb_user_project_permission", joinColumns = @JoinColumn(name = "user_project_id")) @Enumerated(EnumType.STRING) @Column(length = 20) - @Schema(description = "권한 목록", example = "[\"READ\", \"WRITE\"]") + @Schema(description = "권한 목록", example = "[\"READ\", \"WRITE\", \"DELETE\", \"MANAGE\"]") private Set permissions = new HashSet<>(); } diff --git a/src/main/java/kr/re/etri/autoflow/payload/request/UserPermissionRequest.java b/src/main/java/kr/re/etri/autoflow/payload/request/UserPermissionRequest.java new file mode 100644 index 0000000..682e25e --- /dev/null +++ b/src/main/java/kr/re/etri/autoflow/payload/request/UserPermissionRequest.java @@ -0,0 +1,20 @@ +package kr.re.etri.autoflow.payload.request; + +import io.swagger.v3.oas.annotations.media.Schema; +import kr.re.etri.autoflow.entity.ProjectPermission; +import lombok.Getter; +import lombok.Setter; + +import java.util.Set; + +@Getter +@Setter +@Schema(description = "프로젝트 사용자 권한 요청 DTO") +public class UserPermissionRequest { + + @Schema(description = "권한을 부여할 사용자 ID", example = "5") + private Long userId; + + @Schema(description = "권한 목록", example = "[\"CREATE\", \"READ\", \"UPDATE\", \"DELETE\"]") + private Set permissions; +} diff --git a/src/main/java/kr/re/etri/autoflow/repository/UserProjectMapRepository.java b/src/main/java/kr/re/etri/autoflow/repository/UserProjectMapRepository.java new file mode 100644 index 0000000..d849437 --- /dev/null +++ b/src/main/java/kr/re/etri/autoflow/repository/UserProjectMapRepository.java @@ -0,0 +1,20 @@ +package kr.re.etri.autoflow.repository; + +import kr.re.etri.autoflow.entity.ProjectEntity; +import kr.re.etri.autoflow.entity.UserProjectMapEntity; +import kr.re.etri.autoflow.models.User; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; +import java.util.Optional; + +public interface UserProjectMapRepository extends JpaRepository { + + Optional findByProjectAndUser(ProjectEntity project, User user); + + List findAllByProject(ProjectEntity project); + + List findAllByUser(User user); + + boolean existsByProjectAndUser(ProjectEntity project, User user); +} diff --git a/src/main/java/kr/re/etri/autoflow/service/ProjectService.java b/src/main/java/kr/re/etri/autoflow/service/ProjectService.java index 11ec0a9..0d44804 100644 --- a/src/main/java/kr/re/etri/autoflow/service/ProjectService.java +++ b/src/main/java/kr/re/etri/autoflow/service/ProjectService.java @@ -1,9 +1,14 @@ package kr.re.etri.autoflow.service; import kr.re.etri.autoflow.entity.ProjectEntity; +import kr.re.etri.autoflow.entity.ProjectPermission; +import kr.re.etri.autoflow.entity.UserProjectMapEntity; +import kr.re.etri.autoflow.models.User; import kr.re.etri.autoflow.payload.request.BaseSearchRequest; import kr.re.etri.autoflow.payload.request.ProjectRequest; import kr.re.etri.autoflow.repository.ProjectRepository; +import kr.re.etri.autoflow.repository.UserProjectMapRepository; +import kr.re.etri.autoflow.repository.UserRepository; import kr.re.etri.autoflow.specification.ProjectSpecification; import lombok.RequiredArgsConstructor; import org.springframework.beans.BeanUtils; @@ -17,6 +22,7 @@ import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; import java.util.List; import java.util.Optional; +import java.util.Set; @Service @RequiredArgsConstructor @@ -24,6 +30,10 @@ import java.util.Optional; public class ProjectService { private final ProjectRepository projectRepository; + private final UserRepository userRepository; + private final UserProjectMapRepository userProjectMapRepository; + + private final ProjectSpecification projectSpecification; private final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); @@ -92,4 +102,24 @@ public class ProjectService { projectRepository.deleteById(id); return true; } + + @Transactional + public void addUserPermission(Long projectId, Long userId, Set permissions) { + ProjectEntity project = projectRepository.findById(projectId) + .orElseThrow(() -> new IllegalArgumentException("존재하지 않는 프로젝트입니다.")); + + User user = userRepository.findById(userId) + .orElseThrow(() -> new IllegalArgumentException("존재하지 않는 사용자입니다.")); + + UserProjectMapEntity mapping = userProjectMapRepository.findByProjectAndUser(project, user) + .orElseGet(() -> { + UserProjectMapEntity newMap = new UserProjectMapEntity(); + newMap.setProject(project); + newMap.setUser(user); + return newMap; + }); + + mapping.setPermissions(permissions); + userProjectMapRepository.save(mapping); + } }