diff --git a/src/main/java/clap/server/adapter/inbound/web/dto/history/request/CreateCommentRequest.java b/src/main/java/clap/server/adapter/inbound/web/dto/history/request/CreateCommentRequest.java index 7415c9d4..dd48f872 100644 --- a/src/main/java/clap/server/adapter/inbound/web/dto/history/request/CreateCommentRequest.java +++ b/src/main/java/clap/server/adapter/inbound/web/dto/history/request/CreateCommentRequest.java @@ -1,4 +1,4 @@ -package clap.server.adapter.inbound.web.dto.history; +package clap.server.adapter.inbound.web.dto.history.request; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotBlank; diff --git a/src/main/java/clap/server/adapter/inbound/web/dto/history/request/EditCommentRequest.java b/src/main/java/clap/server/adapter/inbound/web/dto/history/request/EditCommentRequest.java index 447f8396..ca1453bc 100644 --- a/src/main/java/clap/server/adapter/inbound/web/dto/history/request/EditCommentRequest.java +++ b/src/main/java/clap/server/adapter/inbound/web/dto/history/request/EditCommentRequest.java @@ -1,4 +1,4 @@ -package clap.server.adapter.inbound.web.dto.history; +package clap.server.adapter.inbound.web.dto.history.request; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotBlank; 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 2e6f3e8e..81a74390 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,7 +1,7 @@ package clap.server.adapter.inbound.web.history; import clap.server.adapter.inbound.security.SecurityUserDetails; -import clap.server.adapter.inbound.web.dto.history.EditCommentRequest; +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; import clap.server.common.annotation.architecture.WebAdapter; 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 42053a84..c473f6fc 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,7 +1,7 @@ package clap.server.adapter.inbound.web.history; import clap.server.adapter.inbound.security.SecurityUserDetails; -import clap.server.adapter.inbound.web.dto.history.CreateCommentRequest; +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; import clap.server.common.annotation.architecture.WebAdapter; 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 7746f58c..6c140118 100644 --- a/src/main/java/clap/server/adapter/outbound/api/AgitClient.java +++ b/src/main/java/clap/server/adapter/outbound/api/AgitClient.java @@ -1,7 +1,6 @@ package clap.server.adapter.outbound.api; -import clap.server.adapter.outbound.api.dto.SendWebhookRequest; -import clap.server.adapter.outbound.persistense.entity.notification.constant.NotificationType; +import clap.server.adapter.outbound.api.dto.PushNotificationTemplate; import clap.server.application.port.outbound.webhook.SendAgitPort; import clap.server.common.annotation.architecture.ExternalApiAdapter; import lombok.RequiredArgsConstructor; @@ -20,34 +19,40 @@ public class AgitClient implements SendAgitPort { private String AGIT_WEBHOOK_URL; @Override - public void sendAgit(SendWebhookRequest request) { - RestTemplate restTemplate = new RestTemplate(); - - String message = null; - if (request.notificationType() == NotificationType.TASK_REQUESTED) { - message = request.taskName() + " 작업이 요청되었습니다."; - } - else if (request.notificationType() == NotificationType.COMMENT) { - message = request.taskName() + " 작업에 " + request.commenterName() + "님이 댓글을 남기셨습니다."; - } - else if (request.notificationType() == NotificationType.PROCESSOR_ASSIGNED) { - message = request.taskName() + " 작업에 담당자(" + request.message() + ")가 배정되었습니다."; - } - else if (request.notificationType() == NotificationType.PROCESSOR_CHANGED) { - message = request.taskName() + " 작업의 담당자가 " + request.message() + "로 변경되었습니다."; - } - else { - message = request.taskName() + " 작업의 상태가 " + request.message() + "로 변경되었습니다"; - } - - String payload = "{\"text\":\"" + message + "\"}"; + public void sendAgit(PushNotificationTemplate request) { HttpHeaders headers = new HttpHeaders(); headers.add("Content-Type", "application/json"); + RestTemplate restTemplate = new RestTemplate(); + String taskUrl = "https://www.naver.com"; //Todo 작업 상세페이지 url 추가 + + String message = 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 + ")"; + 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); - // Post 요청 restTemplate.exchange(AGIT_WEBHOOK_URL, HttpMethod.POST, entity, String.class); } } diff --git a/src/main/java/clap/server/adapter/outbound/api/EmailClient.java b/src/main/java/clap/server/adapter/outbound/api/EmailClient.java index 2ceea26e..1a93445f 100644 --- a/src/main/java/clap/server/adapter/outbound/api/EmailClient.java +++ b/src/main/java/clap/server/adapter/outbound/api/EmailClient.java @@ -1,7 +1,7 @@ package clap.server.adapter.outbound.api; import clap.server.adapter.outbound.api.dto.EmailTemplate; -import clap.server.adapter.outbound.api.dto.SendWebhookRequest; +import clap.server.adapter.outbound.api.dto.PushNotificationTemplate; import clap.server.application.port.outbound.webhook.SendEmailPort; import clap.server.common.annotation.architecture.ExternalApiAdapter; import clap.server.exception.AdapterException; @@ -19,7 +19,7 @@ public class EmailClient implements SendEmailPort { private final JavaMailSender mailSender; @Override - public void sendWebhookEmail(SendWebhookRequest request) { + public void sendWebhookEmail(PushNotificationTemplate request) { try { MimeMessage mimeMessage = mailSender.createMimeMessage(); MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true, "UTF-8"); diff --git a/src/main/java/clap/server/adapter/outbound/api/EmailTemplateBuilder.java b/src/main/java/clap/server/adapter/outbound/api/EmailTemplateBuilder.java index be8c8744..32451b2f 100644 --- a/src/main/java/clap/server/adapter/outbound/api/EmailTemplateBuilder.java +++ b/src/main/java/clap/server/adapter/outbound/api/EmailTemplateBuilder.java @@ -1,7 +1,7 @@ package clap.server.adapter.outbound.api; import clap.server.adapter.outbound.api.dto.EmailTemplate; -import clap.server.adapter.outbound.api.dto.SendWebhookRequest; +import clap.server.adapter.outbound.api.dto.PushNotificationTemplate; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; import org.thymeleaf.context.Context; @@ -10,39 +10,46 @@ @Component @RequiredArgsConstructor public class EmailTemplateBuilder { + private final SpringTemplateEngine templateEngine; - public EmailTemplate createWebhookTemplate(SendWebhookRequest request) { + public EmailTemplate createWebhookTemplate(PushNotificationTemplate request) { Context context = new Context(); String templateName = ""; String subject = ""; + String taskDetailUrl = "https://www.naver.com"; //ToDo task 상세 조회페이지 url 추가 switch (request.notificationType()) { case TASK_REQUESTED: templateName = "task-request"; subject = "[TaskFlow 알림] 신규 작업이 요청되었습니다."; + context.setVariable("taskDetailUrl", taskDetailUrl); context.setVariable("receiverName", request.senderName()); context.setVariable("title", request.taskName()); break; case STATUS_SWITCHED: templateName = "status-switched"; subject = "[TaskFlow 알림] 작업 상태가 변경되었습니다."; + context.setVariable("taskDetailUrl", taskDetailUrl); context.setVariable("receiverName", request.senderName()); context.setVariable("title", request.taskName()); break; case PROCESSOR_CHANGED: templateName = "processor-changed"; subject = "[TaskFlow 알림] 작업 담당자가 변경되었습니다."; + context.setVariable("taskDetailUrl", taskDetailUrl); context.setVariable("processorName", request.message()); context.setVariable("title", request.taskName()); break; case PROCESSOR_ASSIGNED: templateName = "processor-assigned"; subject = "[TaskFlow 알림] 작업 담당자가 지정되었습니다."; + context.setVariable("taskDetailUrl", taskDetailUrl); context.setVariable("processorName", request.message()); context.setVariable("title", request.taskName()); break; case COMMENT: subject = "[TaskFlow 알림] 댓글이 작성되었습니다."; + context.setVariable("taskDetailUrl", taskDetailUrl); context.setVariable("comment", request.message()); context.setVariable("title", request.taskName()); break; diff --git a/src/main/java/clap/server/adapter/outbound/api/KakaoWorkBlockBuilder.java b/src/main/java/clap/server/adapter/outbound/api/KakaoWorkBlockBuilder.java index cb3aeeb4..b3fb07f6 100644 --- a/src/main/java/clap/server/adapter/outbound/api/KakaoWorkBlockBuilder.java +++ b/src/main/java/clap/server/adapter/outbound/api/KakaoWorkBlockBuilder.java @@ -1,7 +1,6 @@ package clap.server.adapter.outbound.api; -import clap.server.adapter.outbound.api.dto.SendWebhookRequest; -import clap.server.adapter.outbound.persistense.entity.notification.constant.NotificationType; +import clap.server.adapter.outbound.api.dto.PushNotificationTemplate; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.RequiredArgsConstructor; @@ -15,36 +14,25 @@ public class KakaoWorkBlockBuilder { private final ObjectMapper objectMapper; - public String makeObjectBlock(SendWebhookRequest request){ - String payload; - if (request.notificationType() == NotificationType.TASK_REQUESTED) { - payload = makeTaskRequestBlock(request); - } - else if (request.notificationType() == NotificationType.PROCESSOR_ASSIGNED) { - payload = makeNewProcessorBlock(request); - } - else if (request.notificationType() == NotificationType.PROCESSOR_CHANGED) { - payload = makeProcessorChangeBlock(request); - } - else if (request.notificationType() == NotificationType.STATUS_SWITCHED) { - payload = makeTaskStatusBlock(request); - } - else { - payload = makeCommentBlock(request); - } - return payload; + public String makeObjectBlock(PushNotificationTemplate request){ + String taskDetailUrl = "https://www.naver.com"; + return switch (request.notificationType()) { + case TASK_REQUESTED -> makeTaskRequestBlock(request, taskDetailUrl); + case STATUS_SWITCHED -> makeTaskStatusBlock(request, taskDetailUrl); + case PROCESSOR_CHANGED -> makeProcessorChangeBlock(request, taskDetailUrl); + case PROCESSOR_ASSIGNED -> makeNewProcessorBlock(request, taskDetailUrl); + case COMMENT -> makeCommentBlock(request, taskDetailUrl); + default -> null; + }; } - private String makeTaskRequestBlock(SendWebhookRequest request) { - // Blocks 데이터 생성 + private String makeTaskRequestBlock(PushNotificationTemplate request, String taskDetailUrl) { Object[] blocks = new Object[]{ - // Header 블록 Map.of( "type", "header", "text", "TaskFlow 작업 요청 알림", "style", "blue" ), - // Text 블록 1 Map.of( "type", "text", "text", "TaskFlow 작업 요청 알림", @@ -56,7 +44,6 @@ private String makeTaskRequestBlock(SendWebhookRequest request) { ) } ), - // Text 블록 2: 제목 변수 사용 Map.of( "type", "text", "text", "TaskFlow 작업 요청 알림", @@ -68,7 +55,6 @@ private String makeTaskRequestBlock(SendWebhookRequest request) { ) } ), - // Text 블록 3: 요청자 변수 사용 Map.of( "type", "text", "text", "TaskFlow 작업 요청 알림", @@ -80,7 +66,6 @@ private String makeTaskRequestBlock(SendWebhookRequest request) { ) } ), - // Button 블록 Map.of( "type", "button", "text", "확인하기", @@ -88,7 +73,7 @@ private String makeTaskRequestBlock(SendWebhookRequest request) { "action", Map.of( "type", "open_system_browser", "name", "button1", - "value", "http://example.com/details/999" + "value", taskDetailUrl ) ) }; @@ -97,7 +82,7 @@ private String makeTaskRequestBlock(SendWebhookRequest request) { try { payload = "{" + "\"email\":\"" + request.email() + "\"," + - "\"text\": \"신규 작업 요청 알림\"," + // fallback 메시지 + "\"text\": \"신규 작업 요청 알림\"," + "\"blocks\":" + objectMapper.writeValueAsString(blocks) + "}"; } catch (JsonProcessingException e) { @@ -107,7 +92,7 @@ private String makeTaskRequestBlock(SendWebhookRequest request) { return payload; } - private String makeNewProcessorBlock(SendWebhookRequest request) { + private String makeNewProcessorBlock(PushNotificationTemplate request, String taskDetailUrl) { Object[] blocks = new Object[]{ Map.of( "type", "header", @@ -154,7 +139,7 @@ private String makeNewProcessorBlock(SendWebhookRequest request) { "action", Map.of( "type", "open_system_browser", "name", "button1", - "value", "http://example.com/details/999" + "value", taskDetailUrl ) ) }; @@ -163,7 +148,7 @@ private String makeNewProcessorBlock(SendWebhookRequest request) { try { payload = "{" + "\"email\":\"" + request.email() + "\"," + - "\"text\":\"작업 담당자 선정 알림\"," + // fallback 메시지 + "\"text\":\"작업 담당자 선정 알림\"," + "\"blocks\":" + objectMapper.writeValueAsString(blocks) + "}"; } catch (JsonProcessingException e) { @@ -173,7 +158,7 @@ private String makeNewProcessorBlock(SendWebhookRequest request) { return payload; } - private String makeProcessorChangeBlock(SendWebhookRequest request) { + private String makeProcessorChangeBlock(PushNotificationTemplate request, String taskDetailUrl) { Object[] blocks = new Object[]{ Map.of( "type", "header", @@ -220,7 +205,7 @@ private String makeProcessorChangeBlock(SendWebhookRequest request) { "action", Map.of( "type", "open_system_browser", "name", "button1", - "value", "http://example.com/details/999" + "value", taskDetailUrl ) ) }; @@ -229,7 +214,7 @@ private String makeProcessorChangeBlock(SendWebhookRequest request) { try { payload = "{" + "\"email\":\"" + request.email() + "\"," + - "\"text\":\"작업 담당자 변경 알림\"," + // fallback 메시지 + "\"text\":\"작업 담당자 변경 알림\"," + "\"blocks\":" + objectMapper.writeValueAsString(blocks) + "}"; } catch (JsonProcessingException e) { @@ -240,7 +225,7 @@ private String makeProcessorChangeBlock(SendWebhookRequest request) { return payload; } - private String makeCommentBlock(SendWebhookRequest request) { + private String makeCommentBlock(PushNotificationTemplate request, String taskDetailUrl) { Object[] blocks = new Object[]{ Map.of( "type", "header", @@ -298,7 +283,7 @@ private String makeCommentBlock(SendWebhookRequest request) { "action", Map.of( "type", "open_system_browser", "name", "button1", - "value", "http://example.com/details/999" + "value", taskDetailUrl ) ) }; @@ -307,7 +292,7 @@ private String makeCommentBlock(SendWebhookRequest request) { try { payload = "{" + "\"email\":\"" + request.email() + "\"," + - "\"text\":\"댓글 알림\"," + // fallback 메시지 + "\"text\":\"댓글 알림\"," + "\"blocks\":" + objectMapper.writeValueAsString(blocks) + "}"; } catch (JsonProcessingException e) { @@ -317,7 +302,7 @@ private String makeCommentBlock(SendWebhookRequest request) { return payload; } - private String makeTaskStatusBlock(SendWebhookRequest request) { + private String makeTaskStatusBlock(PushNotificationTemplate request, String taskDetailUrl) { Object[] blocks = new Object[]{ Map.of( "type", "header", @@ -364,7 +349,7 @@ private String makeTaskStatusBlock(SendWebhookRequest request) { "action", Map.of( "type", "open_system_browser", "name", "button1", - "value", "http://example.com/details/999" + "value", taskDetailUrl ) ) }; @@ -373,7 +358,7 @@ private String makeTaskStatusBlock(SendWebhookRequest request) { try { payload = "{" + "\"email\":\"" + request.email() + "\"," + - "\"text\":\"작업 상태 변경 알림\"," + // fallback 메시지 + "\"text\":\"작업 상태 변경 알림\"," + "\"blocks\":" + objectMapper.writeValueAsString(blocks) + "}"; } catch (JsonProcessingException e) { diff --git a/src/main/java/clap/server/adapter/outbound/api/KakaoWorkClient.java b/src/main/java/clap/server/adapter/outbound/api/KakaoWorkClient.java index 415b3be8..007b9b82 100644 --- a/src/main/java/clap/server/adapter/outbound/api/KakaoWorkClient.java +++ b/src/main/java/clap/server/adapter/outbound/api/KakaoWorkClient.java @@ -1,6 +1,6 @@ package clap.server.adapter.outbound.api; -import clap.server.adapter.outbound.api.dto.SendWebhookRequest; +import clap.server.adapter.outbound.api.dto.PushNotificationTemplate; import clap.server.application.port.outbound.webhook.SendKaKaoWorkPort; import clap.server.common.annotation.architecture.ExternalApiAdapter; import clap.server.exception.AdapterException; @@ -25,7 +25,7 @@ public class KakaoWorkClient implements SendKaKaoWorkPort { private final KakaoWorkBlockBuilder kakaoWorkBlockBuilder; @Override - public void sendKakaoWork(SendWebhookRequest request) { + public void sendKakaoWork(PushNotificationTemplate request) { RestTemplate restTemplate = new RestTemplate(); // Payload 생성 diff --git a/src/main/java/clap/server/adapter/outbound/api/dto/SendWebhookRequest.java b/src/main/java/clap/server/adapter/outbound/api/dto/PushNotificationTemplate.java similarity index 83% rename from src/main/java/clap/server/adapter/outbound/api/dto/SendWebhookRequest.java rename to src/main/java/clap/server/adapter/outbound/api/dto/PushNotificationTemplate.java index 81bfe62c..8ed8d8ff 100644 --- a/src/main/java/clap/server/adapter/outbound/api/dto/SendWebhookRequest.java +++ b/src/main/java/clap/server/adapter/outbound/api/dto/PushNotificationTemplate.java @@ -2,8 +2,9 @@ import clap.server.adapter.outbound.persistense.entity.notification.constant.NotificationType; -public record SendWebhookRequest( +public record PushNotificationTemplate( + Long taskId, String email, NotificationType notificationType, String taskName, diff --git a/src/main/java/clap/server/application/port/inbound/history/EditCommentUsecase.java b/src/main/java/clap/server/application/port/inbound/history/EditCommentUsecase.java index ff5f6fa1..4de7eb1b 100644 --- a/src/main/java/clap/server/application/port/inbound/history/EditCommentUsecase.java +++ b/src/main/java/clap/server/application/port/inbound/history/EditCommentUsecase.java @@ -1,6 +1,6 @@ package clap.server.application.port.inbound.history; -import clap.server.adapter.inbound.web.dto.history.EditCommentRequest; +import clap.server.adapter.inbound.web.dto.history.request.EditCommentRequest; public interface EditCommentUsecase { diff --git a/src/main/java/clap/server/application/port/inbound/history/SaveCommentUsecase.java b/src/main/java/clap/server/application/port/inbound/history/SaveCommentUsecase.java index 1cfa861b..6d4cc7de 100644 --- a/src/main/java/clap/server/application/port/inbound/history/SaveCommentUsecase.java +++ b/src/main/java/clap/server/application/port/inbound/history/SaveCommentUsecase.java @@ -1,6 +1,6 @@ package clap.server.application.port.inbound.history; -import clap.server.adapter.inbound.web.dto.history.CreateCommentRequest; +import clap.server.adapter.inbound.web.dto.history.request.CreateCommentRequest; public interface SaveCommentUsecase { 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 c9d39669..bcb60810 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,7 @@ package clap.server.application.port.outbound.webhook; -import clap.server.adapter.outbound.api.dto.SendWebhookRequest; +import clap.server.adapter.outbound.api.dto.PushNotificationTemplate; public interface SendAgitPort { - void sendAgit(SendWebhookRequest request); + void sendAgit(PushNotificationTemplate request); } diff --git a/src/main/java/clap/server/application/port/outbound/webhook/SendEmailPort.java b/src/main/java/clap/server/application/port/outbound/webhook/SendEmailPort.java index e9f9ce26..33a99aee 100644 --- a/src/main/java/clap/server/application/port/outbound/webhook/SendEmailPort.java +++ b/src/main/java/clap/server/application/port/outbound/webhook/SendEmailPort.java @@ -1,10 +1,10 @@ package clap.server.application.port.outbound.webhook; -import clap.server.adapter.outbound.api.dto.SendWebhookRequest; +import clap.server.adapter.outbound.api.dto.PushNotificationTemplate; public interface SendEmailPort { - void sendWebhookEmail(SendWebhookRequest request); + void sendWebhookEmail(PushNotificationTemplate request); void sendInvitationEmail(String memberEmail, String receiverName, String initialPassword); diff --git a/src/main/java/clap/server/application/port/outbound/webhook/SendKaKaoWorkPort.java b/src/main/java/clap/server/application/port/outbound/webhook/SendKaKaoWorkPort.java index 077399b6..658002a7 100644 --- a/src/main/java/clap/server/application/port/outbound/webhook/SendKaKaoWorkPort.java +++ b/src/main/java/clap/server/application/port/outbound/webhook/SendKaKaoWorkPort.java @@ -1,8 +1,8 @@ package clap.server.application.port.outbound.webhook; -import clap.server.adapter.outbound.api.dto.SendWebhookRequest; +import clap.server.adapter.outbound.api.dto.PushNotificationTemplate; public interface SendKaKaoWorkPort { - void sendKakaoWork(SendWebhookRequest request); + void sendKakaoWork(PushNotificationTemplate request); } 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 d82ec5cb..431e8169 100644 --- a/src/main/java/clap/server/application/service/history/CommandCommentService.java +++ b/src/main/java/clap/server/application/service/history/CommandCommentService.java @@ -1,6 +1,6 @@ package clap.server.application.service.history; -import clap.server.adapter.inbound.web.dto.history.EditCommentRequest; +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; import clap.server.application.port.inbound.domain.MemberService; 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 a6e138f7..bf9ec90e 100644 --- a/src/main/java/clap/server/application/service/history/PostCommentService.java +++ b/src/main/java/clap/server/application/service/history/PostCommentService.java @@ -1,6 +1,6 @@ package clap.server.application.service.history; -import clap.server.adapter.inbound.web.dto.history.CreateCommentRequest; +import clap.server.adapter.inbound.web.dto.history.request.CreateCommentRequest; import clap.server.adapter.outbound.persistense.entity.member.constant.MemberRole; import clap.server.adapter.outbound.persistense.entity.notification.constant.NotificationType; import clap.server.adapter.outbound.persistense.entity.task.constant.TaskHistoryType; @@ -89,6 +89,8 @@ private void saveAttachment(MultipartFile file, Task task, Comment comment) { 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); } } diff --git a/src/main/java/clap/server/application/service/notification/CreateNotificationService.java b/src/main/java/clap/server/application/service/notification/CreateNotificationService.java deleted file mode 100644 index a99af8bc..00000000 --- a/src/main/java/clap/server/application/service/notification/CreateNotificationService.java +++ /dev/null @@ -1,20 +0,0 @@ -package clap.server.application.service.notification; - -import clap.server.application.port.outbound.notification.CommandNotificationPort; -import clap.server.common.annotation.architecture.ApplicationService; -import clap.server.domain.model.notification.Notification; -import lombok.RequiredArgsConstructor; -import org.springframework.transaction.annotation.Transactional; - -@ApplicationService -@RequiredArgsConstructor -public class CreateNotificationService{ - - private final CommandNotificationPort commandNotificationPort; - - @Transactional - public void createNotification(Notification request) { - - commandNotificationPort.save(request); - } -} 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 eb6f272a..efeff07e 100644 --- a/src/main/java/clap/server/application/service/task/ApprovalTaskService.java +++ b/src/main/java/clap/server/application/service/task/ApprovalTaskService.java @@ -73,6 +73,8 @@ private void publishNotification(List receivers, Task task){ sendNotificationService.sendPushNotification(receiver, NotificationType.PROCESSOR_ASSIGNED, task, task.getProcessor().getNickname(), null); }); + sendNotificationService.sendAgitNotification(NotificationType.PROCESSOR_CHANGED, + task, task.getProcessor().getNickname(), null); } } diff --git a/src/main/java/clap/server/application/service/task/CreateTaskService.java b/src/main/java/clap/server/application/service/task/CreateTaskService.java index 8f2cd5bd..b9383966 100644 --- a/src/main/java/clap/server/application/service/task/CreateTaskService.java +++ b/src/main/java/clap/server/application/service/task/CreateTaskService.java @@ -64,5 +64,7 @@ private void publishNotification(Task task) { reviewers.forEach(reviewer -> {sendNotificationService.sendPushNotification(reviewer, NotificationType.TASK_REQUESTED, task, null, null);}); + sendNotificationService.sendAgitNotification(NotificationType.TASK_REQUESTED, + task, null, null); } } \ 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 829bbf35..fe429e6e 100644 --- a/src/main/java/clap/server/application/service/task/UpdateTaskService.java +++ b/src/main/java/clap/server/application/service/task/UpdateTaskService.java @@ -74,6 +74,7 @@ public UpdateTaskResponse updateTask(Long requesterId, Long taskId, UpdateTaskRe @Transactional public UpdateTaskResponse updateTaskState(Long memberId, Long taskId, UpdateTaskStatusRequest updateTaskStatusRequest) { memberService.findActiveMember(memberId); + memberService.findReviewer(memberId); Task task = taskService.findById(taskId); task.updateTaskStatus(updateTaskStatusRequest.taskStatus()); Task updateTask = commandTaskPort.save(task); @@ -85,6 +86,7 @@ public UpdateTaskResponse updateTaskState(Long memberId, Long taskId, UpdateTask @Transactional @Override public UpdateTaskResponse updateTaskProcessor(Long taskId, Long userId, UpdateTaskProcessorRequest request) { + memberService.findActiveMember(userId); memberService.findReviewer(userId); Member processor = memberService.findById(request.processorId()); @@ -99,7 +101,8 @@ public UpdateTaskResponse updateTaskProcessor(Long taskId, Long userId, UpdateTa @Transactional @Override public UpdateTaskResponse updateTaskLabel(Long taskId, Long userId, UpdateTaskLabelRequest request) { - Member reviewer = memberService.findReviewer(userId); + memberService.findActiveMember(userId); + memberService.findReviewer(userId); Task task = taskService.findById(taskId); Label label = labelService.findById(request.labelId()); @@ -133,5 +136,7 @@ private void publishNotification(Task task, NotificationType notificationType, S sendNotificationService.sendPushNotification(receiver, 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 5ae628ce..db2533fa 100644 --- a/src/main/java/clap/server/application/service/webhook/SendAgitService.java +++ b/src/main/java/clap/server/application/service/webhook/SendAgitService.java @@ -1,6 +1,6 @@ package clap.server.application.service.webhook; -import clap.server.adapter.outbound.api.dto.SendWebhookRequest; +import clap.server.adapter.outbound.api.dto.PushNotificationTemplate; import clap.server.application.port.outbound.webhook.SendAgitPort; import clap.server.common.annotation.architecture.ApplicationService; import lombok.RequiredArgsConstructor; @@ -11,7 +11,7 @@ public class SendAgitService { private final SendAgitPort agitPort; - public void sendAgit(SendWebhookRequest request) { + public void sendAgit(PushNotificationTemplate request) { agitPort.sendAgit(request); } } diff --git a/src/main/java/clap/server/application/service/webhook/SendEmailService.java b/src/main/java/clap/server/application/service/webhook/SendEmailService.java index 4f4b1035..b7a0f645 100644 --- a/src/main/java/clap/server/application/service/webhook/SendEmailService.java +++ b/src/main/java/clap/server/application/service/webhook/SendEmailService.java @@ -1,6 +1,6 @@ package clap.server.application.service.webhook; -import clap.server.adapter.outbound.api.dto.SendWebhookRequest; +import clap.server.adapter.outbound.api.dto.PushNotificationTemplate; import clap.server.application.port.outbound.webhook.SendEmailPort; import clap.server.common.annotation.architecture.ApplicationService; import lombok.RequiredArgsConstructor; @@ -11,7 +11,7 @@ public class SendEmailService { private final SendEmailPort port; - public void sendEmail(SendWebhookRequest request) { + public void sendEmail(PushNotificationTemplate request) { port.sendWebhookEmail(request); } } diff --git a/src/main/java/clap/server/application/service/webhook/SendKaKaoWorkService.java b/src/main/java/clap/server/application/service/webhook/SendKaKaoWorkService.java index 487026ba..6a193093 100644 --- a/src/main/java/clap/server/application/service/webhook/SendKaKaoWorkService.java +++ b/src/main/java/clap/server/application/service/webhook/SendKaKaoWorkService.java @@ -1,6 +1,6 @@ package clap.server.application.service.webhook; -import clap.server.adapter.outbound.api.dto.SendWebhookRequest; +import clap.server.adapter.outbound.api.dto.PushNotificationTemplate; import clap.server.application.port.outbound.webhook.SendKaKaoWorkPort; import clap.server.common.annotation.architecture.ApplicationService; import lombok.RequiredArgsConstructor; @@ -11,7 +11,7 @@ public class SendKaKaoWorkService { private final SendKaKaoWorkPort sendKaKaoWorkPort; - public void sendKaKaoWork(SendWebhookRequest request) { + public void sendKaKaoWork(PushNotificationTemplate request) { sendKaKaoWorkPort.sendKakaoWork(request); } } 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 926b9ca0..46322e7d 100644 --- a/src/main/java/clap/server/application/service/webhook/SendNotificationService.java +++ b/src/main/java/clap/server/application/service/webhook/SendNotificationService.java @@ -1,7 +1,7 @@ package clap.server.application.service.webhook; import clap.server.adapter.inbound.web.dto.notification.request.SseRequest; -import clap.server.adapter.outbound.api.dto.SendWebhookRequest; +import clap.server.adapter.outbound.api.dto.PushNotificationTemplate; import clap.server.adapter.outbound.persistense.entity.notification.constant.NotificationType; import clap.server.application.port.outbound.notification.CommandNotificationPort; import clap.server.common.annotation.architecture.ApplicationService; @@ -12,6 +12,7 @@ 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; @@ -24,6 +25,7 @@ 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, @@ -41,8 +43,8 @@ public void sendPushNotification(Member receiver, NotificationType notificationT message ); - SendWebhookRequest sendWebhookRequest = new SendWebhookRequest( - email, notificationType, taskTitle, requesterNickname, message, commenterName + PushNotificationTemplate pushNotificationTemplate = new PushNotificationTemplate( + task.getTaskId(), email, notificationType, taskTitle, requesterNickname, message, commenterName ); CompletableFuture saveNotification = CompletableFuture.runAsync(() -> { @@ -55,23 +57,34 @@ public void sendPushNotification(Member receiver, NotificationType notificationT CompletableFuture sendEmailFuture = CompletableFuture.runAsync(() -> { if (receiver.getEmailNotificationEnabled()) { - sendEmailService.sendEmail(sendWebhookRequest); - } - }); - - CompletableFuture sendAgitFuture = CompletableFuture.runAsync(() -> { - if (receiver.getAgitNotificationEnabled()) { - sendAgitService.sendAgit(sendWebhookRequest); + sendEmailService.sendEmail(pushNotificationTemplate); } }); CompletableFuture sendKakaoWorkFuture = CompletableFuture.runAsync(() -> { if (receiver.getKakaoworkNotificationEnabled()) { - sendKaKaoWorkService.sendKaKaoWork(sendWebhookRequest); + sendKaKaoWorkService.sendKaKaoWork(pushNotificationTemplate); } }); - CompletableFuture allOf = CompletableFuture.allOf(saveNotification, sendSseFuture, sendEmailFuture, sendKakaoWorkFuture, sendAgitFuture); + CompletableFuture allOf = CompletableFuture.allOf(saveNotification, sendSseFuture, + sendEmailFuture, sendKakaoWorkFuture); allOf.join(); } + + @Async("notificationExecutor") + public void sendAgitNotification(NotificationType notificationType, + Task task, String message, String commenterName) { + PushNotificationTemplate pushNotificationTemplate = new PushNotificationTemplate( + task.getTaskId(), + null, + notificationType, + task.getTitle(), + task.getRequester().getNickname(), + message, + commenterName + ); + + sendAgitService.sendAgit(pushNotificationTemplate); + } } diff --git a/src/main/java/clap/server/application/service/webhook/SendPushNotificationService.java b/src/main/java/clap/server/application/service/webhook/SendPushNotificationService.java deleted file mode 100644 index 449a1079..00000000 --- a/src/main/java/clap/server/application/service/webhook/SendPushNotificationService.java +++ /dev/null @@ -1,77 +0,0 @@ -package clap.server.application.service.webhook; - -import clap.server.adapter.inbound.web.dto.notification.request.SseRequest; -import clap.server.adapter.outbound.api.dto.SendWebhookRequest; -import clap.server.adapter.outbound.persistense.entity.notification.constant.NotificationType; -import clap.server.application.port.outbound.notification.CommandNotificationPort; -import clap.server.common.annotation.architecture.ApplicationService; -import clap.server.domain.model.member.Member; -import clap.server.domain.model.notification.Notification; -import clap.server.domain.model.task.Task; -import lombok.RequiredArgsConstructor; -import org.springframework.scheduling.annotation.Async; - -import java.util.concurrent.CompletableFuture; - -import static clap.server.domain.model.notification.Notification.createTaskNotification; - -@ApplicationService -@RequiredArgsConstructor -public class SendPushNotificationService { - - private final SendSseService sendSseService; - private final SendAgitService sendAgitService; - private final SendEmailService sendEmailService; - private final SendKaKaoWorkService sendKaKaoWorkService; - private final CommandNotificationPort commandNotificationPort; - - @Async("notificationExecutor") - public void sendPushNotification(Member receiver, NotificationType notificationType, - Task task, String message, String commenterName) { - String email = receiver.getMemberInfo().getEmail(); - String taskTitle = task.getTitle(); - String requesterNickname = task.getRequester().getNickname(); - - Notification notification = createTaskNotification(task, receiver, notificationType); - - SseRequest sseRequest = new SseRequest( - task.getTitle(), - notificationType, - receiver.getMemberId(), - message - ); - - SendWebhookRequest sendWebhookRequest = new SendWebhookRequest( - email, notificationType, taskTitle, requesterNickname, message, commenterName - ); - - CompletableFuture saveNotification = CompletableFuture.runAsync(() -> { - commandNotificationPort.save(notification); - }); - - CompletableFuture sendSseFuture = CompletableFuture.runAsync(() -> { - sendSseService.send(sseRequest); - }); - - CompletableFuture sendEmailFuture = CompletableFuture.runAsync(() -> { - if (receiver.getEmailNotificationEnabled()) { - sendEmailService.sendEmail(sendWebhookRequest); - } - }); - - CompletableFuture sendAgitFuture = CompletableFuture.runAsync(() -> { - if (receiver.getAgitNotificationEnabled()) { - sendAgitService.sendAgit(sendWebhookRequest); - } - }); - - CompletableFuture sendKakaoWorkFuture = CompletableFuture.runAsync(() -> { - if (receiver.getKakaoworkNotificationEnabled()) { - sendKaKaoWorkService.sendKaKaoWork(sendWebhookRequest); - } - }); - - CompletableFuture allOf = CompletableFuture.allOf(saveNotification, sendSseFuture, sendEmailFuture, sendKakaoWorkFuture, sendAgitFuture); - allOf.join(); - } -} diff --git a/src/main/resources/templates/comment.html b/src/main/resources/templates/comment.html index 08f63efc..bce6add4 100644 --- a/src/main/resources/templates/comment.html +++ b/src/main/resources/templates/comment.html @@ -74,7 +74,7 @@
  • 내용: