diff --git a/src/main/java/clap/server/adapter/outbound/api/email/EmailTemplateBuilder.java b/src/main/java/clap/server/adapter/outbound/api/email/EmailTemplateBuilder.java index bfdd1786..8239845f 100644 --- a/src/main/java/clap/server/adapter/outbound/api/email/EmailTemplateBuilder.java +++ b/src/main/java/clap/server/adapter/outbound/api/email/EmailTemplateBuilder.java @@ -24,7 +24,7 @@ public EmailTemplate createWebhookTemplate(PushNotificationTemplate request, Str switch (request.notificationType()) { case TASK_REQUESTED: templateName = "task-request"; - subject = "[TaskFlow] 신규 작업 "+ request.taskName()+ "이 요청되었습니다."; + subject = "[TaskFlow] 신규 작업 "+ request.taskName()+ "가 요청되었습니다."; context.setVariable("taskDetailUrl", taskDetailUrl); context.setVariable("receiverName", request.senderName()); context.setVariable("title", request.taskName()); diff --git a/src/main/java/clap/server/adapter/outbound/persistense/NotificationPersistenceAdapter.java b/src/main/java/clap/server/adapter/outbound/persistense/NotificationPersistenceAdapter.java index cae89e2e..1d215d31 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/NotificationPersistenceAdapter.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/NotificationPersistenceAdapter.java @@ -42,6 +42,13 @@ public List findNotificationsByMemberId(final Long memberId) { .collect(Collectors.toList()); } + @Override + public List findNotificationsByTaskId(Long taskId) { + return notificationRepository.findByTask_TaskId(taskId) + .stream().map(notificationPersistenceMapper::toDomain) + .collect(Collectors.toList()); + } + @Override public Integer countNotification(final Long memberId) { return notificationRepository.countByIsReadFalseAndReceiver_MemberId(memberId); @@ -51,4 +58,9 @@ public Integer countNotification(final Long memberId) { public void save(final Notification notification) { notificationRepository.save(notificationPersistenceMapper.toEntity(notification)); } + + @Override + public void delete(Notification notification) { + notificationRepository.delete(notificationPersistenceMapper.toEntity(notification)); + } } diff --git a/src/main/java/clap/server/adapter/outbound/persistense/repository/notification/NotificationRepository.java b/src/main/java/clap/server/adapter/outbound/persistense/repository/notification/NotificationRepository.java index 0a8b86e1..b871a0cf 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/repository/notification/NotificationRepository.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/repository/notification/NotificationRepository.java @@ -16,15 +16,18 @@ public interface NotificationRepository extends JpaRepository { @Query("SELECT n FROM NotificationEntity n " + - "JOIN FETCH n.task t " + - "JOIN FETCH n.receiver r " + "WHERE n.receiver.memberId = :receiverId " + - "AND t.isDeleted = false " + + "AND n.task.isDeleted = false " + "ORDER BY n.createdAt DESC") Slice findAllByReceiver_MemberIdOrderByCreatedAtDesc( @Param("receiverId") Long receiverId, Pageable pageable); + @Query("SELECT n FROM NotificationEntity n " + + "WHERE n.receiver.memberId = :receiverId " + + "AND n.task.isDeleted = false") List findAllByReceiver_MemberId(Long memberId); + List findByTask_TaskId(Long taskId); + Integer countByIsReadFalseAndReceiver_MemberId(Long memberId); } \ No newline at end of file diff --git a/src/main/java/clap/server/application/port/outbound/notification/CommandNotificationPort.java b/src/main/java/clap/server/application/port/outbound/notification/CommandNotificationPort.java index 7761d367..655c6295 100644 --- a/src/main/java/clap/server/application/port/outbound/notification/CommandNotificationPort.java +++ b/src/main/java/clap/server/application/port/outbound/notification/CommandNotificationPort.java @@ -5,4 +5,6 @@ public interface CommandNotificationPort { void save(Notification notification); + + void delete(Notification notification); } \ No newline at end of file diff --git a/src/main/java/clap/server/application/port/outbound/notification/LoadNotificationPort.java b/src/main/java/clap/server/application/port/outbound/notification/LoadNotificationPort.java index b740fdc8..663c707d 100644 --- a/src/main/java/clap/server/application/port/outbound/notification/LoadNotificationPort.java +++ b/src/main/java/clap/server/application/port/outbound/notification/LoadNotificationPort.java @@ -16,5 +16,7 @@ public interface LoadNotificationPort { List findNotificationsByMemberId(Long memberId); + List findNotificationsByTaskId(Long taskId); + Integer countNotification(Long memberId); } \ No newline at end of file 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 0050e836..7912fc7b 100644 --- a/src/main/java/clap/server/application/service/history/PostCommentService.java +++ b/src/main/java/clap/server/application/service/history/PostCommentService.java @@ -58,12 +58,11 @@ public void save(Long memberId, Long taskId, CreateCommentRequest request) { Member processor = task.getProcessor(); Member requester = task.getRequester(); - if (Objects.equals(member.getMemberId(), requester.getMemberId())) { - publishNotification(processor, task, request.content(), member.getNickname()); - } else { - publishNotification(requester, task, request.content(), member.getNickname()); - } + Member receiver = Objects.equals(member.getMemberId(), requester.getMemberId()) ? processor : requester; + if (receiver != null) { + publishNotification(receiver, task, request.content(), member.getNickname()); + } } @Transactional @@ -85,10 +84,11 @@ public void saveCommentAttachment(Long memberId, Long taskId, MultipartFile file Member processor = task.getProcessor(); Member requester = task.getRequester(); - if (member.getMemberInfo().getRole() == requester.getMemberInfo().getRole()) { - publishNotification(processor, task, fileName + "(첨부파일)", requester.getNickname()); - } else { - publishNotification(requester, task, fileName + "(첨부파일)", processor.getNickname()); + Member receiver = Objects.equals(member.getMemberId(), requester.getMemberId()) ? processor : requester; + String senderNickname = Objects.equals(member.getMemberId(), requester.getMemberId()) ? requester.getNickname() : processor.getNickname(); + + if (receiver != null) { + publishNotification(receiver, task, fileName + "(첨부파일)", senderNickname); } } diff --git a/src/main/java/clap/server/application/service/task/CancelTaskService.java b/src/main/java/clap/server/application/service/task/CancelTaskService.java index 397a8acf..7660e7ae 100644 --- a/src/main/java/clap/server/application/service/task/CancelTaskService.java +++ b/src/main/java/clap/server/application/service/task/CancelTaskService.java @@ -2,12 +2,15 @@ import clap.server.application.port.inbound.domain.TaskService; import clap.server.application.port.inbound.task.CancelTaskUsecase; +import clap.server.application.port.outbound.notification.CommandNotificationPort; +import clap.server.application.port.outbound.notification.LoadNotificationPort; import clap.server.common.annotation.architecture.ApplicationService; +import clap.server.domain.model.notification.Notification; import clap.server.domain.model.task.Task; import lombok.RequiredArgsConstructor; import org.springframework.transaction.annotation.Transactional; -import java.util.Objects; +import java.util.List; @ApplicationService @@ -15,11 +18,21 @@ @Transactional public class CancelTaskService implements CancelTaskUsecase { private final TaskService taskService; + private final LoadNotificationPort loadNotificationPort; + private final CommandNotificationPort commandNotificationPort; @Override public void cancleTask(Long taskId, Long memberId) { Task task = taskService.findById(taskId); + deleteNotification(task.getTaskId()); task.cancelTask(memberId); taskService.upsert(task); } + + private void deleteNotification(Long taskId) { + List notificationList = loadNotificationPort.findNotificationsByTaskId(taskId); + + notificationList.forEach(commandNotificationPort::delete); + } + } 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 e5bffd76..6daad0ed 100644 --- a/src/main/java/clap/server/application/service/task/UpdateTaskService.java +++ b/src/main/java/clap/server/application/service/task/UpdateTaskService.java @@ -33,6 +33,9 @@ import org.springframework.web.multipart.MultipartFile; import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; +import java.util.stream.Stream; import static clap.server.domain.policy.task.TaskPolicyConstants.TASK_MAX_FILE_COUNT; import static clap.server.domain.policy.task.TaskPolicyConstants.TASK_UPDATABLE_STATUS; @@ -89,7 +92,7 @@ public void updateTaskStatus(Long memberId, Long taskId, TaskStatus taskStatus) TaskHistory taskHistory = TaskHistory.createTaskHistory(TaskHistoryType.STATUS_SWITCHED, task, taskStatus.getDescription(), null, null); commandTaskHistoryPort.save(taskHistory); - List receivers = List.of(task.getRequester(), task.getProcessor()); + List receivers = List.of(task.getRequester()); publishNotification(receivers, updateTask, NotificationType.STATUS_SWITCHED, String.valueOf(updateTask.getTaskStatus())); } } @@ -107,7 +110,7 @@ public void updateTaskProcessor(Long taskId, Long memberId, UpdateTaskProcessorR TaskHistory taskHistory = TaskHistory.createTaskHistory(TaskHistoryType.PROCESSOR_CHANGED, task, null, processor, null); commandTaskHistoryPort.save(taskHistory); - List receivers = List.of(updateTask.getRequester(), updateTask.getProcessor()); + List receivers = List.of(updateTask.getRequester()); publishNotification(receivers, updateTask, NotificationType.PROCESSOR_CHANGED, processor.getNickname()); } diff --git a/src/main/resources/db/migration/dev/V20250212393__Modify_Task_Title_From_Notification.sql b/src/main/resources/db/migration/dev/V20250212393__Modify_Task_Title_From_Notification.sql new file mode 100644 index 00000000..5246e28a --- /dev/null +++ b/src/main/resources/db/migration/dev/V20250212393__Modify_Task_Title_From_Notification.sql @@ -0,0 +1,2 @@ +alter table notification + modify task_title varchar(30) not null; \ No newline at end of file