From 2cfb4da9ba2aa07681160fed7e934d2a250c7c95 Mon Sep 17 00:00:00 2001 From: andrew Date: Tue, 4 Feb 2025 14:17:19 +0900 Subject: [PATCH 01/16] =?UTF-8?q?CLAP-257=20Feat:=20entity=20=EB=B0=8F=20d?= =?UTF-8?q?omain=EC=97=90=20agitPostId(=EC=95=84=EC=A7=80=ED=8A=B8=20?= =?UTF-8?q?=EC=95=8C=EB=A6=BC=20=EA=B2=8C=EC=8B=9C=EA=B8=80=20ID)=20?= =?UTF-8?q?=EC=BB=AC=EB=9F=BC=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../adapter/outbound/persistense/entity/task/TaskEntity.java | 3 +++ src/main/java/clap/server/domain/model/task/Task.java | 5 +++++ 2 files changed, 8 insertions(+) diff --git a/src/main/java/clap/server/adapter/outbound/persistense/entity/task/TaskEntity.java b/src/main/java/clap/server/adapter/outbound/persistense/entity/task/TaskEntity.java index 0bb81daf..53d264d7 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/entity/task/TaskEntity.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/entity/task/TaskEntity.java @@ -45,6 +45,9 @@ public class TaskEntity extends BaseTimeEntity { @Column private Long processorOrder; + @Column + private Long agitPostId; + @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "reviewer_id") private MemberEntity reviewer; diff --git a/src/main/java/clap/server/domain/model/task/Task.java b/src/main/java/clap/server/domain/model/task/Task.java index e5dce10f..62b44f68 100644 --- a/src/main/java/clap/server/domain/model/task/Task.java +++ b/src/main/java/clap/server/domain/model/task/Task.java @@ -28,6 +28,7 @@ public class Task extends BaseTime { private Member requester; private TaskStatus taskStatus; private long processorOrder; + private Long agitPostId; private Member processor; private Label label; private Member reviewer; @@ -68,6 +69,10 @@ public void updateTaskStatus(TaskStatus status) { this.taskStatus = status; } + public void updateAgitPostId(Long agitPostId) { + this.agitPostId = agitPostId; + } + public void terminateTask() { this.taskStatus = TaskStatus.TERMINATED; this.finishedAt = LocalDateTime.now(); From eb322582abfb8cb3d86f9afef91700ed0b76a9f5 Mon Sep 17 00:00:00 2001 From: andrew Date: Tue, 4 Feb 2025 14:23:30 +0900 Subject: [PATCH 02/16] =?UTF-8?q?CLAP-257=20Fix=20:=20pull=20=EC=97=90?= =?UTF-8?q?=EB=9F=AC=20solve?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../adapter/inbound/web/history/CommandCommentController.java | 2 +- .../adapter/inbound/web/history/PostCommentController.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/clap/server/adapter/inbound/web/history/CommandCommentController.java b/src/main/java/clap/server/adapter/inbound/web/history/CommandCommentController.java index 81a74390..e7a44d8d 100644 --- a/src/main/java/clap/server/adapter/inbound/web/history/CommandCommentController.java +++ b/src/main/java/clap/server/adapter/inbound/web/history/CommandCommentController.java @@ -1,6 +1,6 @@ package clap.server.adapter.inbound.web.history; -import clap.server.adapter.inbound.security.SecurityUserDetails; +import clap.server.adapter.inbound.security.service.SecurityUserDetails; import clap.server.adapter.inbound.web.dto.history.request.EditCommentRequest; import clap.server.application.port.inbound.history.DeleteCommentUsecase; import clap.server.application.port.inbound.history.EditCommentUsecase; diff --git a/src/main/java/clap/server/adapter/inbound/web/history/PostCommentController.java b/src/main/java/clap/server/adapter/inbound/web/history/PostCommentController.java index c473f6fc..cc2b6207 100644 --- a/src/main/java/clap/server/adapter/inbound/web/history/PostCommentController.java +++ b/src/main/java/clap/server/adapter/inbound/web/history/PostCommentController.java @@ -1,6 +1,6 @@ package clap.server.adapter.inbound.web.history; -import clap.server.adapter.inbound.security.SecurityUserDetails; +import clap.server.adapter.inbound.security.service.SecurityUserDetails; import clap.server.adapter.inbound.web.dto.history.request.CreateCommentRequest; import clap.server.application.port.inbound.history.SaveCommentAttachmentUsecase; import clap.server.application.port.inbound.history.SaveCommentUsecase; From fd2aa125be824f364c2d217011f1cf441b0928cd Mon Sep 17 00:00:00 2001 From: andrew Date: Tue, 4 Feb 2025 14:24:10 +0900 Subject: [PATCH 03/16] =?UTF-8?q?CLAP-257=20Fix=20:=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20code=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/application/service/task/ApprovalTaskService.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/clap/server/application/service/task/ApprovalTaskService.java b/src/main/java/clap/server/application/service/task/ApprovalTaskService.java index 340141fe..0a033b47 100644 --- a/src/main/java/clap/server/application/service/task/ApprovalTaskService.java +++ b/src/main/java/clap/server/application/service/task/ApprovalTaskService.java @@ -35,7 +35,6 @@ public class ApprovalTaskService implements ApprovalTaskUsecase { private final TaskService taskService; private final CategoryService categoryService; private final LabelService labelService; - private final CommandTaskPort commandTaskPort; private final RequestedTaskUpdatePolicy requestedTaskUpdatePolicy; private final CommandTaskHistoryPort commandTaskHistoryPort; private final SendNotificationService sendNotificationService; From dcf3c9088d0a1e0a13bf943d8424d69e75f0a894 Mon Sep 17 00:00:00 2001 From: andrew Date: Tue, 4 Feb 2025 14:24:51 +0900 Subject: [PATCH 04/16] =?UTF-8?q?CLAP-257=20Fix=20:=20=EC=95=84=EC=A7=80?= =?UTF-8?q?=ED=8A=B8=20=ED=91=B8=EC=8B=9C=20=EC=95=8C=EB=A6=BC=20logic=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../adapter/outbound/api/AgitClient.java | 56 ++++++++++++++----- .../persistense/TaskPersistenceAdapter.java | 18 ++++++ .../port/outbound/task/CommandTaskPort.java | 3 + 3 files changed, 63 insertions(+), 14 deletions(-) diff --git a/src/main/java/clap/server/adapter/outbound/api/AgitClient.java b/src/main/java/clap/server/adapter/outbound/api/AgitClient.java index 6c140118..2de43031 100644 --- a/src/main/java/clap/server/adapter/outbound/api/AgitClient.java +++ b/src/main/java/clap/server/adapter/outbound/api/AgitClient.java @@ -1,13 +1,17 @@ package clap.server.adapter.outbound.api; import clap.server.adapter.outbound.api.dto.PushNotificationTemplate; +import clap.server.adapter.outbound.persistense.entity.notification.constant.NotificationType; +import clap.server.application.port.outbound.task.CommandTaskPort; import clap.server.application.port.outbound.webhook.SendAgitPort; import clap.server.common.annotation.architecture.ExternalApiAdapter; +import clap.server.domain.model.task.Task; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; +import org.springframework.http.ResponseEntity; import org.springframework.web.client.RestTemplate; @@ -18,16 +22,52 @@ public class AgitClient implements SendAgitPort { @Value("${webhook.agit.url}") private String AGIT_WEBHOOK_URL; + private final CommandTaskPort commandTaskPort; + @Override - public void sendAgit(PushNotificationTemplate request) { + public void sendAgit(PushNotificationTemplate request, Task task) { HttpHeaders headers = new HttpHeaders(); + headers.add("Content-Type", "application/json"); + HttpEntity entity = new HttpEntity<>(getPayLoad(request, task), headers); RestTemplate restTemplate = new RestTemplate(); + + + if (request.notificationType() == NotificationType.TASK_REQUESTED) { + ResponseEntity responseEntity = restTemplate.exchange( + AGIT_WEBHOOK_URL, HttpMethod.POST, entity, String.class); + commandTaskPort.updateAgitPostId(responseEntity, task); + } + else { + restTemplate.exchange(AGIT_WEBHOOK_URL, HttpMethod.POST, entity, String.class); + } + } + + private String getPayLoad(PushNotificationTemplate request, Task task) { + + String payload; + if (request.notificationType() == NotificationType.TASK_REQUESTED) { + payload = "{" + + "\"text\": \"" + getMessage(request) + "\"," + + "\"mrkdwn\": true" + "}"; + } + + else { + payload = "{" + + "\"parent_id\": " + task.getAgitPostId() + "," + + "\"text\": \"" + getMessage(request) + "\"," + + "\"mrkdwn\": true" + + "}"; + } + return payload; + } + + private String getMessage(PushNotificationTemplate request) { String taskUrl = "https://www.naver.com"; //Todo 작업 상세페이지 url 추가 - String message = switch (request.notificationType()) { + return switch (request.notificationType()) { case TASK_REQUESTED -> "📌 *새 작업 요청:* `" + request.taskName() + "`\\n" + "\\t\\t*•요청자: " + request.senderName() + "*\\n" + "\\t\\t[OPEN](" + taskUrl + ")"; @@ -40,19 +80,7 @@ public void sendAgit(PushNotificationTemplate request) { case PROCESSOR_ASSIGNED -> "👤 *작업 담당자 배정:* `" + request.taskName() + "\\n" + "\\t\\t*•담당자: " + request.message() + "*\\n" + "\\t\\t[OPEN](" + taskUrl + ")"; - case COMMENT -> "💬 *새 댓글:* `" + request.taskName() + "`\\n" - + "\\t\\t*•작성자: " + request.commenterName() + "\\n" - + "\\t\\t*•댓글 내용: " + request.message() + "\\n" - + "\\t\\t[OPEN](" + taskUrl + ")"; default -> null; }; - - String payload = "{" - + "\"text\": \"" + message + "\"," - + "\"mrkdwn\": true" + "}"; - - HttpEntity entity = new HttpEntity<>(payload, headers); - - restTemplate.exchange(AGIT_WEBHOOK_URL, HttpMethod.POST, entity, String.class); } } diff --git a/src/main/java/clap/server/adapter/outbound/persistense/TaskPersistenceAdapter.java b/src/main/java/clap/server/adapter/outbound/persistense/TaskPersistenceAdapter.java index 7171871b..8fdcff47 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/TaskPersistenceAdapter.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/TaskPersistenceAdapter.java @@ -12,12 +12,18 @@ import clap.server.application.port.outbound.task.LoadTaskPort; import clap.server.common.annotation.architecture.PersistenceAdapter; import clap.server.domain.model.task.Task; +import clap.server.exception.ApplicationException; +import clap.server.exception.code.NotificationErrorCode; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Slice; import org.springframework.data.domain.SliceImpl; +import org.springframework.http.ResponseEntity; import java.time.LocalDateTime; import java.util.List; @@ -29,6 +35,7 @@ public class TaskPersistenceAdapter implements CommandTaskPort, LoadTaskPort { private final TaskRepository taskRepository; private final TaskPersistenceMapper taskPersistenceMapper; + private final ObjectMapper objectMapper; @Override public Task save(Task task) { @@ -37,6 +44,17 @@ public Task save(Task task) { return taskPersistenceMapper.toDomain(savedTaskEntity); } + @Override + public void updateAgitPostId(ResponseEntity responseEntity, Task task) { + try { + JsonNode jsonNode = objectMapper.readTree(responseEntity.getBody()); + task.updateAgitPostId(jsonNode.get("id").asLong()); + taskRepository.save(taskPersistenceMapper.toEntity(task)); + } catch (JsonProcessingException e) { + throw new ApplicationException(NotificationErrorCode.AGIT_SEND_FAILED); + } + } + @Override public Optional findById(Long id) { Optional taskEntity = taskRepository.findById(id); diff --git a/src/main/java/clap/server/application/port/outbound/task/CommandTaskPort.java b/src/main/java/clap/server/application/port/outbound/task/CommandTaskPort.java index 8b1512c0..b2523b7d 100644 --- a/src/main/java/clap/server/application/port/outbound/task/CommandTaskPort.java +++ b/src/main/java/clap/server/application/port/outbound/task/CommandTaskPort.java @@ -1,9 +1,12 @@ package clap.server.application.port.outbound.task; import clap.server.domain.model.task.Task; +import org.springframework.http.ResponseEntity; import java.util.Optional; public interface CommandTaskPort { Task save(Task task); + + void updateAgitPostId(ResponseEntity responseEntity, Task task); } \ No newline at end of file From e38471b51a8b39020a54595ee22cfe9ad4620ed2 Mon Sep 17 00:00:00 2001 From: andrew Date: Tue, 4 Feb 2025 14:26:28 +0900 Subject: [PATCH 05/16] =?UTF-8?q?CLAP-257=20Fix=20:=20=EB=8C=93=EA=B8=80?= =?UTF-8?q?=20=EC=B2=A8=EB=B6=80=ED=8C=8C=EC=9D=BC=20=ED=91=B8=EC=8B=9C=20?= =?UTF-8?q?=EC=95=8C=EB=A6=BC=EC=9C=BC=EB=A1=9C=20=ED=8C=8C=EC=9D=BC?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EC=A0=84=EC=86=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/history/PostCommentService.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) 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 bf9ec90e..945990a3 100644 --- a/src/main/java/clap/server/application/service/history/PostCommentService.java +++ b/src/main/java/clap/server/application/service/history/PostCommentService.java @@ -68,29 +68,28 @@ public void saveCommentAttachment(Long userId, Long taskId, MultipartFile file) if (Member.checkCommenter(task, member)) { Comment comment = Comment.createComment(member, task, null); Comment savedComment = commandCommentPort.saveComment(comment); - saveAttachment(file, task, savedComment); + String fileName = saveAttachment(file, task, savedComment); TaskHistory taskHistory = TaskHistory.createTaskHistory(TaskHistoryType.COMMENT_FILE, task, null, member, savedComment); commandTaskHistoryPort.save(taskHistory); if (member.getMemberInfo().getRole() == MemberRole.ROLE_USER) { - publishNotification(task.getProcessor(), task, "첨부파일", member.getNickname()); + publishNotification(task.getProcessor(), task, fileName + "(첨부파일)", member.getNickname()); } else { - publishNotification(task.getRequester(), task, "첨부파일", task.getProcessor().getNickname()); + publishNotification(task.getRequester(), task, fileName + "(첨부파일)", task.getProcessor().getNickname()); } } } - private void saveAttachment(MultipartFile file, Task task, Comment comment) { + private String saveAttachment(MultipartFile file, Task task, Comment comment) { String fileUrl = s3UploadPort.uploadSingleFile(FilePathPolicy.TASK_COMMENT, file); Attachment attachment = Attachment.createCommentAttachment(task, comment, file.getOriginalFilename(), fileUrl, file.getSize()); commandAttachmentPort.save(attachment); + return file.getOriginalFilename(); } private void publishNotification(Member receiver, Task task, String message, String commenterName) { sendNotificationService.sendPushNotification(receiver, NotificationType.COMMENT, task, message, commenterName); - sendNotificationService.sendAgitNotification(NotificationType.COMMENT, - task, message, commenterName); } } From 465103841fd2761ad1e739782886834e749636e9 Mon Sep 17 00:00:00 2001 From: andrew Date: Tue, 4 Feb 2025 14:27:07 +0900 Subject: [PATCH 06/16] =?UTF-8?q?CLAP-257=20Fix=20:=20=EC=95=84=EC=A7=80?= =?UTF-8?q?=ED=8A=B8=20=ED=91=B8=EC=8B=9C=20=EC=95=8C=EB=A6=BC=20logic=20?= =?UTF-8?q?=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/port/outbound/webhook/SendAgitPort.java | 3 ++- .../server/application/service/task/UpdateTaskService.java | 6 +++--- .../server/application/service/webhook/SendAgitService.java | 5 +++-- .../service/webhook/SendNotificationService.java | 5 +---- 4 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/main/java/clap/server/application/port/outbound/webhook/SendAgitPort.java b/src/main/java/clap/server/application/port/outbound/webhook/SendAgitPort.java index bcb60810..5d9005e4 100644 --- a/src/main/java/clap/server/application/port/outbound/webhook/SendAgitPort.java +++ b/src/main/java/clap/server/application/port/outbound/webhook/SendAgitPort.java @@ -1,7 +1,8 @@ package clap.server.application.port.outbound.webhook; import clap.server.adapter.outbound.api.dto.PushNotificationTemplate; +import clap.server.domain.model.task.Task; public interface SendAgitPort { - void sendAgit(PushNotificationTemplate request); + void sendAgit(PushNotificationTemplate request, Task task); } 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 667114df..6507de43 100644 --- a/src/main/java/clap/server/application/service/task/UpdateTaskService.java +++ b/src/main/java/clap/server/application/service/task/UpdateTaskService.java @@ -71,7 +71,7 @@ public UpdateTaskResponse updateTask(Long requesterId, Long taskId, UpdateTaskRe @Override @Transactional - public UpdateTaskResponse updateTaskState(Long memberId, Long taskId, UpdateTaskStatusRequest updateTaskStatusRequest) { + public UpdateTaskResponse updateTaskStatus(Long memberId, Long taskId, TaskStatus taskStatus) { memberService.findActiveMember(memberId); memberService.findReviewer(memberId); Task task = taskService.findById(taskId); @@ -135,7 +135,7 @@ private void publishNotification(Task task, NotificationType notificationType, S sendNotificationService.sendPushNotification(receiver, notificationType, task, message, null); }); - sendNotificationService.sendAgitNotification(notificationType, - task, message, null); + + sendNotificationService.sendAgitNotification(notificationType, task, message, null); } } diff --git a/src/main/java/clap/server/application/service/webhook/SendAgitService.java b/src/main/java/clap/server/application/service/webhook/SendAgitService.java index db2533fa..905e343a 100644 --- a/src/main/java/clap/server/application/service/webhook/SendAgitService.java +++ b/src/main/java/clap/server/application/service/webhook/SendAgitService.java @@ -3,6 +3,7 @@ import clap.server.adapter.outbound.api.dto.PushNotificationTemplate; import clap.server.application.port.outbound.webhook.SendAgitPort; import clap.server.common.annotation.architecture.ApplicationService; +import clap.server.domain.model.task.Task; import lombok.RequiredArgsConstructor; @ApplicationService @@ -11,7 +12,7 @@ public class SendAgitService { private final SendAgitPort agitPort; - public void sendAgit(PushNotificationTemplate request) { - agitPort.sendAgit(request); + public void sendAgit(PushNotificationTemplate request, Task task) { + agitPort.sendAgit(request, task); } } diff --git a/src/main/java/clap/server/application/service/webhook/SendNotificationService.java b/src/main/java/clap/server/application/service/webhook/SendNotificationService.java index 46322e7d..0a0de008 100644 --- a/src/main/java/clap/server/application/service/webhook/SendNotificationService.java +++ b/src/main/java/clap/server/application/service/webhook/SendNotificationService.java @@ -12,8 +12,6 @@ import org.springframework.scheduling.annotation.Async; import java.util.concurrent.CompletableFuture; -import java.util.concurrent.atomic.AtomicBoolean; - import static clap.server.domain.model.notification.Notification.createTaskNotification; @ApplicationService @@ -25,7 +23,6 @@ public class SendNotificationService { private final SendEmailService sendEmailService; private final SendKaKaoWorkService sendKaKaoWorkService; private final CommandNotificationPort commandNotificationPort; - private static final AtomicBoolean agitSent = new AtomicBoolean(false); @Async("notificationExecutor") public void sendPushNotification(Member receiver, NotificationType notificationType, @@ -85,6 +82,6 @@ public void sendAgitNotification(NotificationType notificationType, commenterName ); - sendAgitService.sendAgit(pushNotificationTemplate); + sendAgitService.sendAgit(pushNotificationTemplate, task); } } From 18aa1761d479b98ab0d5d19058773e8aeccc5304 Mon Sep 17 00:00:00 2001 From: andrew Date: Tue, 4 Feb 2025 14:48:12 +0900 Subject: [PATCH 07/16] =?UTF-8?q?CLAP-257=20Docs=20:=20flyway=20script=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dev/V20250204257__Insert_Agit_Post_id_Into_Task.sql | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 src/main/resources/db/migration/dev/V20250204257__Insert_Agit_Post_id_Into_Task.sql diff --git a/src/main/resources/db/migration/dev/V20250204257__Insert_Agit_Post_id_Into_Task.sql b/src/main/resources/db/migration/dev/V20250204257__Insert_Agit_Post_id_Into_Task.sql new file mode 100644 index 00000000..dc1f4cbd --- /dev/null +++ b/src/main/resources/db/migration/dev/V20250204257__Insert_Agit_Post_id_Into_Task.sql @@ -0,0 +1,2 @@ +ALTER TABLE task + ADD agit_post_id BIGINT NULL; \ No newline at end of file From 7e21e1ae0d945b5196e439456e1bbee02b5643b5 Mon Sep 17 00:00:00 2001 From: andrew Date: Tue, 4 Feb 2025 23:32:26 +0900 Subject: [PATCH 08/16] =?UTF-8?q?CLAP-257=20Fix=20:=20=EC=95=8C=EB=A6=BC?= =?UTF-8?q?=20=ED=8C=8C=EC=8B=B1=20=EB=A1=9C=EC=A7=81=20service=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../persistense/TaskPersistenceAdapter.java | 11 ----------- .../port/outbound/task/CommandTaskPort.java | 5 ----- .../service/task/UpdateTaskService.java | 16 ++++++++++++++++ 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/main/java/clap/server/adapter/outbound/persistense/TaskPersistenceAdapter.java b/src/main/java/clap/server/adapter/outbound/persistense/TaskPersistenceAdapter.java index 8fdcff47..2a625076 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/TaskPersistenceAdapter.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/TaskPersistenceAdapter.java @@ -44,17 +44,6 @@ public Task save(Task task) { return taskPersistenceMapper.toDomain(savedTaskEntity); } - @Override - public void updateAgitPostId(ResponseEntity responseEntity, Task task) { - try { - JsonNode jsonNode = objectMapper.readTree(responseEntity.getBody()); - task.updateAgitPostId(jsonNode.get("id").asLong()); - taskRepository.save(taskPersistenceMapper.toEntity(task)); - } catch (JsonProcessingException e) { - throw new ApplicationException(NotificationErrorCode.AGIT_SEND_FAILED); - } - } - @Override public Optional findById(Long id) { Optional taskEntity = taskRepository.findById(id); diff --git a/src/main/java/clap/server/application/port/outbound/task/CommandTaskPort.java b/src/main/java/clap/server/application/port/outbound/task/CommandTaskPort.java index b2523b7d..94efd87b 100644 --- a/src/main/java/clap/server/application/port/outbound/task/CommandTaskPort.java +++ b/src/main/java/clap/server/application/port/outbound/task/CommandTaskPort.java @@ -1,12 +1,7 @@ package clap.server.application.port.outbound.task; import clap.server.domain.model.task.Task; -import org.springframework.http.ResponseEntity; - -import java.util.Optional; public interface CommandTaskPort { Task save(Task task); - - void updateAgitPostId(ResponseEntity responseEntity, Task task); } \ No newline at end of file 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 6507de43..7d3df316 100644 --- a/src/main/java/clap/server/application/service/task/UpdateTaskService.java +++ b/src/main/java/clap/server/application/service/task/UpdateTaskService.java @@ -29,9 +29,14 @@ import clap.server.domain.model.task.Task; import clap.server.domain.policy.task.TaskPolicyConstants; import clap.server.exception.ApplicationException; +import clap.server.exception.code.NotificationErrorCode; import clap.server.exception.code.TaskErrorCode; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.http.ResponseEntity; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; @@ -52,6 +57,7 @@ public class UpdateTaskService implements UpdateTaskUsecase, UpdateTaskStatusUse private final LabelService labelService; private final CommandAttachmentPort commandAttachmentPort; private final S3UploadPort s3UploadPort; + private final ObjectMapper objectMapper; @Override @Transactional @@ -110,6 +116,16 @@ public UpdateTaskResponse updateTaskLabel(Long taskId, Long userId, UpdateTaskLa return TaskResponseMapper.toUpdateTaskResponse(updatetask); } + public void updateAgitPostId(ResponseEntity responseEntity, Task task) { + try { + JsonNode jsonNode = objectMapper.readTree(responseEntity.getBody()); + task.updateAgitPostId(jsonNode.get("id").asLong()); + taskService.upsert(task); + } catch (JsonProcessingException e) { + throw new ApplicationException(NotificationErrorCode.AGIT_SEND_FAILED); + } + } + private void updateAttachments(List attachmentIdsToDelete, List files, Task task) { List attachmentsToDelete = validateAndGetAttachments(attachmentIdsToDelete, task); attachmentsToDelete.forEach(Attachment::softDelete); From 8fb5fff082899680278795c90a1c80c5924505d0 Mon Sep 17 00:00:00 2001 From: andrew Date: Tue, 4 Feb 2025 23:33:48 +0900 Subject: [PATCH 09/16] =?UTF-8?q?CLAP-257=20Fix=20:=20template=20builder?= =?UTF-8?q?=20=ED=81=B4=EB=9E=98=EC=8A=A4=EB=A1=9C=20agit=20template=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=EA=B8=B0=EB=8A=A5=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../adapter/outbound/api/AgitClient.java | 54 ++-------------- .../outbound/api/AgitTemplateBuilder.java | 62 +++++++++++++++++++ 2 files changed, 67 insertions(+), 49 deletions(-) create mode 100644 src/main/java/clap/server/adapter/outbound/api/AgitTemplateBuilder.java diff --git a/src/main/java/clap/server/adapter/outbound/api/AgitClient.java b/src/main/java/clap/server/adapter/outbound/api/AgitClient.java index 2de43031..cae469ae 100644 --- a/src/main/java/clap/server/adapter/outbound/api/AgitClient.java +++ b/src/main/java/clap/server/adapter/outbound/api/AgitClient.java @@ -2,14 +2,13 @@ import clap.server.adapter.outbound.api.dto.PushNotificationTemplate; import clap.server.adapter.outbound.persistense.entity.notification.constant.NotificationType; -import clap.server.application.port.outbound.task.CommandTaskPort; import clap.server.application.port.outbound.webhook.SendAgitPort; +import clap.server.application.service.task.UpdateTaskService; import clap.server.common.annotation.architecture.ExternalApiAdapter; import clap.server.domain.model.task.Task; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpEntity; -import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.ResponseEntity; import org.springframework.web.client.RestTemplate; @@ -22,65 +21,22 @@ public class AgitClient implements SendAgitPort { @Value("${webhook.agit.url}") private String AGIT_WEBHOOK_URL; - private final CommandTaskPort commandTaskPort; + private final UpdateTaskService updateTaskService; + private final AgitTemplateBuilder agitTemplateBuilder; @Override public void sendAgit(PushNotificationTemplate request, Task task) { - HttpHeaders headers = new HttpHeaders(); - - headers.add("Content-Type", "application/json"); - HttpEntity entity = new HttpEntity<>(getPayLoad(request, task), headers); + HttpEntity entity = agitTemplateBuilder.createAgitEntity(request, task); RestTemplate restTemplate = new RestTemplate(); - - if (request.notificationType() == NotificationType.TASK_REQUESTED) { ResponseEntity responseEntity = restTemplate.exchange( AGIT_WEBHOOK_URL, HttpMethod.POST, entity, String.class); - commandTaskPort.updateAgitPostId(responseEntity, task); + updateTaskService.updateAgitPostId(responseEntity, task); } else { restTemplate.exchange(AGIT_WEBHOOK_URL, HttpMethod.POST, entity, String.class); } } - - private String getPayLoad(PushNotificationTemplate request, Task task) { - - String payload; - if (request.notificationType() == NotificationType.TASK_REQUESTED) { - payload = "{" - + "\"text\": \"" + getMessage(request) + "\"," - + "\"mrkdwn\": true" + "}"; - } - - else { - payload = "{" - + "\"parent_id\": " + task.getAgitPostId() + "," - + "\"text\": \"" + getMessage(request) + "\"," - + "\"mrkdwn\": true" - + "}"; - } - return payload; - } - - private String getMessage(PushNotificationTemplate request) { - String taskUrl = "https://www.naver.com"; //Todo 작업 상세페이지 url 추가 - - return switch (request.notificationType()) { - case TASK_REQUESTED -> "📌 *새 작업 요청:* `" + request.taskName() + "`\\n" - + "\\t\\t*•요청자: " + request.senderName() + "*\\n" - + "\\t\\t[OPEN](" + taskUrl + ")"; - case STATUS_SWITCHED -> "⚙️ *작업 상태 변경:* `" + request.taskName() + "\\n" - + "\\t\\t*•작업 상태: " + request.message() + "*\\n" - + "\\t\\t[OPEN](" + taskUrl + ")"; - case PROCESSOR_CHANGED -> "🔄 *담당자 변경:* `" + request.taskName() + "\\n" - + "\\t\\t*•새 담당자: " + request.message() + "*\\n" - + "\\t\\t[OPEN](" + taskUrl + ")"; - case PROCESSOR_ASSIGNED -> "👤 *작업 담당자 배정:* `" + request.taskName() + "\\n" - + "\\t\\t*•담당자: " + request.message() + "*\\n" - + "\\t\\t[OPEN](" + taskUrl + ")"; - default -> null; - }; - } } diff --git a/src/main/java/clap/server/adapter/outbound/api/AgitTemplateBuilder.java b/src/main/java/clap/server/adapter/outbound/api/AgitTemplateBuilder.java new file mode 100644 index 00000000..77091d0d --- /dev/null +++ b/src/main/java/clap/server/adapter/outbound/api/AgitTemplateBuilder.java @@ -0,0 +1,62 @@ +package clap.server.adapter.outbound.api; + +import clap.server.adapter.outbound.api.dto.PushNotificationTemplate; +import clap.server.adapter.outbound.persistense.entity.notification.constant.NotificationType; +import clap.server.domain.model.task.Task; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.stereotype.Component; + +@Component +public class AgitTemplateBuilder { + + public HttpEntity createAgitEntity(PushNotificationTemplate request, Task task) { + return new HttpEntity<>(createPayLoad(request, task), createHeaders()); + } + + + public HttpHeaders createHeaders() { + HttpHeaders headers = new HttpHeaders(); + headers.add("Content-Type", "application/json"); + return headers; + } + + public String createPayLoad(PushNotificationTemplate request, Task task) { + + String payload; + if (request.notificationType() == NotificationType.TASK_REQUESTED) { + payload = "{" + + "\"text\": \"" + createMessage(request) + "\"," + + "\"mrkdwn\": true" + "}"; + } + + else { + payload = "{" + + "\"parent_id\": " + task.getAgitPostId() + "," + + "\"text\": \"" + createMessage(request) + "\"," + + "\"mrkdwn\": true" + + "}"; + } + return payload; + } + + public String createMessage(PushNotificationTemplate request) { + String taskUrl = "https://www.naver.com"; //Todo 작업 상세페이지 url 추가 + + return switch (request.notificationType()) { + case TASK_REQUESTED -> "📌 *새 작업 요청:* `" + request.taskName() + "`\\n" + + "\\t\\t*•요청자: " + request.senderName() + "*\\n" + + "\\t\\t[OPEN](" + taskUrl + ")"; + case STATUS_SWITCHED -> "⚙️ *작업 상태 변경:* `" + request.taskName() + "\\n" + + "\\t\\t*•작업 상태: " + request.message() + "*\\n" + + "\\t\\t[OPEN](" + taskUrl + ")"; + case PROCESSOR_CHANGED -> "🔄 *담당자 변경:* `" + request.taskName() + "\\n" + + "\\t\\t*•새 담당자: " + request.message() + "*\\n" + + "\\t\\t[OPEN](" + taskUrl + ")"; + case PROCESSOR_ASSIGNED -> "👤 *작업 담당자 배정:* `" + request.taskName() + "\\n" + + "\\t\\t*•담당자: " + request.message() + "*\\n" + + "\\t\\t[OPEN](" + taskUrl + ")"; + default -> null; + }; + } +} From 6ceb64621ec13e815c6cea31dbb82afe008d2e9b Mon Sep 17 00:00:00 2001 From: andrew Date: Wed, 5 Feb 2025 01:35:52 +0900 Subject: [PATCH 10/16] =?UTF-8?q?CLAP-257=20Fix=20:=20git=20build=20proble?= =?UTF-8?q?m=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/adapter/inbound/web/task/ChangeTaskController.java | 4 ++-- .../port/inbound/task/UpdateTaskStatusUsecase.java | 2 +- .../server/application/service/task/UpdateTaskService.java | 3 +-- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main/java/clap/server/adapter/inbound/web/task/ChangeTaskController.java b/src/main/java/clap/server/adapter/inbound/web/task/ChangeTaskController.java index a3e9ffb6..77e4095f 100644 --- a/src/main/java/clap/server/adapter/inbound/web/task/ChangeTaskController.java +++ b/src/main/java/clap/server/adapter/inbound/web/task/ChangeTaskController.java @@ -40,14 +40,14 @@ public class ChangeTaskController { @Operation(summary = "작업 상태 변경") @Secured("ROLE_MANAGER") @PatchMapping("/{taskId}/status") - public ResponseEntity updateTaskState( + public void updateTaskState( @PathVariable @NotNull Long taskId, @AuthenticationPrincipal SecurityUserDetails userInfo, @Parameter(description = "변경하고 싶은 작업 상태", schema = @Schema(allowableValues = {"IN_PROGRESS", "PENDING_COMPLETED", "COMPLETED"})) @RequestBody TaskStatus taskStatus) { - return ResponseEntity.ok(updateTaskStatusUsecase.updateTaskStatus(userInfo.getUserId(), taskId, taskStatus)); + updateTaskStatusUsecase.updateTaskStatus(userInfo.getUserId(), taskId, taskStatus); } @Operation(summary = "작업 처리자 변경") diff --git a/src/main/java/clap/server/application/port/inbound/task/UpdateTaskStatusUsecase.java b/src/main/java/clap/server/application/port/inbound/task/UpdateTaskStatusUsecase.java index 80c7ff03..b08aa879 100644 --- a/src/main/java/clap/server/application/port/inbound/task/UpdateTaskStatusUsecase.java +++ b/src/main/java/clap/server/application/port/inbound/task/UpdateTaskStatusUsecase.java @@ -4,5 +4,5 @@ import clap.server.adapter.outbound.persistense.entity.task.constant.TaskStatus; public interface UpdateTaskStatusUsecase { - UpdateTaskResponse updateTaskStatus(Long memberId, Long taskId, TaskStatus taskStatus); + void updateTaskStatus(Long memberId, Long taskId, TaskStatus taskStatus); } 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 7d3df316..cd80e783 100644 --- a/src/main/java/clap/server/application/service/task/UpdateTaskService.java +++ b/src/main/java/clap/server/application/service/task/UpdateTaskService.java @@ -77,7 +77,7 @@ public UpdateTaskResponse updateTask(Long requesterId, Long taskId, UpdateTaskRe @Override @Transactional - public UpdateTaskResponse updateTaskStatus(Long memberId, Long taskId, TaskStatus taskStatus) { + public void updateTaskStatus(Long memberId, Long taskId, TaskStatus taskStatus) { memberService.findActiveMember(memberId); memberService.findReviewer(memberId); Task task = taskService.findById(taskId); @@ -85,7 +85,6 @@ public UpdateTaskResponse updateTaskStatus(Long memberId, Long taskId, TaskStatu Task updateTask = taskService.upsert(task); publishNotification(updateTask, NotificationType.STATUS_SWITCHED, String.valueOf(updateTask.getTaskStatus())); - return TaskResponseMapper.toUpdateTaskResponse(updateTask); } @Transactional From 3d8555ca410a1269c786de865b3b7c43fc293bd2 Mon Sep 17 00:00:00 2001 From: andrew Date: Wed, 5 Feb 2025 01:37:47 +0900 Subject: [PATCH 11/16] =?UTF-8?q?CLAP-257=20Fix=20:=20git=20build=20proble?= =?UTF-8?q?m=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/task/UpdateTaskService.java | 23 +++++++++++++------ 1 file changed, 16 insertions(+), 7 deletions(-) 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 cd80e783..b1cfba63 100644 --- a/src/main/java/clap/server/application/service/task/UpdateTaskService.java +++ b/src/main/java/clap/server/application/service/task/UpdateTaskService.java @@ -5,6 +5,7 @@ import clap.server.adapter.inbound.web.dto.task.request.UpdateTaskRequest; import clap.server.adapter.inbound.web.dto.task.response.UpdateTaskResponse; import clap.server.adapter.outbound.persistense.entity.notification.constant.NotificationType; +import clap.server.adapter.outbound.persistense.entity.task.constant.TaskHistoryType; import clap.server.adapter.outbound.persistense.entity.task.constant.TaskStatus; import clap.server.application.mapper.AttachmentMapper; import clap.server.application.mapper.TaskResponseMapper; @@ -19,14 +20,12 @@ import clap.server.application.port.outbound.s3.S3UploadPort; import clap.server.application.port.outbound.task.CommandAttachmentPort; import clap.server.application.port.outbound.task.LoadAttachmentPort; +import clap.server.application.port.outbound.taskhistory.CommandTaskHistoryPort; import clap.server.application.service.webhook.SendNotificationService; import clap.server.common.annotation.architecture.ApplicationService; +import clap.server.domain.model.task.*; import clap.server.domain.policy.attachment.FilePathPolicy; import clap.server.domain.model.member.Member; -import clap.server.domain.model.task.Attachment; -import clap.server.domain.model.task.Category; -import clap.server.domain.model.task.Label; -import clap.server.domain.model.task.Task; import clap.server.domain.policy.task.TaskPolicyConstants; import clap.server.exception.ApplicationException; import clap.server.exception.code.NotificationErrorCode; @@ -42,6 +41,8 @@ import java.util.List; +import static clap.server.domain.policy.task.TaskPolicyConstants.TASK_UPDATABLE_STATUS; + @ApplicationService @RequiredArgsConstructor @@ -56,6 +57,7 @@ public class UpdateTaskService implements UpdateTaskUsecase, UpdateTaskStatusUse private final LoadAttachmentPort loadAttachmentPort; private final LabelService labelService; private final CommandAttachmentPort commandAttachmentPort; + private final CommandTaskHistoryPort commandTaskHistoryPort; private final S3UploadPort s3UploadPort; private final ObjectMapper objectMapper; @@ -81,10 +83,17 @@ public void updateTaskStatus(Long memberId, Long taskId, TaskStatus taskStatus) memberService.findActiveMember(memberId); memberService.findReviewer(memberId); Task task = taskService.findById(taskId); - task.updateTaskStatus(taskStatus); - Task updateTask = taskService.upsert(task); + if(!TASK_UPDATABLE_STATUS.contains(taskStatus)){ + throw new ApplicationException(TaskErrorCode.TASK_STATUS_NOT_ALLOWED); + } - publishNotification(updateTask, NotificationType.STATUS_SWITCHED, String.valueOf(updateTask.getTaskStatus())); + if(!task.getTaskStatus().equals(taskStatus)){ + task.updateTaskStatus(taskStatus); + Task updateTask = taskService.upsert(task); + TaskHistory taskHistory = TaskHistory.createTaskHistory(TaskHistoryType.STATUS_SWITCHED, task, taskStatus.getDescription(), null,null); + commandTaskHistoryPort.save(taskHistory); + publishNotification(updateTask, NotificationType.STATUS_SWITCHED, String.valueOf(updateTask.getTaskStatus())); + } } @Transactional From 33049e0f98ec237dbb05b9280d80b7aa0b9b7e5b Mon Sep 17 00:00:00 2001 From: andrew Date: Wed, 5 Feb 2025 01:40:25 +0900 Subject: [PATCH 12/16] =?UTF-8?q?CLAP-257=20Fix=20:=20git=20build=20proble?= =?UTF-8?q?m=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/application/service/task/UpdateTaskService.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 b1cfba63..7d8f2b4b 100644 --- a/src/main/java/clap/server/application/service/task/UpdateTaskService.java +++ b/src/main/java/clap/server/application/service/task/UpdateTaskService.java @@ -27,6 +27,9 @@ import clap.server.domain.policy.attachment.FilePathPolicy; import clap.server.domain.model.member.Member; import clap.server.domain.policy.task.TaskPolicyConstants; +import clap.server.domain.model.member.Member; +import clap.server.domain.model.task.*; +import clap.server.domain.policy.attachment.FilePathPolicy; import clap.server.exception.ApplicationException; import clap.server.exception.code.NotificationErrorCode; import clap.server.exception.code.TaskErrorCode; @@ -83,9 +86,6 @@ public void updateTaskStatus(Long memberId, Long taskId, TaskStatus taskStatus) memberService.findActiveMember(memberId); memberService.findReviewer(memberId); Task task = taskService.findById(taskId); - if(!TASK_UPDATABLE_STATUS.contains(taskStatus)){ - throw new ApplicationException(TaskErrorCode.TASK_STATUS_NOT_ALLOWED); - } if(!task.getTaskStatus().equals(taskStatus)){ task.updateTaskStatus(taskStatus); From 8ff29685eed836b1b174e5563945b1521659e634 Mon Sep 17 00:00:00 2001 From: andrew Date: Wed, 5 Feb 2025 01:42:07 +0900 Subject: [PATCH 13/16] =?UTF-8?q?CLAP-257=20Fix=20:=20git=20build=20proble?= =?UTF-8?q?m=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/application/service/task/UpdateTaskService.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) 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 7d8f2b4b..ed50066c 100644 --- a/src/main/java/clap/server/application/service/task/UpdateTaskService.java +++ b/src/main/java/clap/server/application/service/task/UpdateTaskService.java @@ -27,7 +27,6 @@ import clap.server.domain.policy.attachment.FilePathPolicy; import clap.server.domain.model.member.Member; import clap.server.domain.policy.task.TaskPolicyConstants; -import clap.server.domain.model.member.Member; import clap.server.domain.model.task.*; import clap.server.domain.policy.attachment.FilePathPolicy; import clap.server.exception.ApplicationException; @@ -87,6 +86,10 @@ public void updateTaskStatus(Long memberId, Long taskId, TaskStatus taskStatus) memberService.findReviewer(memberId); Task task = taskService.findById(taskId); + if(!TASK_UPDATABLE_STATUS.contains(taskStatus)){ + throw new ApplicationException(TaskErrorCode.TASK_STATUS_NOT_ALLOWED); + } + if(!task.getTaskStatus().equals(taskStatus)){ task.updateTaskStatus(taskStatus); Task updateTask = taskService.upsert(task); From 7a9f43f79001dd1118b5d73fd6e76d89c442b359 Mon Sep 17 00:00:00 2001 From: andrew Date: Wed, 5 Feb 2025 01:43:56 +0900 Subject: [PATCH 14/16] =?UTF-8?q?CLAP-257=20Fix=20:=20git=20build=20proble?= =?UTF-8?q?m=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../clap/server/application/service/task/UpdateTaskService.java | 2 -- 1 file changed, 2 deletions(-) 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 ed50066c..f3e7846b 100644 --- a/src/main/java/clap/server/application/service/task/UpdateTaskService.java +++ b/src/main/java/clap/server/application/service/task/UpdateTaskService.java @@ -27,8 +27,6 @@ import clap.server.domain.policy.attachment.FilePathPolicy; import clap.server.domain.model.member.Member; import clap.server.domain.policy.task.TaskPolicyConstants; -import clap.server.domain.model.task.*; -import clap.server.domain.policy.attachment.FilePathPolicy; import clap.server.exception.ApplicationException; import clap.server.exception.code.NotificationErrorCode; import clap.server.exception.code.TaskErrorCode; From 507559fb23457812aec919d065ab4ee4cb79879f Mon Sep 17 00:00:00 2001 From: andrew Date: Wed, 5 Feb 2025 01:47:24 +0900 Subject: [PATCH 15/16] =?UTF-8?q?CLAP-257=20Fix=20:=20git=20build=20proble?= =?UTF-8?q?m=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/application/service/task/UpdateTaskService.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) 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 f3e7846b..589d684c 100644 --- a/src/main/java/clap/server/application/service/task/UpdateTaskService.java +++ b/src/main/java/clap/server/application/service/task/UpdateTaskService.java @@ -23,10 +23,9 @@ import clap.server.application.port.outbound.taskhistory.CommandTaskHistoryPort; import clap.server.application.service.webhook.SendNotificationService; import clap.server.common.annotation.architecture.ApplicationService; +import clap.server.domain.model.member.Member; import clap.server.domain.model.task.*; import clap.server.domain.policy.attachment.FilePathPolicy; -import clap.server.domain.model.member.Member; -import clap.server.domain.policy.task.TaskPolicyConstants; import clap.server.exception.ApplicationException; import clap.server.exception.code.NotificationErrorCode; import clap.server.exception.code.TaskErrorCode; From 6569c9d6e5a6f50db53715064c1709510573850f Mon Sep 17 00:00:00 2001 From: andrew Date: Wed, 5 Feb 2025 02:03:37 +0900 Subject: [PATCH 16/16] =?UTF-8?q?CLAP-257=20Fix=20:=20=EC=88=9C=ED=99=98?= =?UTF-8?q?=20=EC=9D=98=EC=A1=B4=EC=84=B1(circular=20dependency)=20?= =?UTF-8?q?=EB=AC=B8=EC=A0=9C=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../adapter/outbound/api/AgitClient.java | 21 +++++++++++++++++-- .../service/task/UpdateTaskService.java | 10 --------- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/main/java/clap/server/adapter/outbound/api/AgitClient.java b/src/main/java/clap/server/adapter/outbound/api/AgitClient.java index cae469ae..4938aeb1 100644 --- a/src/main/java/clap/server/adapter/outbound/api/AgitClient.java +++ b/src/main/java/clap/server/adapter/outbound/api/AgitClient.java @@ -2,10 +2,16 @@ import clap.server.adapter.outbound.api.dto.PushNotificationTemplate; import clap.server.adapter.outbound.persistense.entity.notification.constant.NotificationType; +import clap.server.application.port.inbound.domain.TaskService; import clap.server.application.port.outbound.webhook.SendAgitPort; import clap.server.application.service.task.UpdateTaskService; import clap.server.common.annotation.architecture.ExternalApiAdapter; import clap.server.domain.model.task.Task; +import clap.server.exception.ApplicationException; +import clap.server.exception.code.NotificationErrorCode; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpEntity; @@ -21,8 +27,9 @@ public class AgitClient implements SendAgitPort { @Value("${webhook.agit.url}") private String AGIT_WEBHOOK_URL; - private final UpdateTaskService updateTaskService; private final AgitTemplateBuilder agitTemplateBuilder; + private final ObjectMapper objectMapper; + private final TaskService taskService; @Override public void sendAgit(PushNotificationTemplate request, Task task) { @@ -33,10 +40,20 @@ public void sendAgit(PushNotificationTemplate request, Task task) { if (request.notificationType() == NotificationType.TASK_REQUESTED) { ResponseEntity responseEntity = restTemplate.exchange( AGIT_WEBHOOK_URL, HttpMethod.POST, entity, String.class); - updateTaskService.updateAgitPostId(responseEntity, task); + updateAgitPostId(responseEntity, task); } else { restTemplate.exchange(AGIT_WEBHOOK_URL, HttpMethod.POST, entity, String.class); } } + + private void updateAgitPostId(ResponseEntity responseEntity, Task task) { + try { + JsonNode jsonNode = objectMapper.readTree(responseEntity.getBody()); + task.updateAgitPostId(jsonNode.get("id").asLong()); + taskService.upsert(task); + } catch (JsonProcessingException e) { + throw new ApplicationException(NotificationErrorCode.AGIT_SEND_FAILED); + } + } } 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 589d684c..3d557645 100644 --- a/src/main/java/clap/server/application/service/task/UpdateTaskService.java +++ b/src/main/java/clap/server/application/service/task/UpdateTaskService.java @@ -124,16 +124,6 @@ public UpdateTaskResponse updateTaskLabel(Long taskId, Long userId, UpdateTaskLa return TaskResponseMapper.toUpdateTaskResponse(updatetask); } - public void updateAgitPostId(ResponseEntity responseEntity, Task task) { - try { - JsonNode jsonNode = objectMapper.readTree(responseEntity.getBody()); - task.updateAgitPostId(jsonNode.get("id").asLong()); - taskService.upsert(task); - } catch (JsonProcessingException e) { - throw new ApplicationException(NotificationErrorCode.AGIT_SEND_FAILED); - } - } - private void updateAttachments(List attachmentIdsToDelete, List files, Task task) { List attachmentsToDelete = validateAndGetAttachments(attachmentIdsToDelete, task); attachmentsToDelete.forEach(Attachment::softDelete);