diff --git a/src/main/java/com/somemore/center/service/NEWCenterQueryService.java b/src/main/java/com/somemore/center/service/NEWCenterQueryService.java index 72dafe5d4..48fa95790 100644 --- a/src/main/java/com/somemore/center/service/NEWCenterQueryService.java +++ b/src/main/java/com/somemore/center/service/NEWCenterQueryService.java @@ -40,6 +40,13 @@ public UUID getIdByUserId(UUID userId) { return getByUserId(userId).getId(); } + @Override + public UUID getUserIdById(UUID centerId) { + return centerRepository.findById(centerId) + .orElseThrow(() -> new NoSuchElementException(ExceptionMessage.NOT_EXISTS_CENTER)) + .getUserId(); + } + @Override public CenterProfileResponseDto getCenterProfileById(UUID centerId) { diff --git a/src/main/java/com/somemore/center/usecase/NEWCenterQueryUseCase.java b/src/main/java/com/somemore/center/usecase/NEWCenterQueryUseCase.java index 17eb2f7af..c8a068ec0 100644 --- a/src/main/java/com/somemore/center/usecase/NEWCenterQueryUseCase.java +++ b/src/main/java/com/somemore/center/usecase/NEWCenterQueryUseCase.java @@ -12,6 +12,8 @@ public interface NEWCenterQueryUseCase { UUID getIdByUserId(UUID userId); + UUID getUserIdById(UUID centerId); + CenterProfileResponseDto getCenterProfileById(UUID centerId); void validateCenterExists(UUID id); diff --git a/src/main/java/com/somemore/domains/community/event/CommentAddedEvent.java b/src/main/java/com/somemore/domains/community/event/CommentAddedEvent.java index 0f0470fe8..948f031b2 100644 --- a/src/main/java/com/somemore/domains/community/event/CommentAddedEvent.java +++ b/src/main/java/com/somemore/domains/community/event/CommentAddedEvent.java @@ -27,4 +27,13 @@ public CommentAddedEvent( this.volunteerId = volunteerId; this.communityBoardId = communityBoardId; } + + public static CommentAddedEvent of(UUID targetUserId, Long communityBoardId) { + return CommentAddedEvent.builder() + .type(ServerEventType.NOTIFICATION) + .subType(NotificationSubType.COMMENT_ADDED) + .volunteerId(targetUserId) + .communityBoardId(communityBoardId) + .build(); + } } diff --git a/src/main/java/com/somemore/domains/community/service/comment/CreateCommunityCommentService.java b/src/main/java/com/somemore/domains/community/service/comment/CreateCommunityCommentService.java index bc5784c6c..842cc4722 100644 --- a/src/main/java/com/somemore/domains/community/service/comment/CreateCommunityCommentService.java +++ b/src/main/java/com/somemore/domains/community/service/comment/CreateCommunityCommentService.java @@ -6,9 +6,7 @@ import com.somemore.domains.community.repository.board.CommunityBoardRepository; import com.somemore.domains.community.repository.comment.CommunityCommentRepository; import com.somemore.domains.community.usecase.comment.CreateCommunityCommentUseCase; -import com.somemore.domains.notification.domain.NotificationSubType; import com.somemore.global.common.event.ServerEventPublisher; -import com.somemore.global.common.event.ServerEventType; import com.somemore.global.exception.BadRequestException; import jakarta.persistence.EntityNotFoundException; import lombok.RequiredArgsConstructor; @@ -39,7 +37,8 @@ public Long createCommunityComment(CommunityCommentCreateRequestDto requestDto, validateParentCommentExists(communityComment.getParentCommentId()); } - publishCommentAddedEvent(communityComment); + publishCommentAddedEvent(communityComment, writerId); + return communityCommentRepository.save(communityComment).getId(); } @@ -55,36 +54,35 @@ private void validateParentCommentExists(Long parentCommentId) { } } - private void publishCommentAddedEvent(CommunityComment communityComment) { + private void publishCommentAddedEvent(CommunityComment communityComment, UUID writerId) { Long parentCommentId = communityComment.getParentCommentId(); - UUID targetVolunteerId = getTargetVolunteerId(communityComment, parentCommentId); + UUID targetUserId = getTargetUserId(communityComment, parentCommentId); + + if (writerId == targetUserId) { + return; + } - CommentAddedEvent event = CommentAddedEvent.builder() - .type(ServerEventType.NOTIFICATION) - .subType(NotificationSubType.COMMENT_ADDED) - .volunteerId(targetVolunteerId) - .communityBoardId(communityComment.getCommunityBoardId()) - .build(); + CommentAddedEvent event = CommentAddedEvent.of(targetUserId, communityComment.getCommunityBoardId()); serverEventPublisher.publish(event); } - private UUID getTargetVolunteerId(CommunityComment communityComment, Long parentCommentId) { - UUID targetVolunteerId; + private UUID getTargetUserId(CommunityComment communityComment, Long parentCommentId) { + UUID targetUserId; if (parentCommentId == null) { - targetVolunteerId = communityBoardRepository.findById(communityComment.getCommunityBoardId()) + targetUserId = communityBoardRepository.findById(communityComment.getCommunityBoardId()) .orElseThrow(EntityNotFoundException::new) .getWriterId(); - return targetVolunteerId; + return targetUserId; } - targetVolunteerId = communityCommentRepository.findById(parentCommentId) + targetUserId = communityCommentRepository.findById(parentCommentId) .map(CommunityComment::getWriterId) .orElse(null); - return targetVolunteerId; + return targetUserId; } } diff --git a/src/main/java/com/somemore/domains/interestcenter/event/domain/InterestCenterCreateRecruitBoardEvent.java b/src/main/java/com/somemore/domains/interestcenter/event/domain/InterestCenterCreateRecruitBoardEvent.java index 92b0e7490..46067cc71 100644 --- a/src/main/java/com/somemore/domains/interestcenter/event/domain/InterestCenterCreateRecruitBoardEvent.java +++ b/src/main/java/com/somemore/domains/interestcenter/event/domain/InterestCenterCreateRecruitBoardEvent.java @@ -3,6 +3,7 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import com.somemore.domains.notification.domain.NotificationSubType; +import com.somemore.domains.recruitboard.event.CreateRecruitBoardEvent; import com.somemore.global.common.event.ServerEvent; import com.somemore.global.common.event.ServerEventType; import lombok.Getter; @@ -29,4 +30,14 @@ public InterestCenterCreateRecruitBoardEvent( this.centerId = centerId; this.recruitBoardId = recruitBoardId; } + + public static InterestCenterCreateRecruitBoardEvent of(CreateRecruitBoardEvent createRecruitBoardEvent, UUID volunteerId, UUID centerId) { + return InterestCenterCreateRecruitBoardEvent.builder() + .type(ServerEventType.NOTIFICATION) + .subType(NotificationSubType.INTEREST_CENTER_CREATE_RECRUIT_BOARD) + .volunteerId(volunteerId) + .centerId(centerId) + .recruitBoardId(createRecruitBoardEvent.getRecruitBoardId()) + .build(); + } } diff --git a/src/main/java/com/somemore/domains/interestcenter/event/handler/CreateRecruitBoardHandlerImpl.java b/src/main/java/com/somemore/domains/interestcenter/event/handler/CreateRecruitBoardHandlerImpl.java index 7f334705b..138fdf323 100644 --- a/src/main/java/com/somemore/domains/interestcenter/event/handler/CreateRecruitBoardHandlerImpl.java +++ b/src/main/java/com/somemore/domains/interestcenter/event/handler/CreateRecruitBoardHandlerImpl.java @@ -2,10 +2,8 @@ import com.somemore.domains.interestcenter.event.domain.InterestCenterCreateRecruitBoardEvent; import com.somemore.domains.interestcenter.usecase.InterestCenterQueryUseCase; -import com.somemore.domains.notification.domain.NotificationSubType; import com.somemore.domains.recruitboard.event.CreateRecruitBoardEvent; import com.somemore.global.common.event.ServerEventPublisher; -import com.somemore.global.common.event.ServerEventType; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; @@ -32,14 +30,7 @@ public void handle(CreateRecruitBoardEvent createRecruitBoardEvent) { } private void publishInterestCenterCreateRecruitBoardEvent(CreateRecruitBoardEvent createRecruitBoardEvent, UUID volunteerId, UUID centerId) { - InterestCenterCreateRecruitBoardEvent event = InterestCenterCreateRecruitBoardEvent.builder() - .type(ServerEventType.NOTIFICATION) - .subType(NotificationSubType.INTEREST_CENTER_CREATE_RECRUIT_BOARD) - .volunteerId(volunteerId) - .centerId(centerId) - .recruitBoardId(createRecruitBoardEvent.getRecruitBoardId()) - .build(); - + InterestCenterCreateRecruitBoardEvent event = InterestCenterCreateRecruitBoardEvent.of(createRecruitBoardEvent, volunteerId, centerId); serverEventPublisher.publish(event); } } diff --git a/src/main/java/com/somemore/domains/notification/controller/NotificationQueryController.java b/src/main/java/com/somemore/domains/notification/controller/NotificationQueryController.java index f9e6ffecd..bbb6b7863 100644 --- a/src/main/java/com/somemore/domains/notification/controller/NotificationQueryController.java +++ b/src/main/java/com/somemore/domains/notification/controller/NotificationQueryController.java @@ -2,7 +2,7 @@ import com.somemore.domains.notification.dto.NotificationResponseDto; import com.somemore.domains.notification.usecase.NotificationQueryUseCase; -import com.somemore.global.auth.annotation.CurrentUser; +import com.somemore.global.auth.annotation.UserId; import com.somemore.global.common.response.ApiResponse; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -27,7 +27,7 @@ public class NotificationQueryController { @Operation(summary = "읽지 않은 알림 조회", description = "읽지 않은 알림들을 조회합니다.") @GetMapping("/unread") public ApiResponse> getUnreadNotifications( - @CurrentUser UUID userId + @UserId UUID userId ) { return ApiResponse.ok(200, notificationQueryUseCase.getUnreadNotifications(userId), @@ -39,7 +39,7 @@ public ApiResponse> getUnreadNotifications( @Operation(summary = "읽은 알림 조회", description = "읽은 알림들을 조회합니다.") @GetMapping("/read") public ApiResponse> getReadNotifications( - @CurrentUser UUID userId + @UserId UUID userId ) { return ApiResponse.ok(200, diff --git a/src/main/java/com/somemore/domains/notification/event/converter/NotificationMessageConverter.java b/src/main/java/com/somemore/domains/notification/event/converter/NotificationMessageConverter.java index 1d5b6efe5..bcf08f1a5 100644 --- a/src/main/java/com/somemore/domains/notification/event/converter/NotificationMessageConverter.java +++ b/src/main/java/com/somemore/domains/notification/event/converter/NotificationMessageConverter.java @@ -3,6 +3,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; +import com.somemore.center.usecase.NEWCenterQueryUseCase; import com.somemore.domains.community.event.CommentAddedEvent; import com.somemore.domains.interestcenter.event.domain.InterestCenterCreateRecruitBoardEvent; import com.somemore.domains.notification.domain.Notification; @@ -11,18 +12,23 @@ import com.somemore.domains.volunteerapply.event.VolunteerApplyEvent; import com.somemore.domains.volunteerapply.event.VolunteerApplyStatusChangeEvent; import com.somemore.domains.volunteerapply.event.VolunteerReviewRequestEvent; +import com.somemore.volunteer.usecase.NEWVolunteerQueryUseCase; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; +import java.util.UUID; + @Slf4j @RequiredArgsConstructor @Component public class NotificationMessageConverter { private final ObjectMapper objectMapper; + private final NEWVolunteerQueryUseCase volunteerQueryUseCase; + private final NEWCenterQueryUseCase centerQueryUseCase; - public static final String SUB_TYPE = "subType"; + private static final String SUB_TYPE = "subType"; public Notification from(String message) { try { @@ -50,8 +56,10 @@ private Notification buildNewNoteNotification(String message) { private Notification buildVolunteerReviewRequestNotification(String message) throws JsonProcessingException { VolunteerReviewRequestEvent event = objectMapper.readValue(message, VolunteerReviewRequestEvent.class); + UUID volunteerUserId = volunteerQueryUseCase.getUserIdById(event.getVolunteerId()); + return Notification.builder() - .receiverId(event.getVolunteerId()) + .receiverId(volunteerUserId) .title(createVolunteerReviewRequestNotificationTitle()) .type(NotificationSubType.VOLUNTEER_REVIEW_REQUEST) .relatedId(event.getRecruitBoardId()) @@ -61,8 +69,10 @@ private Notification buildVolunteerReviewRequestNotification(String message) thr private Notification buildVolunteerApplyStatusChangeNotification(String message) throws JsonProcessingException { VolunteerApplyStatusChangeEvent event = objectMapper.readValue(message, VolunteerApplyStatusChangeEvent.class); + UUID volunteerUserId = volunteerQueryUseCase.getUserIdById(event.getVolunteerId()); + return Notification.builder() - .receiverId(event.getVolunteerId()) + .receiverId(volunteerUserId) .title(createVolunteerApplyStatusChangeNotificationTitle(event.getNewStatus())) .type(NotificationSubType.VOLUNTEER_APPLY_STATUS_CHANGE) .relatedId(event.getRecruitBoardId()) @@ -72,8 +82,10 @@ private Notification buildVolunteerApplyStatusChangeNotification(String message) private Notification buildCommentAddedNotification(String message) throws JsonProcessingException { CommentAddedEvent event = objectMapper.readValue(message, CommentAddedEvent.class); + UUID volunteerUserId = volunteerQueryUseCase.getUserIdById(event.getVolunteerId()); + return Notification.builder() - .receiverId(event.getVolunteerId()) + .receiverId(volunteerUserId) .title(createCommentAddedNotificationTitle()) .type(NotificationSubType.COMMENT_ADDED) .relatedId(event.getCommunityBoardId()) @@ -83,8 +95,10 @@ private Notification buildCommentAddedNotification(String message) throws JsonPr private Notification buildVolunteerApplyNotification(String message) throws JsonProcessingException { VolunteerApplyEvent event = objectMapper.readValue(message, VolunteerApplyEvent.class); + UUID centerUserId = centerQueryUseCase.getUserIdById(event.getCenterId()); + return Notification.builder() - .receiverId(event.getCenterId()) + .receiverId(centerUserId) .title(createVolunteerApplyNotificationTitle()) .type(NotificationSubType.VOLUNTEER_APPLY) .relatedId(event.getRecruitBoardId()) @@ -94,8 +108,10 @@ private Notification buildVolunteerApplyNotification(String message) throws Json private Notification buildInterestCenterCreateRecruitBoardNotification(String message) throws JsonProcessingException { InterestCenterCreateRecruitBoardEvent event = objectMapper.readValue(message, InterestCenterCreateRecruitBoardEvent.class); + UUID volunteerUserId = volunteerQueryUseCase.getUserIdById(event.getVolunteerId()); + return Notification.builder() - .receiverId(event.getVolunteerId()) + .receiverId(volunteerUserId) .title(createInterestCenterCreateRecruitBoardNotificationTitle()) .type(NotificationSubType.INTEREST_CENTER_CREATE_RECRUIT_BOARD) .relatedId(event.getRecruitBoardId()) diff --git a/src/main/java/com/somemore/domains/recruitboard/event/CreateRecruitBoardEvent.java b/src/main/java/com/somemore/domains/recruitboard/event/CreateRecruitBoardEvent.java index c3e79e395..b57e838e4 100644 --- a/src/main/java/com/somemore/domains/recruitboard/event/CreateRecruitBoardEvent.java +++ b/src/main/java/com/somemore/domains/recruitboard/event/CreateRecruitBoardEvent.java @@ -2,6 +2,7 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; +import com.somemore.domains.recruitboard.domain.RecruitBoard; import com.somemore.global.common.event.DomainEventSubType; import com.somemore.global.common.event.ServerEvent; import com.somemore.global.common.event.ServerEventType; @@ -26,4 +27,13 @@ public CreateRecruitBoardEvent( this.centerId = centerId; this.recruitBoardId = recruitBoardId; } + + public static CreateRecruitBoardEvent of(UUID centerId, RecruitBoard recruitBoard) { + return CreateRecruitBoardEvent.builder() + .type(ServerEventType.DOMAIN_EVENT) + .subType(DomainEventSubType.CREATE_RECRUIT_BOARD) + .centerId(centerId) + .recruitBoardId(recruitBoard.getId()) + .build(); + } } diff --git a/src/main/java/com/somemore/domains/recruitboard/service/CreateRecruitBoardService.java b/src/main/java/com/somemore/domains/recruitboard/service/CreateRecruitBoardService.java index cb058775f..d7d22dcfc 100644 --- a/src/main/java/com/somemore/domains/recruitboard/service/CreateRecruitBoardService.java +++ b/src/main/java/com/somemore/domains/recruitboard/service/CreateRecruitBoardService.java @@ -7,9 +7,7 @@ import com.somemore.domains.recruitboard.repository.RecruitBoardRepository; import com.somemore.domains.recruitboard.service.validator.RecruitBoardValidator; import com.somemore.domains.recruitboard.usecase.CreateRecruitBoardUseCase; -import com.somemore.global.common.event.DomainEventSubType; import com.somemore.global.common.event.ServerEventPublisher; -import com.somemore.global.common.event.ServerEventType; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -41,13 +39,7 @@ public Long createRecruitBoard(RecruitBoardCreateRequestDto dto, UUID centerId) } private void publishCreateRecruitBoardEvent(UUID centerId, RecruitBoard recruitBoard) { - CreateRecruitBoardEvent event = CreateRecruitBoardEvent.builder() - .type(ServerEventType.DOMAIN_EVENT) - .subType(DomainEventSubType.CREATE_RECRUIT_BOARD) - .centerId(centerId) - .recruitBoardId(recruitBoard.getId()) - .build(); - + CreateRecruitBoardEvent event = CreateRecruitBoardEvent.of(centerId, recruitBoard); serverEventPublisher.publish(event); } } diff --git a/src/main/java/com/somemore/domains/volunteerapply/event/VolunteerApplyEvent.java b/src/main/java/com/somemore/domains/volunteerapply/event/VolunteerApplyEvent.java index 4a723f115..8271219f7 100644 --- a/src/main/java/com/somemore/domains/volunteerapply/event/VolunteerApplyEvent.java +++ b/src/main/java/com/somemore/domains/volunteerapply/event/VolunteerApplyEvent.java @@ -3,6 +3,8 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import com.somemore.domains.notification.domain.NotificationSubType; +import com.somemore.domains.recruitboard.domain.RecruitBoard; +import com.somemore.domains.volunteerapply.domain.VolunteerApply; import com.somemore.global.common.event.ServerEvent; import com.somemore.global.common.event.ServerEventType; import lombok.Getter; @@ -32,4 +34,15 @@ public VolunteerApplyEvent( this.centerId = centerId; this.recruitBoardId = recruitBoardId; } + + public static VolunteerApplyEvent of(VolunteerApply apply, RecruitBoard board) { + return VolunteerApplyEvent.builder() + .type(ServerEventType.NOTIFICATION) + .subType(NotificationSubType.VOLUNTEER_APPLY) + .volunteerId(apply.getVolunteerId()) + .volunteerApplyId(apply.getId()) + .centerId(board.getCenterId()) + .recruitBoardId(board.getId()) + .build(); + } } diff --git a/src/main/java/com/somemore/domains/volunteerapply/event/VolunteerApplyStatusChangeEvent.java b/src/main/java/com/somemore/domains/volunteerapply/event/VolunteerApplyStatusChangeEvent.java index 4c240bac8..a8e79dcd5 100644 --- a/src/main/java/com/somemore/domains/volunteerapply/event/VolunteerApplyStatusChangeEvent.java +++ b/src/main/java/com/somemore/domains/volunteerapply/event/VolunteerApplyStatusChangeEvent.java @@ -43,7 +43,7 @@ public VolunteerApplyStatusChangeEvent( this.newStatus = newStatus; } - public static VolunteerApplyStatusChangeEvent from(VolunteerApply apply, RecruitBoard recruitBoard, ApplyStatus oldStatus) { + public static VolunteerApplyStatusChangeEvent of(VolunteerApply apply, RecruitBoard recruitBoard, ApplyStatus oldStatus) { return VolunteerApplyStatusChangeEvent.builder() .type(ServerEventType.NOTIFICATION) diff --git a/src/main/java/com/somemore/domains/volunteerapply/event/VolunteerReviewRequestEvent.java b/src/main/java/com/somemore/domains/volunteerapply/event/VolunteerReviewRequestEvent.java index 91d43b643..b77630300 100644 --- a/src/main/java/com/somemore/domains/volunteerapply/event/VolunteerReviewRequestEvent.java +++ b/src/main/java/com/somemore/domains/volunteerapply/event/VolunteerReviewRequestEvent.java @@ -3,6 +3,8 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; import com.somemore.domains.notification.domain.NotificationSubType; +import com.somemore.domains.recruitboard.domain.RecruitBoard; +import com.somemore.domains.volunteerapply.domain.VolunteerApply; import com.somemore.global.common.event.ServerEvent; import com.somemore.global.common.event.ServerEventType; import lombok.Getter; @@ -32,4 +34,15 @@ public VolunteerReviewRequestEvent( this.centerId = centerId; this.recruitBoardId = recruitBoardId; } + + public static VolunteerReviewRequestEvent of(VolunteerApply apply, RecruitBoard recruitBoard) { + return VolunteerReviewRequestEvent.builder() + .type(ServerEventType.NOTIFICATION) + .subType(NotificationSubType.VOLUNTEER_REVIEW_REQUEST) + .volunteerId(apply.getVolunteerId()) + .volunteerApplyId(apply.getId()) + .centerId(recruitBoard.getCenterId()) + .recruitBoardId(recruitBoard.getId()) + .build(); + } } diff --git a/src/main/java/com/somemore/domains/volunteerapply/service/ApplyVolunteerApplyService.java b/src/main/java/com/somemore/domains/volunteerapply/service/ApplyVolunteerApplyService.java index 4a4aa8b30..bc4e382a7 100644 --- a/src/main/java/com/somemore/domains/volunteerapply/service/ApplyVolunteerApplyService.java +++ b/src/main/java/com/somemore/domains/volunteerapply/service/ApplyVolunteerApplyService.java @@ -1,6 +1,5 @@ package com.somemore.domains.volunteerapply.service; -import com.somemore.domains.notification.domain.NotificationSubType; import com.somemore.domains.recruitboard.domain.RecruitBoard; import com.somemore.domains.recruitboard.usecase.RecruitBoardQueryUseCase; import com.somemore.domains.volunteerapply.domain.VolunteerApply; @@ -9,7 +8,6 @@ import com.somemore.domains.volunteerapply.repository.VolunteerApplyRepository; import com.somemore.domains.volunteerapply.usecase.ApplyVolunteerApplyUseCase; import com.somemore.global.common.event.ServerEventPublisher; -import com.somemore.global.common.event.ServerEventType; import com.somemore.global.exception.BadRequestException; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -60,15 +58,7 @@ private void validateDuplicatedApply(UUID volunteerId, RecruitBoard board) { } private void publishVolunteerApplyEvent(VolunteerApply apply, RecruitBoard board) { - VolunteerApplyEvent event = VolunteerApplyEvent.builder() - .type(ServerEventType.NOTIFICATION) - .subType(NotificationSubType.VOLUNTEER_APPLY) - .volunteerId(apply.getVolunteerId()) - .volunteerApplyId(apply.getId()) - .centerId(board.getCenterId()) - .recruitBoardId(board.getId()) - .build(); - + VolunteerApplyEvent event = VolunteerApplyEvent.of(apply, board); serverEventPublisher.publish(event); } } diff --git a/src/main/java/com/somemore/domains/volunteerapply/service/SettleVolunteerApplyFacadeService.java b/src/main/java/com/somemore/domains/volunteerapply/service/SettleVolunteerApplyFacadeService.java index af78eb40c..0f525af29 100644 --- a/src/main/java/com/somemore/domains/volunteerapply/service/SettleVolunteerApplyFacadeService.java +++ b/src/main/java/com/somemore/domains/volunteerapply/service/SettleVolunteerApplyFacadeService.java @@ -1,10 +1,5 @@ package com.somemore.domains.volunteerapply.service; -import static com.somemore.global.exception.ExceptionMessage.RECRUIT_BOARD_ID_MISMATCH; -import static com.somemore.global.exception.ExceptionMessage.UNAUTHORIZED_RECRUIT_BOARD; -import static com.somemore.global.exception.ExceptionMessage.VOLUNTEER_APPLY_LIST_MISMATCH; - -import com.somemore.domains.notification.domain.NotificationSubType; import com.somemore.domains.recruitboard.domain.RecruitBoard; import com.somemore.domains.recruitboard.usecase.RecruitBoardQueryUseCase; import com.somemore.domains.volunteerapply.domain.VolunteerApply; @@ -14,15 +9,19 @@ import com.somemore.domains.volunteerapply.usecase.VolunteerApplyQueryUseCase; import com.somemore.domains.volunteerrecord.event.VolunteerRecordEventPublisher; import com.somemore.global.common.event.ServerEventPublisher; -import com.somemore.global.common.event.ServerEventType; import com.somemore.global.exception.BadRequestException; import com.somemore.volunteer.usecase.UpdateVolunteerUseCase; -import java.util.List; -import java.util.UUID; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.List; +import java.util.UUID; + +import static com.somemore.global.exception.ExceptionMessage.RECRUIT_BOARD_ID_MISMATCH; +import static com.somemore.global.exception.ExceptionMessage.UNAUTHORIZED_RECRUIT_BOARD; +import static com.somemore.global.exception.ExceptionMessage.VOLUNTEER_APPLY_LIST_MISMATCH; + @RequiredArgsConstructor @Transactional @Service @@ -79,17 +78,8 @@ private void validateRecruitBoardConsistency(List applies, } } - private void publishVolunteerReviewRequestEvent(VolunteerApply apply, - RecruitBoard recruitBoard) { - VolunteerReviewRequestEvent event = VolunteerReviewRequestEvent.builder() - .type(ServerEventType.NOTIFICATION) - .subType(NotificationSubType.VOLUNTEER_REVIEW_REQUEST) - .volunteerId(apply.getVolunteerId()) - .volunteerApplyId(apply.getId()) - .centerId(recruitBoard.getCenterId()) - .recruitBoardId(recruitBoard.getId()) - .build(); - + private void publishVolunteerReviewRequestEvent(VolunteerApply apply, RecruitBoard recruitBoard) { + VolunteerReviewRequestEvent event = VolunteerReviewRequestEvent.of(apply, recruitBoard); serverEventPublisher.publish(event); } } diff --git a/src/main/java/com/somemore/domains/volunteerapply/service/VolunteerApplyStatusChangeService.java b/src/main/java/com/somemore/domains/volunteerapply/service/VolunteerApplyStatusChangeService.java index 008e8a061..7b4ab254d 100644 --- a/src/main/java/com/somemore/domains/volunteerapply/service/VolunteerApplyStatusChangeService.java +++ b/src/main/java/com/somemore/domains/volunteerapply/service/VolunteerApplyStatusChangeService.java @@ -79,6 +79,6 @@ private void publishVolunteerApplyStatusChangeEvent(VolunteerApply apply, if (apply.getStatus() == oldStatus) { return; } - serverEventPublisher.publish(VolunteerApplyStatusChangeEvent.from(apply, recruitBoard, oldStatus)); + serverEventPublisher.publish(VolunteerApplyStatusChangeEvent.of(apply, recruitBoard, oldStatus)); } } diff --git a/src/main/java/com/somemore/domains/volunteerrecord/event/VolunteerRecordCreateEvent.java b/src/main/java/com/somemore/domains/volunteerrecord/event/VolunteerRecordCreateEvent.java index 56cbda80f..3b576bb89 100644 --- a/src/main/java/com/somemore/domains/volunteerrecord/event/VolunteerRecordCreateEvent.java +++ b/src/main/java/com/somemore/domains/volunteerrecord/event/VolunteerRecordCreateEvent.java @@ -2,6 +2,8 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; +import com.somemore.domains.recruitboard.domain.RecruitBoard; +import com.somemore.domains.volunteerapply.domain.VolunteerApply; import com.somemore.global.common.event.DomainEventSubType; import com.somemore.global.common.event.ServerEvent; import com.somemore.global.common.event.ServerEventType; @@ -36,4 +38,15 @@ private VolunteerRecordCreateEvent( this.volunteerHours = volunteerHours; } + public static VolunteerRecordCreateEvent of(VolunteerApply apply, RecruitBoard recruitBoard) { + return VolunteerRecordCreateEvent + .builder() + .type(ServerEventType.DOMAIN_EVENT) + .subType(DomainEventSubType.VOLUNTEER_HOURS_SETTLE) + .volunteerId(apply.getVolunteerId()) + .title(recruitBoard.getTitle()) + .volunteerDate(recruitBoard.getRecruitmentInfo().getVolunteerEndDateTime().toLocalDate()) + .volunteerHours(recruitBoard.getRecruitmentInfo().getVolunteerHours()) + .build(); + } } diff --git a/src/main/java/com/somemore/domains/volunteerrecord/event/VolunteerRecordEventPublisher.java b/src/main/java/com/somemore/domains/volunteerrecord/event/VolunteerRecordEventPublisher.java index 373bcb7b9..2e536cb1e 100644 --- a/src/main/java/com/somemore/domains/volunteerrecord/event/VolunteerRecordEventPublisher.java +++ b/src/main/java/com/somemore/domains/volunteerrecord/event/VolunteerRecordEventPublisher.java @@ -2,9 +2,7 @@ import com.somemore.domains.recruitboard.domain.RecruitBoard; import com.somemore.domains.volunteerapply.domain.VolunteerApply; -import com.somemore.global.common.event.DomainEventSubType; import com.somemore.global.common.event.ServerEventPublisher; -import com.somemore.global.common.event.ServerEventType; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; @@ -16,16 +14,7 @@ public class VolunteerRecordEventPublisher { public void publishVolunteerRecordCreateEvent(VolunteerApply apply, RecruitBoard recruitBoard) { - VolunteerRecordCreateEvent event = VolunteerRecordCreateEvent - .builder() - .type(ServerEventType.DOMAIN_EVENT) - .subType(DomainEventSubType.VOLUNTEER_HOURS_SETTLE) - .volunteerId(apply.getVolunteerId()) - .title(recruitBoard.getTitle()) - .volunteerDate(recruitBoard.getRecruitmentInfo().getVolunteerEndDateTime().toLocalDate()) - .volunteerHours(recruitBoard.getRecruitmentInfo().getVolunteerHours()) - .build(); - + VolunteerRecordCreateEvent event = VolunteerRecordCreateEvent.of(apply, recruitBoard); serverEventPublisher.publish(event); } } diff --git a/src/main/java/com/somemore/global/auth/annotation/UserIdArgumentResolver.java b/src/main/java/com/somemore/global/auth/annotation/UserIdArgumentResolver.java index 2c49ba273..ff170573c 100644 --- a/src/main/java/com/somemore/global/auth/annotation/UserIdArgumentResolver.java +++ b/src/main/java/com/somemore/global/auth/annotation/UserIdArgumentResolver.java @@ -35,6 +35,6 @@ public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer m return principal.userId(); } - return new InvalidAuthenticationException(INVALID_PRINCIPAL_TYPE); + throw new InvalidAuthenticationException(INVALID_PRINCIPAL_TYPE); } } diff --git a/src/test/java/com/somemore/domains/interestcenter/handler/CreateRecruitBoardHandlerImplTest.java b/src/test/java/com/somemore/domains/interestcenter/handler/CreateRecruitBoardHandlerImplTest.java index 9a163ef04..991695bd4 100644 --- a/src/test/java/com/somemore/domains/interestcenter/handler/CreateRecruitBoardHandlerImplTest.java +++ b/src/test/java/com/somemore/domains/interestcenter/handler/CreateRecruitBoardHandlerImplTest.java @@ -1,22 +1,32 @@ package com.somemore.domains.interestcenter.handler; +import com.somemore.center.domain.NEWCenter; +import com.somemore.center.repository.NEWCenterRepository; import com.somemore.domains.interestcenter.event.domain.InterestCenterCreateRecruitBoardEvent; import com.somemore.domains.interestcenter.event.handler.CreateRecruitBoardHandlerImpl; import com.somemore.domains.interestcenter.usecase.InterestCenterQueryUseCase; import com.somemore.domains.recruitboard.event.CreateRecruitBoardEvent; +import com.somemore.global.auth.oauth.domain.OAuthProvider; import com.somemore.global.common.event.ServerEventPublisher; import com.somemore.support.IntegrationTestSupport; +import com.somemore.user.domain.User; +import com.somemore.user.domain.UserRole; +import com.somemore.user.dto.UserAuthInfo; +import com.somemore.user.repository.user.UserRepository; +import com.somemore.volunteer.domain.NEWVolunteer; +import com.somemore.volunteer.repository.NEWVolunteerRepository; import org.junit.jupiter.api.Test; import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.transaction.annotation.Transactional; -import java.util.List; -import java.util.UUID; +import java.util.Collections; import static org.mockito.ArgumentMatchers.argThat; -import static org.mockito.Mockito.*; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; @Transactional class CreateRecruitBoardHandlerImplTest extends IntegrationTestSupport { @@ -24,6 +34,15 @@ class CreateRecruitBoardHandlerImplTest extends IntegrationTestSupport { @Autowired private CreateRecruitBoardHandlerImpl createRecruitBoardHandler; + @Autowired + private UserRepository userRepository; + + @Autowired + private NEWVolunteerRepository volunteerRepository; + + @Autowired + private NEWCenterRepository centerRepository; + @MockBean private InterestCenterQueryUseCase interestCenterQueryUseCase; @@ -33,17 +52,26 @@ class CreateRecruitBoardHandlerImplTest extends IntegrationTestSupport { @Test void handle_ShouldPublishEventsForVolunteers() { // given - UUID centerId = UUID.randomUUID(); - UUID volunteerId1 = UUID.randomUUID(); - UUID volunteerId2 = UUID.randomUUID(); - UUID volunteerId3 = UUID.randomUUID(); + UserAuthInfo volunteerUserAuthInfo = UserAuthInfo.createForOAuth(OAuthProvider.NAVER); + User volunteerUser = User.of(volunteerUserAuthInfo, UserRole.VOLUNTEER); + userRepository.save(volunteerUser); + + UserAuthInfo centerUserAuthInfo = UserAuthInfo.createForOAuth(OAuthProvider.NAVER); + User centerUser = User.of(centerUserAuthInfo, UserRole.CENTER); + userRepository.save(centerUser); + + NEWVolunteer volunteer = NEWVolunteer.createDefault(volunteerUser.getId()); + volunteerRepository.save(volunteer); + + NEWCenter center = NEWCenter.createDefault(centerUser.getId()); + centerRepository.save(center); + Long recruitBoardId = 123L; - List volunteerIds = List.of(volunteerId1, volunteerId2, volunteerId3); - when(interestCenterQueryUseCase.getVolunteerIdsByCenterId(centerId)).thenReturn(volunteerIds); + when(interestCenterQueryUseCase.getVolunteerIdsByCenterId(center.getId())).thenReturn(Collections.singletonList(volunteer.getId())); CreateRecruitBoardEvent createRecruitBoardEvent = CreateRecruitBoardEvent.builder() - .centerId(centerId) + .centerId(center.getId()) .recruitBoardId(recruitBoardId) .build(); @@ -51,15 +79,13 @@ void handle_ShouldPublishEventsForVolunteers() { createRecruitBoardHandler.handle(createRecruitBoardEvent); // then - verify(serverEventPublisher, times(volunteerIds.size())).publish(Mockito.any(InterestCenterCreateRecruitBoardEvent.class)); - - for (UUID volunteerId : volunteerIds) { - verify(serverEventPublisher).publish(argThat(event -> - event instanceof InterestCenterCreateRecruitBoardEvent && - ((InterestCenterCreateRecruitBoardEvent) event).getCenterId().equals(centerId) && - ((InterestCenterCreateRecruitBoardEvent) event).getVolunteerId().equals(volunteerId) && - ((InterestCenterCreateRecruitBoardEvent) event).getRecruitBoardId().equals(recruitBoardId) - )); - } + verify(serverEventPublisher, times(1)).publish(Mockito.any(InterestCenterCreateRecruitBoardEvent.class)); + + verify(serverEventPublisher).publish(argThat(event -> + event instanceof InterestCenterCreateRecruitBoardEvent && + ((InterestCenterCreateRecruitBoardEvent) event).getRecruitBoardId().equals(recruitBoardId) && + ((InterestCenterCreateRecruitBoardEvent) event).getVolunteerId().equals(volunteer.getId()) + )); + } } diff --git a/src/test/java/com/somemore/domains/notification/converter/NotificationMessageConverterTest.java b/src/test/java/com/somemore/domains/notification/converter/NotificationMessageConverterTest.java index d32781a3a..3c8c2e5b7 100644 --- a/src/test/java/com/somemore/domains/notification/converter/NotificationMessageConverterTest.java +++ b/src/test/java/com/somemore/domains/notification/converter/NotificationMessageConverterTest.java @@ -1,44 +1,76 @@ package com.somemore.domains.notification.converter; +import com.somemore.center.domain.NEWCenter; +import com.somemore.center.repository.NEWCenterRepository; import com.somemore.domains.notification.domain.Notification; import com.somemore.domains.notification.domain.NotificationSubType; import com.somemore.domains.notification.event.converter.NotificationMessageConverter; +import com.somemore.global.auth.oauth.domain.OAuthProvider; import com.somemore.support.IntegrationTestSupport; +import com.somemore.user.domain.User; +import com.somemore.user.domain.UserRole; +import com.somemore.user.dto.UserAuthInfo; +import com.somemore.user.repository.user.UserRepository; +import com.somemore.volunteer.domain.NEWVolunteer; +import com.somemore.volunteer.repository.NEWVolunteerRepository; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; - -import java.util.UUID; +import org.springframework.transaction.annotation.Transactional; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertThrows; +@Transactional class NotificationMessageConverterTest extends IntegrationTestSupport { @Autowired private NotificationMessageConverter notificationMessageConverter; + @Autowired + private UserRepository userRepository; + + @Autowired + private NEWVolunteerRepository volunteerRepository; + + @Autowired + private NEWCenterRepository centerRepository; + @Test - @DisplayName("VOLUNTEER_REVIEW_REQUEST 메시지를 변환하면 Notification 객체를 반환한다") + @DisplayName("VOLUNTEER_REVIEW_REQUEST 메시지를 변환하면 Notification 객체를 반환한다. 알림 수신자인 volunteerId가 userId로 변환된다.") void testVolunteerReviewRequestConversion() { // given - String message = """ + UserAuthInfo volunteerUserAuthInfo = UserAuthInfo.createForOAuth(OAuthProvider.NAVER); + User volunteerUser = User.of(volunteerUserAuthInfo, UserRole.VOLUNTEER); + userRepository.save(volunteerUser); + + UserAuthInfo centerUserAuthInfo = UserAuthInfo.createForOAuth(OAuthProvider.NAVER); + User centerUser = User.of(centerUserAuthInfo, UserRole.CENTER); + userRepository.save(centerUser); + + NEWVolunteer volunteer = NEWVolunteer.createDefault(volunteerUser.getId()); + volunteerRepository.save(volunteer); + + NEWCenter center = NEWCenter.createDefault(centerUser.getId()); + centerRepository.save(center); + + String message = String.format(""" { "type": "NOTIFICATION", "subType": "VOLUNTEER_REVIEW_REQUEST", - "volunteerId": "123e4567-e89b-12d3-a456-426614174000", + "volunteerId": "%s", "volunteerApplyId": "1", - "centerId": "123e4567-e89b-12d3-a456-426614174001", + "centerId": "%s", "recruitBoardId": 456, "createdAt": "2024-12-05T10:00:00" } - """; + """, volunteer.getId(), center.getId()); // when Notification notification = notificationMessageConverter.from(message); // then - assertThat(notification.getReceiverId()).isEqualTo(UUID.fromString("123e4567-e89b-12d3-a456-426614174000")); + assertThat(notification.getReceiverId()).isEqualTo(volunteer.getUserId()); assertThat(notification.getTitle()).isEqualTo("최근 활동하신 활동의 후기를 작성해 주세요!"); assertThat(notification.getType()).isEqualTo(NotificationSubType.VOLUNTEER_REVIEW_REQUEST); assertThat(notification.getRelatedId()).isEqualTo(456L); @@ -48,7 +80,21 @@ void testVolunteerReviewRequestConversion() { @DisplayName("임의의 필드가 추가된 VOLUNTEER_APPLY_STATUS_CHANGE 메시지를 변환해도 Notification 객체를 반환한다") void testVolunteerApplyStatusChangeConversion() { // given - String message = """ + UserAuthInfo volunteerUserAuthInfo = UserAuthInfo.createForOAuth(OAuthProvider.NAVER); + User volunteerUser = User.of(volunteerUserAuthInfo, UserRole.VOLUNTEER); + userRepository.save(volunteerUser); + + UserAuthInfo centerUserAuthInfo = UserAuthInfo.createForOAuth(OAuthProvider.NAVER); + User centerUser = User.of(centerUserAuthInfo, UserRole.CENTER); + userRepository.save(centerUser); + + NEWVolunteer volunteer = NEWVolunteer.createDefault(volunteerUser.getId()); + volunteerRepository.save(volunteer); + + NEWCenter center = NEWCenter.createDefault(centerUser.getId()); + centerRepository.save(center); + + String message = String.format(""" { "extraField": "this should be ignored", "extraField": "this should be ignored", @@ -57,21 +103,21 @@ void testVolunteerApplyStatusChangeConversion() { "extraField": "this should be ignored", "type": "NOTIFICATION", "subType": "VOLUNTEER_APPLY_STATUS_CHANGE", - "volunteerId": "123e4567-e89b-12d3-a456-426614174000", - "centerId": "123e4567-e89b-12d3-a456-426614174001", + "volunteerId": "%s", + "centerId": "%s", "volunteerApplyId": "1", "recruitBoardId": 456, "oldStatus": "WAITING", "newStatus": "APPROVED", "createdAt": "2024-12-05T10:00:00" } - """; + """, volunteer.getId(), center.getId()); // when Notification notification = notificationMessageConverter.from(message); // then - assertThat(notification.getReceiverId()).isEqualTo(UUID.fromString("123e4567-e89b-12d3-a456-426614174000")); + assertThat(notification.getReceiverId()).isEqualTo(volunteer.getUserId()); assertThat(notification.getTitle()).isEqualTo("봉사 활동 신청이 승인되었습니다."); assertThat(notification.getType()).isEqualTo(NotificationSubType.VOLUNTEER_APPLY_STATUS_CHANGE); assertThat(notification.getRelatedId()).isEqualTo(456L); @@ -81,22 +127,36 @@ void testVolunteerApplyStatusChangeConversion() { @DisplayName("INTEREST_CENTER_CREATE_RECRUIT_BOARD 메시지를 변환하면 Notification 객체를 반환한다. ") void testBuildInterestCenterCreateRecruitBoardNotification() { // given - String message = """ + UserAuthInfo volunteerUserAuthInfo = UserAuthInfo.createForOAuth(OAuthProvider.NAVER); + User volunteerUser = User.of(volunteerUserAuthInfo, UserRole.VOLUNTEER); + userRepository.save(volunteerUser); + + UserAuthInfo centerUserAuthInfo = UserAuthInfo.createForOAuth(OAuthProvider.NAVER); + User centerUser = User.of(centerUserAuthInfo, UserRole.CENTER); + userRepository.save(centerUser); + + NEWVolunteer volunteer = NEWVolunteer.createDefault(volunteerUser.getId()); + volunteerRepository.save(volunteer); + + NEWCenter center = NEWCenter.createDefault(centerUser.getId()); + centerRepository.save(center); + + String message = String.format(""" { "type": "NOTIFICATION", "subType": "INTEREST_CENTER_CREATE_RECRUIT_BOARD", - "volunteerId": "123e4567-e89b-12d3-a456-426614174000", - "centerId": "123e4567-e89b-12d3-a456-426614174001", + "volunteerId": "%s", + "centerId": "%s", "recruitBoardId": 456, "createdAt": "2024-12-05T10:00:00" } - """; + """, volunteer.getId(), center.getId()); // when Notification notification = notificationMessageConverter.from(message); // then - assertThat(notification.getReceiverId()).isEqualTo(UUID.fromString("123e4567-e89b-12d3-a456-426614174000")); + assertThat(notification.getReceiverId()).isEqualTo(volunteer.getUserId()); assertThat(notification.getTitle()).isEqualTo("관심 기관이 봉사 모집을 등록했습니다."); assertThat(notification.getType()).isEqualTo(NotificationSubType.INTEREST_CENTER_CREATE_RECRUIT_BOARD); assertThat(notification.getRelatedId()).isEqualTo(456L); diff --git a/src/test/java/com/somemore/domains/notification/handler/NotificationHandlerTest.java b/src/test/java/com/somemore/domains/notification/handler/NotificationHandlerTest.java index 2e7832346..5ea8a7e56 100644 --- a/src/test/java/com/somemore/domains/notification/handler/NotificationHandlerTest.java +++ b/src/test/java/com/somemore/domains/notification/handler/NotificationHandlerTest.java @@ -1,18 +1,26 @@ package com.somemore.domains.notification.handler; +import com.somemore.center.domain.NEWCenter; +import com.somemore.center.repository.NEWCenterRepository; import com.somemore.domains.notification.domain.Notification; import com.somemore.domains.notification.domain.NotificationSubType; import com.somemore.domains.notification.event.converter.NotificationMessageConverter; import com.somemore.domains.notification.event.handler.NotificationHandlerImpl; import com.somemore.domains.notification.repository.NotificationRepository; +import com.somemore.global.auth.oauth.domain.OAuthProvider; import com.somemore.support.IntegrationTestSupport; +import com.somemore.user.domain.User; +import com.somemore.user.domain.UserRole; +import com.somemore.user.dto.UserAuthInfo; +import com.somemore.user.repository.user.UserRepository; +import com.somemore.volunteer.domain.NEWVolunteer; +import com.somemore.volunteer.repository.NEWVolunteerRepository; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import java.util.List; -import java.util.UUID; import static org.assertj.core.api.Assertions.assertThat; @@ -28,36 +36,58 @@ class NotificationHandlerTest extends IntegrationTestSupport { @Autowired private NotificationRepository notificationRepository; + @Autowired + private UserRepository userRepository; + + @Autowired + private NEWVolunteerRepository volunteerRepository; + + @Autowired + private NEWCenterRepository centerRepository; + @Test @DisplayName("handle 호출 시 Notification이 저장된다") void handle() { + // given - String message = """ + UserAuthInfo volunteerUserAuthInfo = UserAuthInfo.createForOAuth(OAuthProvider.NAVER); + User volunteerUser = User.of(volunteerUserAuthInfo, UserRole.VOLUNTEER); + userRepository.save(volunteerUser); + + UserAuthInfo centerUserAuthInfo = UserAuthInfo.createForOAuth(OAuthProvider.NAVER); + User centerUser = User.of(centerUserAuthInfo, UserRole.CENTER); + userRepository.save(centerUser); + + NEWVolunteer volunteer = NEWVolunteer.createDefault(volunteerUser.getId()); + volunteerRepository.save(volunteer); + + NEWCenter center = NEWCenter.createDefault(centerUser.getId()); + centerRepository.save(center); + + String message = String.format(""" { "type": "NOTIFICATION", "subType": "VOLUNTEER_APPLY_STATUS_CHANGE", - "volunteerId": "123e4567-e89b-12d3-a456-426614174000", + "volunteerId": "%s", "volunteerApplyId": 123, - "centerId": "123e4567-e89b-12d3-a456-426614174001", + "centerId": "%s", "recruitBoardId": 456, "oldStatus": "WAITING", "newStatus": "APPROVED", "createdAt": "2024-12-05T10:00:00" } - """; - - UUID receiverId = UUID.fromString("123e4567-e89b-12d3-a456-426614174000"); + """, volunteer.getId(), center.getId()); Notification notification = notificationMessageConverter.from(message); // when notificationHandler.handle(notification); // then - List notifications = notificationRepository.findAllByUserId(receiverId); + List notifications = notificationRepository.findAllByUserId(volunteerUser.getId()); assertThat(notifications).hasSize(1); Notification savedNotification = notifications.getFirst(); - assertThat(savedNotification.getReceiverId()).isEqualTo(receiverId); + assertThat(savedNotification.getReceiverId()).isEqualTo(volunteerUser.getId()); assertThat(savedNotification.getTitle()).isEqualTo("봉사 활동 신청이 승인되었습니다."); assertThat(savedNotification.getType()).isEqualTo(NotificationSubType.VOLUNTEER_APPLY_STATUS_CHANGE); assertThat(savedNotification.getRelatedId()).isEqualTo(456L); // 프론트 요구사항: 123L(봉사신청아이디), 456L(모집글아이디)