Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,15 @@ public Optional<Member> findByNickname(final String nickname) {
return memberEntity.map(memberPersistenceMapper::toDomain);
}

// 검토자인 담당자들 조회
@Override
public List<Member> findReviewers() {
List<MemberEntity> memberEntities = memberRepository.findByIsReviewerTrue();
return memberEntities.stream()
.map(memberPersistenceMapper::toDomain)
.collect(Collectors.toList());
}

@Override
public void save(final Member member) {
MemberEntity memberEntity = memberPersistenceMapper.toEntity(member);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand All @@ -25,4 +26,9 @@ public Page<FindNotificationListResponse> findAllByReceiverId(Long receiverId, P
.map(notificationPersistenceMapper::toDomain);
return notificationList.map(NotificationMapper::toFindNoticeListResponse);
}

@Override
public void save(Notification notification) {
notificationRepository.save(notificationPersistenceMapper.toEntity(notification));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package clap.server.adapter.outbound.persistense.evenlistener;

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;
import org.springframework.transaction.annotation.Transactional;
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)
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void handler(Notification request) {
createNotificationService.createNotification(request);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,5 +19,7 @@ public interface MemberRepository extends JpaRepository<MemberEntity, Long> {
Optional<MemberEntity> findByStatusAndMemberId(MemberStatus memberStatus, Long memberId);

Optional<MemberEntity> findByNickname(String nickname);

List<MemberEntity> findByIsReviewerTrue();
}

26 changes: 24 additions & 2 deletions src/main/java/clap/server/application/Task/CreateTaskService.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
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;
Expand All @@ -12,11 +13,13 @@

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;
import lombok.RequiredArgsConstructor;

import org.springframework.context.ApplicationEventPublisher;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
Expand All @@ -30,10 +33,11 @@ public class CreateTaskService implements CreateTaskUsecase {
private final CategoryService categoryService;
private final CommandTaskPort commandTaskPort;
private final CommandAttachmentPort commandAttachmentPort;
private final ApplicationEventPublisher applicationEventPublisher;

@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());
Expand All @@ -42,6 +46,24 @@ public CreateAndUpdateTaskResponse createTask(Long requesterId, CreateTaskReques
List<Attachment> attachments = Attachment.createAttachments(savedTask, createTaskRequest.fileUrls());
commandAttachmentPort.saveAll(attachments);

return TaskMapper.toCreateAndUpdateTaskResponse(savedTask);

// requestDto에 알림 데이터 mapping

List<Member> reviewers = memberService.findReviewers();


// 검토자들 각각에 대한 알림 생성 후 event 발행
for (Member reviewer : reviewers) {
Notification notification = Notification.builder()
.task(savedTask)
.type(NotificationType.TASK_REQUESTED)
.receiver(reviewer)
.message(null)
.build();
// publish event로 event 발행
applicationEventPublisher.publishEvent(notification);
}

return TaskMapper.toCreateTaskResponse(savedTask);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -52,4 +52,8 @@ public List<Member> findActiveManagers() {
}
return activeManagers;
}

public List<Member> findReviewers() {
return loadMemberPort.findReviewers();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package clap.server.application.port.inbound.notification;

import clap.server.domain.model.notification.Notification;

public interface CreateNotificationUsecase {
void createNotification(Notification notification);
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,6 @@ public interface LoadMemberPort {

Optional<Member> findByNickname(String nickname);

List<Member> findReviewers();

}
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,5 @@
import java.util.Optional;

public interface CommandNotificationPort {
Optional<Notification> save(Notification notification);
void save(Notification notification);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package clap.server.application.service.notification;

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.notification.Notification;
import lombok.RequiredArgsConstructor;

@ApplicationService
@RequiredArgsConstructor
public class CreateNotificationService implements CreateNotificationUsecase {

private final CommandNotificationPort commandNotificationPort;

@Override
public void createNotification(Notification request) {

commandNotificationPort.save(request);
}
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,20 @@
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.Builder;
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)
Expand All @@ -18,6 +24,14 @@ public class Notification extends BaseTime {
private NotificationType type;
private Member receiver;
private String message;
private String taskTitle;
private boolean isRead;

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

빌더 선언 부탁드립니다!

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

넵 추가해놓았습니다

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@joowojr 수정해서 다시 commit 올려놨습니다. 확인 부탁드립니다!

@Builder
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;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,14 @@
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;

import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.when;

@Testcontainers
@ExtendWith(MockitoExtension.class)
public class NotificationServiceTest {

Expand Down
Loading