From 2c7995ce16bdb302cd990fbbf10bf31077b41266 Mon Sep 17 00:00:00 2001 From: parkjaehak Date: Tue, 28 Jan 2025 14:08:41 +0900 Subject: [PATCH 1/7] =?UTF-8?q?CLAP-153=20Refactor:=20application=20task?= =?UTF-8?q?=20=ED=8C=A8=ED=82=A4=EC=A7=80=20service=20=EA=B3=84=EC=B8=B5?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{Task => service/task}/ApprovalTaskService.java | 2 +- .../application/{Task => service/task}/CreateTaskService.java | 2 +- .../{Task => service/task}/FindTaskDetailsService.java | 4 +--- .../{Task => service/task}/FindTaskListService.java | 2 +- .../application/{Task => service/task}/TaskBoardService.java | 2 +- .../application/{Task => service/task}/UpdateTaskService.java | 2 +- .../application/service/task/FindTaskListServiceTest.java | 1 - 7 files changed, 6 insertions(+), 9 deletions(-) rename src/main/java/clap/server/application/{Task => service/task}/ApprovalTaskService.java (98%) rename src/main/java/clap/server/application/{Task => service/task}/CreateTaskService.java (99%) rename src/main/java/clap/server/application/{Task => service/task}/FindTaskDetailsService.java (93%) rename src/main/java/clap/server/application/{Task => service/task}/FindTaskListService.java (97%) rename src/main/java/clap/server/application/{Task => service/task}/TaskBoardService.java (97%) rename src/main/java/clap/server/application/{Task => service/task}/UpdateTaskService.java (99%) diff --git a/src/main/java/clap/server/application/Task/ApprovalTaskService.java b/src/main/java/clap/server/application/service/task/ApprovalTaskService.java similarity index 98% rename from src/main/java/clap/server/application/Task/ApprovalTaskService.java rename to src/main/java/clap/server/application/service/task/ApprovalTaskService.java index 58b115c5..cad2d10c 100644 --- a/src/main/java/clap/server/application/Task/ApprovalTaskService.java +++ b/src/main/java/clap/server/application/service/task/ApprovalTaskService.java @@ -1,4 +1,4 @@ -package clap.server.application.Task; +package clap.server.application.service.task; import clap.server.adapter.inbound.web.dto.task.ApprovalTaskRequest; import clap.server.adapter.inbound.web.dto.task.ApprovalTaskResponse; diff --git a/src/main/java/clap/server/application/Task/CreateTaskService.java b/src/main/java/clap/server/application/service/task/CreateTaskService.java similarity index 99% rename from src/main/java/clap/server/application/Task/CreateTaskService.java rename to src/main/java/clap/server/application/service/task/CreateTaskService.java index 2c978d92..a704e13c 100644 --- a/src/main/java/clap/server/application/Task/CreateTaskService.java +++ b/src/main/java/clap/server/application/service/task/CreateTaskService.java @@ -1,4 +1,4 @@ -package clap.server.application.Task; +package clap.server.application.service.task; import clap.server.adapter.inbound.web.dto.notification.SseRequest; import clap.server.adapter.inbound.web.dto.task.CreateTaskRequest; diff --git a/src/main/java/clap/server/application/Task/FindTaskDetailsService.java b/src/main/java/clap/server/application/service/task/FindTaskDetailsService.java similarity index 93% rename from src/main/java/clap/server/application/Task/FindTaskDetailsService.java rename to src/main/java/clap/server/application/service/task/FindTaskDetailsService.java index 6bf4a9dd..7cac0338 100644 --- a/src/main/java/clap/server/application/Task/FindTaskDetailsService.java +++ b/src/main/java/clap/server/application/service/task/FindTaskDetailsService.java @@ -1,15 +1,13 @@ -package clap.server.application.Task; +package clap.server.application.service.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; import clap.server.application.port.inbound.domain.MemberService; import clap.server.application.port.inbound.task.FindTaskDetailsUsecase; import clap.server.application.port.outbound.task.LoadAttachmentPort; import clap.server.application.port.outbound.task.LoadTaskPort; import clap.server.common.annotation.architecture.ApplicationService; -import clap.server.domain.model.member.Member; import clap.server.domain.model.task.Attachment; import clap.server.domain.model.task.Task; import clap.server.exception.ApplicationException; diff --git a/src/main/java/clap/server/application/Task/FindTaskListService.java b/src/main/java/clap/server/application/service/task/FindTaskListService.java similarity index 97% rename from src/main/java/clap/server/application/Task/FindTaskListService.java rename to src/main/java/clap/server/application/service/task/FindTaskListService.java index 78420693..ae718941 100644 --- a/src/main/java/clap/server/application/Task/FindTaskListService.java +++ b/src/main/java/clap/server/application/service/task/FindTaskListService.java @@ -1,4 +1,4 @@ -package clap.server.application.Task; +package clap.server.application.service.task; import clap.server.adapter.inbound.web.dto.task.FilterAllTasksResponse; import clap.server.adapter.inbound.web.dto.task.FilterTaskListRequest; diff --git a/src/main/java/clap/server/application/Task/TaskBoardService.java b/src/main/java/clap/server/application/service/task/TaskBoardService.java similarity index 97% rename from src/main/java/clap/server/application/Task/TaskBoardService.java rename to src/main/java/clap/server/application/service/task/TaskBoardService.java index 2e597453..f515b4cb 100644 --- a/src/main/java/clap/server/application/Task/TaskBoardService.java +++ b/src/main/java/clap/server/application/service/task/TaskBoardService.java @@ -1,4 +1,4 @@ -package clap.server.application.Task; +package clap.server.application.service.task; import clap.server.adapter.inbound.web.dto.task.response.TaskBoardResponse; import clap.server.adapter.outbound.persistense.entity.task.constant.TaskStatus; diff --git a/src/main/java/clap/server/application/Task/UpdateTaskService.java b/src/main/java/clap/server/application/service/task/UpdateTaskService.java similarity index 99% rename from src/main/java/clap/server/application/Task/UpdateTaskService.java rename to src/main/java/clap/server/application/service/task/UpdateTaskService.java index d8163b6c..251b2b92 100644 --- a/src/main/java/clap/server/application/Task/UpdateTaskService.java +++ b/src/main/java/clap/server/application/service/task/UpdateTaskService.java @@ -1,4 +1,4 @@ -package clap.server.application.Task; +package clap.server.application.service.task; import clap.server.adapter.inbound.web.dto.task.*; import clap.server.adapter.outbound.infrastructure.s3.S3UploadAdapter; diff --git a/src/test/java/clap/server/application/service/task/FindTaskListServiceTest.java b/src/test/java/clap/server/application/service/task/FindTaskListServiceTest.java index fe4adb02..90142205 100644 --- a/src/test/java/clap/server/application/service/task/FindTaskListServiceTest.java +++ b/src/test/java/clap/server/application/service/task/FindTaskListServiceTest.java @@ -3,7 +3,6 @@ import clap.server.adapter.inbound.web.dto.task.FilterTaskListRequest; import clap.server.adapter.inbound.web.dto.task.OrderTaskRequest; import clap.server.adapter.inbound.web.dto.task.FilterPendingApprovalResponse; -import clap.server.application.Task.FindTaskListService; import clap.server.application.port.inbound.domain.MemberService; import clap.server.application.port.outbound.task.LoadTaskPort; import org.junit.jupiter.api.BeforeEach; From 98508528f57469726ea9f3a2843d1623a7a3f7c5 Mon Sep 17 00:00:00 2001 From: parkjaehak Date: Tue, 28 Jan 2025 22:49:18 +0900 Subject: [PATCH 2/7] =?UTF-8?q?CLAP-153=20Feat:=20=EC=9E=91=EC=97=85=20?= =?UTF-8?q?=ED=9E=88=EC=8A=A4=ED=86=A0=EB=A6=AC=20=EC=A1=B0=ED=9A=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../response/FindTaskHistoryResponse.java | 51 ++++++++++++ .../task/FindApprovalTaskFormController.java | 4 +- .../web/task/FindTaskHistoryController.java | 36 +++++++++ .../AttachmentPersistenceAdapter.java | 9 +++ .../CommentPersistenceAdapter.java | 13 +++ .../TaskHistoryPersistenceAdapter.java | 27 ++++++- .../entity/task/CommentEntity.java | 2 +- .../entity/task/TaskModificationInfo.java | 6 +- .../repository/task/AttachmentRepository.java | 2 +- .../task/TaskHistoryCustomRepository.java | 9 +++ .../task/TaskHistoryCustomRepositoryImpl.java | 38 +++++++++ .../task/TaskHistoryRepository.java | 5 +- .../application/mapper/TaskHistoryMapper.java | 79 +++++++++++++++++++ .../task/FindTaskHistoriesUsecase.java | 7 ++ .../outbound/task/LoadAttachmentPort.java | 3 +- .../outbound/task/LoadTaskHistoryPort.java | 5 ++ .../task/FindTaskHistoriesService.java | 45 +++++++++++ 17 files changed, 328 insertions(+), 13 deletions(-) create mode 100644 src/main/java/clap/server/adapter/inbound/web/dto/task/response/FindTaskHistoryResponse.java create mode 100644 src/main/java/clap/server/adapter/inbound/web/task/FindTaskHistoryController.java create mode 100644 src/main/java/clap/server/adapter/outbound/persistense/CommentPersistenceAdapter.java create mode 100644 src/main/java/clap/server/adapter/outbound/persistense/repository/task/TaskHistoryCustomRepository.java create mode 100644 src/main/java/clap/server/adapter/outbound/persistense/repository/task/TaskHistoryCustomRepositoryImpl.java create mode 100644 src/main/java/clap/server/application/mapper/TaskHistoryMapper.java create mode 100644 src/main/java/clap/server/application/port/inbound/task/FindTaskHistoriesUsecase.java create mode 100644 src/main/java/clap/server/application/service/task/FindTaskHistoriesService.java diff --git a/src/main/java/clap/server/adapter/inbound/web/dto/task/response/FindTaskHistoryResponse.java b/src/main/java/clap/server/adapter/inbound/web/dto/task/response/FindTaskHistoryResponse.java new file mode 100644 index 00000000..336164c2 --- /dev/null +++ b/src/main/java/clap/server/adapter/inbound/web/dto/task/response/FindTaskHistoryResponse.java @@ -0,0 +1,51 @@ +package clap.server.adapter.inbound.web.dto.task.response; + +import clap.server.adapter.outbound.persistense.entity.task.constant.TaskHistoryType; + +import java.time.LocalDate; +import java.time.LocalTime; +import java.util.List; + +public record FindTaskHistoryResponse( + List histories +) { + public static record TaskHistoryResponse( + Long historyId, + LocalDate date, + LocalTime time, + TaskHistoryType taskHistoryType, + Details details + ) {} + + public static record Details( + ProcessorChanged processorChanged, + TaskStatusSwitched taskStatusSwitched, + CommentDetails commentDetails, + CommentFileDetails commentFileDetails + ) {} + + public static record ProcessorChanged( + String previousProcessor, + String currentProcessor + ) {} + + public static record TaskStatusSwitched( + String taskStatus + ) {} + + public static record CommentDetails( + String name, + String profileImageUrl, + boolean isModified, + String comment + ) {} + + public static record CommentFileDetails( + String name, + String profileImageUrl, + boolean isModified, + String fileName, + String url, + String size + ) {} +} 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 index b275e8a8..c37b80c0 100644 --- a/src/main/java/clap/server/adapter/inbound/web/task/FindApprovalTaskFormController.java +++ b/src/main/java/clap/server/adapter/inbound/web/task/FindApprovalTaskFormController.java @@ -14,14 +14,14 @@ @WebAdapter @RestController @RequiredArgsConstructor -@RequestMapping("/api/tasks/form") +@RequestMapping("/api/tasks") public class FindApprovalTaskFormController { private final ApprovalTaskUsecase approvalTaskUsecase; @Operation(summary = "요청 승인 폼 조회") @Secured("ROLE_MANAGER") - @GetMapping("/{taskId}") + @GetMapping("/approval/{taskId}") public ResponseEntity findTaskForm( @PathVariable Long taskId, @AuthenticationPrincipal SecurityUserDetails userInfo){ diff --git a/src/main/java/clap/server/adapter/inbound/web/task/FindTaskHistoryController.java b/src/main/java/clap/server/adapter/inbound/web/task/FindTaskHistoryController.java new file mode 100644 index 00000000..0d437f00 --- /dev/null +++ b/src/main/java/clap/server/adapter/inbound/web/task/FindTaskHistoryController.java @@ -0,0 +1,36 @@ +package clap.server.adapter.inbound.web.task; + +import clap.server.adapter.inbound.security.SecurityUserDetails; +import clap.server.adapter.inbound.web.dto.task.FindTaskDetailsForManagerResponse; +import clap.server.adapter.inbound.web.dto.task.response.FindTaskHistoryResponse; +import clap.server.application.port.inbound.task.FindTaskHistoriesUsecase; +import clap.server.common.annotation.architecture.WebAdapter; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +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.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + + +@WebAdapter +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/tasks") +public class FindTaskHistoryController { + + private final FindTaskHistoriesUsecase findTaskHistoriesUsecase; + + @Operation(summary = "작업 히스토리 조회") + @Secured({"ROLE_MANAGER","ROLE_USER"}) + @GetMapping("/histories/{taskId}") + public ResponseEntity findTaskHistories( + @PathVariable Long taskId, + @AuthenticationPrincipal SecurityUserDetails userInfo) { + return ResponseEntity.ok(findTaskHistoriesUsecase.findTaskHistories(userInfo.getUserId(), taskId)); + } +} diff --git a/src/main/java/clap/server/adapter/outbound/persistense/AttachmentPersistenceAdapter.java b/src/main/java/clap/server/adapter/outbound/persistense/AttachmentPersistenceAdapter.java index 4efd3063..c4a7bb75 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/AttachmentPersistenceAdapter.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/AttachmentPersistenceAdapter.java @@ -45,10 +45,19 @@ public List findAllByTaskIdAndCommentIsNull(final Long taskId) { .collect(Collectors.toList()); } + @Override public List findAllByTaskIdAndCommentIsNullAndAttachmentId(final Long taskId, final List attachmentIds) { List attachmentEntities = attachmentRepository.findAllByTask_TaskIdAndCommentIsNullAndIsDeletedIsFalseAndAttachmentIdIn(taskId, attachmentIds); return attachmentEntities.stream() .map(attachmentPersistenceMapper::toDomain) .collect(Collectors.toList()); } + + @Override + public List findAllByTaskIdAndCommentIsNotNull(final Long taskId) { + List attachmentEntities = attachmentRepository.findAllByTask_TaskIdAndCommentIsNotNullAndIsDeletedIsFalse(taskId); + return attachmentEntities.stream() + .map(attachmentPersistenceMapper::toDomain) + .collect(Collectors.toList()); + } } diff --git a/src/main/java/clap/server/adapter/outbound/persistense/CommentPersistenceAdapter.java b/src/main/java/clap/server/adapter/outbound/persistense/CommentPersistenceAdapter.java new file mode 100644 index 00000000..20b4aca6 --- /dev/null +++ b/src/main/java/clap/server/adapter/outbound/persistense/CommentPersistenceAdapter.java @@ -0,0 +1,13 @@ +package clap.server.adapter.outbound.persistense; + +import clap.server.application.port.outbound.task.LoadCommentPort; +import clap.server.domain.model.task.Comment; + +import java.util.Optional; + +public class CommentPersistenceAdapter implements LoadCommentPort { + @Override + public Optional findById(Long id) { + return Optional.empty(); + } +} 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 6da99e0d..6db85d86 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/TaskHistoryPersistenceAdapter.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/TaskHistoryPersistenceAdapter.java @@ -1,18 +1,37 @@ package clap.server.adapter.outbound.persistense; +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.common.annotation.architecture.PersistenceAdapter; +import clap.server.domain.model.task.TaskHistory; import lombok.RequiredArgsConstructor; - - - +import java.util.List; @PersistenceAdapter @RequiredArgsConstructor public class TaskHistoryPersistenceAdapter implements LoadTaskHistoryPort { - + private final TaskHistoryRepository taskHistoryRepository; + private final TaskHistoryPersistenceMapper taskHistoryPersistenceMapper; + + @Override + public List findAllByTaskIdNotInComment(Long taskId) { + return taskHistoryRepository.findAllByTaskModificationInfo_Task_TaskId(taskId) + .stream() + .map(taskHistoryPersistenceMapper::toDomain) + .toList(); + } + + @Override + public List findAllTaskHistoriesByTaskId(Long taskId) { + return taskHistoryRepository.findAllTaskHistoriesByTaskId(taskId) + .stream() + .map(taskHistoryPersistenceMapper::toDomain) + .toList(); + } } diff --git a/src/main/java/clap/server/adapter/outbound/persistense/entity/task/CommentEntity.java b/src/main/java/clap/server/adapter/outbound/persistense/entity/task/CommentEntity.java index 6654f4ec..23af3bac 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/entity/task/CommentEntity.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/entity/task/CommentEntity.java @@ -27,7 +27,7 @@ public class CommentEntity extends BaseTimeEntity { @JoinColumn(name = "task_id", nullable = false) private TaskEntity task; - @Column(name = "content", nullable = false) //nullable false인 이유 + @Column(name = "content") private String content; @Column(name = "is_modified", nullable = false) 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 d7256abb..2fac6d00 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 @@ -18,12 +18,12 @@ public class TaskModificationInfo { private TaskEntity task; @Column(name = "modified_field") - private String modifiedField; //처리자(requestor) / 요청상태(taskStatus) -> task 상태 변경 혹은 처리 변경시에 taskhistory 테이블도 변경해야함 + private String modifiedField; //TODO: 속성 필요성 검토 @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "modified_member_id") //처리자가 바뀌는 경우 + @JoinColumn(name = "modified_member_id") private MemberEntity modifiedMember; @Column(name = "new_value") - private String newValue; //상태가 바뀌는 경우 + private String newValue; //TODO: 속성 필요성 검토 } diff --git a/src/main/java/clap/server/adapter/outbound/persistense/repository/task/AttachmentRepository.java b/src/main/java/clap/server/adapter/outbound/persistense/repository/task/AttachmentRepository.java index ed92d792..8aaaca21 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/repository/task/AttachmentRepository.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/repository/task/AttachmentRepository.java @@ -9,5 +9,5 @@ public interface AttachmentRepository extends JpaRepository { List findAllByTask_TaskIdAndCommentIsNullAndIsDeletedIsFalse(Long taskId); List findAllByTask_TaskIdAndCommentIsNullAndIsDeletedIsFalseAndAttachmentIdIn(Long task_taskId, List attachmentId); - + List findAllByTask_TaskIdAndCommentIsNotNullAndIsDeletedIsFalse(Long taskId); } \ No newline at end of file diff --git a/src/main/java/clap/server/adapter/outbound/persistense/repository/task/TaskHistoryCustomRepository.java b/src/main/java/clap/server/adapter/outbound/persistense/repository/task/TaskHistoryCustomRepository.java new file mode 100644 index 00000000..f9e82ab3 --- /dev/null +++ b/src/main/java/clap/server/adapter/outbound/persistense/repository/task/TaskHistoryCustomRepository.java @@ -0,0 +1,9 @@ +package clap.server.adapter.outbound.persistense.repository.task; + +import clap.server.adapter.outbound.persistense.entity.task.TaskHistoryEntity; + +import java.util.List; + +public interface TaskHistoryCustomRepository { + List findAllTaskHistoriesByTaskId(Long taskId); +} diff --git a/src/main/java/clap/server/adapter/outbound/persistense/repository/task/TaskHistoryCustomRepositoryImpl.java b/src/main/java/clap/server/adapter/outbound/persistense/repository/task/TaskHistoryCustomRepositoryImpl.java new file mode 100644 index 00000000..3a94f180 --- /dev/null +++ b/src/main/java/clap/server/adapter/outbound/persistense/repository/task/TaskHistoryCustomRepositoryImpl.java @@ -0,0 +1,38 @@ +package clap.server.adapter.outbound.persistense.repository.task; + +import clap.server.adapter.outbound.persistense.entity.task.QCommentEntity; +import clap.server.adapter.outbound.persistense.entity.task.QTaskHistoryEntity; +import clap.server.adapter.outbound.persistense.entity.task.TaskHistoryEntity; +import com.querydsl.jpa.impl.JPAQueryFactory; +import lombok.RequiredArgsConstructor; + + + +import java.util.List; + +@RequiredArgsConstructor +public class TaskHistoryCustomRepositoryImpl implements TaskHistoryCustomRepository { + + private final JPAQueryFactory queryFactory; + + @Override + public List findAllTaskHistoriesByTaskId(Long taskId) { + QTaskHistoryEntity taskHistory = QTaskHistoryEntity.taskHistoryEntity; + QCommentEntity comment = QCommentEntity.commentEntity; + + return queryFactory.selectFrom(taskHistory) + .leftJoin(taskHistory.comment, comment).fetchJoin() // TaskHistory와 Comment를 조인 + .where( + // Comment가 없는 경우에는 TaskModificationInfo의 Task 기준 + taskHistory.comment.isNull() + .and(taskHistory.taskModificationInfo.task.taskId.eq(taskId)) + .or( + // Comment가 있는 경우에는 Comment의 Task 기준 + taskHistory.comment.isNotNull() + .and(comment.task.taskId.eq(taskId)) + ) + ) + .orderBy(taskHistory.taskHistoryId.asc()) // taskHistoryId로 정렬 + .fetch(); + } +} diff --git a/src/main/java/clap/server/adapter/outbound/persistense/repository/task/TaskHistoryRepository.java b/src/main/java/clap/server/adapter/outbound/persistense/repository/task/TaskHistoryRepository.java index bb2fba0e..b3787fa4 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/repository/task/TaskHistoryRepository.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/repository/task/TaskHistoryRepository.java @@ -4,6 +4,9 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import java.util.List; + @Repository -public interface TaskHistoryRepository extends JpaRepository { +public interface TaskHistoryRepository extends JpaRepository , TaskHistoryCustomRepository{ + List findAllByTaskModificationInfo_Task_TaskId(Long taskId); } \ No newline at end of file diff --git a/src/main/java/clap/server/application/mapper/TaskHistoryMapper.java b/src/main/java/clap/server/application/mapper/TaskHistoryMapper.java new file mode 100644 index 00000000..3f50b3f1 --- /dev/null +++ b/src/main/java/clap/server/application/mapper/TaskHistoryMapper.java @@ -0,0 +1,79 @@ +package clap.server.application.mapper; + +import clap.server.adapter.inbound.web.dto.task.response.FindTaskHistoryResponse; + +import clap.server.domain.model.task.Attachment; +import clap.server.domain.model.task.TaskHistory; + +import java.util.List; + + +public class TaskHistoryMapper { + + private TaskHistoryMapper() { + throw new IllegalArgumentException(); + } + + public static FindTaskHistoryResponse toFindTaskHistoryResponse(List taskHistories, List attachments) { + List historyResponses = taskHistories.stream() + .map(taskHistory -> { + FindTaskHistoryResponse.Details details = + switch (taskHistory.getType()) { + case PROCESSOR_CHANGED, PROCESSOR_ASSIGNED -> new FindTaskHistoryResponse.Details( + new FindTaskHistoryResponse.ProcessorChanged( + null, //TODO: 이전 처리자 이름 검토 + taskHistory.getTaskModificationInfo().getModifiedMember().getNickname() + ), + null, + null, + null + ); + case STATUS_SWITCHED -> new FindTaskHistoryResponse.Details( + null, + new FindTaskHistoryResponse.TaskStatusSwitched( + taskHistory.getTaskModificationInfo().getTask().getTaskStatus().getDescription() + ), + null, + null + ); + case COMMENT -> new FindTaskHistoryResponse.Details( + null, + null, + new FindTaskHistoryResponse.CommentDetails( + taskHistory.getComment().getMember().getNickname(), + taskHistory.getComment().getMember().getImageUrl(), + taskHistory.getComment().isModified(), + taskHistory.getComment().getContent() + ), + null + ); + case COMMENT_FILE -> new FindTaskHistoryResponse.Details( + null, + null, + null, + attachments.stream() + .filter(attachment -> attachment.getComment().getCommentId().equals(taskHistory.getComment().getCommentId())) + .findFirst() + .map(attachment -> new FindTaskHistoryResponse.CommentFileDetails( + taskHistory.getComment().getMember().getNickname(), + taskHistory.getComment().getMember().getImageUrl(), + taskHistory.getComment().isModified(), + attachment.getOriginalName(), + attachment.getFileUrl(), + attachment.getFileSize() + )) + .orElse(null) + ); + }; + return new FindTaskHistoryResponse.TaskHistoryResponse( + taskHistory.getTaskHistoryId(), + taskHistory.getUpdatedAt().toLocalDate(), + taskHistory.getUpdatedAt().toLocalTime(), + taskHistory.getType(), + details + ); + }) + .toList(); + return new FindTaskHistoryResponse(historyResponses); + } +} diff --git a/src/main/java/clap/server/application/port/inbound/task/FindTaskHistoriesUsecase.java b/src/main/java/clap/server/application/port/inbound/task/FindTaskHistoriesUsecase.java new file mode 100644 index 00000000..ca166c60 --- /dev/null +++ b/src/main/java/clap/server/application/port/inbound/task/FindTaskHistoriesUsecase.java @@ -0,0 +1,7 @@ +package clap.server.application.port.inbound.task; + +import clap.server.adapter.inbound.web.dto.task.response.FindTaskHistoryResponse; + +public interface FindTaskHistoriesUsecase { + FindTaskHistoryResponse findTaskHistories(Long userId, Long taskId); +} diff --git a/src/main/java/clap/server/application/port/outbound/task/LoadAttachmentPort.java b/src/main/java/clap/server/application/port/outbound/task/LoadAttachmentPort.java index 7b2f350f..bec2ac52 100644 --- a/src/main/java/clap/server/application/port/outbound/task/LoadAttachmentPort.java +++ b/src/main/java/clap/server/application/port/outbound/task/LoadAttachmentPort.java @@ -6,6 +6,7 @@ public interface LoadAttachmentPort { - List findAllByTaskIdAndCommentIsNull(Long task); + List findAllByTaskIdAndCommentIsNull(Long taskId); List findAllByTaskIdAndCommentIsNullAndAttachmentId(Long taskId, List attachmentIds); + List findAllByTaskIdAndCommentIsNotNull(Long taskId); } diff --git a/src/main/java/clap/server/application/port/outbound/task/LoadTaskHistoryPort.java b/src/main/java/clap/server/application/port/outbound/task/LoadTaskHistoryPort.java index b05033d7..4d1fe7b6 100644 --- a/src/main/java/clap/server/application/port/outbound/task/LoadTaskHistoryPort.java +++ b/src/main/java/clap/server/application/port/outbound/task/LoadTaskHistoryPort.java @@ -1,6 +1,11 @@ package clap.server.application.port.outbound.task; +import clap.server.domain.model.task.TaskHistory; + +import java.util.List; public interface LoadTaskHistoryPort { + List findAllByTaskIdNotInComment(Long taskId); + List findAllTaskHistoriesByTaskId(Long taskId); } diff --git a/src/main/java/clap/server/application/service/task/FindTaskHistoriesService.java b/src/main/java/clap/server/application/service/task/FindTaskHistoriesService.java new file mode 100644 index 00000000..00315123 --- /dev/null +++ b/src/main/java/clap/server/application/service/task/FindTaskHistoriesService.java @@ -0,0 +1,45 @@ +package clap.server.application.service.task; + +import clap.server.adapter.inbound.web.dto.task.response.FindTaskHistoryResponse; +import clap.server.application.mapper.TaskHistoryMapper; +import clap.server.application.port.inbound.domain.MemberService; +import clap.server.application.port.inbound.task.FindTaskHistoriesUsecase; +import clap.server.application.port.outbound.task.LoadAttachmentPort; +import clap.server.application.port.outbound.task.LoadCommentPort; +import clap.server.application.port.outbound.task.LoadTaskHistoryPort; +import clap.server.application.port.outbound.task.LoadTaskPort; +import clap.server.common.annotation.architecture.ApplicationService; +import clap.server.domain.model.task.Attachment; +import clap.server.domain.model.task.Task; +import clap.server.domain.model.task.TaskHistory; +import clap.server.exception.DomainException; +import clap.server.exception.code.TaskErrorCode; +import lombok.RequiredArgsConstructor; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@ApplicationService +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class FindTaskHistoriesService implements FindTaskHistoriesUsecase { + private final MemberService memberService; + private final LoadTaskPort loadTaskPort; + private final LoadTaskHistoryPort loadTaskHistoryPort; + private final LoadAttachmentPort loadAttachmentPort; + + @Override + public FindTaskHistoryResponse findTaskHistories(Long memberId, Long taskId) { + memberService.findActiveMember(memberId); + Task task = loadTaskPort.findById(taskId) + .orElseThrow(()-> new DomainException(TaskErrorCode.TASK_NOT_FOUND)); + List attachments = loadAttachmentPort.findAllByTaskIdAndCommentIsNotNull(task.getTaskId()); + List taskHistories = loadTaskHistoryPort.findAllTaskHistoriesByTaskId(task.getTaskId()); + return TaskHistoryMapper.toFindTaskHistoryResponse(taskHistories, attachments); + + //task가 fk로 있고 comment가 null인 taskhisotry 를 가져온다 + //List taskHistoriesNotComment = loadTaskHistoryPort.findAllByTaskIdNotInComment(taskId); + //task가 fk로 있는 comment를 가져오고 comment fk로 있는 taskhistory를 가져온다. + //task가 fk로 있는 comment를 가져오고 comment fk로 있는 attachment와 taskhistory를 가져온다. + } +} From 578440ea4e59b3f07f7b2d243eaf3b6cefeb2d09 Mon Sep 17 00:00:00 2001 From: parkjaehak Date: Tue, 28 Jan 2025 23:18:33 +0900 Subject: [PATCH 3/7] =?UTF-8?q?CLAP-153=20Fix:=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20=EC=A3=BC=EC=84=9D=20=EB=B0=8F=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../persistense/TaskHistoryPersistenceAdapter.java | 8 -------- .../port/outbound/task/LoadTaskHistoryPort.java | 1 - .../service/task/FindTaskHistoriesService.java | 7 +------ 3 files changed, 1 insertion(+), 15 deletions(-) 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 6db85d86..15a60b9b 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/TaskHistoryPersistenceAdapter.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/TaskHistoryPersistenceAdapter.java @@ -19,14 +19,6 @@ public class TaskHistoryPersistenceAdapter implements LoadTaskHistoryPort { private final TaskHistoryRepository taskHistoryRepository; private final TaskHistoryPersistenceMapper taskHistoryPersistenceMapper; - @Override - public List findAllByTaskIdNotInComment(Long taskId) { - return taskHistoryRepository.findAllByTaskModificationInfo_Task_TaskId(taskId) - .stream() - .map(taskHistoryPersistenceMapper::toDomain) - .toList(); - } - @Override public List findAllTaskHistoriesByTaskId(Long taskId) { return taskHistoryRepository.findAllTaskHistoriesByTaskId(taskId) diff --git a/src/main/java/clap/server/application/port/outbound/task/LoadTaskHistoryPort.java b/src/main/java/clap/server/application/port/outbound/task/LoadTaskHistoryPort.java index 4d1fe7b6..b5ef8d7a 100644 --- a/src/main/java/clap/server/application/port/outbound/task/LoadTaskHistoryPort.java +++ b/src/main/java/clap/server/application/port/outbound/task/LoadTaskHistoryPort.java @@ -6,6 +6,5 @@ import java.util.List; public interface LoadTaskHistoryPort { - List findAllByTaskIdNotInComment(Long taskId); List findAllTaskHistoriesByTaskId(Long taskId); } 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 00315123..69c5d9ae 100644 --- a/src/main/java/clap/server/application/service/task/FindTaskHistoriesService.java +++ b/src/main/java/clap/server/application/service/task/FindTaskHistoriesService.java @@ -5,7 +5,7 @@ import clap.server.application.port.inbound.domain.MemberService; import clap.server.application.port.inbound.task.FindTaskHistoriesUsecase; import clap.server.application.port.outbound.task.LoadAttachmentPort; -import clap.server.application.port.outbound.task.LoadCommentPort; + import clap.server.application.port.outbound.task.LoadTaskHistoryPort; import clap.server.application.port.outbound.task.LoadTaskPort; import clap.server.common.annotation.architecture.ApplicationService; @@ -36,10 +36,5 @@ public FindTaskHistoryResponse findTaskHistories(Long memberId, Long taskId) { List attachments = loadAttachmentPort.findAllByTaskIdAndCommentIsNotNull(task.getTaskId()); List taskHistories = loadTaskHistoryPort.findAllTaskHistoriesByTaskId(task.getTaskId()); return TaskHistoryMapper.toFindTaskHistoryResponse(taskHistories, attachments); - - //task가 fk로 있고 comment가 null인 taskhisotry 를 가져온다 - //List taskHistoriesNotComment = loadTaskHistoryPort.findAllByTaskIdNotInComment(taskId); - //task가 fk로 있는 comment를 가져오고 comment fk로 있는 taskhistory를 가져온다. - //task가 fk로 있는 comment를 가져오고 comment fk로 있는 attachment와 taskhistory를 가져온다. } } From 90547f4617a9172ac4aa332a894eeb62fcf3a122 Mon Sep 17 00:00:00 2001 From: parkjaehak Date: Wed, 29 Jan 2025 09:57:33 +0900 Subject: [PATCH 4/7] =?UTF-8?q?CLAP-153=20Fix:=20=EC=9E=91=EC=97=85=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20=EC=8A=A4=EC=9B=A8=EA=B1=B0=20=ED=83=9C?= =?UTF-8?q?=EA=B7=B8=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../inbound/web/task/FindApprovalTaskFormController.java | 2 ++ .../server/adapter/inbound/web/task/FindTaskController.java | 2 +- .../adapter/inbound/web/task/FindTaskHistoryController.java | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) 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 index c37b80c0..416394b8 100644 --- a/src/main/java/clap/server/adapter/inbound/web/task/FindApprovalTaskFormController.java +++ b/src/main/java/clap/server/adapter/inbound/web/task/FindApprovalTaskFormController.java @@ -5,12 +5,14 @@ import clap.server.application.port.inbound.task.ApprovalTaskUsecase; import clap.server.common.annotation.architecture.WebAdapter; import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; 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.*; +@Tag(name = "02. Task [조회]", description = "작업 조회 API") @WebAdapter @RestController @RequiredArgsConstructor 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 f7819beb..80ab7050 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 @@ -17,7 +17,7 @@ import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.*; -@Tag(name = "작업 조회") +@Tag(name = "02. Task [조회]", description = "작업 조회 API") @WebAdapter @RestController @RequiredArgsConstructor diff --git a/src/main/java/clap/server/adapter/inbound/web/task/FindTaskHistoryController.java b/src/main/java/clap/server/adapter/inbound/web/task/FindTaskHistoryController.java index 0d437f00..c128502c 100644 --- a/src/main/java/clap/server/adapter/inbound/web/task/FindTaskHistoryController.java +++ b/src/main/java/clap/server/adapter/inbound/web/task/FindTaskHistoryController.java @@ -17,6 +17,7 @@ import org.springframework.web.bind.annotation.RestController; +@Tag(name = "02. Task [조회]", description = "작업 조회 API") @WebAdapter @RestController @RequiredArgsConstructor From 3d3019d31cd3c1bf1295133495c6d2ff8c653fb4 Mon Sep 17 00:00:00 2001 From: parkjaehak Date: Wed, 29 Jan 2025 12:15:46 +0900 Subject: [PATCH 5/7] =?UTF-8?q?CLAP-153=20Fix:=20=EC=9D=B4=EC=A0=84=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC=EC=9E=90=20=EC=9D=B4=EB=A6=84=20=EB=A7=A4?= =?UTF-8?q?=ED=95=91=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../inbound/web/dto/task/response/FindTaskHistoryResponse.java | 3 +-- .../java/clap/server/application/mapper/TaskHistoryMapper.java | 1 - 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/clap/server/adapter/inbound/web/dto/task/response/FindTaskHistoryResponse.java b/src/main/java/clap/server/adapter/inbound/web/dto/task/response/FindTaskHistoryResponse.java index 336164c2..322c71b0 100644 --- a/src/main/java/clap/server/adapter/inbound/web/dto/task/response/FindTaskHistoryResponse.java +++ b/src/main/java/clap/server/adapter/inbound/web/dto/task/response/FindTaskHistoryResponse.java @@ -25,8 +25,7 @@ public static record Details( ) {} public static record ProcessorChanged( - String previousProcessor, - String currentProcessor + String processorName ) {} public static record TaskStatusSwitched( diff --git a/src/main/java/clap/server/application/mapper/TaskHistoryMapper.java b/src/main/java/clap/server/application/mapper/TaskHistoryMapper.java index 3f50b3f1..49b0985d 100644 --- a/src/main/java/clap/server/application/mapper/TaskHistoryMapper.java +++ b/src/main/java/clap/server/application/mapper/TaskHistoryMapper.java @@ -21,7 +21,6 @@ public static FindTaskHistoryResponse toFindTaskHistoryResponse(List new FindTaskHistoryResponse.Details( new FindTaskHistoryResponse.ProcessorChanged( - null, //TODO: 이전 처리자 이름 검토 taskHistory.getTaskModificationInfo().getModifiedMember().getNickname() ), null, From a118dc9c3ff8306ada48646ddee65d02839ead5b Mon Sep 17 00:00:00 2001 From: parkjaehak Date: Wed, 29 Jan 2025 15:03:04 +0900 Subject: [PATCH 6/7] =?UTF-8?q?CLAP-153=20Fix:=20=EC=9E=91=EC=97=85=20?= =?UTF-8?q?=ED=9E=88=EC=8A=A4=ED=86=A0=EB=A6=AC=20=EC=9D=91=EB=8B=B5=20?= =?UTF-8?q?=EA=B5=AC=EC=A1=B0=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/dto/task/response/FindTaskHistoryResponse.java | 7 +++++-- .../clap/server/application/mapper/TaskHistoryMapper.java | 8 ++------ 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/main/java/clap/server/adapter/inbound/web/dto/task/response/FindTaskHistoryResponse.java b/src/main/java/clap/server/adapter/inbound/web/dto/task/response/FindTaskHistoryResponse.java index 322c71b0..8db1ce15 100644 --- a/src/main/java/clap/server/adapter/inbound/web/dto/task/response/FindTaskHistoryResponse.java +++ b/src/main/java/clap/server/adapter/inbound/web/dto/task/response/FindTaskHistoryResponse.java @@ -18,8 +18,7 @@ public static record TaskHistoryResponse( ) {} public static record Details( - ProcessorChanged processorChanged, - TaskStatusSwitched taskStatusSwitched, + TaskDetails taskDetails, CommentDetails commentDetails, CommentFileDetails commentFileDetails ) {} @@ -32,6 +31,10 @@ public static record TaskStatusSwitched( String taskStatus ) {} + public static record TaskDetails( + String newValue + ) {} + public static record CommentDetails( String name, String profileImageUrl, diff --git a/src/main/java/clap/server/application/mapper/TaskHistoryMapper.java b/src/main/java/clap/server/application/mapper/TaskHistoryMapper.java index 49b0985d..dd8ba622 100644 --- a/src/main/java/clap/server/application/mapper/TaskHistoryMapper.java +++ b/src/main/java/clap/server/application/mapper/TaskHistoryMapper.java @@ -20,23 +20,20 @@ public static FindTaskHistoryResponse toFindTaskHistoryResponse(List new FindTaskHistoryResponse.Details( - new FindTaskHistoryResponse.ProcessorChanged( + new FindTaskHistoryResponse.TaskDetails( taskHistory.getTaskModificationInfo().getModifiedMember().getNickname() ), null, - null, null ); case STATUS_SWITCHED -> new FindTaskHistoryResponse.Details( - null, - new FindTaskHistoryResponse.TaskStatusSwitched( + new FindTaskHistoryResponse.TaskDetails( taskHistory.getTaskModificationInfo().getTask().getTaskStatus().getDescription() ), null, null ); case COMMENT -> new FindTaskHistoryResponse.Details( - null, null, new FindTaskHistoryResponse.CommentDetails( taskHistory.getComment().getMember().getNickname(), @@ -47,7 +44,6 @@ public static FindTaskHistoryResponse toFindTaskHistoryResponse(List new FindTaskHistoryResponse.Details( - null, null, null, attachments.stream() From a3c0bd54da28e718e50bd118c0faa53c4edf80dd Mon Sep 17 00:00:00 2001 From: parkjaehak Date: Wed, 29 Jan 2025 20:12:35 +0900 Subject: [PATCH 7/7] =?UTF-8?q?CLAP-153=20Fix:=20=EB=8C=93=EA=B8=80=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1=EC=9E=90=20nickName=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EC=88=98=EB=AA=85=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/task/response/FindTaskHistoryResponse.java | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/src/main/java/clap/server/adapter/inbound/web/dto/task/response/FindTaskHistoryResponse.java b/src/main/java/clap/server/adapter/inbound/web/dto/task/response/FindTaskHistoryResponse.java index 8db1ce15..431c7a92 100644 --- a/src/main/java/clap/server/adapter/inbound/web/dto/task/response/FindTaskHistoryResponse.java +++ b/src/main/java/clap/server/adapter/inbound/web/dto/task/response/FindTaskHistoryResponse.java @@ -23,27 +23,19 @@ public static record Details( CommentFileDetails commentFileDetails ) {} - public static record ProcessorChanged( - String processorName - ) {} - - public static record TaskStatusSwitched( - String taskStatus - ) {} - public static record TaskDetails( String newValue ) {} public static record CommentDetails( - String name, + String nickName, String profileImageUrl, boolean isModified, String comment ) {} public static record CommentFileDetails( - String name, + String nickName, String profileImageUrl, boolean isModified, String fileName,