From b1b27599966eba9aac7b9e371a8d045c304416bb Mon Sep 17 00:00:00 2001 From: andrew Date: Tue, 28 Jan 2025 03:32:54 +0900 Subject: [PATCH 1/2] =?UTF-8?q?CLAP-159=20Fix:=20UpdateStatusUsecase=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...eTaskStateRequest.java => UpdateTaskStatusRequest.java} | 2 +- .../clap/server/application/Task/UpdateTaskService.java | 7 +++---- .../port/inbound/task/UpdateTaskStatusUsecase.java | 4 ++-- .../application/port/inbound/task/UpdateTaskUsecase.java | 1 - 4 files changed, 6 insertions(+), 8 deletions(-) rename src/main/java/clap/server/adapter/inbound/web/dto/task/{UpdateTaskStateRequest.java => UpdateTaskStatusRequest.java} (91%) 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/UpdateTaskStatusRequest.java similarity index 91% rename from src/main/java/clap/server/adapter/inbound/web/dto/task/UpdateTaskStateRequest.java rename to src/main/java/clap/server/adapter/inbound/web/dto/task/UpdateTaskStatusRequest.java index ae65bb0c..12eebbdb 100644 --- a/src/main/java/clap/server/adapter/inbound/web/dto/task/UpdateTaskStateRequest.java +++ b/src/main/java/clap/server/adapter/inbound/web/dto/task/UpdateTaskStatusRequest.java @@ -5,7 +5,7 @@ import jakarta.validation.constraints.NotNull; @Schema(description = "작업 상태 변경 요청") -public record UpdateTaskStateRequest( +public record UpdateTaskStatusRequest( @Schema(description = "변경하고 싶은 작업 상태", example = "완료") @NotNull diff --git a/src/main/java/clap/server/application/Task/UpdateTaskService.java b/src/main/java/clap/server/application/Task/UpdateTaskService.java index c3b2ffb5..93d2bbea 100644 --- a/src/main/java/clap/server/application/Task/UpdateTaskService.java +++ b/src/main/java/clap/server/application/Task/UpdateTaskService.java @@ -2,9 +2,8 @@ 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.inbound.web.dto.task.UpdateTaskStatusRequest; import clap.server.adapter.outbound.infrastructure.s3.S3UploadAdapter; -import clap.server.adapter.outbound.persistense.entity.task.constant.TaskStatus; import clap.server.application.mapper.AttachmentMapper; import clap.server.application.mapper.TaskMapper; import clap.server.application.port.inbound.domain.CategoryService; @@ -68,10 +67,10 @@ public UpdateTaskResponse updateTask(Long requesterId, Long taskId, UpdateTaskRe @Override @Transactional - public UpdateTaskResponse updateTaskState(Long memberId, Long taskId, UpdateTaskStateRequest updateTaskStateRequest) { + public UpdateTaskResponse updateTaskState(Long memberId, Long taskId, UpdateTaskStatusRequest updateTaskStatusRequest) { memberService.findActiveMember(memberId); Task task = taskService.findById(taskId); - task.updateTaskStatus(updateTaskStateRequest.taskStatus()); + task.updateTaskStatus(updateTaskStatusRequest.taskStatus()); Task updateTask = commandTaskPort.save(task); return TaskMapper.toUpdateTaskResponse(updateTask); 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 index bdd6b416..9d35b392 100644 --- a/src/main/java/clap/server/application/port/inbound/task/UpdateTaskStatusUsecase.java +++ b/src/main/java/clap/server/application/port/inbound/task/UpdateTaskStatusUsecase.java @@ -1,8 +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; +import clap.server.adapter.inbound.web.dto.task.UpdateTaskStatusRequest; public interface UpdateTaskStatusUsecase { - UpdateTaskResponse updateTaskState(Long memberId, Long taskId, UpdateTaskStateRequest updateTaskStateRequest); + UpdateTaskResponse updateTaskState(Long memberId, Long taskId, UpdateTaskStatusRequest updateTaskStatusRequest); } 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 f1bbbe6a..ee3f6f98 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,7 +3,6 @@ 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; From c5d7963624ca672579cc1af559df5448e0792662 Mon Sep 17 00:00:00 2001 From: andrew Date: Tue, 28 Jan 2025 04:00:54 +0900 Subject: [PATCH 2/2] =?UTF-8?q?CLAP-159=20Feat:=20=EC=9E=91=EC=97=85=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC=EC=9E=90=20=EB=B3=80=EA=B2=BD=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/task/UpdateTaskProcessorRequest.java | 8 +++++++ .../web/task/ManagementTaskController.java | 21 +++++++++++++------ .../application/Task/UpdateTaskService.java | 21 ++++++++++++++++++- .../task/UpdateTaskProcessorUsecase.java | 8 +++++++ .../clap/server/domain/model/task/Task.java | 4 ++++ 5 files changed, 55 insertions(+), 7 deletions(-) create mode 100644 src/main/java/clap/server/adapter/inbound/web/dto/task/UpdateTaskProcessorRequest.java create mode 100644 src/main/java/clap/server/application/port/inbound/task/UpdateTaskProcessorUsecase.java diff --git a/src/main/java/clap/server/adapter/inbound/web/dto/task/UpdateTaskProcessorRequest.java b/src/main/java/clap/server/adapter/inbound/web/dto/task/UpdateTaskProcessorRequest.java new file mode 100644 index 00000000..3831ab49 --- /dev/null +++ b/src/main/java/clap/server/adapter/inbound/web/dto/task/UpdateTaskProcessorRequest.java @@ -0,0 +1,8 @@ +package clap.server.adapter.inbound.web.dto.task; + +import clap.server.domain.model.member.Member; + +public record UpdateTaskProcessorRequest( + Long processorId +) { +} 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 71223e5e..ab045008 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 @@ -2,10 +2,8 @@ import clap.server.adapter.inbound.security.SecurityUserDetails; 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.adapter.inbound.web.dto.task.UpdateTaskProcessorRequest; +import clap.server.application.port.inbound.task.*; import clap.server.common.annotation.architecture.WebAdapter; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -32,6 +30,7 @@ public class ManagementTaskController { private final CreateTaskUsecase createTaskUsecase; private final UpdateTaskUsecase updateTaskUsecase; private final UpdateTaskStatusUsecase updateTaskStatusUsecase; + private final UpdateTaskProcessorUsecase updateTaskProcessorUsecase; private final ApprovalTaskUsecase approvalTaskUsecase; @Operation(summary = "작업 요청 생성") @@ -62,9 +61,19 @@ public ResponseEntity updateTask( public ResponseEntity updateTaskState( @PathVariable @NotNull Long taskId, @AuthenticationPrincipal SecurityUserDetails userInfo, - @RequestBody UpdateTaskStateRequest updateTaskStateRequest) { + @RequestBody UpdateTaskStatusRequest updateTaskStatusRequest) { - return ResponseEntity.ok(updateTaskStatusUsecase.updateTaskState(userInfo.getUserId(), taskId, updateTaskStateRequest)); + return ResponseEntity.ok(updateTaskStatusUsecase.updateTaskState(userInfo.getUserId(), taskId, updateTaskStatusRequest)); + } + + @Operation(summary = "작업 처리자 변경") + @Secured({"ROLE_MANAGER"}) + @PatchMapping("/processor/{taskId}") + public ResponseEntity updateTaskProcessor( + @PathVariable Long taskId, + @AuthenticationPrincipal SecurityUserDetails userInfo, + @RequestBody UpdateTaskProcessorRequest updateTaskProcessorRequest) { + return ResponseEntity.ok(updateTaskProcessorUsecase.updateTaskProcessor(taskId, userInfo.getUserId(), updateTaskProcessorRequest)); } @Operation(summary = "작업 승인") diff --git a/src/main/java/clap/server/application/Task/UpdateTaskService.java b/src/main/java/clap/server/application/Task/UpdateTaskService.java index 93d2bbea..372f2cba 100644 --- a/src/main/java/clap/server/application/Task/UpdateTaskService.java +++ b/src/main/java/clap/server/application/Task/UpdateTaskService.java @@ -3,12 +3,14 @@ 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.UpdateTaskStatusRequest; +import clap.server.adapter.inbound.web.dto.task.UpdateTaskProcessorRequest; import clap.server.adapter.outbound.infrastructure.s3.S3UploadAdapter; import clap.server.application.mapper.AttachmentMapper; import clap.server.application.mapper.TaskMapper; 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.UpdateTaskProcessorUsecase; import clap.server.application.port.inbound.task.UpdateTaskStatusUsecase; import clap.server.application.port.inbound.task.UpdateTaskUsecase; import clap.server.application.port.outbound.task.CommandAttachmentPort; @@ -22,6 +24,7 @@ import clap.server.domain.model.task.Task; import clap.server.exception.ApplicationException; +import clap.server.exception.code.MemberErrorCode; import clap.server.exception.code.TaskErrorCode; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -35,7 +38,7 @@ @ApplicationService @RequiredArgsConstructor @Slf4j -public class UpdateTaskService implements UpdateTaskUsecase, UpdateTaskStatusUsecase { +public class UpdateTaskService implements UpdateTaskUsecase, UpdateTaskStatusUsecase, UpdateTaskProcessorUsecase { private final MemberService memberService; private final CategoryService categoryService; @@ -77,6 +80,22 @@ public UpdateTaskResponse updateTaskState(Long memberId, Long taskId, UpdateTask // TODO : 알림 생성 로직 및 푸시 알림 로직 추가 } + @Transactional + @Override + public UpdateTaskResponse updateTaskProcessor(Long taskId, Long userId, UpdateTaskProcessorRequest request) { + Member reviewer = memberService.findActiveMember(userId); + Member processor = memberService.findById(request.processorId()); + if (!reviewer.isReviewer()) { + throw new ApplicationException(MemberErrorCode.NOT_A_REVIEWER); + } + Task task = taskService.findById(taskId); + task.updateProcessor(processor); + Task updateTask = commandTaskPort.save(task); + return TaskMapper.toUpdateTaskResponse(updateTask); + + // TODO : 알림 생성 로직 및 푸시 알림 로직 추가 + } + private void updateAttachments(List attachmentIdsToDelete, List files, Task task) { List attachmentsToDelete = validateAndGetAttachments(attachmentIdsToDelete, task); attachmentsToDelete.forEach(Attachment::softDelete); diff --git a/src/main/java/clap/server/application/port/inbound/task/UpdateTaskProcessorUsecase.java b/src/main/java/clap/server/application/port/inbound/task/UpdateTaskProcessorUsecase.java new file mode 100644 index 00000000..4381c0c5 --- /dev/null +++ b/src/main/java/clap/server/application/port/inbound/task/UpdateTaskProcessorUsecase.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.UpdateTaskProcessorRequest; + +public interface UpdateTaskProcessorUsecase { + UpdateTaskResponse updateTaskProcessor(Long taskId, Long userId, UpdateTaskProcessorRequest request); +} 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 1798ebbf..fb17bcd0 100644 --- a/src/main/java/clap/server/domain/model/task/Task.java +++ b/src/main/java/clap/server/domain/model/task/Task.java @@ -63,6 +63,10 @@ public void updateTaskStatus(TaskStatus status) { this.taskStatus = status; } + public void updateProcessor(Member processor) { + this.processor = processor; + } + public void approveTask(Member reviewer, Member processor, LocalDateTime dueDate, Category category, Label label) { this.reviewer = reviewer; this.processor = processor;