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..431c7a92 --- /dev/null +++ b/src/main/java/clap/server/adapter/inbound/web/dto/task/response/FindTaskHistoryResponse.java @@ -0,0 +1,45 @@ +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( + TaskDetails taskDetails, + CommentDetails commentDetails, + CommentFileDetails commentFileDetails + ) {} + + public static record TaskDetails( + String newValue + ) {} + + public static record CommentDetails( + String nickName, + String profileImageUrl, + boolean isModified, + String comment + ) {} + + public static record CommentFileDetails( + String nickName, + 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..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,23 +5,25 @@ 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 -@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/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 new file mode 100644 index 00000000..c128502c --- /dev/null +++ b/src/main/java/clap/server/adapter/inbound/web/task/FindTaskHistoryController.java @@ -0,0 +1,37 @@ +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; + + +@Tag(name = "02. Task [조회]", description = "작업 조회 API") +@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..15a60b9b 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,29 @@ 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 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..dd8ba622 --- /dev/null +++ b/src/main/java/clap/server/application/mapper/TaskHistoryMapper.java @@ -0,0 +1,74 @@ +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.TaskDetails( + taskHistory.getTaskModificationInfo().getModifiedMember().getNickname() + ), + null, + null + ); + case STATUS_SWITCHED -> new FindTaskHistoryResponse.Details( + new FindTaskHistoryResponse.TaskDetails( + taskHistory.getTaskModificationInfo().getTask().getTaskStatus().getDescription() + ), + null, + null + ); + case COMMENT -> new FindTaskHistoryResponse.Details( + 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, + 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..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 @@ -1,6 +1,10 @@ package clap.server.application.port.outbound.task; +import clap.server.domain.model.task.TaskHistory; + +import java.util.List; public interface LoadTaskHistoryPort { + List findAllTaskHistoriesByTaskId(Long taskId); } 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/service/task/FindTaskHistoriesService.java b/src/main/java/clap/server/application/service/task/FindTaskHistoriesService.java new file mode 100644 index 00000000..69c5d9ae --- /dev/null +++ b/src/main/java/clap/server/application/service/task/FindTaskHistoriesService.java @@ -0,0 +1,40 @@ +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.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); + } +} 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;