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 index 3831ab49..547e00f2 100644 --- 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 @@ -1,6 +1,5 @@ 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/dto/task/UpdateTaskStatusRequest.java b/src/main/java/clap/server/adapter/inbound/web/dto/task/UpdateTaskStatusRequest.java index 12eebbdb..dd4b07cb 100644 --- a/src/main/java/clap/server/adapter/inbound/web/dto/task/UpdateTaskStatusRequest.java +++ b/src/main/java/clap/server/adapter/inbound/web/dto/task/UpdateTaskStatusRequest.java @@ -7,7 +7,7 @@ @Schema(description = "작업 상태 변경 요청") public record UpdateTaskStatusRequest( - @Schema(description = "변경하고 싶은 작업 상태", example = "완료") + @Schema(description = "변경하고 싶은 작업 상태", example = "COMPLETED") @NotNull TaskStatus taskStatus ) { diff --git a/src/main/java/clap/server/adapter/inbound/web/task/ChangeTaskController.java b/src/main/java/clap/server/adapter/inbound/web/task/ChangeTaskController.java index 9ec8bd7a..3b4e3970 100644 --- a/src/main/java/clap/server/adapter/inbound/web/task/ChangeTaskController.java +++ b/src/main/java/clap/server/adapter/inbound/web/task/ChangeTaskController.java @@ -31,7 +31,7 @@ public class ChangeTaskController { private final ApprovalTaskUsecase approvalTaskUsecase; @Operation(summary = "작업 상태 변경") - @Secured({"ROLE_MANGER"}) + @Secured("ROLE_MANAGER") @PatchMapping("/state/{taskId}") public ResponseEntity updateTaskState( @PathVariable @NotNull Long taskId, diff --git a/src/main/java/clap/server/adapter/outbound/persistense/CommentPersistenceAdapter.java b/src/main/java/clap/server/adapter/outbound/persistense/CommentPersistenceAdapter.java index 20b4aca6..48b65cf7 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/CommentPersistenceAdapter.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/CommentPersistenceAdapter.java @@ -1,6 +1,6 @@ package clap.server.adapter.outbound.persistense; -import clap.server.application.port.outbound.task.LoadCommentPort; +import clap.server.application.port.outbound.taskhistory.LoadCommentPort; import clap.server.domain.model.task.Comment; import java.util.Optional; diff --git a/src/main/java/clap/server/adapter/outbound/persistense/TaskHistoryPersistenceAdapter.java b/src/main/java/clap/server/adapter/outbound/persistense/TaskHistoryPersistenceAdapter.java index 15a60b9b..9d9b3e31 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/TaskHistoryPersistenceAdapter.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/TaskHistoryPersistenceAdapter.java @@ -4,7 +4,8 @@ import clap.server.adapter.outbound.persistense.entity.task.TaskHistoryEntity; import clap.server.adapter.outbound.persistense.mapper.TaskHistoryPersistenceMapper; import clap.server.adapter.outbound.persistense.repository.task.TaskHistoryRepository; -import clap.server.application.port.outbound.task.LoadTaskHistoryPort; +import clap.server.application.port.outbound.taskhistory.CommandTaskHistoryPort; +import clap.server.application.port.outbound.taskhistory.LoadTaskHistoryPort; import clap.server.common.annotation.architecture.PersistenceAdapter; import clap.server.domain.model.task.TaskHistory; @@ -15,7 +16,7 @@ @PersistenceAdapter @RequiredArgsConstructor -public class TaskHistoryPersistenceAdapter implements LoadTaskHistoryPort { +public class TaskHistoryPersistenceAdapter implements LoadTaskHistoryPort, CommandTaskHistoryPort { private final TaskHistoryRepository taskHistoryRepository; private final TaskHistoryPersistenceMapper taskHistoryPersistenceMapper; @@ -26,4 +27,11 @@ public List findAllTaskHistoriesByTaskId(Long taskId) { .map(taskHistoryPersistenceMapper::toDomain) .toList(); } + + @Override + public TaskHistory save(TaskHistory taskHistory) { + TaskHistoryEntity taskHistoryEntity = taskHistoryPersistenceMapper.toEntity(taskHistory); + TaskHistoryEntity savedTaskHistoryEntity = taskHistoryRepository.save(taskHistoryEntity); + return taskHistoryPersistenceMapper.toDomain(savedTaskHistoryEntity); + } } diff --git a/src/main/java/clap/server/adapter/outbound/persistense/entity/task/TaskModificationInfo.java b/src/main/java/clap/server/adapter/outbound/persistense/entity/task/TaskModificationInfo.java index 2fac6d00..e7679315 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/entity/task/TaskModificationInfo.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/entity/task/TaskModificationInfo.java @@ -17,13 +17,10 @@ public class TaskModificationInfo { @JoinColumn(name = "task_id") private TaskEntity task; - @Column(name = "modified_field") - private String modifiedField; //TODO: 속성 필요성 검토 - @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "modified_member_id") private MemberEntity modifiedMember; - @Column(name = "new_value") - private String newValue; //TODO: 속성 필요성 검토 + @JoinColumn(name = "modified_status") + private String modifiedStatus; } diff --git a/src/main/java/clap/server/adapter/outbound/persistense/entity/task/constant/TaskStatus.java b/src/main/java/clap/server/adapter/outbound/persistense/entity/task/constant/TaskStatus.java index 83a653f4..3eb78723 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/entity/task/constant/TaskStatus.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/entity/task/constant/TaskStatus.java @@ -17,16 +17,6 @@ public enum TaskStatus { private final String description; - @JsonCreator - public static TaskStatus fromDescription(String description) { - for (TaskStatus status : TaskStatus.values()) { - if (status.getDescription().equals(description)) { - return status; - } - } - throw new IllegalArgumentException("Unknown description: " + description); - } - public static List getTaskBoardStatusList() { return List.of( TaskStatus.IN_PROGRESS, diff --git a/src/main/java/clap/server/application/mapper/TaskHistoryMapper.java b/src/main/java/clap/server/application/mapper/TaskHistoryMapper.java index dd8ba622..d0fc4e4f 100644 --- a/src/main/java/clap/server/application/mapper/TaskHistoryMapper.java +++ b/src/main/java/clap/server/application/mapper/TaskHistoryMapper.java @@ -28,7 +28,7 @@ public static FindTaskHistoryResponse toFindTaskHistoryResponse(List new FindTaskHistoryResponse.Details( new FindTaskHistoryResponse.TaskDetails( - taskHistory.getTaskModificationInfo().getTask().getTaskStatus().getDescription() + taskHistory.getTaskModificationInfo().getModifiedStatus() ), null, null diff --git a/src/main/java/clap/server/application/port/outbound/task/CommandCommentPort.java b/src/main/java/clap/server/application/port/outbound/taskhistory/CommandCommentPort.java similarity index 73% rename from src/main/java/clap/server/application/port/outbound/task/CommandCommentPort.java rename to src/main/java/clap/server/application/port/outbound/taskhistory/CommandCommentPort.java index 61720996..ed378deb 100644 --- a/src/main/java/clap/server/application/port/outbound/task/CommandCommentPort.java +++ b/src/main/java/clap/server/application/port/outbound/taskhistory/CommandCommentPort.java @@ -1,4 +1,4 @@ -package clap.server.application.port.outbound.task; +package clap.server.application.port.outbound.taskhistory; import clap.server.domain.model.task.Comment; diff --git a/src/main/java/clap/server/application/port/outbound/taskhistory/CommandTaskHistoryPort.java b/src/main/java/clap/server/application/port/outbound/taskhistory/CommandTaskHistoryPort.java new file mode 100644 index 00000000..007b0661 --- /dev/null +++ b/src/main/java/clap/server/application/port/outbound/taskhistory/CommandTaskHistoryPort.java @@ -0,0 +1,8 @@ +package clap.server.application.port.outbound.taskhistory; + +import clap.server.domain.model.task.TaskHistory; + +public interface CommandTaskHistoryPort { + TaskHistory save(TaskHistory taskHistory); + +} diff --git a/src/main/java/clap/server/application/port/outbound/task/LoadCommentPort.java b/src/main/java/clap/server/application/port/outbound/taskhistory/LoadCommentPort.java similarity index 72% rename from src/main/java/clap/server/application/port/outbound/task/LoadCommentPort.java rename to src/main/java/clap/server/application/port/outbound/taskhistory/LoadCommentPort.java index e27869b9..a49cd218 100644 --- a/src/main/java/clap/server/application/port/outbound/task/LoadCommentPort.java +++ b/src/main/java/clap/server/application/port/outbound/taskhistory/LoadCommentPort.java @@ -1,4 +1,4 @@ -package clap.server.application.port.outbound.task; +package clap.server.application.port.outbound.taskhistory; import clap.server.domain.model.task.Comment; diff --git a/src/main/java/clap/server/application/port/outbound/task/LoadTaskHistoryPort.java b/src/main/java/clap/server/application/port/outbound/taskhistory/LoadTaskHistoryPort.java similarity index 75% rename from src/main/java/clap/server/application/port/outbound/task/LoadTaskHistoryPort.java rename to src/main/java/clap/server/application/port/outbound/taskhistory/LoadTaskHistoryPort.java index b5ef8d7a..96d73464 100644 --- a/src/main/java/clap/server/application/port/outbound/task/LoadTaskHistoryPort.java +++ b/src/main/java/clap/server/application/port/outbound/taskhistory/LoadTaskHistoryPort.java @@ -1,4 +1,4 @@ -package clap.server.application.port.outbound.task; +package clap.server.application.port.outbound.taskhistory; import clap.server.domain.model.task.TaskHistory; diff --git a/src/main/java/clap/server/application/service/task/ApprovalTaskService.java b/src/main/java/clap/server/application/service/task/ApprovalTaskService.java index 2c4d88b4..124c6527 100644 --- a/src/main/java/clap/server/application/service/task/ApprovalTaskService.java +++ b/src/main/java/clap/server/application/service/task/ApprovalTaskService.java @@ -3,6 +3,7 @@ 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.TaskHistoryType; import clap.server.application.mapper.TaskMapper; import clap.server.application.port.inbound.domain.CategoryService; import clap.server.application.port.inbound.domain.LabelService; @@ -10,11 +11,13 @@ import clap.server.application.port.inbound.domain.TaskService; import clap.server.application.port.inbound.task.ApprovalTaskUsecase; import clap.server.application.port.outbound.task.CommandTaskPort; +import clap.server.application.port.outbound.taskhistory.CommandTaskHistoryPort; import clap.server.common.annotation.architecture.ApplicationService; import clap.server.domain.model.member.Member; import clap.server.domain.model.task.Category; import clap.server.domain.model.task.Label; import clap.server.domain.model.task.Task; +import clap.server.domain.model.task.TaskHistory; import lombok.RequiredArgsConstructor; import org.springframework.transaction.annotation.Transactional; @@ -28,6 +31,7 @@ public class ApprovalTaskService implements ApprovalTaskUsecase { private final CategoryService categoryService; private final LabelService labelService; private final CommandTaskPort commandTaskPort; + private final CommandTaskHistoryPort commandTaskHistoryPort; @Override @Transactional @@ -39,6 +43,8 @@ public ApprovalTaskResponse approvalTaskByReviewer(Long reviewerId, Long taskId, Label label = labelService.findById(approvalTaskRequest.labelId()); task.approveTask(reviewer, processor, approvalTaskRequest.dueDate(), category, label); + TaskHistory taskHistory = TaskHistory.createTaskHistory(TaskHistoryType.PROCESSOR_ASSIGNED, task, null, processor,null); + commandTaskHistoryPort.save(taskHistory); return TaskMapper.toApprovalTaskResponse(commandTaskPort.save(task)); } diff --git a/src/main/java/clap/server/application/service/task/FindTaskHistoriesService.java b/src/main/java/clap/server/application/service/task/FindTaskHistoriesService.java index 69c5d9ae..4bb1d4a1 100644 --- a/src/main/java/clap/server/application/service/task/FindTaskHistoriesService.java +++ b/src/main/java/clap/server/application/service/task/FindTaskHistoriesService.java @@ -6,7 +6,7 @@ import clap.server.application.port.inbound.task.FindTaskHistoriesUsecase; import clap.server.application.port.outbound.task.LoadAttachmentPort; -import clap.server.application.port.outbound.task.LoadTaskHistoryPort; +import clap.server.application.port.outbound.taskhistory.LoadTaskHistoryPort; import clap.server.application.port.outbound.task.LoadTaskPort; import clap.server.common.annotation.architecture.ApplicationService; import clap.server.domain.model.task.Attachment; diff --git a/src/main/java/clap/server/application/service/task/UpdateTaskService.java b/src/main/java/clap/server/application/service/task/UpdateTaskService.java index b25e355f..3da416ff 100644 --- a/src/main/java/clap/server/application/service/task/UpdateTaskService.java +++ b/src/main/java/clap/server/application/service/task/UpdateTaskService.java @@ -2,6 +2,7 @@ import clap.server.adapter.inbound.web.dto.task.*; import clap.server.adapter.outbound.infrastructure.s3.S3UploadAdapter; +import clap.server.adapter.outbound.persistense.entity.task.constant.TaskHistoryType; import clap.server.application.mapper.AttachmentMapper; import clap.server.application.mapper.TaskMapper; import clap.server.application.port.inbound.domain.CategoryService; @@ -15,13 +16,11 @@ import clap.server.application.port.outbound.task.CommandAttachmentPort; import clap.server.application.port.outbound.task.CommandTaskPort; import clap.server.application.port.outbound.task.LoadAttachmentPort; +import clap.server.application.port.outbound.taskhistory.CommandTaskHistoryPort; import clap.server.common.annotation.architecture.ApplicationService; import clap.server.common.constants.FilePathConstants; import clap.server.domain.model.member.Member; -import clap.server.domain.model.task.Attachment; -import clap.server.domain.model.task.Category; -import clap.server.domain.model.task.Label; -import clap.server.domain.model.task.Task; +import clap.server.domain.model.task.*; import clap.server.exception.ApplicationException; import clap.server.exception.code.TaskErrorCode; import lombok.RequiredArgsConstructor; @@ -45,6 +44,7 @@ public class UpdateTaskService implements UpdateTaskUsecase, UpdateTaskStatusUse private final LoadAttachmentPort loadAttachmentPort; private final LabelService labelService; private final CommandAttachmentPort commandAttachmentPort; + private final CommandTaskHistoryPort commandTaskHistoryPort; private final S3UploadAdapter s3UploadAdapter; @Override @@ -69,8 +69,9 @@ public UpdateTaskResponse updateTaskState(Long memberId, Long taskId, UpdateTask memberService.findActiveMember(memberId); Task task = taskService.findById(taskId); task.updateTaskStatus(updateTaskStatusRequest.taskStatus()); - Task updateTask = commandTaskPort.save(task); - return TaskMapper.toUpdateTaskResponse(updateTask); + TaskHistory taskHistory = TaskHistory.createTaskHistory(TaskHistoryType.STATUS_SWITCHED, task, task.getTaskStatus().getDescription(), null, null); + commandTaskHistoryPort.save(taskHistory); + return TaskMapper.toUpdateTaskResponse(commandTaskPort.save(task)); // TODO : 알림 생성 로직 및 푸시 알림 로직 추가 } @@ -78,13 +79,13 @@ public UpdateTaskResponse updateTaskState(Long memberId, Long taskId, UpdateTask @Transactional @Override public UpdateTaskResponse updateTaskProcessor(Long taskId, Long userId, UpdateTaskProcessorRequest request) { - Member reviewer = memberService.findReviewer(userId); + memberService.findReviewer(userId); Member processor = memberService.findById(request.processorId()); - Task task = taskService.findById(taskId); task.updateProcessor(processor); - Task updateTask = commandTaskPort.save(task); - return TaskMapper.toUpdateTaskResponse(updateTask); + TaskHistory taskHistory = TaskHistory.createTaskHistory(TaskHistoryType.PROCESSOR_CHANGED, task, null, processor, null); + commandTaskHistoryPort.save(taskHistory); + return TaskMapper.toUpdateTaskResponse(commandTaskPort.save(task)); // TODO : 알림 생성 로직 및 푸시 알림 로직 추가 } @@ -92,13 +93,11 @@ public UpdateTaskResponse updateTaskProcessor(Long taskId, Long userId, UpdateTa @Transactional @Override public UpdateTaskResponse updateTaskLabel(Long taskId, Long userId, UpdateTaskLabelRequest request) { - Member reviewer = memberService.findReviewer(userId); + memberService.findReviewer(userId); Task task = taskService.findById(taskId); Label label = labelService.findById(request.labelId()); - task.updateLabel(label); - Task updatetask = commandTaskPort.save(task); - return TaskMapper.toUpdateTaskResponse(updatetask); + return TaskMapper.toUpdateTaskResponse(commandTaskPort.save(task)); } private void updateAttachments(List attachmentIdsToDelete, List files, Task task) { 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 efdfeba5..fd076ac7 100644 --- a/src/main/java/clap/server/domain/model/task/Task.java +++ b/src/main/java/clap/server/domain/model/task/Task.java @@ -85,6 +85,7 @@ public void updateLabel(Label label) { } public void approveTask(Member reviewer, Member processor, LocalDateTime dueDate, Category category, Label label) { + validateTaskRequested(); this.reviewer = reviewer; this.processor = processor; this.dueDate = dueDate; diff --git a/src/main/java/clap/server/domain/model/task/TaskHistory.java b/src/main/java/clap/server/domain/model/task/TaskHistory.java index b41b0fa9..0e751998 100644 --- a/src/main/java/clap/server/domain/model/task/TaskHistory.java +++ b/src/main/java/clap/server/domain/model/task/TaskHistory.java @@ -1,15 +1,11 @@ package clap.server.domain.model.task; -import clap.server.adapter.outbound.persistense.entity.member.constant.MemberStatus; import clap.server.adapter.outbound.persistense.entity.task.constant.TaskHistoryType; + import clap.server.domain.model.common.BaseTime; import clap.server.domain.model.member.Member; -import clap.server.domain.model.member.MemberInfo; -import co.elastic.clients.elasticsearch.inference.TaskType; -import lombok.AccessLevel; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; + +import lombok.*; import lombok.experimental.SuperBuilder; @Getter @@ -22,20 +18,27 @@ public class TaskHistory extends BaseTime { private Comment comment; @Getter + @Builder + @AllArgsConstructor @NoArgsConstructor(access = AccessLevel.PROTECTED) public static class TaskModificationInfo { private Task task; - private String modifiedField; private Member modifiedMember; - private String newValue; + private String modifiedStatus; + } - @Builder - public TaskModificationInfo(Task task, String modifiedField, Member modifiedMember, String newValue) { - this.task = task; - this.modifiedField = modifiedField; - this.modifiedMember = modifiedMember; - this.newValue = newValue; - } + public static TaskHistory createTaskHistory(TaskHistoryType type, Task task, String statusDescription, Member member, Comment comment) { + return TaskHistory.builder() + .type(type) + .taskModificationInfo( + TaskModificationInfo.builder() + .task(task) + .modifiedMember(member) + .modifiedStatus(statusDescription) + .build() + ) + .comment(comment) + .build(); } }