diff --git a/src/main/java/clap/server/adapter/inbound/web/dto/task/UpdateTaskStateRequest.java b/src/main/java/clap/server/adapter/inbound/web/dto/task/UpdateTaskStateRequest.java new file mode 100644 index 00000000..ae65bb0c --- /dev/null +++ b/src/main/java/clap/server/adapter/inbound/web/dto/task/UpdateTaskStateRequest.java @@ -0,0 +1,14 @@ +package clap.server.adapter.inbound.web.dto.task; + +import clap.server.adapter.outbound.persistense.entity.task.constant.TaskStatus; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; + +@Schema(description = "작업 상태 변경 요청") +public record UpdateTaskStateRequest( + + @Schema(description = "변경하고 싶은 작업 상태", example = "완료") + @NotNull + TaskStatus taskStatus +) { +} diff --git a/src/main/java/clap/server/adapter/inbound/web/task/ManagementTaskController.java b/src/main/java/clap/server/adapter/inbound/web/task/ManagementTaskController.java index 7a4c0f19..2bf0e75b 100644 --- a/src/main/java/clap/server/adapter/inbound/web/task/ManagementTaskController.java +++ b/src/main/java/clap/server/adapter/inbound/web/task/ManagementTaskController.java @@ -4,6 +4,7 @@ import clap.server.adapter.inbound.web.dto.task.*; import clap.server.application.port.inbound.task.ApprovalTaskUsecase; import clap.server.application.port.inbound.task.CreateTaskUsecase; +import clap.server.application.port.inbound.task.UpdateTaskStatusUsecase; import clap.server.application.port.inbound.task.UpdateTaskUsecase; import clap.server.common.annotation.architecture.WebAdapter; import io.swagger.v3.oas.annotations.Operation; @@ -30,6 +31,7 @@ public class ManagementTaskController { private final CreateTaskUsecase createTaskUsecase; private final UpdateTaskUsecase updateTaskUsecase; + private final UpdateTaskStatusUsecase updateTaskStatusUsecase; private final ApprovalTaskUsecase approvalTaskUsecase; @Operation(summary = "작업 요청 생성") @@ -54,6 +56,17 @@ public ResponseEntity updateTask( return ResponseEntity.ok(updateTaskUsecase.updateTask(userInfo.getUserId(), taskId, updateTaskRequest, attachments)); } + @Operation(summary = "작업 상태 변경") + @Secured({"ROLE_MANGER"}) + @PatchMapping("/state/{taskId}") + public ResponseEntity updateTaskState( + @PathVariable @NotNull Long taskId, + @AuthenticationPrincipal SecurityUserDetails userInfo, + @RequestBody UpdateTaskStateRequest updateTaskStateRequest) { + + return ResponseEntity.ok(updateTaskStatusUsecase.updateTaskState(userInfo.getUserId(), taskId, updateTaskStateRequest)); + } + @Operation(summary = "작업 승인") @Secured({"ROLE_MANAGER"}) @PostMapping("/approval/{taskId}") diff --git a/src/main/java/clap/server/application/Task/UpdateTaskService.java b/src/main/java/clap/server/application/Task/UpdateTaskService.java index e25938ac..d77a8eac 100644 --- a/src/main/java/clap/server/application/Task/UpdateTaskService.java +++ b/src/main/java/clap/server/application/Task/UpdateTaskService.java @@ -2,6 +2,7 @@ import clap.server.adapter.inbound.web.dto.task.UpdateTaskRequest; import clap.server.adapter.inbound.web.dto.task.UpdateTaskResponse; +import clap.server.adapter.inbound.web.dto.task.UpdateTaskStateRequest; import clap.server.adapter.outbound.infrastructure.s3.S3UploadAdapter; import clap.server.adapter.outbound.persistense.entity.task.constant.TaskStatus; import clap.server.application.mapper.AttachmentMapper; @@ -9,6 +10,7 @@ import clap.server.application.port.inbound.domain.CategoryService; import clap.server.application.port.inbound.domain.MemberService; import clap.server.application.port.inbound.domain.TaskService; +import clap.server.application.port.inbound.task.UpdateTaskStatusUsecase; import clap.server.application.port.inbound.task.UpdateTaskUsecase; import clap.server.application.port.outbound.task.CommandAttachmentPort; import clap.server.application.port.outbound.task.CommandTaskPort; @@ -34,7 +36,7 @@ @ApplicationService @RequiredArgsConstructor @Slf4j -public class UpdateTaskService implements UpdateTaskUsecase { +public class UpdateTaskService implements UpdateTaskUsecase, UpdateTaskStatusUsecase { private final MemberService memberService; private final CategoryService categoryService; @@ -62,6 +64,18 @@ public UpdateTaskResponse updateTask(Long requesterId, Long taskId, UpdateTaskRe return TaskMapper.toUpdateTaskResponse(updatedTask); } + @Override + @Transactional + public UpdateTaskResponse updateTaskState(Long memberId, Long taskId, UpdateTaskStateRequest updateTaskStateRequest) { + memberService.findActiveMember(memberId); + Task task = taskService.findById(taskId); + task.updateTaskStatus(updateTaskStateRequest.taskStatus()); + Task updateTask = commandTaskPort.save(task); + return TaskMapper.toUpdateTaskResponse(updateTask); + + // TODO : 알림 생성 로직 및 푸시 알림 로직 추가 + } + private void updateAttachments(List attachmentIdsToDelete, List files, Task task) { validateAttachments(attachmentIdsToDelete, task); commandAttachmentPort.deleteByIds(attachmentIdsToDelete); diff --git a/src/main/java/clap/server/application/port/inbound/task/UpdateTaskStatusUsecase.java b/src/main/java/clap/server/application/port/inbound/task/UpdateTaskStatusUsecase.java new file mode 100644 index 00000000..bdd6b416 --- /dev/null +++ b/src/main/java/clap/server/application/port/inbound/task/UpdateTaskStatusUsecase.java @@ -0,0 +1,8 @@ +package clap.server.application.port.inbound.task; + +import clap.server.adapter.inbound.web.dto.task.UpdateTaskResponse; +import clap.server.adapter.inbound.web.dto.task.UpdateTaskStateRequest; + +public interface UpdateTaskStatusUsecase { + UpdateTaskResponse updateTaskState(Long memberId, Long taskId, UpdateTaskStateRequest updateTaskStateRequest); +} diff --git a/src/main/java/clap/server/application/port/inbound/task/UpdateTaskUsecase.java b/src/main/java/clap/server/application/port/inbound/task/UpdateTaskUsecase.java index ee3f6f98..f1bbbe6a 100644 --- a/src/main/java/clap/server/application/port/inbound/task/UpdateTaskUsecase.java +++ b/src/main/java/clap/server/application/port/inbound/task/UpdateTaskUsecase.java @@ -3,6 +3,7 @@ import clap.server.adapter.inbound.web.dto.task.UpdateTaskRequest; import clap.server.adapter.inbound.web.dto.task.UpdateTaskResponse; +import clap.server.adapter.inbound.web.dto.task.UpdateTaskStateRequest; import org.springframework.web.multipart.MultipartFile; import java.util.List; diff --git a/src/main/java/clap/server/domain/model/task/Task.java b/src/main/java/clap/server/domain/model/task/Task.java index 1142fba0..401caa38 100644 --- a/src/main/java/clap/server/domain/model/task/Task.java +++ b/src/main/java/clap/server/domain/model/task/Task.java @@ -25,7 +25,7 @@ public class Task extends BaseTime { private Category category; private Member requester; private TaskStatus taskStatus; - private int processorOrder; + private long processorOrder; private Member processor; private Label label; private Member reviewer; @@ -50,6 +50,16 @@ public void updateTask(Category category, String title, String description) { this.taskCode = toTaskCode(category); } + public void setInitialProcessorOrder() { + if(this.processor == null) { + this.processorOrder = this.taskId * 128L; + } + } + + public void updateTaskStatus(TaskStatus status) { + this.taskStatus = status; + } + public void approveTask(Member reviewer, Member processor, LocalDateTime dueDate, Category category, Label label) { this.reviewer = reviewer; this.processor = processor;