Skip to content

Commit 0408482

Browse files
authored
Merge pull request #101 from TaskFlow-CLAP/CLAP-126
CLAP-126 시스템 알림 생성
2 parents b35f240 + 7c5d628 commit 0408482

File tree

13 files changed

+117
-10
lines changed

13 files changed

+117
-10
lines changed

src/main/java/clap/server/adapter/outbound/persistense/MemberPersistenceAdapter.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,15 @@ public Optional<Member> findByNickname(final String nickname) {
4848
return memberEntity.map(memberPersistenceMapper::toDomain);
4949
}
5050

51+
// 검토자인 담당자들 조회
52+
@Override
53+
public List<Member> findReviewers() {
54+
List<MemberEntity> memberEntities = memberRepository.findByIsReviewerTrue();
55+
return memberEntities.stream()
56+
.map(memberPersistenceMapper::toDomain)
57+
.collect(Collectors.toList());
58+
}
59+
5160
@Override
5261
public void save(final Member member) {
5362
MemberEntity memberEntity = memberPersistenceMapper.toEntity(member);

src/main/java/clap/server/adapter/outbound/persistense/NotificationPersistenceAdapter.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import clap.server.adapter.outbound.persistense.mapper.NotificationPersistenceMapper;
55
import clap.server.adapter.outbound.persistense.repository.notification.NotificationRepository;
66
import clap.server.application.mapper.NotificationMapper;
7+
import clap.server.application.port.outbound.notification.CommandNotificationPort;
78
import clap.server.application.port.outbound.notification.LoadNotificationPort;
89
import clap.server.common.annotation.architecture.PersistenceAdapter;
910
import clap.server.domain.model.notification.Notification;
@@ -13,7 +14,7 @@
1314

1415
@PersistenceAdapter
1516
@RequiredArgsConstructor
16-
public class NotificationPersistenceAdapter implements LoadNotificationPort {
17+
public class NotificationPersistenceAdapter implements LoadNotificationPort, CommandNotificationPort {
1718

1819
private final NotificationRepository notificationRepository;
1920
private final NotificationPersistenceMapper notificationPersistenceMapper;
@@ -25,4 +26,9 @@ public Page<FindNotificationListResponse> findAllByReceiverId(Long receiverId, P
2526
.map(notificationPersistenceMapper::toDomain);
2627
return notificationList.map(NotificationMapper::toFindNoticeListResponse);
2728
}
29+
30+
@Override
31+
public void save(Notification notification) {
32+
notificationRepository.save(notificationPersistenceMapper.toEntity(notification));
33+
}
2834
}

src/main/java/clap/server/adapter/outbound/persistense/entity/notification/NotificationEntity.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,9 @@ public class NotificationEntity extends BaseTimeEntity {
3434
@JoinColumn(name = "receiver_id", nullable = false)
3535
private MemberEntity receiver;
3636

37-
@Column(nullable = false)
37+
@Column(nullable = true)
3838
private String message;
3939

40-
@Column
41-
private String taskTitle;
42-
4340
@Column(nullable = false)
4441
private boolean isRead;
4542
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package clap.server.adapter.outbound.persistense.evenlistener;
2+
3+
import clap.server.application.service.notification.CreateNotificationService;
4+
import clap.server.domain.model.notification.Notification;
5+
import lombok.RequiredArgsConstructor;
6+
import org.springframework.stereotype.Component;
7+
import org.springframework.transaction.annotation.Propagation;
8+
import org.springframework.transaction.annotation.Transactional;
9+
import org.springframework.transaction.event.TransactionPhase;
10+
import org.springframework.transaction.event.TransactionalEventListener;
11+
12+
// 이벤트 발행 시 실행
13+
@RequiredArgsConstructor
14+
@Component
15+
public class CustomEventListener {
16+
private final CreateNotificationService createNotificationService;
17+
18+
@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
19+
@Transactional(propagation = Propagation.REQUIRES_NEW)
20+
public void handler(Notification request) {
21+
createNotificationService.createNotification(request);
22+
}
23+
}

src/main/java/clap/server/adapter/outbound/persistense/repository/member/MemberRepository.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,5 +19,7 @@ public interface MemberRepository extends JpaRepository<MemberEntity, Long> {
1919
Optional<MemberEntity> findByStatusAndMemberId(MemberStatus memberStatus, Long memberId);
2020

2121
Optional<MemberEntity> findByNickname(String nickname);
22+
23+
List<MemberEntity> findByIsReviewerTrue();
2224
}
2325

src/main/java/clap/server/application/Task/CreateTaskService.java

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import clap.server.adapter.inbound.web.dto.task.CreateTaskRequest;
44
import clap.server.adapter.inbound.web.dto.task.CreateTaskResponse;
55

6+
import clap.server.adapter.outbound.persistense.entity.notification.constant.NotificationType;
67
import clap.server.application.mapper.TaskMapper;
78
import clap.server.application.port.inbound.domain.CategoryService;
89
import clap.server.application.port.inbound.domain.MemberService;
@@ -12,11 +13,13 @@
1213

1314
import clap.server.common.annotation.architecture.ApplicationService;
1415
import clap.server.domain.model.member.Member;
16+
import clap.server.domain.model.notification.Notification;
1517
import clap.server.domain.model.task.Attachment;
1618
import clap.server.domain.model.task.Category;
1719
import clap.server.domain.model.task.Task;
1820
import lombok.RequiredArgsConstructor;
1921

22+
import org.springframework.context.ApplicationEventPublisher;
2023
import org.springframework.transaction.annotation.Transactional;
2124

2225
import java.util.List;
@@ -30,10 +33,11 @@ public class CreateTaskService implements CreateTaskUsecase {
3033
private final CategoryService categoryService;
3134
private final CommandTaskPort commandTaskPort;
3235
private final CommandAttachmentPort commandAttachmentPort;
36+
private final ApplicationEventPublisher applicationEventPublisher;
3337

3438
@Override
3539
@Transactional
36-
public CreateAndUpdateTaskResponse createTask(Long requesterId, CreateTaskRequest createTaskRequest) {
40+
public CreateTaskResponse createTask(Long requesterId, CreateTaskRequest createTaskRequest) {
3741
Member member = memberService.findActiveMember(requesterId);
3842
Category category = categoryService.findById(createTaskRequest.categoryId());
3943
Task task = Task.createTask(member, category, createTaskRequest.title(), createTaskRequest.description());
@@ -42,6 +46,24 @@ public CreateAndUpdateTaskResponse createTask(Long requesterId, CreateTaskReques
4246
List<Attachment> attachments = Attachment.createAttachments(savedTask, createTaskRequest.fileUrls());
4347
commandAttachmentPort.saveAll(attachments);
4448

45-
return TaskMapper.toCreateAndUpdateTaskResponse(savedTask);
49+
50+
// requestDto에 알림 데이터 mapping
51+
52+
List<Member> reviewers = memberService.findReviewers();
53+
54+
55+
// 검토자들 각각에 대한 알림 생성 후 event 발행
56+
for (Member reviewer : reviewers) {
57+
Notification notification = Notification.builder()
58+
.task(savedTask)
59+
.type(NotificationType.TASK_REQUESTED)
60+
.receiver(reviewer)
61+
.message(null)
62+
.build();
63+
// publish event로 event 발행
64+
applicationEventPublisher.publishEvent(notification);
65+
}
66+
67+
return TaskMapper.toCreateTaskResponse(savedTask);
4668
}
4769
}

src/main/java/clap/server/application/port/inbound/domain/MemberService.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,4 +52,8 @@ public List<Member> findActiveManagers() {
5252
}
5353
return activeManagers;
5454
}
55+
56+
public List<Member> findReviewers() {
57+
return loadMemberPort.findReviewers();
58+
}
5559
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package clap.server.application.port.inbound.notification;
2+
3+
import clap.server.domain.model.notification.Notification;
4+
5+
public interface CreateNotificationUsecase {
6+
void createNotification(Notification notification);
7+
}

src/main/java/clap/server/application/port/outbound/member/LoadMemberPort.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,6 @@ public interface LoadMemberPort {
1919

2020
Optional<Member> findByNickname(String nickname);
2121

22+
List<Member> findReviewers();
23+
2224
}

src/main/java/clap/server/application/port/outbound/notification/CommandNotificationPort.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,5 @@
44
import java.util.Optional;
55

66
public interface CommandNotificationPort {
7-
Optional<Notification> save(Notification notification);
7+
void save(Notification notification);
88
}

0 commit comments

Comments
 (0)