diff --git a/src/main/java/clap/server/adapter/inbound/web/dto/history/response/FindTaskHistoryResponse.java b/src/main/java/clap/server/adapter/inbound/web/dto/history/response/FindTaskHistoryResponse.java index 471d5b0b..ce468bc1 100644 --- a/src/main/java/clap/server/adapter/inbound/web/dto/history/response/FindTaskHistoryResponse.java +++ b/src/main/java/clap/server/adapter/inbound/web/dto/history/response/FindTaskHistoryResponse.java @@ -39,7 +39,6 @@ public static record CommentFileDetails( Long commentId, String nickName, String profileImageUrl, - boolean isModified, String fileName, String url, String size 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 03e031e9..b7296582 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/AttachmentPersistenceAdapter.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/AttachmentPersistenceAdapter.java @@ -37,37 +37,18 @@ public void saveAll(final List attachments) { } @Override - public List findAllByTaskIdAndCommentIsNull(final Long taskId) { - List attachmentEntities = attachmentRepository.findAllByTask_TaskIdAndCommentIsNull(taskId); + public List findAllByTaskId(final Long taskId) { + List attachmentEntities = attachmentRepository.findAllByTask_TaskId(taskId); return attachmentEntities.stream() .map(attachmentPersistenceMapper::toDomain) .collect(Collectors.toList()); } @Override - public List findAllByTaskIdAndCommentIsNullAndAttachmentId(final Long taskId, final List attachmentIds) { - List attachmentEntities = attachmentRepository.findAllByTask_TaskIdAndCommentIsNullAndAttachmentIdIn(taskId, attachmentIds); + public List findAllByTaskIdAndAttachmentId(final Long taskId, final List attachmentIds) { + List attachmentEntities = attachmentRepository.findAllByTask_TaskIdAndAttachmentIdIn(taskId, attachmentIds); return attachmentEntities.stream() .map(attachmentPersistenceMapper::toDomain) .collect(Collectors.toList()); } - - @Override - public Optional findByCommentId(final Long commentId) { - Optional attachmentEntity = attachmentRepository.findByComment_CommentId(commentId); - return attachmentEntity.map(attachmentPersistenceMapper::toDomain); - } - - @Override - public List findAllByTaskIdAndCommentIsNotNull(final Long taskId) { - List attachmentEntities = attachmentRepository.findAllByTask_TaskIdAndCommentIsNotNull(taskId); - return attachmentEntities.stream() - .map(attachmentPersistenceMapper::toDomain) - .collect(Collectors.toList()); - } - - @Override - public boolean exitsByCommentId(final Long commentId) { - return attachmentRepository.existsByComment_CommentId(commentId); - } } 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 72aa69d2..0c80994b 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/CommentPersistenceAdapter.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/CommentPersistenceAdapter.java @@ -34,9 +34,4 @@ public Comment saveComment(final Comment comment) { public void deleteCommentWithTaskHistory(final Long commentId) { commentRepository.deleteCommentWithTaskHistory(commentId); } - - @Override - public void deleteComment(final Comment comment) { - commentRepository.delete(commentPersistenceMapper.toEntity(comment)); - } } diff --git a/src/main/java/clap/server/adapter/outbound/persistense/entity/member/MemberEntity.java b/src/main/java/clap/server/adapter/outbound/persistense/entity/member/MemberEntity.java index 10bc90ad..553b8a0f 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/entity/member/MemberEntity.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/entity/member/MemberEntity.java @@ -54,11 +54,11 @@ public class MemberEntity extends BaseTimeEntity { @Column(name = "kakaowork_notification_enabled") @Builder.Default - private Boolean kakaoworkNotificationEnabled = Boolean.TRUE;; + private Boolean kakaoworkNotificationEnabled = Boolean.TRUE; @Column(name = "email_notification_enabled") @Builder.Default - private Boolean emailNotificationEnabled = Boolean.TRUE;; + private Boolean emailNotificationEnabled = Boolean.TRUE; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "admin_id") diff --git a/src/main/java/clap/server/adapter/outbound/persistense/entity/task/AttachmentEntity.java b/src/main/java/clap/server/adapter/outbound/persistense/entity/task/AttachmentEntity.java index 2ff0eba7..33e406b9 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/entity/task/AttachmentEntity.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/entity/task/AttachmentEntity.java @@ -35,10 +35,6 @@ public class AttachmentEntity extends BaseTimeEntity { @JoinColumn(name = "task_id") private TaskEntity task; - @OneToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "comment_id") - private CommentEntity comment; - @Column(name= "is_deleted", nullable = false) @Builder.Default private boolean isDeleted = Boolean.FALSE; 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 9f3df25f..950b729b 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 @@ -35,8 +35,18 @@ public class CommentEntity extends BaseTimeEntity { @Column(name = "content") private String content; + @Column + private String originalName; + + @Column + private String fileUrl; + + @Column + private String fileSize; + @Column(name = "is_modified", nullable = false) - private boolean isModified; + @Builder.Default + private boolean isModified = Boolean.FALSE; @Column(name="is_deleted", nullable = false) @Builder.Default 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 1c5321a7..26ca4aae 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 @@ -8,9 +8,6 @@ @Repository public interface AttachmentRepository extends JpaRepository { - List findAllByTask_TaskIdAndCommentIsNull(Long taskId); - List findAllByTask_TaskIdAndCommentIsNullAndAttachmentIdIn(Long task_taskId, List attachmentId); - Optional findByComment_CommentId(Long commentId); - boolean existsByComment_CommentId(Long commentId); - List findAllByTask_TaskIdAndCommentIsNotNull(Long taskId); + List findAllByTask_TaskId(Long taskId); + List findAllByTask_TaskIdAndAttachmentIdIn(Long task_taskId, List attachmentId); } \ No newline at end of file diff --git a/src/main/java/clap/server/application/mapper/response/TaskHistoryResponseMapper.java b/src/main/java/clap/server/application/mapper/response/TaskHistoryResponseMapper.java index bf65372d..e3ac847f 100644 --- a/src/main/java/clap/server/application/mapper/response/TaskHistoryResponseMapper.java +++ b/src/main/java/clap/server/application/mapper/response/TaskHistoryResponseMapper.java @@ -14,7 +14,7 @@ private TaskHistoryResponseMapper() { throw new IllegalArgumentException("Utility class"); } - public static FindTaskHistoryResponse toFindTaskHistoryResponse(List taskHistories, List attachments) { + public static FindTaskHistoryResponse toFindTaskHistoryResponse(List taskHistories) { List historyResponses = taskHistories.stream() .map(taskHistory -> { FindTaskHistoryResponse.Details details = @@ -47,25 +47,20 @@ public static FindTaskHistoryResponse toFindTaskHistoryResponse(List new FindTaskHistoryResponse.Details( null, null, - attachments.stream() - .filter(attachment -> attachment.getComment().getCommentId().equals(taskHistory.getComment().getCommentId())) - .findFirst() - .map(attachment -> new FindTaskHistoryResponse.CommentFileDetails( - taskHistory.getComment().getCommentId(), - taskHistory.getComment().getMember().getNickname(), - taskHistory.getComment().getMember().getImageUrl(), - taskHistory.getComment().isModified(), - attachment.getOriginalName(), - attachment.getFileUrl(), - attachment.getFileSize() - )) - .orElse(null) + new FindTaskHistoryResponse.CommentFileDetails( + taskHistory.getComment().getCommentId(), + taskHistory.getComment().getMember().getNickname(), + taskHistory.getComment().getMember().getImageUrl(), + taskHistory.getComment().getOriginalName(), + taskHistory.getComment().getFileUrl(), + taskHistory.getComment().getFileSize() + ) ); }; return new FindTaskHistoryResponse.TaskHistoryResponse( taskHistory.getTaskHistoryId(), - taskHistory.getUpdatedAt().toLocalDate(), - taskHistory.getUpdatedAt().toLocalTime(), + taskHistory.getCreatedAt().toLocalDate(), + taskHistory.getCreatedAt().toLocalTime(), taskHistory.getType(), details ); diff --git a/src/main/java/clap/server/application/port/outbound/task/CommandCommentPort.java b/src/main/java/clap/server/application/port/outbound/task/CommandCommentPort.java index b5087c45..71a60c8c 100644 --- a/src/main/java/clap/server/application/port/outbound/task/CommandCommentPort.java +++ b/src/main/java/clap/server/application/port/outbound/task/CommandCommentPort.java @@ -7,6 +7,4 @@ public interface CommandCommentPort { Comment saveComment(Comment comment); void deleteCommentWithTaskHistory(Long commentId); - - void deleteComment(Comment comment); } 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 127c4fad..ccab40f6 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 @@ -3,13 +3,9 @@ import clap.server.domain.model.task.Attachment; import java.util.List; -import java.util.Optional; public interface LoadAttachmentPort { - List findAllByTaskIdAndCommentIsNull(Long taskId); - List findAllByTaskIdAndCommentIsNullAndAttachmentId(Long taskId, List attachmentIds); - Optional findByCommentId(Long commentId); - List findAllByTaskIdAndCommentIsNotNull(Long taskId); - boolean exitsByCommentId(Long commentId); + List findAllByTaskId(Long taskId); + List findAllByTaskIdAndAttachmentId(Long taskId, List attachmentIds); } diff --git a/src/main/java/clap/server/application/service/history/CommandCommentService.java b/src/main/java/clap/server/application/service/history/CommandCommentService.java index f2d7f303..2eff6a12 100644 --- a/src/main/java/clap/server/application/service/history/CommandCommentService.java +++ b/src/main/java/clap/server/application/service/history/CommandCommentService.java @@ -32,10 +32,7 @@ public class CommandCommentService implements EditCommentUsecase, DeleteCommentU private final MemberService memberService; private final CommentService commentService; - private final CommandCommentPort commandCommentPort; - private final LoadAttachmentPort loadAttachmentPort; - private final CommandAttachmentPort commandAttachmentPort; @Transactional @Override @@ -54,23 +51,8 @@ public void editComment(Long memberId, Long commentId, EditCommentRequest reques @Transactional @Override public void deleteComment(Long memberId, Long commentId) { - Member member = memberService.findActiveMember(memberId); - Comment comment = commentService.findById(commentId); - - if (comment.getMember().getMemberId().equals(member.getMemberId())) { - if (loadAttachmentPort.exitsByCommentId(commentId)) { - deleteAttachments(commentId); - } - commandCommentPort.deleteCommentWithTaskHistory(commentId); - }else{ - throw new ApplicationException(CommentErrorCode.NOT_A_COMMENT_WRITER); - } - } - - private void deleteAttachments(Long commentId) { - Attachment attachment = loadAttachmentPort.findByCommentId(commentId) - .orElseThrow(() -> new ApplicationException(CommentErrorCode.COMMENT_ATTACHMENT_NOT_FOUND)); - attachment.softDelete(); - commandAttachmentPort.save(attachment); + memberService.findActiveMember(memberId); + commentService.findById(commentId); + commandCommentPort.deleteCommentWithTaskHistory(commentId); } } diff --git a/src/main/java/clap/server/application/service/history/FindTaskHistoriesService.java b/src/main/java/clap/server/application/service/history/FindTaskHistoriesService.java index 3192902f..7ff7a37d 100644 --- a/src/main/java/clap/server/application/service/history/FindTaskHistoriesService.java +++ b/src/main/java/clap/server/application/service/history/FindTaskHistoriesService.java @@ -33,8 +33,7 @@ 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 TaskHistoryResponseMapper.toFindTaskHistoryResponse(taskHistories, attachments); + return TaskHistoryResponseMapper.toFindTaskHistoryResponse(taskHistories); } } diff --git a/src/main/java/clap/server/application/service/history/PostCommentService.java b/src/main/java/clap/server/application/service/history/PostCommentService.java index 1f08e2ba..0050e836 100644 --- a/src/main/java/clap/server/application/service/history/PostCommentService.java +++ b/src/main/java/clap/server/application/service/history/PostCommentService.java @@ -27,6 +27,8 @@ import java.util.Objects; +import static clap.server.domain.model.task.Attachment.formatFileSize; + @ApplicationService @RequiredArgsConstructor public class PostCommentService implements SaveCommentUsecase, SaveCommentAttachmentUsecase { @@ -48,7 +50,7 @@ public void save(Long memberId, Long taskId, CreateCommentRequest request) { // 일반 회원일 경우 => 요청자인지 확인 taskCommentPolicy.validateCommentPermission(task, member); - Comment comment = Comment.createComment(member, task, request.content()); + Comment comment = Comment.createComment(member, task, request.content(), null, null, null); Comment savedComment = commandCommentPort.saveComment(comment); TaskHistory taskHistory = TaskHistory.createTaskHistory(TaskHistoryType.COMMENT, task, null, member, savedComment); @@ -71,11 +73,14 @@ public void saveCommentAttachment(Long memberId, Long taskId, MultipartFile file Member member = memberService.findActiveMember(memberId); taskCommentPolicy.validateCommentPermission(task, member); - Comment comment = Comment.createComment(member, task, null); + + String fileUrl = s3UploadPort.uploadSingleFile(FilePathConstants.TASK_COMMENT, file); + String fileName = file.getOriginalFilename(); + + Comment comment = Comment.createComment(member, task, null, fileName, fileUrl, formatFileSize(file.getSize())); Comment savedComment = commandCommentPort.saveComment(comment); - String fileName = saveAttachment(file, task, savedComment); - TaskHistory taskHistory = TaskHistory.createTaskHistory(TaskHistoryType.COMMENT_FILE, task, null, member, savedComment); + TaskHistory taskHistory = TaskHistory.createTaskHistory(TaskHistoryType.COMMENT_FILE, null, null, null, savedComment); commandTaskHistoryPort.save(taskHistory); Member processor = task.getProcessor(); @@ -88,12 +93,13 @@ public void saveCommentAttachment(Long memberId, Long taskId, MultipartFile file } - private String saveAttachment(MultipartFile file, Task task, Comment comment) { - String fileUrl = s3UploadPort.uploadSingleFile(FilePathConstants.TASK_COMMENT, file); - Attachment attachment = Attachment.createCommentAttachment(task, comment, file.getOriginalFilename(), fileUrl, file.getSize()); - commandAttachmentPort.save(attachment); - return file.getOriginalFilename(); - } + @Deprecated +// private String saveAttachment(MultipartFile file, Task task) { +// String fileUrl = s3UploadPort.uploadSingleFile(FilePathConstants.TASK_COMMENT, file); +// Attachment attachment = Attachment.createCommentAttachment(task, null, file.getOriginalFilename(), fileUrl, file.getSize()); +// commandAttachmentPort.save(attachment); +// return file.getOriginalFilename(); +// } private void publishNotification(Member receiver, Task task, String message, String commenterName) { boolean isManager = receiver.getMemberInfo().getRole() == MemberRole.ROLE_MANAGER; diff --git a/src/main/java/clap/server/application/service/task/FindTaskDetailsService.java b/src/main/java/clap/server/application/service/task/FindTaskDetailsService.java index ebcee406..67097d86 100644 --- a/src/main/java/clap/server/application/service/task/FindTaskDetailsService.java +++ b/src/main/java/clap/server/application/service/task/FindTaskDetailsService.java @@ -31,7 +31,7 @@ public FindTaskDetailsResponse findRequestedTaskDetails(final Long requesterId, memberService.findActiveMember(requesterId); Task task = loadTaskPort.findById(taskId) .orElseThrow(()-> new ApplicationException(TaskErrorCode.TASK_NOT_FOUND)); - List attachments = loadAttachmentPort.findAllByTaskIdAndCommentIsNull(taskId); + List attachments = loadAttachmentPort.findAllByTaskId(taskId); return TaskResponseMapper.toFindTaskDetailResponse(task, attachments); } @@ -40,7 +40,7 @@ public FindTaskDetailsForManagerResponse findTaskDetailsForManager(final Long re memberService.findActiveMember(requesterId); Task task = loadTaskPort.findById(taskId) .orElseThrow(() -> new ApplicationException(TaskErrorCode.TASK_NOT_FOUND)); - List attachments = loadAttachmentPort.findAllByTaskIdAndCommentIsNull(taskId); + List attachments = loadAttachmentPort.findAllByTaskId(taskId); return TaskResponseMapper.toFindTaskDetailForManagerResponse(task, attachments); } } 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 403f8545..e5bffd76 100644 --- a/src/main/java/clap/server/application/service/task/UpdateTaskService.java +++ b/src/main/java/clap/server/application/service/task/UpdateTaskService.java @@ -138,7 +138,7 @@ private void updateAttachments(List attachmentIdsToDelete, List validateAndGetAttachments(List attachmentIdsToDelete, Task task) { - List attachmentsOfTask = loadAttachmentPort.findAllByTaskIdAndCommentIsNullAndAttachmentId(task.getTaskId(), attachmentIdsToDelete); + List attachmentsOfTask = loadAttachmentPort.findAllByTaskIdAndAttachmentId(task.getTaskId(), attachmentIdsToDelete); if (attachmentsOfTask.size() != attachmentIdsToDelete.size()) { throw new ApplicationException(TaskErrorCode.TASK_ATTACHMENT_NOT_FOUND); } diff --git a/src/main/java/clap/server/domain/model/task/Attachment.java b/src/main/java/clap/server/domain/model/task/Attachment.java index 21f02f64..b797a7ae 100644 --- a/src/main/java/clap/server/domain/model/task/Attachment.java +++ b/src/main/java/clap/server/domain/model/task/Attachment.java @@ -12,7 +12,6 @@ public class Attachment extends BaseTime { private Long attachmentId; private Task task; - private Comment comment; private String originalName; private String fileUrl; private String fileSize; @@ -21,7 +20,6 @@ public class Attachment extends BaseTime { public static Attachment createAttachment(Task task, String originalName, String fileUrl, long fileSize) { return Attachment.builder() .task(task) - .comment(null) .originalName(originalName) .fileUrl(fileUrl) .fileSize(formatFileSize(fileSize)) @@ -29,10 +27,10 @@ public static Attachment createAttachment(Task task, String originalName, String .build(); } + @Deprecated public static Attachment createCommentAttachment(Task task, Comment comment, String originalName, String fileUrl, long fileSize) { return Attachment.builder() .task(task) - .comment(comment) .originalName(originalName) .fileUrl(fileUrl) .fileSize(formatFileSize(fileSize)) @@ -53,5 +51,4 @@ public static String formatFileSize(long size) { return String.format("%.1f MB", size / (1024.0 * 1024.0)); } } - } diff --git a/src/main/java/clap/server/domain/model/task/Comment.java b/src/main/java/clap/server/domain/model/task/Comment.java index fa74651b..2f13a18c 100644 --- a/src/main/java/clap/server/domain/model/task/Comment.java +++ b/src/main/java/clap/server/domain/model/task/Comment.java @@ -2,6 +2,7 @@ import clap.server.domain.model.common.BaseTime; import clap.server.domain.model.member.Member; +import jakarta.persistence.Column; import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; @@ -15,15 +16,20 @@ public class Comment extends BaseTime { private Member member; private Task task; private String content; + private String originalName; + private String fileUrl; + private String fileSize; private boolean isModified; private boolean isDeleted; - public static Comment createComment(Member member, Task task, String content) { + public static Comment createComment(Member member, Task task, String content, String originalName, String fileUrl, String fileSize) { return Comment.builder() .member(member) .task(task) .content(content) - .isModified(false) + .originalName(originalName) + .fileUrl(fileUrl) + .fileSize(fileSize) .build(); } diff --git a/src/main/resources/db/migration/dev/V20250211374__Add_From_Comment.sql b/src/main/resources/db/migration/dev/V20250211374__Add_From_Comment.sql new file mode 100644 index 00000000..a6b30a85 --- /dev/null +++ b/src/main/resources/db/migration/dev/V20250211374__Add_From_Comment.sql @@ -0,0 +1,4 @@ +ALTER TABLE comment + ADD COLUMN original_name VARCHAR(255), + ADD COLUMN file_url VARCHAR(255), + ADD COLUMN file_size VARCHAR(255); \ No newline at end of file diff --git a/src/main/resources/db/migration/dev/V20250211375__Modify_From_Comment_And_Attachment.sql b/src/main/resources/db/migration/dev/V20250211375__Modify_From_Comment_And_Attachment.sql new file mode 100644 index 00000000..0ea0c064 --- /dev/null +++ b/src/main/resources/db/migration/dev/V20250211375__Modify_From_Comment_And_Attachment.sql @@ -0,0 +1,16 @@ +START TRANSACTION; +-- Step 1: attachment 데이터 복사 +UPDATE comment c + JOIN attachment a ON c.comment_id = a.comment_id + SET + c.original_name = a.original_name, + c.file_url = a.file_url, + c.file_size = a.file_size +WHERE a.attachment_id IS NOT NULL; +COMMIT; + +-- Step 2: attachment 테이블에 제약조건 제거 +ALTER TABLE attachment + DROP FOREIGN KEY FKds6u1rptrsif835t89kb15cyo, + DROP COLUMN comment_id; +