diff --git a/src/main/java/clap/server/adapter/inbound/web/dto/task/FindApprovalFormResponse.java b/src/main/java/clap/server/adapter/inbound/web/dto/task/FindApprovalFormResponse.java new file mode 100644 index 00000000..5c46a428 --- /dev/null +++ b/src/main/java/clap/server/adapter/inbound/web/dto/task/FindApprovalFormResponse.java @@ -0,0 +1,9 @@ +package clap.server.adapter.inbound.web.dto.task; + +public record FindApprovalFormResponse( + Long categoryId, + String categoryName, + String mainCategoryName +) { +} + diff --git a/src/main/java/clap/server/adapter/inbound/web/task/FindApprovalTaskFormController.java b/src/main/java/clap/server/adapter/inbound/web/task/FindApprovalTaskFormController.java new file mode 100644 index 00000000..b275e8a8 --- /dev/null +++ b/src/main/java/clap/server/adapter/inbound/web/task/FindApprovalTaskFormController.java @@ -0,0 +1,30 @@ +package clap.server.adapter.inbound.web.task; + +import clap.server.adapter.inbound.security.SecurityUserDetails; +import clap.server.adapter.inbound.web.dto.task.FindApprovalFormResponse; +import clap.server.application.port.inbound.task.ApprovalTaskUsecase; +import clap.server.common.annotation.architecture.WebAdapter; +import io.swagger.v3.oas.annotations.Operation; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.security.access.annotation.Secured; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.web.bind.annotation.*; + +@WebAdapter +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/tasks/form") +public class FindApprovalTaskFormController { + + private final ApprovalTaskUsecase approvalTaskUsecase; + + @Operation(summary = "요청 승인 폼 조회") + @Secured("ROLE_MANAGER") + @GetMapping("/{taskId}") + public ResponseEntity findTaskForm( + @PathVariable Long taskId, + @AuthenticationPrincipal SecurityUserDetails userInfo){ + return ResponseEntity.ok(approvalTaskUsecase.findApprovalForm(userInfo.getUserId(), taskId)); + } +} diff --git a/src/main/java/clap/server/application/Task/ApprovalTaskService.java b/src/main/java/clap/server/application/Task/ApprovalTaskService.java index 848e7714..58b115c5 100644 --- a/src/main/java/clap/server/application/Task/ApprovalTaskService.java +++ b/src/main/java/clap/server/application/Task/ApprovalTaskService.java @@ -2,6 +2,8 @@ import clap.server.adapter.inbound.web.dto.task.ApprovalTaskRequest; import clap.server.adapter.inbound.web.dto.task.ApprovalTaskResponse; +import clap.server.adapter.inbound.web.dto.task.FindApprovalFormResponse; +import clap.server.adapter.outbound.persistense.entity.task.constant.TaskStatus; import clap.server.application.mapper.TaskMapper; import clap.server.application.port.inbound.domain.CategoryService; import clap.server.application.port.inbound.domain.LabelService; @@ -22,6 +24,7 @@ @ApplicationService @RequiredArgsConstructor +@Transactional(readOnly = true) public class ApprovalTaskService implements ApprovalTaskUsecase { private final MemberService memberService; @@ -45,4 +48,15 @@ public ApprovalTaskResponse approvalTaskByReviewer(Long reviewerId, Long taskId, task.approveTask(reviewer, processor, approvalTaskRequest.dueDate(), category, label); return TaskMapper.toApprovalTaskResponse(commandTaskPort.save(task)); } + + + @Override + public FindApprovalFormResponse findApprovalForm(Long managerId, Long taskId) { + memberService.findActiveMember(managerId); + Task task = taskService.findById(taskId); + if (task.getTaskStatus() != TaskStatus.REQUESTED) { + throw new ApplicationException(TaskErrorCode.TASK_STATUS_MISMATCH); + } + return TaskMapper.toFindApprovalFormResponse(task); + } } diff --git a/src/main/java/clap/server/application/mapper/TaskMapper.java b/src/main/java/clap/server/application/mapper/TaskMapper.java index 8ad3220e..b5025465 100644 --- a/src/main/java/clap/server/application/mapper/TaskMapper.java +++ b/src/main/java/clap/server/application/mapper/TaskMapper.java @@ -152,4 +152,12 @@ public static FindTaskDetailsForManagerResponse toFindTaskDetailForManagerRespon attachmentResponses ); } + + public static FindApprovalFormResponse toFindApprovalFormResponse(Task task) { + return new FindApprovalFormResponse( + task.getCategory().getCategoryId(), + task.getCategory().getName(), + task.getCategory().getMainCategory().getName() + ); + } } diff --git a/src/main/java/clap/server/application/port/inbound/task/ApprovalTaskUsecase.java b/src/main/java/clap/server/application/port/inbound/task/ApprovalTaskUsecase.java index 550826c9..75e179a9 100644 --- a/src/main/java/clap/server/application/port/inbound/task/ApprovalTaskUsecase.java +++ b/src/main/java/clap/server/application/port/inbound/task/ApprovalTaskUsecase.java @@ -2,7 +2,9 @@ import clap.server.adapter.inbound.web.dto.task.ApprovalTaskRequest; import clap.server.adapter.inbound.web.dto.task.ApprovalTaskResponse; +import clap.server.adapter.inbound.web.dto.task.FindApprovalFormResponse; public interface ApprovalTaskUsecase { ApprovalTaskResponse approvalTaskByReviewer(Long userId, Long taskId, ApprovalTaskRequest approvalTaskRequest); + FindApprovalFormResponse findApprovalForm(Long managerId, Long taskId); }