Skip to content

Commit 4f14e17

Browse files
authored
Merge pull request #566 from TaskFlow-CLAP/CLAP-432
CLAP-432 회원 수정 및 삭제 시에 검증 로직 추가
2 parents 1fda805 + 89118c8 commit 4f14e17

File tree

11 files changed

+67
-19
lines changed

11 files changed

+67
-19
lines changed

src/main/java/clap/server/adapter/inbound/web/dto/admin/response/MemberDetailsResponse.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ public record MemberDetailsResponse(
2121
@Schema(description = "부서")
2222
String departmentName,
2323
@Schema(description = "직무")
24-
String departmentRole
24+
String departmentRole,
25+
@Schema(description = "잔여 작업, 등록이 되지 않은 회원은 Null로 출력됩니다.")
26+
Integer remainingTasks
2527
) {}
2628

src/main/java/clap/server/adapter/inbound/web/dto/member/response/MemberDetailInfoResponse.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@ public record MemberDetailInfoResponse(
2020
@Schema(description = "직책")
2121
String departmentRole,
2222
@Schema(description = "알림 수신 여부")
23-
NotificationSettingInfoResponse notificationSettingInfo
23+
NotificationSettingInfoResponse notificationSettingInfo,
24+
@Schema(description = "진행/검토 작업 수, 담당자가 아닐 경우에는 null입니다.")
25+
MemberRemainingTaskCountsResponse remainingTaskCounts
2426
) {
2527
public static record NotificationSettingInfoResponse(
2628
@Schema(description = "이메일 알림 수신 여부")
@@ -29,6 +31,14 @@ public static record NotificationSettingInfoResponse(
2931
boolean kakaoWork
3032
) {
3133
}
34+
35+
public static record MemberRemainingTaskCountsResponse(
36+
@Schema(description = "진행중 작업 수")
37+
int totalInProgressTaskCount,
38+
@Schema(description = "검토중 작업 수")
39+
int totalInReviewingTaskCount
40+
) {
41+
}
3242
}
3343

3444

src/main/java/clap/server/application/mapper/response/MemberResponseMapper.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import clap.server.adapter.inbound.web.dto.admin.response.MemberDetailsResponse;
55
import clap.server.adapter.inbound.web.dto.member.response.MemberDetailInfoResponse;
66
import clap.server.adapter.inbound.web.dto.member.response.MemberProfileResponse;
7+
import clap.server.adapter.outbound.persistense.entity.member.constant.MemberRole;
78
import clap.server.domain.model.member.Member;
89
import clap.server.domain.model.member.MemberInfo;
910

@@ -32,7 +33,15 @@ public static MemberDetailInfoResponse toMemberDetailInfoResponse(Member member)
3233
member.getMemberInfo().getRole(),
3334
member.getMemberInfo().getDepartment().getName(),
3435
member.getMemberInfo().getDepartmentRole(),
35-
toNotificationSettingInfoResponse(member)
36+
toNotificationSettingInfoResponse(member),
37+
member.getMemberInfo().getRole()!= MemberRole.ROLE_MANAGER ? null : toMemberRemainingTaskCountsResponse(member)
38+
);
39+
}
40+
41+
public static MemberDetailInfoResponse.MemberRemainingTaskCountsResponse toMemberRemainingTaskCountsResponse(Member member){
42+
return new MemberDetailInfoResponse.MemberRemainingTaskCountsResponse(
43+
member.getInProgressTaskCount(),
44+
member.getInReviewingTaskCount()
3645
);
3746
}
3847

@@ -54,7 +63,8 @@ public static MemberDetailsResponse toMemberDetailsResponse(Member member) {
5463
member.getMemberInfo().getRole(),
5564
member.getMemberInfo().getDepartment().getDepartmentId(),
5665
member.getMemberInfo().getDepartment().getName(),
57-
member.getMemberInfo().getDepartmentRole()
66+
member.getMemberInfo().getDepartmentRole(),
67+
member.getInProgressTaskCount() + member.getInReviewingTaskCount()
5868
);
5969
}
6070

src/main/java/clap/server/application/service/admin/CsvParseService.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import clap.server.domain.model.member.Department;
66
import clap.server.domain.model.member.Member;
77
import clap.server.domain.model.member.MemberInfo;
8-
import clap.server.domain.policy.member.ManagerDepartmentPolicy;
8+
import clap.server.domain.policy.member.ManagerInfoUpdatePolicy;
99
import clap.server.exception.ApplicationException;
1010
import clap.server.exception.code.DepartmentErrorCode;
1111
import clap.server.exception.code.MemberErrorCode;
@@ -30,7 +30,7 @@
3030
public class CsvParseService {
3131

3232
private final LoadDepartmentPort loadDepartmentPort;
33-
private final ManagerDepartmentPolicy managerDepartmentPolicy;
33+
private final ManagerInfoUpdatePolicy managerInfoUpdatePolicy;
3434

3535
public List<Member> parseDataAndMapToMember(MultipartFile file) {
3636
List<Member> members = new ArrayList<>();
@@ -67,7 +67,7 @@ private Member mapToMember(String[] fields, List<Department> departments) {
6767
.findFirst()
6868
.orElseThrow(() -> new ApplicationException(DepartmentErrorCode.DEPARTMENT_NOT_FOUND));
6969

70-
managerDepartmentPolicy.validateDepartment(department, MemberRole.valueOf(fields[5].trim()));
70+
managerInfoUpdatePolicy.validateDepartment(department, MemberRole.valueOf(fields[5].trim()));
7171
MemberInfo memberInfo = toMemberInfo(
7272
fields[0].trim(), // name
7373
fields[4].trim(), // email

src/main/java/clap/server/application/service/admin/DeleteMemberService.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
package clap.server.application.service.admin;
22

3+
import clap.server.adapter.outbound.persistense.entity.member.constant.MemberRole;
34
import clap.server.application.port.inbound.admin.DeleteMemberUsecase;
45
import clap.server.application.port.outbound.member.CommandMemberPort;
56
import clap.server.application.port.outbound.member.LoadMemberPort;
67
import clap.server.common.annotation.architecture.ApplicationService;
78
import clap.server.domain.model.member.Member;
9+
import clap.server.domain.policy.member.ManagerInfoUpdatePolicy;
810
import clap.server.exception.ApplicationException;
911
import clap.server.exception.code.MemberErrorCode;
1012
import lombok.RequiredArgsConstructor;
@@ -16,17 +18,19 @@
1618
public class DeleteMemberService implements DeleteMemberUsecase {
1719
private final LoadMemberPort loadMemberPort;
1820
private final CommandMemberPort commandMemberPort;
21+
private final ManagerInfoUpdatePolicy managerInfoUpdatePolicy;
1922

2023
@Transactional
2124
@Override
2225
public void deleteMember(Long memberId) {
2326
Member member = loadMemberPort.findById(memberId)
2427
.orElseThrow(() -> new ApplicationException(MemberErrorCode.MEMBER_NOT_FOUND));
2528

29+
if(member.getMemberInfo().getRole().equals(MemberRole.ROLE_MANAGER)){
30+
managerInfoUpdatePolicy.validateNoRemainingTasks(member);
31+
}
2632
Hibernate.initialize(member.getDepartment());
27-
28-
member.setStatusDeleted();
29-
33+
member.softDelete();
3034
commandMemberPort.save(member);
3135
}
3236
}

src/main/java/clap/server/application/service/admin/ManageMemberService.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import clap.server.adapter.inbound.web.dto.admin.request.UpdateMemberRequest;
44
import clap.server.adapter.inbound.web.dto.admin.response.MemberDetailsResponse;
5+
import clap.server.adapter.outbound.persistense.entity.member.constant.MemberRole;
56
import clap.server.application.mapper.response.MemberResponseMapper;
67
import clap.server.application.port.inbound.admin.MemberDetailUsecase;
78
import clap.server.application.port.inbound.admin.UpdateMemberUsecase;
@@ -11,6 +12,7 @@
1112
import clap.server.common.annotation.architecture.ApplicationService;
1213
import clap.server.domain.model.member.Department;
1314
import clap.server.domain.model.member.Member;
15+
import clap.server.domain.policy.member.ManagerInfoUpdatePolicy;
1416
import clap.server.exception.ApplicationException;
1517
import clap.server.exception.code.DepartmentErrorCode;
1618
import lombok.RequiredArgsConstructor;
@@ -22,14 +24,21 @@ class ManageMemberService implements UpdateMemberUsecase, MemberDetailUsecase {
2224
private final MemberService memberService;
2325
private final CommandMemberPort commandMemberPort;
2426
private final LoadDepartmentPort loadDepartmentPort;
27+
private final ManagerInfoUpdatePolicy managerInfoUpdatePolicy;
2528

2629
@Override
2730
@Transactional
2831
public void updateMemberInfo(Long adminId, Long memberId, UpdateMemberRequest request) {
2932
Member member = memberService.findById(memberId);
3033
Department department = loadDepartmentPort.findById(request.departmentId()).orElseThrow(() ->
3134
new ApplicationException(DepartmentErrorCode.DEPARTMENT_NOT_FOUND));
32-
35+
36+
managerInfoUpdatePolicy.validateDepartment(department, request.role());
37+
if(member.getMemberInfo().getRole().equals(MemberRole.ROLE_MANAGER) &&
38+
!request.role().equals(MemberRole.ROLE_MANAGER)){
39+
managerInfoUpdatePolicy.validateNoRemainingTasks(member);
40+
}
41+
3342
member.getMemberInfo().updateMemberInfoByAdmin(
3443
request.name(), request.isReviewer(),
3544
department, request.role(), request.departmentRole());

src/main/java/clap/server/application/service/admin/RegisterMemberService.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
import clap.server.domain.model.member.Department;
1111
import clap.server.domain.model.member.Member;
1212
import clap.server.domain.model.member.MemberInfo;
13-
import clap.server.domain.policy.member.ManagerDepartmentPolicy;
13+
import clap.server.domain.policy.member.ManagerInfoUpdatePolicy;
1414
import clap.server.exception.ApplicationException;
1515
import clap.server.exception.code.DepartmentErrorCode;
1616
import clap.server.exception.code.MemberErrorCode;
@@ -26,7 +26,7 @@ class RegisterMemberService implements RegisterMemberUsecase {
2626
private final CommandMemberPort commandMemberPort;
2727
private final LoadDepartmentPort loadDepartmentPort;
2828
private final LoadMemberPort loadMemberPort;
29-
private final ManagerDepartmentPolicy managerDepartmentPolicy;
29+
private final ManagerInfoUpdatePolicy managerInfoUpdatePolicy;
3030

3131
@Override
3232
@Transactional
@@ -39,7 +39,7 @@ public void registerMember(Long adminId, RegisterMemberRequest request) {
3939
throw new ApplicationException(MemberErrorCode.DUPLICATE_NICKNAME_OR_EMAIL);
4040
}
4141

42-
managerDepartmentPolicy.validateDepartment(department, request.role());
42+
managerInfoUpdatePolicy.validateDepartment(department, request.role());
4343
MemberInfo memberInfo = MemberInfo.toMemberInfo(request.name(), request.email(), request.nickname(), request.isReviewer(),
4444
department, request.role(), request.departmentRole());
4545
Member member = Member.createMember(admin, memberInfo);

src/main/java/clap/server/application/service/task/TerminateTaskService.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,10 @@ public class TerminateTaskService implements TerminateTaskUsecase {
2727
public void terminateTask(Long memberId, Long taskId, String reason) {
2828
Task task = taskService.findById(taskId);
2929

30-
updateProcessorTaskCountService.handleTaskStatusChange(task.getProcessor(), task.getTaskStatus(), TaskStatus.TERMINATED);
30+
// 작업 종료의 경우. 작업 반려는 count를 업데이트를 하지 않음
31+
if(task.getProcessor()!=null) {
32+
updateProcessorTaskCountService.handleTaskStatusChange(task.getProcessor(), task.getTaskStatus(), TaskStatus.TERMINATED);
33+
}
3134
task.terminateTask();
3235
taskService.upsert(task);
3336

src/main/java/clap/server/domain/model/member/Member.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
import clap.server.adapter.outbound.persistense.entity.member.constant.MemberStatus;
44
import clap.server.domain.model.common.BaseTime;
5-
import jakarta.persistence.Column;
65
import lombok.AccessLevel;
76
import lombok.AllArgsConstructor;
87
import lombok.Getter;
@@ -87,7 +86,7 @@ public void setImageUrl(String imageUrl) {
8786
this.imageUrl = imageUrl;
8887
}
8988

90-
public void setStatusDeleted() {
89+
public void softDelete() {
9190
this.status = MemberStatus.DELETED;
9291
}
9392

src/main/java/clap/server/domain/policy/member/ManagerDepartmentPolicy.java renamed to src/main/java/clap/server/domain/policy/member/ManagerInfoUpdatePolicy.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,26 @@
33
import clap.server.adapter.outbound.persistense.entity.member.constant.MemberRole;
44
import clap.server.common.annotation.architecture.Policy;
55
import clap.server.domain.model.member.Department;
6+
import clap.server.domain.model.member.Member;
67
import clap.server.exception.DomainException;
78
import clap.server.exception.code.MemberErrorCode;
89

910
@Policy
10-
public class ManagerDepartmentPolicy {
11+
public class ManagerInfoUpdatePolicy {
12+
13+
// 담당자 권한이 있는 부서의 인원만 담당자의 역할이 허용됨
1114
public void validateDepartment(final Department department, final MemberRole memberRole) {
1215
if (!department.isManager() ){
1316
if(memberRole == MemberRole.ROLE_MANAGER){
1417
throw new DomainException(MemberErrorCode.MANAGER_PERMISSION_DENIED);
1518
}
1619
}
1720
}
21+
22+
// 담당자의 잔여 작업이 남아있는 경우 해당 회원의 데이터 수정이 허용되지 않음
23+
public void validateNoRemainingTasks(final Member member){
24+
if(member.getInReviewingTaskCount()>0 || member.getInProgressTaskCount()> 0){
25+
throw new DomainException(MemberErrorCode.MANAGER_MEMBER_UPDATE_NOT_ALLOWED_WITH_TASKS);
26+
}
27+
}
1828
}

0 commit comments

Comments
 (0)