Skip to content

Commit dec04f0

Browse files
authored
Merge pull request #600 from TaskFlow-CLAP/CLAP-453
CLAP-453 댓글 작성 및 task history 조회 쿼리 수정
2 parents cfa304b + fc4f6b8 commit dec04f0

17 files changed

+86
-56
lines changed

src/main/java/clap/server/adapter/inbound/web/history/CommandCommentController.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ public void editComment(
3636
editCommentUsecase.editComment(userInfo.getUserId(), commentId, request);
3737
}
3838

39-
@Operation(summary = "댓글 삭제", description = "첨부파일 댓글일 경우 request body에 삭제할 파일 ID를 리스트로 전달")
40-
@Parameter(name = "commentId", description = "수정할 댓글 고유 ID", required = true, in = ParameterIn.PATH)
39+
@Operation(summary = "댓글 삭제")
40+
@Parameter(name = "commentId", description = "삭제할 댓글 고유 ID", required = true, in = ParameterIn.PATH)
4141
@DeleteMapping("/{commentId}")
4242
@Secured({"ROLE_MANAGER", "ROLE_USER"})
4343
public void deleteComment(

src/main/java/clap/server/adapter/inbound/web/history/FindTaskHistoryController.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,8 @@
22

33
import clap.server.adapter.inbound.security.service.SecurityUserDetails;
44
import clap.server.adapter.inbound.web.dto.history.response.FindTaskHistoryResponse;
5-
import clap.server.adapter.outbound.persistense.entity.log.constant.LogStatus;
65
import clap.server.application.port.inbound.history.FindTaskHistoriesUsecase;
76
import clap.server.common.annotation.architecture.WebAdapter;
8-
import clap.server.common.annotation.log.LogType;
97
import io.swagger.v3.oas.annotations.Operation;
108
import io.swagger.v3.oas.annotations.tags.Tag;
119
import lombok.RequiredArgsConstructor;
@@ -15,7 +13,6 @@
1513
import org.springframework.web.bind.annotation.GetMapping;
1614
import org.springframework.web.bind.annotation.PathVariable;
1715
import org.springframework.web.bind.annotation.RequestMapping;
18-
import org.springframework.web.bind.annotation.RestController;
1916

2017

2118
@Tag(name = "03. Task History")

src/main/java/clap/server/adapter/outbound/persistense/entity/task/TaskHistoryEntity.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
package clap.server.adapter.outbound.persistense.entity.task;
22

33
import clap.server.adapter.outbound.persistense.entity.common.BaseTimeEntity;
4+
import clap.server.adapter.outbound.persistense.entity.member.MemberEntity;
45
import clap.server.adapter.outbound.persistense.entity.task.constant.TaskHistoryType;
56
import jakarta.persistence.*;
67
import lombok.AccessLevel;
78
import lombok.Builder;
89
import lombok.Getter;
910
import lombok.NoArgsConstructor;
1011
import lombok.experimental.SuperBuilder;
11-
import org.hibernate.annotations.SQLDelete;
1212
import org.hibernate.annotations.SQLRestriction;
1313

1414
@Entity
@@ -30,6 +30,10 @@ public class TaskHistoryEntity extends BaseTimeEntity {
3030
@Embedded
3131
private TaskModificationInfo taskModificationInfo;
3232

33+
@ManyToOne(fetch = FetchType.LAZY)
34+
@JoinColumn(name = "modified_member_id")
35+
private MemberEntity modifiedMember;
36+
3337
@OneToOne(fetch = FetchType.LAZY)
3438
@JoinColumn(name = "comment_id")
3539
private CommentEntity comment;

src/main/java/clap/server/adapter/outbound/persistense/entity/task/TaskModificationInfo.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package clap.server.adapter.outbound.persistense.entity.task;
22

3-
import clap.server.adapter.outbound.persistense.entity.member.MemberEntity;
4-
import jakarta.persistence.*;
3+
import jakarta.persistence.Embeddable;
4+
import jakarta.persistence.FetchType;
5+
import jakarta.persistence.JoinColumn;
6+
import jakarta.persistence.ManyToOne;
57
import lombok.AllArgsConstructor;
68
import lombok.Builder;
79
import lombok.Getter;
@@ -17,10 +19,6 @@ public class TaskModificationInfo {
1719
@JoinColumn(name = "task_id")
1820
private TaskEntity task;
1921

20-
@ManyToOne(fetch = FetchType.LAZY)
21-
@JoinColumn(name = "modified_member_id")
22-
private MemberEntity modifiedMember;
23-
2422
@JoinColumn(name = "modified_status")
2523
private String modifiedStatus;
2624
}
Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,34 @@
11
package clap.server.adapter.outbound.persistense.mapper;
22

33
import clap.server.adapter.outbound.persistense.entity.task.CommentEntity;
4-
5-
import clap.server.adapter.outbound.persistense.mapper.common.PersistenceMapper;
6-
4+
import clap.server.domain.model.member.Member;
75
import clap.server.domain.model.task.Comment;
8-
6+
import org.hibernate.Hibernate;
97
import org.mapstruct.Mapper;
108
import org.mapstruct.Mapping;
9+
import org.springframework.beans.factory.annotation.Autowired;
1110

1211
@Mapper(componentModel = "spring", uses = {MemberPersistenceMapper.class, TaskPersistenceMapper.class})
13-
public interface CommentPersistenceMapper extends PersistenceMapper<CommentEntity, Comment> {
12+
public abstract class CommentPersistenceMapper {
13+
14+
@Autowired
15+
MemberPersistenceMapper memberPersistenceMapper;
1416

15-
@Override
1617
@Mapping(source = "modified", target = "isModified")
1718
@Mapping(source = "deleted", target = "isDeleted")
18-
Comment toDomain(final CommentEntity entity);
19+
@Mapping(target = "member", expression = "java(mapMember(entity))")
20+
@Mapping(target = "task", ignore = true)
21+
public abstract Comment toDomain(final CommentEntity entity);
1922

20-
@Override
2123
@Mapping(source = "modified", target = "isModified")
2224
@Mapping(source = "deleted", target = "isDeleted")
23-
CommentEntity toEntity(final Comment domain);
25+
public abstract CommentEntity toEntity(final Comment domain);
26+
27+
protected Member mapMember(CommentEntity entity) {
28+
if (entity == null || entity.getMember() == null || !Hibernate.isInitialized(entity.getMember())) {
29+
return null;
30+
}
31+
return memberPersistenceMapper.toDomain(entity.getMember());
32+
}
33+
2434
}

src/main/java/clap/server/adapter/outbound/persistense/repository/history/TaskHistoryCustomRepositoryImpl.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package clap.server.adapter.outbound.persistense.repository.history;
22

3+
import clap.server.adapter.outbound.persistense.entity.member.QMemberEntity;
34
import clap.server.adapter.outbound.persistense.entity.task.QCommentEntity;
45
import clap.server.adapter.outbound.persistense.entity.task.QTaskHistoryEntity;
56
import clap.server.adapter.outbound.persistense.entity.task.TaskHistoryEntity;
@@ -18,9 +19,11 @@ public class TaskHistoryCustomRepositoryImpl implements TaskHistoryCustomReposit
1819
public List<TaskHistoryEntity> findAllTaskHistoriesByTaskId(Long taskId) {
1920
QTaskHistoryEntity taskHistory = QTaskHistoryEntity.taskHistoryEntity;
2021
QCommentEntity comment = QCommentEntity.commentEntity;
22+
QMemberEntity member = QMemberEntity.memberEntity;
2123

2224
return queryFactory.selectFrom(taskHistory)
23-
.leftJoin(taskHistory.comment, comment).fetchJoin() // TaskHistory와 Comment를 조인
25+
.leftJoin(taskHistory.comment, comment).fetchJoin()
26+
.leftJoin(taskHistory.modifiedMember, member).fetchJoin()
2427
.where(
2528
// Comment가 없는 경우에는 TaskModificationInfo의 Task 기준
2629
taskHistory.comment.isNull()

src/main/java/clap/server/adapter/outbound/persistense/repository/task/TaskCustomRepository.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
package clap.server.adapter.outbound.persistense.repository.task;
22

3-
import clap.server.adapter.inbound.web.dto.task.request.FilterTaskListRequest;
43
import clap.server.adapter.inbound.web.dto.task.request.FilterTaskBoardRequest;
4+
import clap.server.adapter.inbound.web.dto.task.request.FilterTaskListRequest;
55
import clap.server.adapter.inbound.web.dto.task.request.FilterTeamStatusRequest;
6-
import clap.server.adapter.inbound.web.dto.task.response.TeamTaskResponse;
76
import clap.server.adapter.outbound.persistense.entity.task.TaskEntity;
87
import clap.server.adapter.outbound.persistense.entity.task.constant.TaskStatus;
98
import org.springframework.data.domain.Page;

src/main/java/clap/server/application/mapper/response/TaskHistoryResponseMapper.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public static FindTaskHistoryResponse toFindTaskHistoryResponse(List<TaskHistory
2121
switch (taskHistory.getType()) {
2222
case PROCESSOR_CHANGED, PROCESSOR_ASSIGNED -> new FindTaskHistoryResponse.Details(
2323
new FindTaskHistoryResponse.TaskDetails(
24-
taskHistory.getTaskModificationInfo().getModifiedMember().getNickname()
24+
taskHistory.getModifiedMember().getNickname()
2525
),
2626
null,
2727
null
@@ -37,8 +37,8 @@ public static FindTaskHistoryResponse toFindTaskHistoryResponse(List<TaskHistory
3737
null,
3838
new FindTaskHistoryResponse.CommentDetails(
3939
taskHistory.getComment().getCommentId(),
40-
taskHistory.getComment().getMember().getNickname(),
41-
taskHistory.getComment().getMember().getImageUrl(),
40+
taskHistory.getModifiedMember().getNickname(),
41+
taskHistory.getModifiedMember().getImageUrl(),
4242
taskHistory.getComment().isModified(),
4343
taskHistory.getComment().getContent()
4444
),
@@ -49,8 +49,8 @@ public static FindTaskHistoryResponse toFindTaskHistoryResponse(List<TaskHistory
4949
null,
5050
new FindTaskHistoryResponse.CommentFileDetails(
5151
taskHistory.getComment().getCommentId(),
52-
taskHistory.getComment().getMember().getNickname(),
53-
taskHistory.getComment().getMember().getImageUrl(),
52+
taskHistory.getModifiedMember().getNickname(),
53+
taskHistory.getModifiedMember().getImageUrl(),
5454
taskHistory.getComment().getOriginalName(),
5555
taskHistory.getComment().getFileUrl(),
5656
taskHistory.getComment().getFileSize()

src/main/java/clap/server/application/service/history/FindTaskHistoriesService.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,9 @@
77
import clap.server.application.port.outbound.task.LoadTaskPort;
88
import clap.server.application.port.outbound.taskhistory.LoadTaskHistoryPort;
99
import clap.server.common.annotation.architecture.ApplicationService;
10-
import clap.server.domain.model.member.Member;
1110
import clap.server.domain.model.task.Task;
1211
import clap.server.domain.model.task.TaskHistory;
13-
import clap.server.exception.DomainException;
12+
import clap.server.exception.ApplicationException;
1413
import clap.server.exception.code.TaskErrorCode;
1514
import lombok.RequiredArgsConstructor;
1615
import org.springframework.transaction.annotation.Transactional;
@@ -29,7 +28,7 @@ public class FindTaskHistoriesService implements FindTaskHistoriesUsecase {
2928
public FindTaskHistoryResponse findTaskHistories(Long memberId, Long taskId) {
3029
memberService.findActiveMember(memberId);
3130
Task task = loadTaskPort.findById(taskId)
32-
.orElseThrow(()-> new DomainException(TaskErrorCode.TASK_NOT_FOUND));
31+
.orElseThrow(()-> new ApplicationException(TaskErrorCode.TASK_NOT_FOUND));
3332
List<TaskHistory> taskHistories = loadTaskHistoryPort.findAllTaskHistoriesByTaskId(task.getTaskId());
3433
return TaskHistoryResponseMapper.toFindTaskHistoryResponse(taskHistories);
3534
}

src/main/java/clap/server/application/service/history/PostCommentService.java

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,15 @@
99
import clap.server.application.port.inbound.history.SaveCommentAttachmentUsecase;
1010
import clap.server.application.port.inbound.history.SaveCommentUsecase;
1111
import clap.server.application.port.outbound.s3.S3UploadPort;
12-
import clap.server.application.port.outbound.task.CommandAttachmentPort;
1312
import clap.server.application.port.outbound.task.CommandCommentPort;
1413
import clap.server.application.port.outbound.taskhistory.CommandTaskHistoryPort;
1514
import clap.server.application.service.webhook.SendNotificationService;
1615
import clap.server.common.annotation.architecture.ApplicationService;
16+
import clap.server.common.constants.FilePathConstants;
1717
import clap.server.domain.model.member.Member;
18-
import clap.server.domain.model.task.Attachment;
1918
import clap.server.domain.model.task.Comment;
2019
import clap.server.domain.model.task.Task;
2120
import clap.server.domain.model.task.TaskHistory;
22-
import clap.server.common.constants.FilePathConstants;
2321
import clap.server.domain.policy.task.TaskCommentPolicy;
2422
import lombok.RequiredArgsConstructor;
2523
import org.springframework.transaction.annotation.Transactional;
@@ -53,7 +51,7 @@ public void save(Long memberId, Long taskId, CreateCommentRequest request) {
5351
Comment comment = Comment.createComment(member, task, request.content(), null, null, null);
5452
Comment savedComment = commandCommentPort.saveComment(comment);
5553

56-
TaskHistory taskHistory = TaskHistory.createTaskHistory(TaskHistoryType.COMMENT, task, null, member, savedComment);
54+
TaskHistory taskHistory = TaskHistory.createCommentTaskHistory(TaskHistoryType.COMMENT, member, savedComment);
5755
commandTaskHistoryPort.save(taskHistory);
5856

5957
Member processor = task.getProcessor();
@@ -76,10 +74,10 @@ public void saveCommentAttachment(Long memberId, Long taskId, MultipartFile file
7674
String fileUrl = s3UploadPort.uploadSingleFile(FilePathConstants.TASK_COMMENT, file);
7775
String fileName = file.getOriginalFilename();
7876

79-
Comment comment = Comment.createComment(member, task, null, fileName, fileUrl, formatFileSize(file.getSize()));
77+
Comment comment = Comment.createComment(member, task, null, fileName, fileUrl, formatFileSize(file.getSize()));
8078
Comment savedComment = commandCommentPort.saveComment(comment);
8179

82-
TaskHistory taskHistory = TaskHistory.createTaskHistory(TaskHistoryType.COMMENT_FILE, null, null, null, savedComment);
80+
TaskHistory taskHistory = TaskHistory.createCommentTaskHistory(TaskHistoryType.COMMENT_FILE, member, savedComment);
8381
commandTaskHistoryPort.save(taskHistory);
8482

8583
Member processor = task.getProcessor();
@@ -93,14 +91,6 @@ public void saveCommentAttachment(Long memberId, Long taskId, MultipartFile file
9391

9492
}
9593

96-
@Deprecated
97-
// private String saveAttachment(MultipartFile file, Task task) {
98-
// String fileUrl = s3UploadPort.uploadSingleFile(FilePathConstants.TASK_COMMENT, file);
99-
// Attachment attachment = Attachment.createCommentAttachment(task, null, file.getOriginalFilename(), fileUrl, file.getSize());
100-
// commandAttachmentPort.save(attachment);
101-
// return file.getOriginalFilename();
102-
// }
103-
10494
private void publishNotification(Member receiver, Task task, String message, String commenterName) {
10595
boolean isManager = receiver.getMemberInfo().getRole() == MemberRole.ROLE_MANAGER;
10696
sendNotificationService.sendPushNotification(receiver, NotificationType.COMMENT, task, message, null, commenterName, isManager);

0 commit comments

Comments
 (0)