From 4d93afdda1da99d85b2e4b65209edbb34233fee1 Mon Sep 17 00:00:00 2001 From: andrew Date: Sat, 25 Jan 2025 03:44:07 +0900 Subject: [PATCH 01/12] =?UTF-8?q?CLAP-126=20Feature=20:=20=EC=9E=91?= =?UTF-8?q?=EC=97=85=20=EC=83=9D=EC=84=B1=20method=EC=97=90=20=EC=95=8C?= =?UTF-8?q?=EB=A6=BC=20=EC=83=9D=EC=84=B1=20event=20=EC=83=9D=EC=84=B1=20l?= =?UTF-8?q?ogic=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/Task/CreateTaskService.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/main/java/clap/server/application/Task/CreateTaskService.java b/src/main/java/clap/server/application/Task/CreateTaskService.java index c490d067..45f91656 100644 --- a/src/main/java/clap/server/application/Task/CreateTaskService.java +++ b/src/main/java/clap/server/application/Task/CreateTaskService.java @@ -1,8 +1,10 @@ package clap.server.application.Task; +import clap.server.adapter.inbound.web.dto.notification.CreateNotificationRequest; import clap.server.adapter.inbound.web.dto.task.CreateTaskRequest; import clap.server.adapter.inbound.web.dto.task.CreateAndUpdateTaskResponse; +import clap.server.adapter.outbound.persistense.entity.notification.constant.NotificationType; import clap.server.application.mapper.TaskMapper; import clap.server.application.port.inbound.domain.CategoryService; import clap.server.application.port.inbound.domain.MemberService; @@ -17,6 +19,7 @@ import clap.server.domain.model.task.Task; import lombok.RequiredArgsConstructor; +import org.springframework.context.ApplicationEventPublisher; import org.springframework.transaction.annotation.Transactional; import java.util.List; @@ -30,6 +33,7 @@ public class CreateTaskService implements CreateTaskUsecase { private final CategoryService categoryService; private final CommandTaskPort commandTaskPort; private final CommandAttachmentPort commandAttachmentPort; + private final ApplicationEventPublisher applicationEventPublisher; @Override @Transactional @@ -42,6 +46,24 @@ public CreateAndUpdateTaskResponse createTask(Long requesterId, CreateTaskReques List attachments = Attachment.createAttachments(savedTask, createTaskRequest.fileUrls()); commandAttachmentPort.saveAll(attachments); + + // requestDto에 알림 데이터 mapping + + List reviewers = memberService.findReviewers(); + + CreateNotificationRequest createNotificationRequest; + + // 검토자들 각각에 대한 알림 생성 후 event 발행 + for (Member reviewer : reviewers) { + createNotificationRequest = new CreateNotificationRequest( + savedTask.getTaskId(), NotificationType.TASK_REQUESTED, + reviewer.getMemberId(), null + ); + + // publish event로 event 발행 + applicationEventPublisher.publishEvent(createNotificationRequest); + } + return TaskMapper.toCreateAndUpdateTaskResponse(savedTask); } } \ No newline at end of file From 1bc7e7aa0aa06340aa8d939938d6df816c3166f7 Mon Sep 17 00:00:00 2001 From: andrew Date: Sat, 25 Jan 2025 03:44:44 +0900 Subject: [PATCH 02/12] =?UTF-8?q?CLAP-126=20Feature=20:=20=EC=95=8C?= =?UTF-8?q?=EB=A6=BC=20=EC=83=9D=EC=84=B1=EC=97=90=20=EB=8C=80=ED=95=9C=20?= =?UTF-8?q?EventListener=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../evenlistener/CustomEventListener.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 src/main/java/clap/server/config/evenlistener/CustomEventListener.java diff --git a/src/main/java/clap/server/config/evenlistener/CustomEventListener.java b/src/main/java/clap/server/config/evenlistener/CustomEventListener.java new file mode 100644 index 00000000..4cd00472 --- /dev/null +++ b/src/main/java/clap/server/config/evenlistener/CustomEventListener.java @@ -0,0 +1,21 @@ +package clap.server.config.evenlistener; + +import clap.server.adapter.inbound.web.dto.notification.CreateNotificationRequest; +import clap.server.application.service.notification.CreateNotificationService; +import lombok.RequiredArgsConstructor; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Component; +import org.springframework.transaction.event.TransactionPhase; +import org.springframework.transaction.event.TransactionalEventListener; + +// 이벤트 발행 시 실행 +@RequiredArgsConstructor +@Component +public class CustomEventListener { + private final CreateNotificationService createNotificationService; + + @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT) + public void handler(CreateNotificationRequest request) { + createNotificationService.createNotification(request); + } +} From abe0780f680d92d78bda321c732287b22518a286 Mon Sep 17 00:00:00 2001 From: andrew Date: Sat, 25 Jan 2025 03:45:31 +0900 Subject: [PATCH 03/12] =?UTF-8?q?CLAP-126=20Feature=20:=20=EB=8B=B4?= =?UTF-8?q?=EB=8B=B9=EC=9E=90=EB=93=A4=EB=A7=8C=20=EC=A1=B0=ED=9A=8C?= =?UTF-8?q?=ED=95=98=EB=8A=94=20method=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../outbound/persistense/MemberPersistenceAdapter.java | 9 +++++++++ .../persistense/repository/member/MemberRepository.java | 2 ++ .../application/port/inbound/domain/MemberService.java | 4 ++++ .../application/port/outbound/member/LoadMemberPort.java | 2 ++ 4 files changed, 17 insertions(+) diff --git a/src/main/java/clap/server/adapter/outbound/persistense/MemberPersistenceAdapter.java b/src/main/java/clap/server/adapter/outbound/persistense/MemberPersistenceAdapter.java index 3dc1fb46..6a142f5d 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/MemberPersistenceAdapter.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/MemberPersistenceAdapter.java @@ -48,6 +48,15 @@ public Optional findByNickname(final String nickname) { return memberEntity.map(memberPersistenceMapper::toDomain); } + // 검토자인 담당자들 조회 + @Override + public List findReviewers() { + List memberEntities = memberRepository.findByIsReviewerTrue(); + return memberEntities.stream() + .map(memberPersistenceMapper::toDomain) + .collect(Collectors.toList()); + } + @Override public void save(final Member member) { MemberEntity memberEntity = memberPersistenceMapper.toEntity(member); diff --git a/src/main/java/clap/server/adapter/outbound/persistense/repository/member/MemberRepository.java b/src/main/java/clap/server/adapter/outbound/persistense/repository/member/MemberRepository.java index 892f0a88..0bbec88e 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/repository/member/MemberRepository.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/repository/member/MemberRepository.java @@ -19,5 +19,7 @@ public interface MemberRepository extends JpaRepository { Optional findByStatusAndMemberId(MemberStatus memberStatus, Long memberId); Optional findByNickname(String nickname); + + List findByIsReviewerTrue(); } diff --git a/src/main/java/clap/server/application/port/inbound/domain/MemberService.java b/src/main/java/clap/server/application/port/inbound/domain/MemberService.java index a3d31fd3..d8d3e8d8 100644 --- a/src/main/java/clap/server/application/port/inbound/domain/MemberService.java +++ b/src/main/java/clap/server/application/port/inbound/domain/MemberService.java @@ -52,4 +52,8 @@ public List findActiveManagers() { } return activeManagers; } + + public List findReviewers() { + return loadMemberPort.findReviewers(); + } } diff --git a/src/main/java/clap/server/application/port/outbound/member/LoadMemberPort.java b/src/main/java/clap/server/application/port/outbound/member/LoadMemberPort.java index 2d719663..1eb3e576 100644 --- a/src/main/java/clap/server/application/port/outbound/member/LoadMemberPort.java +++ b/src/main/java/clap/server/application/port/outbound/member/LoadMemberPort.java @@ -19,4 +19,6 @@ public interface LoadMemberPort { Optional findByNickname(String nickname); + List findReviewers(); + } From 38884002941ae7408b3a2160a54ad2b8f5c305bc Mon Sep 17 00:00:00 2001 From: andrew Date: Sat, 25 Jan 2025 03:46:22 +0900 Subject: [PATCH 04/12] =?UTF-8?q?CLAP-126=20Feature=20:=20=EC=95=8C?= =?UTF-8?q?=EB=A6=BC=20=EC=83=9D=EC=84=B1=20method=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CreateNotificationRequest.java | 15 ++++++++ .../NotificationPersistenceAdapter.java | 8 ++++- .../CreateNotificationUsecase.java | 7 ++++ .../notification/CommandNotificationPort.java | 2 +- .../CreateNotificationService.java | 36 +++++++++++++++++++ .../model/notification/Notification.java | 13 +++++++ 6 files changed, 79 insertions(+), 2 deletions(-) create mode 100644 src/main/java/clap/server/adapter/inbound/web/dto/notification/CreateNotificationRequest.java create mode 100644 src/main/java/clap/server/application/port/inbound/notification/CreateNotificationUsecase.java create mode 100644 src/main/java/clap/server/application/service/notification/CreateNotificationService.java diff --git a/src/main/java/clap/server/adapter/inbound/web/dto/notification/CreateNotificationRequest.java b/src/main/java/clap/server/adapter/inbound/web/dto/notification/CreateNotificationRequest.java new file mode 100644 index 00000000..dc989f13 --- /dev/null +++ b/src/main/java/clap/server/adapter/inbound/web/dto/notification/CreateNotificationRequest.java @@ -0,0 +1,15 @@ +package clap.server.adapter.inbound.web.dto.notification; + +import clap.server.adapter.outbound.persistense.entity.notification.constant.NotificationType; +import jakarta.validation.constraints.NotNull; + +public record CreateNotificationRequest( + @NotNull + Long taskId, + @NotNull + NotificationType notificationType, + @NotNull + Long receiverId, + String message +) { +} 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 c2b0d0a1..8aad00a0 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/NotificationPersistenceAdapter.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/NotificationPersistenceAdapter.java @@ -4,6 +4,7 @@ import clap.server.adapter.outbound.persistense.mapper.NotificationPersistenceMapper; import clap.server.adapter.outbound.persistense.repository.notification.NotificationRepository; import clap.server.application.mapper.NotificationMapper; +import clap.server.application.port.outbound.notification.CommandNotificationPort; import clap.server.application.port.outbound.notification.LoadNotificationPort; import clap.server.common.annotation.architecture.PersistenceAdapter; import clap.server.domain.model.notification.Notification; @@ -13,7 +14,7 @@ @PersistenceAdapter @RequiredArgsConstructor -public class NotificationPersistenceAdapter implements LoadNotificationPort { +public class NotificationPersistenceAdapter implements LoadNotificationPort, CommandNotificationPort { private final NotificationRepository notificationRepository; private final NotificationPersistenceMapper notificationPersistenceMapper; @@ -25,4 +26,9 @@ public Page findAllByReceiverId(Long receiverId, P .map(notificationPersistenceMapper::toDomain); return notificationList.map(NotificationMapper::toFindNoticeListResponse); } + + @Override + public void save(Notification notification) { + notificationRepository.save(notificationPersistenceMapper.toEntity(notification)); + } } diff --git a/src/main/java/clap/server/application/port/inbound/notification/CreateNotificationUsecase.java b/src/main/java/clap/server/application/port/inbound/notification/CreateNotificationUsecase.java new file mode 100644 index 00000000..2a7a0bfd --- /dev/null +++ b/src/main/java/clap/server/application/port/inbound/notification/CreateNotificationUsecase.java @@ -0,0 +1,7 @@ +package clap.server.application.port.inbound.notification; + +import clap.server.adapter.inbound.web.dto.notification.CreateNotificationRequest; + +public interface CreateNotificationUsecase { + void createNotification(CreateNotificationRequest request); +} 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 1b549fea..7761d367 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 @@ -4,5 +4,5 @@ import java.util.Optional; public interface CommandNotificationPort { - Optional save(Notification notification); + void save(Notification notification); } \ No newline at end of file diff --git a/src/main/java/clap/server/application/service/notification/CreateNotificationService.java b/src/main/java/clap/server/application/service/notification/CreateNotificationService.java new file mode 100644 index 00000000..98d8def3 --- /dev/null +++ b/src/main/java/clap/server/application/service/notification/CreateNotificationService.java @@ -0,0 +1,36 @@ +package clap.server.application.service.notification; + +import clap.server.adapter.inbound.web.dto.notification.CreateNotificationRequest; +import clap.server.application.port.inbound.domain.MemberService; +import clap.server.application.port.inbound.domain.TaskService; +import clap.server.application.port.inbound.notification.CreateNotificationUsecase; +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; + +@ApplicationService +@RequiredArgsConstructor +public class CreateNotificationService implements CreateNotificationUsecase { + + private final MemberService memberService; + private final TaskService taskService; + private final CommandNotificationPort commandNotificationPort; + + @Override + public void createNotification(CreateNotificationRequest request) { + Member receiver = memberService.findById(request.receiverId()); + Task task = taskService.findById(request.taskId()); + + Notification notification = Notification.builder() + .task(task) + .type(request.notificationType()) + .receiver(receiver) + .message(request.message()) + .build(); + + commandNotificationPort.save(notification); + } +} diff --git a/src/main/java/clap/server/domain/model/notification/Notification.java b/src/main/java/clap/server/domain/model/notification/Notification.java index 73feeaea..9ce5d4f3 100644 --- a/src/main/java/clap/server/domain/model/notification/Notification.java +++ b/src/main/java/clap/server/domain/model/notification/Notification.java @@ -1,14 +1,19 @@ package clap.server.domain.model.notification; import clap.server.adapter.outbound.persistense.entity.notification.constant.NotificationType; +import clap.server.adapter.outbound.persistense.entity.task.constant.TaskStatus; import clap.server.domain.model.common.BaseTime; import clap.server.domain.model.member.Member; +import clap.server.domain.model.task.Category; import clap.server.domain.model.task.Task; import lombok.AccessLevel; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.experimental.SuperBuilder; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + @Getter @SuperBuilder @NoArgsConstructor(access = AccessLevel.PROTECTED) @@ -20,4 +25,12 @@ public class Notification extends BaseTime { private String message; private String taskTitle; private boolean isRead; + + public Notification(Task task, NotificationType type, Member receiver, String message) { + this.task = task; + this.type = type; + this.receiver = receiver; + this.message = message; + this.isRead = false; + } } From e935a633a9b259013a9be72a6b52062a1b85f428 Mon Sep 17 00:00:00 2001 From: andrew Date: Sat, 25 Jan 2025 20:17:15 +0900 Subject: [PATCH 05/12] =?UTF-8?q?CLAP-126=20Fix=20:=20=ED=8A=B8=EB=9E=9C?= =?UTF-8?q?=EC=9E=AD=EC=85=98=20=EC=83=9D=EC=84=B1=20annotation=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../clap/server/config/evenlistener/CustomEventListener.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/clap/server/config/evenlistener/CustomEventListener.java b/src/main/java/clap/server/config/evenlistener/CustomEventListener.java index 4cd00472..ee096759 100644 --- a/src/main/java/clap/server/config/evenlistener/CustomEventListener.java +++ b/src/main/java/clap/server/config/evenlistener/CustomEventListener.java @@ -5,6 +5,8 @@ import lombok.RequiredArgsConstructor; import org.springframework.context.event.EventListener; import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.event.TransactionPhase; import org.springframework.transaction.event.TransactionalEventListener; @@ -15,6 +17,7 @@ public class CustomEventListener { private final CreateNotificationService createNotificationService; @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT) + @Transactional(propagation = Propagation.REQUIRES_NEW) public void handler(CreateNotificationRequest request) { createNotificationService.createNotification(request); } From 6aa140dbe43c642d7dec03276520cd923625525e Mon Sep 17 00:00:00 2001 From: andrew Date: Sat, 25 Jan 2025 20:17:44 +0900 Subject: [PATCH 06/12] =?UTF-8?q?CLAP-126=20Fix=20:=20@TestContainers=20an?= =?UTF-8?q?notation=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/clap/server/notification/NotificationServiceTest.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/test/java/clap/server/notification/NotificationServiceTest.java b/src/test/java/clap/server/notification/NotificationServiceTest.java index dec1f21e..b523b526 100644 --- a/src/test/java/clap/server/notification/NotificationServiceTest.java +++ b/src/test/java/clap/server/notification/NotificationServiceTest.java @@ -13,6 +13,7 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.Pageable; +import org.testcontainers.junit.jupiter.Testcontainers; import java.time.LocalDateTime; import java.util.List; @@ -20,6 +21,7 @@ import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.when; +@Testcontainers @ExtendWith(MockitoExtension.class) public class NotificationServiceTest { From f965d1cbb715195591a4dc932d1f33b269572382 Mon Sep 17 00:00:00 2001 From: andrew Date: Sat, 25 Jan 2025 21:38:49 +0900 Subject: [PATCH 07/12] =?UTF-8?q?CLAP-126=20Fix=20:=20taskId=20=EC=99=B8?= =?UTF-8?q?=EB=9E=98=ED=82=A4=EA=B0=80=20=EC=A1=B4=EC=9E=AC=ED=95=A8?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20taskTitle=EB=8F=84=20=EC=A1=B0=ED=9A=8C?= =?UTF-8?q?=EA=B0=80=EB=8A=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../persistense/entity/notification/NotificationEntity.java | 5 +---- .../clap/server/domain/model/notification/Notification.java | 1 - 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/src/main/java/clap/server/adapter/outbound/persistense/entity/notification/NotificationEntity.java b/src/main/java/clap/server/adapter/outbound/persistense/entity/notification/NotificationEntity.java index 4fd79f5d..00e5b3ed 100644 --- a/src/main/java/clap/server/adapter/outbound/persistense/entity/notification/NotificationEntity.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/entity/notification/NotificationEntity.java @@ -34,12 +34,9 @@ public class NotificationEntity extends BaseTimeEntity { @JoinColumn(name = "receiver_id", nullable = false) private MemberEntity receiver; - @Column(nullable = false) + @Column(nullable = true) private String message; - @Column - private String taskTitle; - @Column(nullable = false) private boolean isRead; } diff --git a/src/main/java/clap/server/domain/model/notification/Notification.java b/src/main/java/clap/server/domain/model/notification/Notification.java index 9ce5d4f3..553d5ff6 100644 --- a/src/main/java/clap/server/domain/model/notification/Notification.java +++ b/src/main/java/clap/server/domain/model/notification/Notification.java @@ -23,7 +23,6 @@ public class Notification extends BaseTime { private NotificationType type; private Member receiver; private String message; - private String taskTitle; private boolean isRead; public Notification(Task task, NotificationType type, Member receiver, String message) { From 5c8b120e4dbd66033422f3d935e412921abfa163 Mon Sep 17 00:00:00 2001 From: andrew Date: Sat, 25 Jan 2025 21:52:04 +0900 Subject: [PATCH 08/12] =?UTF-8?q?CLAP-126=20Fix=20:=20Merge=20Conflict=20?= =?UTF-8?q?=ED=95=B4=EA=B2=B0=EC=9D=84=20=EC=9C=84=ED=95=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/clap/server/application/Task/CreateTaskService.java | 2 +- .../clap/server/config/evenlistener/CustomEventListener.java | 1 - .../java/clap/server/notification/NotificationServiceTest.java | 1 - 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/clap/server/application/Task/CreateTaskService.java b/src/main/java/clap/server/application/Task/CreateTaskService.java index 45f91656..3602b93d 100644 --- a/src/main/java/clap/server/application/Task/CreateTaskService.java +++ b/src/main/java/clap/server/application/Task/CreateTaskService.java @@ -64,6 +64,6 @@ public CreateAndUpdateTaskResponse createTask(Long requesterId, CreateTaskReques applicationEventPublisher.publishEvent(createNotificationRequest); } - return TaskMapper.toCreateAndUpdateTaskResponse(savedTask); + return TaskMapper.toCreateTaskResponse(savedTask); } } \ No newline at end of file diff --git a/src/main/java/clap/server/config/evenlistener/CustomEventListener.java b/src/main/java/clap/server/config/evenlistener/CustomEventListener.java index ee096759..c50a632e 100644 --- a/src/main/java/clap/server/config/evenlistener/CustomEventListener.java +++ b/src/main/java/clap/server/config/evenlistener/CustomEventListener.java @@ -3,7 +3,6 @@ import clap.server.adapter.inbound.web.dto.notification.CreateNotificationRequest; import clap.server.application.service.notification.CreateNotificationService; import lombok.RequiredArgsConstructor; -import org.springframework.context.event.EventListener; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; diff --git a/src/test/java/clap/server/notification/NotificationServiceTest.java b/src/test/java/clap/server/notification/NotificationServiceTest.java index b523b526..ae79627b 100644 --- a/src/test/java/clap/server/notification/NotificationServiceTest.java +++ b/src/test/java/clap/server/notification/NotificationServiceTest.java @@ -18,7 +18,6 @@ import java.time.LocalDateTime; import java.util.List; -import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.when; @Testcontainers From c5c1a7c3953f5725fdb1886d24dbb2fb13f3fd8a Mon Sep 17 00:00:00 2001 From: andrew Date: Sat, 25 Jan 2025 21:59:11 +0900 Subject: [PATCH 09/12] =?UTF-8?q?CLAP-126=20Fix=20:=20Merge=20Conflict=20?= =?UTF-8?q?=ED=95=B4=EA=B2=B0=EC=9D=84=20=EC=9C=84=ED=95=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/clap/server/application/Task/CreateTaskService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/clap/server/application/Task/CreateTaskService.java b/src/main/java/clap/server/application/Task/CreateTaskService.java index 3602b93d..c3b92192 100644 --- a/src/main/java/clap/server/application/Task/CreateTaskService.java +++ b/src/main/java/clap/server/application/Task/CreateTaskService.java @@ -37,7 +37,7 @@ public class CreateTaskService implements CreateTaskUsecase { @Override @Transactional - public CreateAndUpdateTaskResponse createTask(Long requesterId, CreateTaskRequest createTaskRequest) { + public CreateTaskResponse createTask(Long requesterId, CreateTaskRequest createTaskRequest) { Member member = memberService.findActiveMember(requesterId); Category category = categoryService.findById(createTaskRequest.categoryId()); Task task = Task.createTask(member, category, createTaskRequest.title(), createTaskRequest.description()); From 0d985c4f7bf2ee21da828d0134325699d9236b20 Mon Sep 17 00:00:00 2001 From: andrew Date: Sat, 25 Jan 2025 22:49:16 +0900 Subject: [PATCH 10/12] =?UTF-8?q?CLAP-126=20Fix=20:=20@Builder=20Annotatio?= =?UTF-8?q?n=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../clap/server/domain/model/notification/Notification.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/clap/server/domain/model/notification/Notification.java b/src/main/java/clap/server/domain/model/notification/Notification.java index 553d5ff6..91ae10f9 100644 --- a/src/main/java/clap/server/domain/model/notification/Notification.java +++ b/src/main/java/clap/server/domain/model/notification/Notification.java @@ -7,6 +7,7 @@ import clap.server.domain.model.task.Category; import clap.server.domain.model.task.Task; import lombok.AccessLevel; +import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.experimental.SuperBuilder; @@ -25,6 +26,7 @@ public class Notification extends BaseTime { private String message; private boolean isRead; + @Builder public Notification(Task task, NotificationType type, Member receiver, String message) { this.task = task; this.type = type; From 27fc8054a867707f35e6b6b2d08a648b8e21a9ea Mon Sep 17 00:00:00 2001 From: andrew Date: Sun, 26 Jan 2025 00:25:18 +0900 Subject: [PATCH 11/12] =?UTF-8?q?CLAP-126=20Fix=20:=20CreateNotificationRe?= =?UTF-8?q?quest=20=EC=A0=9C=EA=B1=B0=20=EB=B0=8F=20Builder=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CreateNotificationRequest.java | 15 -------------- .../evenlistener/CustomEventListener.java | 6 +++--- .../application/Task/CreateTaskService.java | 20 +++++++++---------- .../CreateNotificationUsecase.java | 4 ++-- .../CreateNotificationService.java | 20 ++----------------- 5 files changed, 17 insertions(+), 48 deletions(-) delete mode 100644 src/main/java/clap/server/adapter/inbound/web/dto/notification/CreateNotificationRequest.java rename src/main/java/clap/server/{config => adapter/outbound/persistense}/evenlistener/CustomEventListener.java (81%) diff --git a/src/main/java/clap/server/adapter/inbound/web/dto/notification/CreateNotificationRequest.java b/src/main/java/clap/server/adapter/inbound/web/dto/notification/CreateNotificationRequest.java deleted file mode 100644 index dc989f13..00000000 --- a/src/main/java/clap/server/adapter/inbound/web/dto/notification/CreateNotificationRequest.java +++ /dev/null @@ -1,15 +0,0 @@ -package clap.server.adapter.inbound.web.dto.notification; - -import clap.server.adapter.outbound.persistense.entity.notification.constant.NotificationType; -import jakarta.validation.constraints.NotNull; - -public record CreateNotificationRequest( - @NotNull - Long taskId, - @NotNull - NotificationType notificationType, - @NotNull - Long receiverId, - String message -) { -} diff --git a/src/main/java/clap/server/config/evenlistener/CustomEventListener.java b/src/main/java/clap/server/adapter/outbound/persistense/evenlistener/CustomEventListener.java similarity index 81% rename from src/main/java/clap/server/config/evenlistener/CustomEventListener.java rename to src/main/java/clap/server/adapter/outbound/persistense/evenlistener/CustomEventListener.java index c50a632e..3a7ba0a0 100644 --- a/src/main/java/clap/server/config/evenlistener/CustomEventListener.java +++ b/src/main/java/clap/server/adapter/outbound/persistense/evenlistener/CustomEventListener.java @@ -1,7 +1,7 @@ -package clap.server.config.evenlistener; +package clap.server.adapter.outbound.persistense.evenlistener; -import clap.server.adapter.inbound.web.dto.notification.CreateNotificationRequest; import clap.server.application.service.notification.CreateNotificationService; +import clap.server.domain.model.notification.Notification; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Propagation; @@ -17,7 +17,7 @@ public class CustomEventListener { @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT) @Transactional(propagation = Propagation.REQUIRES_NEW) - public void handler(CreateNotificationRequest request) { + public void handler(Notification request) { createNotificationService.createNotification(request); } } diff --git a/src/main/java/clap/server/application/Task/CreateTaskService.java b/src/main/java/clap/server/application/Task/CreateTaskService.java index c3b92192..c388ae33 100644 --- a/src/main/java/clap/server/application/Task/CreateTaskService.java +++ b/src/main/java/clap/server/application/Task/CreateTaskService.java @@ -1,6 +1,5 @@ package clap.server.application.Task; -import clap.server.adapter.inbound.web.dto.notification.CreateNotificationRequest; import clap.server.adapter.inbound.web.dto.task.CreateTaskRequest; import clap.server.adapter.inbound.web.dto.task.CreateAndUpdateTaskResponse; @@ -14,6 +13,7 @@ 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.Attachment; import clap.server.domain.model.task.Category; import clap.server.domain.model.task.Task; @@ -37,7 +37,7 @@ public class CreateTaskService implements CreateTaskUsecase { @Override @Transactional - public CreateTaskResponse createTask(Long requesterId, CreateTaskRequest createTaskRequest) { + public CreateAndUpdateTaskResponse createTask(Long requesterId, CreateTaskRequest createTaskRequest) { Member member = memberService.findActiveMember(requesterId); Category category = categoryService.findById(createTaskRequest.categoryId()); Task task = Task.createTask(member, category, createTaskRequest.title(), createTaskRequest.description()); @@ -51,19 +51,19 @@ public CreateTaskResponse createTask(Long requesterId, CreateTaskRequest createT List reviewers = memberService.findReviewers(); - CreateNotificationRequest createNotificationRequest; // 검토자들 각각에 대한 알림 생성 후 event 발행 for (Member reviewer : reviewers) { - createNotificationRequest = new CreateNotificationRequest( - savedTask.getTaskId(), NotificationType.TASK_REQUESTED, - reviewer.getMemberId(), null - ); - + Notification notification = Notification.builder() + .task(savedTask) + .type(NotificationType.TASK_REQUESTED) + .receiver(reviewer) + .message(null) + .build(); // publish event로 event 발행 - applicationEventPublisher.publishEvent(createNotificationRequest); + applicationEventPublisher.publishEvent(notification); } - return TaskMapper.toCreateTaskResponse(savedTask); + return TaskMapper.toCreateAndUpdateTaskResponse(savedTask); } } \ No newline at end of file diff --git a/src/main/java/clap/server/application/port/inbound/notification/CreateNotificationUsecase.java b/src/main/java/clap/server/application/port/inbound/notification/CreateNotificationUsecase.java index 2a7a0bfd..147ced9e 100644 --- a/src/main/java/clap/server/application/port/inbound/notification/CreateNotificationUsecase.java +++ b/src/main/java/clap/server/application/port/inbound/notification/CreateNotificationUsecase.java @@ -1,7 +1,7 @@ package clap.server.application.port.inbound.notification; -import clap.server.adapter.inbound.web.dto.notification.CreateNotificationRequest; +import clap.server.domain.model.notification.Notification; public interface CreateNotificationUsecase { - void createNotification(CreateNotificationRequest request); + void createNotification(Notification notification); } diff --git a/src/main/java/clap/server/application/service/notification/CreateNotificationService.java b/src/main/java/clap/server/application/service/notification/CreateNotificationService.java index 98d8def3..840acb69 100644 --- a/src/main/java/clap/server/application/service/notification/CreateNotificationService.java +++ b/src/main/java/clap/server/application/service/notification/CreateNotificationService.java @@ -1,36 +1,20 @@ package clap.server.application.service.notification; -import clap.server.adapter.inbound.web.dto.notification.CreateNotificationRequest; -import clap.server.application.port.inbound.domain.MemberService; -import clap.server.application.port.inbound.domain.TaskService; import clap.server.application.port.inbound.notification.CreateNotificationUsecase; 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; @ApplicationService @RequiredArgsConstructor public class CreateNotificationService implements CreateNotificationUsecase { - private final MemberService memberService; - private final TaskService taskService; private final CommandNotificationPort commandNotificationPort; @Override - public void createNotification(CreateNotificationRequest request) { - Member receiver = memberService.findById(request.receiverId()); - Task task = taskService.findById(request.taskId()); + public void createNotification(Notification request) { - Notification notification = Notification.builder() - .task(task) - .type(request.notificationType()) - .receiver(receiver) - .message(request.message()) - .build(); - - commandNotificationPort.save(notification); + commandNotificationPort.save(request); } } From 7c5d628f0aeb2b9a2f89c9b591b840942780a6fb Mon Sep 17 00:00:00 2001 From: andrew Date: Sun, 26 Jan 2025 00:29:04 +0900 Subject: [PATCH 12/12] CLAP-126 Fix : merge conflict --- .../java/clap/server/application/Task/CreateTaskService.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/clap/server/application/Task/CreateTaskService.java b/src/main/java/clap/server/application/Task/CreateTaskService.java index c388ae33..67adcacf 100644 --- a/src/main/java/clap/server/application/Task/CreateTaskService.java +++ b/src/main/java/clap/server/application/Task/CreateTaskService.java @@ -37,7 +37,7 @@ public class CreateTaskService implements CreateTaskUsecase { @Override @Transactional - public CreateAndUpdateTaskResponse createTask(Long requesterId, CreateTaskRequest createTaskRequest) { + public CreateTaskResponse createTask(Long requesterId, CreateTaskRequest createTaskRequest) { Member member = memberService.findActiveMember(requesterId); Category category = categoryService.findById(createTaskRequest.categoryId()); Task task = Task.createTask(member, category, createTaskRequest.title(), createTaskRequest.description()); @@ -64,6 +64,6 @@ public CreateAndUpdateTaskResponse createTask(Long requesterId, CreateTaskReques applicationEventPublisher.publishEvent(notification); } - return TaskMapper.toCreateAndUpdateTaskResponse(savedTask); + return TaskMapper.toCreateTaskResponse(savedTask); } } \ No newline at end of file