diff --git a/src/main/java/clap/server/adapter/inbound/web/dto/task/FindTaskDetailsForManagerResponse.java b/src/main/java/clap/server/adapter/inbound/web/dto/task/FindTaskDetailsForManagerResponse.java new file mode 100644 index 00000000..19dd72be --- /dev/null +++ b/src/main/java/clap/server/adapter/inbound/web/dto/task/FindTaskDetailsForManagerResponse.java @@ -0,0 +1,25 @@ +package clap.server.adapter.inbound.web.dto.task; + +import clap.server.adapter.outbound.persistense.entity.task.constant.TaskStatus; + +import java.time.LocalDateTime; +import java.util.List; + +public record FindTaskDetailsForManagerResponse( + Long taskId, + String taskCode, + LocalDateTime requestedAt, + LocalDateTime finishedAt, + TaskStatus taskStatus, + String requesterNickName, + String requesterImageUrl, + String processorNickName, + String processorImageUrl, + String mainCategoryName, + String categoryName, + String title, + String description, + LocalDateTime dueDate, + String labelName, + List attachmentResponses +) implements TaskDetailsResponse {} diff --git a/src/main/java/clap/server/adapter/inbound/web/dto/task/FindTaskDetailsResponse.java b/src/main/java/clap/server/adapter/inbound/web/dto/task/FindTaskDetailsResponse.java index 2e243487..905c01e3 100644 --- a/src/main/java/clap/server/adapter/inbound/web/dto/task/FindTaskDetailsResponse.java +++ b/src/main/java/clap/server/adapter/inbound/web/dto/task/FindTaskDetailsResponse.java @@ -21,5 +21,4 @@ public record FindTaskDetailsResponse( String description, List attachmentResponses - //TODO: taskhistory 및 comment 정보 추가 -) {} +) implements TaskDetailsResponse {} diff --git a/src/main/java/clap/server/adapter/inbound/web/dto/task/TaskDetailsResponse.java b/src/main/java/clap/server/adapter/inbound/web/dto/task/TaskDetailsResponse.java new file mode 100644 index 00000000..6dbbc5a3 --- /dev/null +++ b/src/main/java/clap/server/adapter/inbound/web/dto/task/TaskDetailsResponse.java @@ -0,0 +1,23 @@ +package clap.server.adapter.inbound.web.dto.task; + +import clap.server.adapter.outbound.persistense.entity.task.constant.TaskStatus; + +import java.time.LocalDateTime; +import java.util.List; + +public interface TaskDetailsResponse { + Long taskId(); + String taskCode(); + LocalDateTime requestedAt(); + LocalDateTime finishedAt(); + TaskStatus taskStatus(); + String requesterNickName(); + String requesterImageUrl(); + String processorNickName(); + String processorImageUrl(); + String mainCategoryName(); + String categoryName(); + String title(); + String description(); + List attachmentResponses(); +} 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 39c6d5ae..f7819beb 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,7 +37,6 @@ 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("/requests/details/{taskId}") @@ -70,4 +69,13 @@ public ResponseEntity> findAllTasks( Pageable pageable = PageRequest.of(page, pageSize); return ResponseEntity.ok(taskListUsecase.findAllTasks(userInfo.getUserId(), pageable, filterTaskListRequest)); } + + @Operation(summary = "전체요청, 내 작업에 대한 상세 조회") + @Secured("ROLE_MANAGER") + @GetMapping("/details/{taskId}") + public ResponseEntity findRequestedTaskDetailsForManager( + @PathVariable Long taskId, + @AuthenticationPrincipal SecurityUserDetails userInfo) { + return ResponseEntity.ok(taskDetailsUsecase.findTaskDetailsForManager(userInfo.getUserId(), taskId)); + } } \ No newline at end of file diff --git a/src/main/java/clap/server/application/Task/FindTaskDetailsService.java b/src/main/java/clap/server/application/Task/FindTaskDetailsService.java index 2920f46d..6bf4a9dd 100644 --- a/src/main/java/clap/server/application/Task/FindTaskDetailsService.java +++ b/src/main/java/clap/server/application/Task/FindTaskDetailsService.java @@ -1,5 +1,6 @@ package clap.server.application.Task; +import clap.server.adapter.inbound.web.dto.task.FindTaskDetailsForManagerResponse; import clap.server.adapter.inbound.web.dto.task.FindTaskDetailsResponse; import clap.server.adapter.outbound.persistense.entity.task.TaskEntity; import clap.server.application.mapper.TaskMapper; @@ -35,4 +36,13 @@ public FindTaskDetailsResponse findRequestedTaskDetails(final Long requesterId, List attachments = loadAttachmentPort.findAllByTaskIdAndCommentIsNull(taskId); return TaskMapper.toFindTaskDetailResponse(task, attachments); } + + @Override + public FindTaskDetailsForManagerResponse findTaskDetailsForManager(final Long requesterId, final Long taskId) { + memberService.findActiveMember(requesterId); + Task task = loadTaskPort.findById(taskId) + .orElseThrow(() -> new ApplicationException(TaskErrorCode.TASK_NOT_FOUND)); + List attachments = loadAttachmentPort.findAllByTaskIdAndCommentIsNull(taskId); + return TaskMapper.toFindTaskDetailForManagerResponse(task, attachments); + } } diff --git a/src/main/java/clap/server/application/mapper/AttachmentMapper.java b/src/main/java/clap/server/application/mapper/AttachmentMapper.java index 121dd9fe..119221b6 100644 --- a/src/main/java/clap/server/application/mapper/AttachmentMapper.java +++ b/src/main/java/clap/server/application/mapper/AttachmentMapper.java @@ -1,5 +1,6 @@ package clap.server.application.mapper; +import clap.server.adapter.inbound.web.dto.task.AttachmentResponse; import clap.server.domain.model.task.Attachment; import clap.server.domain.model.task.Task; import org.springframework.web.multipart.MultipartFile; @@ -25,5 +26,17 @@ public static List toTaskAttachments(Task task, List .toList(); } + public static List toAttachmentResponseList(List attachments) { + return attachments.stream() + .map(attachment -> new AttachmentResponse( + attachment.getAttachmentId(), + attachment.getOriginalName(), + attachment.getFileSize(), + attachment.getFileUrl(), + attachment.getCreatedAt() + )) + .toList(); + } + } diff --git a/src/main/java/clap/server/application/mapper/TaskMapper.java b/src/main/java/clap/server/application/mapper/TaskMapper.java index 4843c235..8ad3220e 100644 --- a/src/main/java/clap/server/application/mapper/TaskMapper.java +++ b/src/main/java/clap/server/application/mapper/TaskMapper.java @@ -14,6 +14,8 @@ import java.util.Map; import java.util.stream.Collectors; +import static clap.server.application.mapper.AttachmentMapper.toAttachmentResponseList; + public class TaskMapper { private TaskMapper() { throw new IllegalArgumentException(); @@ -54,17 +56,7 @@ public static FilterPendingApprovalResponse toFilterPendingApprovalTasksResponse } public static FindTaskDetailsResponse toFindTaskDetailResponse(Task task, List attachments){ - - List attachmentResponses = attachments.stream() - .map(attachment -> new AttachmentResponse( - attachment.getAttachmentId(), - attachment.getOriginalName(), - attachment.getFileSize(), - attachment.getFileUrl(), - attachment.getCreatedAt() - )) - .collect(Collectors.toList()); - + List attachmentResponses = toAttachmentResponseList(attachments); return new FindTaskDetailsResponse( task.getTaskId(), task.getTaskCode(), @@ -138,4 +130,26 @@ private static TaskItemResponse toTaskItemResponse(Task task) { task.getCreatedAt() ); } + + public static FindTaskDetailsForManagerResponse toFindTaskDetailForManagerResponse(Task task, List attachments) { + List attachmentResponses = toAttachmentResponseList(attachments); + return new FindTaskDetailsForManagerResponse( + task.getTaskId(), + task.getTaskCode(), + task.getCreatedAt(), + task.getFinishedAt(), + task.getTaskStatus(), + task.getRequester().getMemberInfo().getNickname(), + task.getRequester().getImageUrl(), + task.getProcessor() != null ? task.getProcessor().getMemberInfo().getNickname() : "", + task.getProcessor() != null ? task.getProcessor().getImageUrl() : "", + task.getCategory().getMainCategory().getName(), + task.getCategory().getName(), + task.getTitle(), + task.getDescription(), + task.getDueDate(), + task.getLabel() != null ? task.getLabel().getLabelName() : "", + attachmentResponses + ); + } } diff --git a/src/main/java/clap/server/application/port/inbound/task/FindTaskDetailsUsecase.java b/src/main/java/clap/server/application/port/inbound/task/FindTaskDetailsUsecase.java index 009eca07..b537fc9a 100644 --- a/src/main/java/clap/server/application/port/inbound/task/FindTaskDetailsUsecase.java +++ b/src/main/java/clap/server/application/port/inbound/task/FindTaskDetailsUsecase.java @@ -1,9 +1,10 @@ package clap.server.application.port.inbound.task; import clap.server.adapter.inbound.web.dto.task.FindTaskDetailsResponse; - -import java.util.List; +import clap.server.adapter.inbound.web.dto.task.FindTaskDetailsForManagerResponse; public interface FindTaskDetailsUsecase { FindTaskDetailsResponse findRequestedTaskDetails(Long memberId, Long taskId); + + FindTaskDetailsForManagerResponse findTaskDetailsForManager(Long memberId, Long taskId); } 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 8e340eb1..ff18bf14 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,8 @@ package clap.server.application.port.outbound.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.FilterAllTasksResponse; import clap.server.adapter.inbound.web.dto.task.FilterTaskListRequest;