diff --git a/src/main/java/clap/server/adapter/inbound/web/dto/task/FilterAssignedTaskListResponse.java b/src/main/java/clap/server/adapter/inbound/web/dto/task/FilterAssignedTaskListResponse.java new file mode 100644 index 00000000..0f444351 --- /dev/null +++ b/src/main/java/clap/server/adapter/inbound/web/dto/task/FilterAssignedTaskListResponse.java @@ -0,0 +1,17 @@ +package clap.server.adapter.inbound.web.dto.task; + +import clap.server.adapter.outbound.persistense.entity.task.constant.TaskStatus; + +import java.time.LocalDateTime; + +public record FilterAssignedTaskListResponse( + Long taskId, + String taskCode, + LocalDateTime requestedAt, + String mainCategoryName, + String categoryName, + String title, + String requesterName, + TaskStatus taskStatus, + LocalDateTime finishedAt +) {} diff --git a/src/main/java/clap/server/adapter/inbound/web/task/FindTaskController.java b/src/main/java/clap/server/adapter/inbound/web/task/FindTaskController.java index 2a7b155e..873e7ac9 100644 --- a/src/main/java/clap/server/adapter/inbound/web/task/FindTaskController.java +++ b/src/main/java/clap/server/adapter/inbound/web/task/FindTaskController.java @@ -37,6 +37,7 @@ public ResponseEntity> findTasksRequestedByUs Pageable pageable = PageRequest.of(page, pageSize); return ResponseEntity.ok(taskListUsecase.findTasksRequestedByUser(userInfo.getUserId(), pageable, filterTaskListRequest)); } + @Operation(summary = "요청한 작업 상세 조회") @Secured({"ROLE_USER", "ROLE_MANAGER"}) @GetMapping("/{taskId}/requests/details") @@ -46,6 +47,18 @@ public ResponseEntity findRequestedTaskDetails( return ResponseEntity.ok(taskDetailsUsecase.findRequestedTaskDetails(userInfo.getUserId(), taskId)); } + @Operation(summary = "할당된 내 작업 목록 조회") + @Secured({"ROLE_MANAGER"}) + @GetMapping("/assigned") + public ResponseEntity> findTasksAssignedByManager( + @RequestParam(defaultValue = "0") int page, + @RequestParam(defaultValue = "20") int pageSize, + @ModelAttribute FilterTaskListRequest filterTaskListRequest, + @AuthenticationPrincipal SecurityUserDetails userInfo){ + Pageable pageable = PageRequest.of(page, pageSize); + return ResponseEntity.ok(taskListUsecase.findTasksAssignedByManager(userInfo.getUserId(), pageable, filterTaskListRequest)); + } + @Operation(summary = "승인 대기 중인 요청 목록 조회") @Secured({"ROLE_MANAGER"}) @GetMapping("/requests/pending") diff --git a/src/main/java/clap/server/adapter/outbound/persistense/TaskPersistenceAdapter.java b/src/main/java/clap/server/adapter/outbound/persistense/TaskPersistenceAdapter.java index 1b72d24a..745049d3 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/TaskPersistenceAdapter.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/TaskPersistenceAdapter.java @@ -4,6 +4,7 @@ import clap.server.adapter.inbound.web.dto.task.FilterPendingApprovalResponse; import clap.server.adapter.inbound.web.dto.task.FilterRequestedTasksResponse; import clap.server.adapter.inbound.web.dto.task.FilterTaskListRequest; +import clap.server.adapter.inbound.web.dto.task.*; import clap.server.adapter.outbound.persistense.entity.task.TaskEntity; import clap.server.adapter.outbound.persistense.entity.task.constant.TaskStatus; import clap.server.adapter.outbound.persistense.mapper.TaskPersistenceMapper; @@ -50,6 +51,13 @@ public Page findTasksRequestedByUser(Long requeste return taskList.map(TaskMapper::toFilterRequestedTasksResponse); } + @Override + public Page findTasksAssignedByManager(Long processorId, Pageable pageable, FilterTaskListRequest filterTaskListRequest) { + Page taskList = taskRepository.findTasksAssignedByManager(processorId, pageable, filterTaskListRequest) + .map(taskPersistenceMapper::toDomain); + return taskList.map(TaskMapper::toFilterAssignedTaskListResponse); + } + @Override public Page findPendingApprovalTasks(Pageable pageable, FilterTaskListRequest filterTaskListRequest) { Page taskList = taskRepository.findPendingApprovalTasks(pageable, filterTaskListRequest) diff --git a/src/main/java/clap/server/adapter/outbound/persistense/repository/task/TaskCustomRepository.java b/src/main/java/clap/server/adapter/outbound/persistense/repository/task/TaskCustomRepository.java index d7f5902d..fc974623 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/repository/task/TaskCustomRepository.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/repository/task/TaskCustomRepository.java @@ -10,4 +10,5 @@ public interface TaskCustomRepository { Page findTasksRequestedByUser(Long requesterId, Pageable pageable, FilterTaskListRequest findTaskListRequest); Page findPendingApprovalTasks(Pageable pageable, FilterTaskListRequest findTaskListRequest); Page findAllTasks(Pageable pageable, FilterTaskListRequest findTaskListRequest); + Page findTasksAssignedByManager(Long processorId, Pageable pageable, FilterTaskListRequest findTaskListRequest); } diff --git a/src/main/java/clap/server/adapter/outbound/persistense/repository/task/TaskCustomRepositoryImpl.java b/src/main/java/clap/server/adapter/outbound/persistense/repository/task/TaskCustomRepositoryImpl.java index 29b44a93..a95c2f0a 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/repository/task/TaskCustomRepositoryImpl.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/repository/task/TaskCustomRepositoryImpl.java @@ -36,6 +36,17 @@ public Page findTasksRequestedByUser(Long requesterId, Pageable page return getTasksPage(pageable, whereClause, filterTaskListRequest.orderRequest().sortBy(), filterTaskListRequest.orderRequest().sortDirection()); } + @Override + public Page findTasksAssignedByManager(Long processorId, Pageable pageable, FilterTaskListRequest filterTaskListRequest) { + BooleanBuilder whereClause = createFilter(filterTaskListRequest); + if (!filterTaskListRequest.nickName().isEmpty()) { + whereClause.and(taskEntity.requester.nickname.eq(filterTaskListRequest.nickName())); + } + whereClause.and(taskEntity.processor.memberId.eq(processorId)); + + return getTasksPage(pageable, whereClause, filterTaskListRequest.orderRequest().sortBy(), filterTaskListRequest.orderRequest().sortDirection()); + } + @Override public Page findPendingApprovalTasks(Pageable pageable, FilterTaskListRequest filterTaskListRequest) { BooleanBuilder whereClause = createFilter(filterTaskListRequest); diff --git a/src/main/java/clap/server/application/mapper/TaskMapper.java b/src/main/java/clap/server/application/mapper/TaskMapper.java index b5025465..3cfce29a 100644 --- a/src/main/java/clap/server/application/mapper/TaskMapper.java +++ b/src/main/java/clap/server/application/mapper/TaskMapper.java @@ -42,7 +42,19 @@ public static FilterRequestedTasksResponse toFilterRequestedTasksResponse(Task t task.getFinishedAt() != null ? task.getFinishedAt() : null ); } - + public static FilterAssignedTaskListResponse toFilterAssignedTaskListResponse(Task task) { + return new FilterAssignedTaskListResponse( + task.getTaskId(), + task.getTaskCode(), + task.getUpdatedAt(), + task.getCategory().getMainCategory().getName(), + task.getCategory().getName(), + task.getTitle(), + task.getRequester() != null ? task.getRequester().getMemberInfo().getNickname() : "", + task.getTaskStatus(), + task.getFinishedAt() != null ? task.getFinishedAt() : null + ); + } public static FilterPendingApprovalResponse toFilterPendingApprovalTasksResponse(Task task) { return new FilterPendingApprovalResponse( task.getTaskId(), diff --git a/src/main/java/clap/server/application/port/inbound/task/FindTaskListUsecase.java b/src/main/java/clap/server/application/port/inbound/task/FindTaskListUsecase.java index 903c6563..6700b5bc 100644 --- a/src/main/java/clap/server/application/port/inbound/task/FindTaskListUsecase.java +++ b/src/main/java/clap/server/application/port/inbound/task/FindTaskListUsecase.java @@ -1,15 +1,14 @@ package clap.server.application.port.inbound.task; -import clap.server.adapter.inbound.web.dto.task.FilterAllTasksResponse; -import clap.server.adapter.inbound.web.dto.task.FilterTaskListRequest; -import clap.server.adapter.inbound.web.dto.task.FilterRequestedTasksResponse; -import clap.server.adapter.inbound.web.dto.task.FilterPendingApprovalResponse; +import clap.server.adapter.inbound.web.dto.task.*; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; public interface FindTaskListUsecase { Page findTasksRequestedByUser(Long memberId, Pageable pageable, FilterTaskListRequest findTaskListRequest); + Page findTasksAssignedByManager(Long memberId, Pageable pageable, FilterTaskListRequest findTaskListRequest); + Page findPendingApprovalTasks(Long userId, Pageable pageable, FilterTaskListRequest filterTaskListRequest); Page findAllTasks(Long userId, Pageable pageable, FilterTaskListRequest filterTaskListRequest); diff --git a/src/main/java/clap/server/application/port/outbound/task/LoadTaskPort.java b/src/main/java/clap/server/application/port/outbound/task/LoadTaskPort.java index c6e69572..c6628d79 100644 --- a/src/main/java/clap/server/application/port/outbound/task/LoadTaskPort.java +++ b/src/main/java/clap/server/application/port/outbound/task/LoadTaskPort.java @@ -1,5 +1,6 @@ package clap.server.application.port.outbound.task; +import clap.server.adapter.inbound.web.dto.task.*; import clap.server.adapter.inbound.web.dto.task.FilterAllTasksResponse; import clap.server.adapter.inbound.web.dto.task.FilterPendingApprovalResponse; import clap.server.adapter.inbound.web.dto.task.FilterRequestedTasksResponse; @@ -21,6 +22,8 @@ public interface LoadTaskPort { Page findTasksRequestedByUser(Long requesterId, Pageable pageable, FilterTaskListRequest findTaskListRequest); + Page findTasksAssignedByManager(Long processorId, Pageable pageable, FilterTaskListRequest filterTaskListRequest); + Page findPendingApprovalTasks(Pageable pageable, FilterTaskListRequest filterTaskListRequest); Page findAllTasks(Pageable pageable, FilterTaskListRequest findTaskListRequest); diff --git a/src/main/java/clap/server/application/service/task/FindTaskListService.java b/src/main/java/clap/server/application/service/task/FindTaskListService.java index ae718941..4fec9de2 100644 --- a/src/main/java/clap/server/application/service/task/FindTaskListService.java +++ b/src/main/java/clap/server/application/service/task/FindTaskListService.java @@ -1,10 +1,7 @@ package clap.server.application.service.task; -import clap.server.adapter.inbound.web.dto.task.FilterAllTasksResponse; -import clap.server.adapter.inbound.web.dto.task.FilterTaskListRequest; -import clap.server.adapter.inbound.web.dto.task.FilterRequestedTasksResponse; +import clap.server.adapter.inbound.web.dto.task.*; -import clap.server.adapter.inbound.web.dto.task.FilterPendingApprovalResponse; import clap.server.application.port.inbound.domain.MemberService; import clap.server.application.port.inbound.task.FindTaskListUsecase; @@ -35,6 +32,12 @@ public Page findTasksRequestedByUser(Long requeste return loadTaskPort.findTasksRequestedByUser(requester.getMemberId(), pageable, findTaskListRequest); } + @Override + public Page findTasksAssignedByManager(Long processorId, Pageable pageable, FilterTaskListRequest findTaskListRequest) { + Member processor = memberService.findActiveMember(processorId); + return loadTaskPort.findTasksAssignedByManager(processor.getMemberId(), pageable, findTaskListRequest); + } + @Override public Page findPendingApprovalTasks(Long managerId, Pageable pageable, FilterTaskListRequest filterTaskListRequest) { memberService.findActiveMember(managerId);