Skip to content

Commit 8be4f9c

Browse files
authored
Merge pull request #560 from TaskFlow-CLAP/CLAP-408
CLAP-408 진행중, 검토중인 작업 수 조회 시 member 테이블의 컬럼을 참조하도록 리팩토링
2 parents a808d3b + a4db273 commit 8be4f9c

21 files changed

+314
-144
lines changed

src/main/java/clap/server/adapter/inbound/web/dto/task/response/TeamStatusResponse.java

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,4 @@ public record TeamStatusResponse(
88
int totalInReviewingTaskCount,
99
int totalTaskCount
1010
) {
11-
// 기존 생성자 (3개 파라미터)
12-
public TeamStatusResponse(List<TeamTaskResponse> members, int totalInProgressTaskCount, int totalInReviewingTaskCount) {
13-
this(
14-
(members == null) ? List.of() : members,
15-
totalInProgressTaskCount,
16-
totalInReviewingTaskCount,
17-
totalInProgressTaskCount + totalInReviewingTaskCount
18-
);
19-
}
20-
21-
// 추가된 생성자 (List만 받음)
22-
public TeamStatusResponse(List<TeamTaskResponse> members) {
23-
this(members, 0, 0); // 기본값을 사용하여 생성
24-
}
2511
}

src/main/java/clap/server/adapter/inbound/web/task/CancelTaskController.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,15 @@
1212
import org.springframework.web.bind.annotation.PathVariable;
1313
import org.springframework.web.bind.annotation.RequestMapping;
1414

15-
@Tag(name = "02. Task [거부 & 종료]")
15+
@Tag(name = "02. Task [종료]")
1616
@RequestMapping("/api/tasks")
1717
@RequiredArgsConstructor
1818
@WebAdapter
1919
public class CancelTaskController {
2020
private final CancelTaskUsecase cancelTaskUsecase;
2121

2222
@Operation(summary = "작업 취소")
23-
@Secured({"ROLE_USER","ROLE_MANAGER"})
23+
@Secured("ROLE_USER")
2424
@PatchMapping("/{taskId}/cancel")
2525
public void cancelTask(@PathVariable Long taskId, @AuthenticationPrincipal SecurityUserDetails userDetails) {
2626
cancelTaskUsecase.cancleTask(taskId, userDetails.getUserId());

src/main/java/clap/server/adapter/inbound/web/task/TerminateTaskController.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,23 @@
55
import clap.server.application.port.inbound.task.TerminateTaskUsecase;
66
import clap.server.common.annotation.architecture.WebAdapter;
77
import io.swagger.v3.oas.annotations.Operation;
8-
import io.swagger.v3.oas.annotations.media.Schema;
98
import io.swagger.v3.oas.annotations.tags.Tag;
10-
import jakarta.validation.constraints.NotBlank;
119
import lombok.RequiredArgsConstructor;
1210
import org.springframework.security.access.annotation.Secured;
1311
import org.springframework.security.core.annotation.AuthenticationPrincipal;
14-
import org.springframework.web.bind.annotation.*;
12+
import org.springframework.web.bind.annotation.PatchMapping;
13+
import org.springframework.web.bind.annotation.PathVariable;
14+
import org.springframework.web.bind.annotation.RequestBody;
15+
import org.springframework.web.bind.annotation.RequestMapping;
1516

16-
@Tag(name = "02. Task [거부 & 종료]")
17+
@Tag(name = "02. Task [종료]")
1718
@WebAdapter
1819
@RequiredArgsConstructor
1920
@RequestMapping("/api/tasks")
2021
public class TerminateTaskController {
2122
private final TerminateTaskUsecase terminateTaskUsecase;
2223

23-
@Operation(summary = "작업 거부 및 종료")
24+
@Operation(summary = "작업 반려 및 종료")
2425
@Secured({"ROLE_MANAGER"})
2526
@PatchMapping("/{taskId}/terminate")
2627
public void terminateTask(@AuthenticationPrincipal SecurityUserDetails userInfo,

src/main/java/clap/server/adapter/outbound/persistense/repository/task/TaskCustomRepositoryImpl.java

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,8 @@
33
import clap.server.adapter.inbound.web.dto.task.request.FilterTaskBoardRequest;
44
import clap.server.adapter.inbound.web.dto.task.request.FilterTaskListRequest;
55
import clap.server.adapter.inbound.web.dto.task.request.FilterTeamStatusRequest;
6-
import clap.server.adapter.inbound.web.dto.task.request.SortBy;
7-
import clap.server.adapter.inbound.web.dto.task.response.TeamTaskItemResponse;
8-
import clap.server.adapter.inbound.web.dto.task.response.TeamTaskResponse;
96
import clap.server.adapter.outbound.persistense.entity.task.TaskEntity;
107
import clap.server.adapter.outbound.persistense.entity.task.constant.TaskStatus;
11-
import clap.server.domain.model.task.Task;
128
import com.querydsl.core.BooleanBuilder;
139
import com.querydsl.core.types.OrderSpecifier;
1410
import com.querydsl.core.types.dsl.DateTimePath;
@@ -20,12 +16,8 @@
2016
import org.springframework.stereotype.Repository;
2117

2218
import java.time.LocalDateTime;
23-
import java.util.Comparator;
24-
import java.util.LinkedHashMap;
2519
import java.util.List;
26-
import java.util.stream.Collectors;
2720

28-
import static clap.server.adapter.inbound.web.dto.task.request.SortBy.CONTRIBUTE;
2921
import static clap.server.adapter.outbound.persistense.entity.task.QTaskEntity.taskEntity;
3022
import static com.querydsl.core.types.Order.ASC;
3123
import static com.querydsl.core.types.Order.DESC;

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

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package clap.server.application.mapper.response;
22

3+
import clap.server.adapter.inbound.web.dto.task.response.TeamStatusResponse;
34
import clap.server.adapter.inbound.web.dto.task.response.TeamTaskItemResponse;
45
import clap.server.adapter.inbound.web.dto.task.response.TeamTaskResponse;
5-
import clap.server.adapter.outbound.persistense.entity.task.constant.TaskStatus;
66
import clap.server.domain.model.task.Task;
77

88
import java.util.LinkedHashMap;
@@ -25,10 +25,10 @@ private static TeamTaskResponse toTeamTaskResponse(Map.Entry<Long, List<Task>> e
2525
.map(TeamTaskResponseMapper::toTeamTaskItemResponse)
2626
.collect(Collectors.toList());
2727

28-
int inProgressTaskCount = (int) entry.getValue().stream().filter(t -> t.getTaskStatus() == TaskStatus.IN_PROGRESS).count();
29-
int inReviewingTaskCount = (int) entry.getValue().stream().filter(t -> t.getTaskStatus() == TaskStatus.IN_REVIEWING).count();
30-
3128
Task firstTask = entry.getValue().get(0);
29+
int inProgressTaskCount = firstTask.getProcessor().getInProgressTaskCount();
30+
int inReviewingTaskCount = firstTask.getProcessor().getInReviewingTaskCount();
31+
3232
return new TeamTaskResponse(
3333
entry.getKey(),
3434
firstTask.getProcessor().getNickname(),
@@ -65,4 +65,13 @@ private static TeamTaskItemResponse.LabelInfo toLabelInfo(Task task) {
6565
task.getLabel().getLabelColor()
6666
) : null;
6767
}
68+
69+
public static TeamStatusResponse toTeamStatusResponse(List<TeamTaskResponse> members, int totalInProgressTaskCount, int totalInReviewingTaskCount) {
70+
return new TeamStatusResponse(
71+
(members == null) ? List.of() : members,
72+
totalInProgressTaskCount,
73+
totalInReviewingTaskCount,
74+
totalInProgressTaskCount + totalInReviewingTaskCount
75+
);
76+
}
6877
}

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,7 @@ public void updateMemberInfo(Long adminId, Long memberId, UpdateMemberRequest re
2929
Member member = memberService.findById(memberId);
3030
Department department = loadDepartmentPort.findById(request.departmentId()).orElseThrow(() ->
3131
new ApplicationException(DepartmentErrorCode.DEPARTMENT_NOT_FOUND));
32-
33-
//TODO: 인프라팀만 담당자가 될 수 있도록 수정해야함
32+
3433
member.getMemberInfo().updateMemberInfoByAdmin(
3534
request.name(), request.isReviewer(),
3635
department, request.role(), request.departmentRole());

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

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import clap.server.adapter.outbound.persistense.entity.member.constant.MemberRole;
77
import clap.server.adapter.outbound.persistense.entity.notification.constant.NotificationType;
88
import clap.server.adapter.outbound.persistense.entity.task.constant.TaskHistoryType;
9+
import clap.server.adapter.outbound.persistense.entity.task.constant.TaskStatus;
910
import clap.server.application.mapper.response.TaskResponseMapper;
1011
import clap.server.application.port.inbound.domain.CategoryService;
1112
import clap.server.application.port.inbound.domain.LabelService;
@@ -28,16 +29,16 @@
2829

2930
@ApplicationService
3031
@RequiredArgsConstructor
31-
@Transactional(readOnly = true)
3232
public class ApprovalTaskService implements ApprovalTaskUsecase {
33-
3433
private final MemberService memberService;
3534
private final TaskService taskService;
3635
private final CategoryService categoryService;
3736
private final LabelService labelService;
37+
3838
private final RequestedTaskUpdatePolicy requestedTaskUpdatePolicy;
3939
private final CommandTaskHistoryPort commandTaskHistoryPort;
4040
private final SendNotificationService sendNotificationService;
41+
private final UpdateProcessorTaskCountService updateProcessorTaskCountService;
4142

4243
@Override
4344
@Transactional
@@ -52,8 +53,10 @@ public ApprovalTaskResponse approvalTaskByReviewer(Long reviewerId, Long taskId,
5253
}
5354

5455
requestedTaskUpdatePolicy.validateTaskRequested(task);
56+
updateProcessorTaskCountService.handleTaskStatusChange(processor, TaskStatus.REQUESTED, TaskStatus.IN_PROGRESS);
5557
task.approveTask(reviewer, processor, approvalTaskRequest.dueDate(), category, label);
56-
TaskHistory taskHistory = TaskHistory.createTaskHistory(TaskHistoryType.PROCESSOR_ASSIGNED, task, null, processor,null);
58+
59+
TaskHistory taskHistory = TaskHistory.createTaskHistory(TaskHistoryType.PROCESSOR_ASSIGNED, task, null, processor, null);
5760
commandTaskHistoryPort.save(taskHistory);
5861

5962
List<Member> receivers = List.of(task.getRequester(), processor);
@@ -71,7 +74,7 @@ public FindApprovalFormResponse findApprovalForm(Long managerId, Long taskId) {
7174
return TaskResponseMapper.toFindApprovalFormResponse(task);
7275
}
7376

74-
private void publishNotification(List<Member> receivers, Task task, String processorName){
77+
private void publishNotification(List<Member> receivers, Task task, String processorName) {
7578
receivers.forEach(receiver -> {
7679
boolean isManager = receiver.getMemberInfo().getRole() == MemberRole.ROLE_MANAGER;
7780
sendNotificationService.sendPushNotification(receiver, NotificationType.PROCESSOR_ASSIGNED,

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

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
package clap.server.application.service.task;
22

33
import clap.server.adapter.inbound.web.dto.task.response.FindManagersResponse;
4-
import clap.server.adapter.outbound.persistense.entity.task.constant.TaskStatus;
54
import clap.server.application.port.inbound.domain.MemberService;
65
import clap.server.application.port.inbound.task.FindManagersUsecase;
7-
import clap.server.application.port.outbound.task.LoadTaskPort;
86
import clap.server.common.annotation.architecture.ApplicationService;
97
import clap.server.domain.model.member.Member;
108
import jakarta.transaction.Transactional;
@@ -19,16 +17,14 @@
1917
public class FindManagersService implements FindManagersUsecase {
2018

2119
private final MemberService memberService;
22-
private final LoadTaskPort loadTaskPort;
2320

2421
@Transactional
2522
@Override
2623
public List<FindManagersResponse> findManagers() {
27-
List<TaskStatus> targetStatuses = List.of(TaskStatus.IN_PROGRESS, TaskStatus.IN_REVIEWING);
2824
List<Member> managers = memberService.findActiveManagers();
2925
return managers.stream()
3026
.map(manager -> {
31-
int remainingTasks = loadTaskPort.findTasksByMemberIdAndStatus(manager.getMemberId(), targetStatuses).size();
27+
int remainingTasks = manager.getInProgressTaskCount() + manager.getInReviewingTaskCount();
3228
return toFindManagersResponse(manager, remainingTasks);
3329
}).toList();
3430
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public TeamStatusResponse filterTeamStatus(FilterTeamStatusRequest filter) {
3535
taskItemResponses.sort((a, b) -> b.totalTaskCount() - a.totalTaskCount());
3636
else taskItemResponses.sort(Comparator.comparing(TeamTaskResponse::nickname));
3737

38-
return new TeamStatusResponse(taskItemResponses, totalInProgressTaskCount, totalInReviewingTaskCount);
38+
return TeamTaskResponseMapper.toTeamStatusResponse(taskItemResponses, totalInProgressTaskCount, totalInReviewingTaskCount);
3939
}
4040

4141

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

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
package clap.server.application.service.task;
22

3-
import clap.server.adapter.outbound.persistense.entity.member.constant.MemberRole;
43
import clap.server.adapter.outbound.persistense.entity.notification.constant.NotificationType;
54
import clap.server.adapter.outbound.persistense.entity.task.constant.TaskHistoryType;
6-
import clap.server.application.port.inbound.domain.MemberService;
5+
import clap.server.adapter.outbound.persistense.entity.task.constant.TaskStatus;
76
import clap.server.application.port.inbound.domain.TaskService;
87
import clap.server.application.port.inbound.task.TerminateTaskUsecase;
98
import clap.server.application.port.outbound.taskhistory.CommandTaskHistoryPort;
@@ -15,20 +14,20 @@
1514
import lombok.RequiredArgsConstructor;
1615
import org.springframework.transaction.annotation.Transactional;
1716

18-
import java.util.List;
19-
2017
@ApplicationService
2118
@RequiredArgsConstructor
2219
@Transactional
2320
public class TerminateTaskService implements TerminateTaskUsecase {
24-
private final MemberService memberService;
2521
private final TaskService taskService;
2622
private final CommandTaskHistoryPort commandTaskHistoryPort;
2723
private final SendNotificationService sendNotificationService;
24+
private final UpdateProcessorTaskCountService updateProcessorTaskCountService;
2825

2926
@Override
3027
public void terminateTask(Long memberId, Long taskId, String reason) {
3128
Task task = taskService.findById(taskId);
29+
30+
updateProcessorTaskCountService.handleTaskStatusChange(task.getProcessor(), task.getTaskStatus(), TaskStatus.TERMINATED);
3231
task.terminateTask();
3332
taskService.upsert(task);
3433

0 commit comments

Comments
 (0)