Skip to content

Commit

Permalink
Merge pull request #196 from Kernel360/feature/project-authorization-…
Browse files Browse the repository at this point in the history
…refactor-#191

Feat : 프로젝트 접근 권한 수정 #191
  • Loading branch information
Eseas authored Feb 10, 2025
2 parents 2f74124 + 989ac52 commit bd53420
Show file tree
Hide file tree
Showing 23 changed files with 265 additions and 152 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -19,19 +19,22 @@ public class AdminProjectFacade {
private final AdminProjectStepService adminProjectStepService;

public PostProject.Response registerProject(PostProject.Request request){
// TODO - Project 권한 설정 로직 추가 - LSY
Project project = adminProjectService.createProject(request);
adminProjectStepService.createBasicStep(project);
adminProjectHistoryService.saveProjectHistory(project);
return PostProject.Response.of(project);
}

public PutProject.Response updateProject(Long id,PutProject.Request request){
// TODO - Project 권한 설정 로직 추가 고민 중 - LSY
Project project = adminProjectService.updateProject(id, request);
adminProjectHistoryService.saveProjectHistory(project);
return PutProject.Response.of(project);
}

public GetProject.Response getProject(Long id){
// TODO - Project 권한 목록 추가 로직 - LSY
return adminProjectService.getProject(id);
}

Expand All @@ -40,6 +43,7 @@ public PaginatedResponse<GetProject.Response> getListOfProject(Integer page) {
}

public void deleteProject(Long id){
// TODO - 프로젝트 권한 목록 비활성화 로직 추가 - LSY
Project project = adminProjectService.deleteProject(id);
adminProjectHistoryService.saveProjectHistory(project);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,30 +15,30 @@
public class MemberProjectStepId implements Serializable {

private Long memberId; // 회원 ID
private Long projectStepId; // 프로젝트 단계 ID
private Long projectId; // 프로젝트 ID

public MemberProjectStepId(Long memberId, Long projectStepId) {
public MemberProjectStepId(Long memberId, Long projectId) {
if(memberId == null) {
throw new BusinessException(ErrorCode.USER_NOT_FOUND);
}
if(projectStepId == null) {
if(projectId == null) {
throw new BusinessException(ErrorCode.NOT_FOUND_PROJECT_STEP);
}

this.memberId = memberId;
this.projectStepId = projectStepId;
this.projectId = projectId;
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
MemberProjectStepId that = (MemberProjectStepId) o;
return Objects.equals(memberId, that.memberId) && Objects.equals(projectStepId, that.projectStepId);
return Objects.equals(memberId, that.memberId) && Objects.equals(projectId, that.projectId);
}

@Override
public int hashCode() {
return Objects.hash(memberId, projectStepId);
return Objects.hash(memberId, projectId);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,29 +25,30 @@ public class ProjectAuthorization extends BaseEntity {
private Member member;

@ManyToOne(fetch = FetchType.LAZY)
@MapsId("projectStepId") // 복합 키의 projectStepId와 매핑
@JoinColumn(name = "project_step_id", nullable = false)
private ProjectStep projectStep;
@MapsId("projectId") // 복합 키의 projectStepId와 매핑
@JoinColumn(name = "project_id", nullable = false)
private Project project;

@Enumerated(EnumType.STRING)
private MemberType memberType; // 회원 구분 (client, developer)

// Question - Enum으로 뺄까?
private String authorizationCode; // 권한 코드

@Convert(converter = YesNoConverter.class)
private YesNo isActive; // 삭제 여부

private ProjectAuthorization(Member member, ProjectStep projectStep, MemberType memberType, String authorizationCode) {
this.id = new MemberProjectStepId(member.getId(), projectStep.getId());
private ProjectAuthorization(Member member, Project project, MemberType memberType, String authorizationCode) {
this.id = new MemberProjectStepId(member.getId(), project.getId());
this.member = member;
this.projectStep = projectStep;
this.project = project;
this.memberType = memberType;
this.authorizationCode = authorizationCode;
this.isActive = YesNo.YES;
}

public static ProjectAuthorization create(Member member, ProjectStep projectStep, MemberType memberType, String authorizationCode) {
return new ProjectAuthorization(member, projectStep, memberType, authorizationCode);
public static ProjectAuthorization create(Member member, Project project, MemberType memberType, String authorizationCode) {
return new ProjectAuthorization(member, project, memberType, authorizationCode);
}

public void edit(MemberType memberType, String authorizationCode) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ public class ProjectAuthorizationHistory extends BaseEntity {
private String memberName; // 회원 이름

@Column(nullable = false)
private String projectStepName; // 프로젝트 단계 이름
private String projectName; // 프로젝트 단계 이름

@Column(nullable = false)
private String memberType; // 회원 구분 (client, developer)
Expand All @@ -36,7 +36,7 @@ public class ProjectAuthorizationHistory extends BaseEntity {

private ProjectAuthorizationHistory(ProjectAuthorization authorization) {
this.memberName = authorization.getMember().getName();
this.projectStepName = authorization.getProjectStep().getStepName();
this.projectName = authorization.getProject().getProjectName();
this.memberType = authorization.getMemberType().name();
this.authorizationCode = authorization.getAuthorizationCode();
this.isActive = authorization.getIsActive();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package com.seveneleven.util.security.service;

public interface ProjectAuthorizationCheckService {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.seveneleven.util.security.service;

import org.springframework.stereotype.Service;

@Service
public class ProjectAuthorizationCheckServiceImpl {

// TODO - 프로젝트 권한 체크 서비스 - For @PreAuthorization - SpEL 사용
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package com.seveneleven.project.controller;

import com.seveneleven.project.dto.GetMemberAuthorization;
import com.seveneleven.project.dto.GetProjectAuthorization;
import com.seveneleven.project.dto.PostProjectAuthorization;
import com.seveneleven.response.APIResponse;
import com.seveneleven.response.SuccessCode;
import com.seveneleven.util.security.dto.CustomUserDetails;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.*;

@RestController
@RequiredArgsConstructor
@RequestMapping("/api/projects")
public class ProjectAuthorizationController {

private final ProjectAuthorizationFacade projectAuthorizationFacade;

/**
* 함수명 : postProjectAuthorization
* 프로젝트 접근 권한을 편집하는 함수
*/
@PostMapping("/{projectId}/authorizations")
public ResponseEntity<APIResponse<PostProjectAuthorization.Response>> postProjectAuthorization(
@PathVariable Long projectId,
@RequestBody PostProjectAuthorization.Request requestDto
) {
// TODO - ProjectId로 변경
PostProjectAuthorization.Response responseDto = projectAuthorizationFacade.postProjectAuthorization(requestDto, projectId);

if(responseDto.getFailList().isEmpty()) {
return ResponseEntity.status(SuccessCode.CREATED.getStatusCode())
.body(APIResponse.success(SuccessCode.OK, responseDto));
}
return ResponseEntity.status(SuccessCode.MULTISTATUS.getStatusCode())
.body(APIResponse.success(SuccessCode.MULTISTATUS, responseDto));
}

/**
* 함수명 : getProjectAuthorization
* 해당 프로젝트의 접근 권한자 목록을 반환하는 함수
*/
@GetMapping("/{projectId}/authorizations")
public ResponseEntity<APIResponse<GetProjectAuthorization.Response>> getProjectAuthorization(
@PathVariable Long projectId
) {
return ResponseEntity.status(SuccessCode.OK.getStatusCode())
.body(APIResponse.success(SuccessCode.OK, projectAuthorizationFacade.getProjectAuthorization(projectId)));
}

/**
* 함수명 : getMemberAuthorization
* 해당 멤버가 접근 권한을 확인하는 함수
*/
@GetMapping("/{projectId}/authorizations/members")
public ResponseEntity<APIResponse<GetMemberAuthorization.Response>> getMemberAuthorization(
@PathVariable Long projectId,
@AuthenticationPrincipal CustomUserDetails customUserDetails
) {
// TODO - 구현
return null;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package com.seveneleven.project.controller;

import com.seveneleven.project.dto.GetProjectAuthorization;
import com.seveneleven.project.dto.PostProjectAuthorization;
import com.seveneleven.response.APIResponse;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

@RequestMapping("/api/projects")
public interface ProjectAuthorizationDocs {

@PostMapping("/steps/{stepId}/authorizations")
@Operation(
summary = "프로젝트 권한 생성",
description = "특정 단계의 프로젝트 권한을 생성합니다.",
responses = {
@ApiResponse(
responseCode = "201",
description = "프로젝트 권한이 성공적으로 생성되었습니다.",
content = @Content(
mediaType = "application/json",
schema = @Schema(implementation = PostProjectAuthorization.Response.class)
)
),
@ApiResponse(
responseCode = "207",
description = "일부 요청이 실패하였습니다.",
content = @Content(
mediaType = "application/json",
schema = @Schema(implementation = PostProjectAuthorization.Response.class)
)
)
}
)
ResponseEntity<APIResponse<PostProjectAuthorization.Response>> postProjectAuthorization(
@PathVariable Long stepId,
@RequestBody PostProjectAuthorization.Request requestDto
);

@GetMapping("/steps/{stepId}/authorizations")
@Operation(
summary = "프로젝트 권한 조회",
description = "특정 단계의 프로젝트 권한을 조회합니다.",
responses = {
@ApiResponse(
responseCode = "200",
description = "프로젝트 권한이 성공적으로 조회되었습니다.",
content = @Content(
mediaType = "application/json",
schema = @Schema(implementation = GetProjectAuthorization.Response.class)
)
)
}
)
ResponseEntity<APIResponse<GetProjectAuthorization.Response>> getProjectAuthorization(
@PathVariable Long stepId
);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package com.seveneleven.project.controller;

import com.seveneleven.entity.project.Project;
import com.seveneleven.project.dto.GetProjectAuthorization;
import com.seveneleven.project.dto.PostProjectAuthorization;
import com.seveneleven.project.service.ProjectAuthorizationService;
import com.seveneleven.project.service.dashboard.ProjectReader;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

@Component
@Slf4j
@RequiredArgsConstructor
public class ProjectAuthorizationFacade {

private final ProjectReader projectReader;
private final ProjectAuthorizationService projectAuthorizationService;

/**
* 함수명 : postProjectAuthorization
* 프로젝트 접근 권한을 편힙하는 함수
*/
public PostProjectAuthorization.Response postProjectAuthorization(
PostProjectAuthorization.Request requestDto,
Long projectId
) {
Project project = projectReader.read(projectId);
return projectAuthorizationService.createProjectAuthorization(project, requestDto);
}

/**
* 함수명 : getProjectAuthorization
* 해당 단계에 접근할 수 있는 인원을 반환하는 함수
*/
public GetProjectAuthorization.Response getProjectAuthorization(Long projectId) {
Project project = projectReader.read(projectId);
return projectAuthorizationService.getProjectAuthorization(project);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -68,35 +68,4 @@ public ResponseEntity<APIResponse<DeleteProjectStep.Response>> deleteProjectStep
return ResponseEntity.status(SuccessCode.OK.getStatusCode())
.body(APIResponse.success(SuccessCode.OK, projectStepFacade.deleteProjectStep(projectId, stepId)));
}

/**
* 함수명 : postProjectAuthorization
* 프로젝트 접근 권한을 편집하는 함수
*/
@PostMapping("/steps/{stepId}/authorizations")
public ResponseEntity<APIResponse<PostProjectAuthorization.Response>> postProjectAuthorization(
@PathVariable Long stepId,
@RequestBody PostProjectAuthorization.Request requestDto
) {
PostProjectAuthorization.Response responseDto = projectStepFacade.postProjectAuthorization(requestDto, stepId);

if(responseDto.getFailList().isEmpty()) {
return ResponseEntity.status(SuccessCode.CREATED.getStatusCode())
.body(APIResponse.success(SuccessCode.OK, responseDto));
}
return ResponseEntity.status(SuccessCode.MULTISTATUS.getStatusCode())
.body(APIResponse.success(SuccessCode.MULTISTATUS, responseDto));
}

/**
* 함수명 : getProjectAuthorization
* 접근 권한자 목록을 반환하는 함수
*/
@GetMapping("/steps/{stepId}/authorizations")
public ResponseEntity<APIResponse<GetProjectAuthorization.Response>> getProjectAuthorization(
@PathVariable Long stepId
) {
return ResponseEntity.status(SuccessCode.OK.getStatusCode())
.body(APIResponse.success(SuccessCode.OK, projectStepFacade.getProjectAuthorization(stepId)));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -92,52 +92,4 @@ ResponseEntity<APIResponse<DeleteProjectStep.Response>> deleteProjectStep(
@PathVariable Long projectId,
@PathVariable Long stepId
);


@PostMapping("/steps/{stepId}/authorizations")
@Operation(
summary = "프로젝트 권한 생성",
description = "특정 단계의 프로젝트 권한을 생성합니다.",
responses = {
@ApiResponse(
responseCode = "201",
description = "프로젝트 권한이 성공적으로 생성되었습니다.",
content = @Content(
mediaType = "application/json",
schema = @Schema(implementation = PostProjectAuthorization.Response.class)
)
),
@ApiResponse(
responseCode = "207",
description = "일부 요청이 실패하였습니다.",
content = @Content(
mediaType = "application/json",
schema = @Schema(implementation = PostProjectAuthorization.Response.class)
)
)
}
)
ResponseEntity<APIResponse<PostProjectAuthorization.Response>> postProjectAuthorization(
@PathVariable Long stepId,
@RequestBody PostProjectAuthorization.Request requestDto
);

@GetMapping("/steps/{stepId}/authorizations")
@Operation(
summary = "프로젝트 권한 조회",
description = "특정 단계의 프로젝트 권한을 조회합니다.",
responses = {
@ApiResponse(
responseCode = "200",
description = "프로젝트 권한이 성공적으로 조회되었습니다.",
content = @Content(
mediaType = "application/json",
schema = @Schema(implementation = GetProjectAuthorization.Response.class)
)
)
}
)
ResponseEntity<APIResponse<GetProjectAuthorization.Response>> getProjectAuthorization(
@PathVariable Long stepId
);
}
Loading

0 comments on commit bd53420

Please sign in to comment.