Skip to content

Commit 58396fb

Browse files
authored
[REFACTOR] 유저 테이블 변경에 따른 알림 로직 변경 및 개선 (#362)
* fix: 오타 수정 * feat: receiverId로 userId 사용 * feat(center): centerId로 userId 조회 추가 * feat(comment): 로직개선, 댓글 작성자와 알림을 받을 사람이 같으면 알림 생성 취소 * refactor(interestCenter): 정적 팩토리 메서드 추가 * refactor(recruitBoard): 정적 팩토리 메서드 추가 * refactor(volunteerApply): 정적 팩토리 메서드 추가 * refactor: 정적 팩토리 메서드 추가 * test: 테스트 개선 * test: 유저 리팩토링 테스트에 적용 * refactor: 올바른 어노테이션으로 변경
1 parent fa61cac commit 58396fb

22 files changed

+297
-137
lines changed

src/main/java/com/somemore/center/service/NEWCenterQueryService.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,13 @@ public UUID getIdByUserId(UUID userId) {
4040
return getByUserId(userId).getId();
4141
}
4242

43+
@Override
44+
public UUID getUserIdById(UUID centerId) {
45+
return centerRepository.findById(centerId)
46+
.orElseThrow(() -> new NoSuchElementException(ExceptionMessage.NOT_EXISTS_CENTER))
47+
.getUserId();
48+
}
49+
4350
@Override
4451
public CenterProfileResponseDto getCenterProfileById(UUID centerId) {
4552

src/main/java/com/somemore/center/usecase/NEWCenterQueryUseCase.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ public interface NEWCenterQueryUseCase {
1212

1313
UUID getIdByUserId(UUID userId);
1414

15+
UUID getUserIdById(UUID centerId);
16+
1517
CenterProfileResponseDto getCenterProfileById(UUID centerId);
1618

1719
void validateCenterExists(UUID id);

src/main/java/com/somemore/domains/community/event/CommentAddedEvent.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,13 @@ public CommentAddedEvent(
2727
this.volunteerId = volunteerId;
2828
this.communityBoardId = communityBoardId;
2929
}
30+
31+
public static CommentAddedEvent of(UUID targetUserId, Long communityBoardId) {
32+
return CommentAddedEvent.builder()
33+
.type(ServerEventType.NOTIFICATION)
34+
.subType(NotificationSubType.COMMENT_ADDED)
35+
.volunteerId(targetUserId)
36+
.communityBoardId(communityBoardId)
37+
.build();
38+
}
3039
}

src/main/java/com/somemore/domains/community/service/comment/CreateCommunityCommentService.java

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,7 @@
66
import com.somemore.domains.community.repository.board.CommunityBoardRepository;
77
import com.somemore.domains.community.repository.comment.CommunityCommentRepository;
88
import com.somemore.domains.community.usecase.comment.CreateCommunityCommentUseCase;
9-
import com.somemore.domains.notification.domain.NotificationSubType;
109
import com.somemore.global.common.event.ServerEventPublisher;
11-
import com.somemore.global.common.event.ServerEventType;
1210
import com.somemore.global.exception.BadRequestException;
1311
import jakarta.persistence.EntityNotFoundException;
1412
import lombok.RequiredArgsConstructor;
@@ -39,7 +37,8 @@ public Long createCommunityComment(CommunityCommentCreateRequestDto requestDto,
3937
validateParentCommentExists(communityComment.getParentCommentId());
4038
}
4139

42-
publishCommentAddedEvent(communityComment);
40+
publishCommentAddedEvent(communityComment, writerId);
41+
4342
return communityCommentRepository.save(communityComment).getId();
4443
}
4544

@@ -55,36 +54,35 @@ private void validateParentCommentExists(Long parentCommentId) {
5554
}
5655
}
5756

58-
private void publishCommentAddedEvent(CommunityComment communityComment) {
57+
private void publishCommentAddedEvent(CommunityComment communityComment, UUID writerId) {
5958
Long parentCommentId = communityComment.getParentCommentId();
6059

61-
UUID targetVolunteerId = getTargetVolunteerId(communityComment, parentCommentId);
60+
UUID targetUserId = getTargetUserId(communityComment, parentCommentId);
61+
62+
if (writerId == targetUserId) {
63+
return;
64+
}
6265

63-
CommentAddedEvent event = CommentAddedEvent.builder()
64-
.type(ServerEventType.NOTIFICATION)
65-
.subType(NotificationSubType.COMMENT_ADDED)
66-
.volunteerId(targetVolunteerId)
67-
.communityBoardId(communityComment.getCommunityBoardId())
68-
.build();
66+
CommentAddedEvent event = CommentAddedEvent.of(targetUserId, communityComment.getCommunityBoardId());
6967

7068
serverEventPublisher.publish(event);
7169
}
7270

73-
private UUID getTargetVolunteerId(CommunityComment communityComment, Long parentCommentId) {
74-
UUID targetVolunteerId;
71+
private UUID getTargetUserId(CommunityComment communityComment, Long parentCommentId) {
72+
UUID targetUserId;
7573

7674
if (parentCommentId == null) {
77-
targetVolunteerId = communityBoardRepository.findById(communityComment.getCommunityBoardId())
75+
targetUserId = communityBoardRepository.findById(communityComment.getCommunityBoardId())
7876
.orElseThrow(EntityNotFoundException::new)
7977
.getWriterId();
8078

81-
return targetVolunteerId;
79+
return targetUserId;
8280
}
8381

84-
targetVolunteerId = communityCommentRepository.findById(parentCommentId)
82+
targetUserId = communityCommentRepository.findById(parentCommentId)
8583
.map(CommunityComment::getWriterId)
8684
.orElse(null);
8785

88-
return targetVolunteerId;
86+
return targetUserId;
8987
}
9088
}

src/main/java/com/somemore/domains/interestcenter/event/domain/InterestCenterCreateRecruitBoardEvent.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.fasterxml.jackson.annotation.JsonCreator;
44
import com.fasterxml.jackson.annotation.JsonProperty;
55
import com.somemore.domains.notification.domain.NotificationSubType;
6+
import com.somemore.domains.recruitboard.event.CreateRecruitBoardEvent;
67
import com.somemore.global.common.event.ServerEvent;
78
import com.somemore.global.common.event.ServerEventType;
89
import lombok.Getter;
@@ -29,4 +30,14 @@ public InterestCenterCreateRecruitBoardEvent(
2930
this.centerId = centerId;
3031
this.recruitBoardId = recruitBoardId;
3132
}
33+
34+
public static InterestCenterCreateRecruitBoardEvent of(CreateRecruitBoardEvent createRecruitBoardEvent, UUID volunteerId, UUID centerId) {
35+
return InterestCenterCreateRecruitBoardEvent.builder()
36+
.type(ServerEventType.NOTIFICATION)
37+
.subType(NotificationSubType.INTEREST_CENTER_CREATE_RECRUIT_BOARD)
38+
.volunteerId(volunteerId)
39+
.centerId(centerId)
40+
.recruitBoardId(createRecruitBoardEvent.getRecruitBoardId())
41+
.build();
42+
}
3243
}

src/main/java/com/somemore/domains/interestcenter/event/handler/CreateRecruitBoardHandlerImpl.java

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,8 @@
22

33
import com.somemore.domains.interestcenter.event.domain.InterestCenterCreateRecruitBoardEvent;
44
import com.somemore.domains.interestcenter.usecase.InterestCenterQueryUseCase;
5-
import com.somemore.domains.notification.domain.NotificationSubType;
65
import com.somemore.domains.recruitboard.event.CreateRecruitBoardEvent;
76
import com.somemore.global.common.event.ServerEventPublisher;
8-
import com.somemore.global.common.event.ServerEventType;
97
import lombok.RequiredArgsConstructor;
108
import org.springframework.stereotype.Component;
119
import org.springframework.transaction.annotation.Transactional;
@@ -32,14 +30,7 @@ public void handle(CreateRecruitBoardEvent createRecruitBoardEvent) {
3230
}
3331

3432
private void publishInterestCenterCreateRecruitBoardEvent(CreateRecruitBoardEvent createRecruitBoardEvent, UUID volunteerId, UUID centerId) {
35-
InterestCenterCreateRecruitBoardEvent event = InterestCenterCreateRecruitBoardEvent.builder()
36-
.type(ServerEventType.NOTIFICATION)
37-
.subType(NotificationSubType.INTEREST_CENTER_CREATE_RECRUIT_BOARD)
38-
.volunteerId(volunteerId)
39-
.centerId(centerId)
40-
.recruitBoardId(createRecruitBoardEvent.getRecruitBoardId())
41-
.build();
42-
33+
InterestCenterCreateRecruitBoardEvent event = InterestCenterCreateRecruitBoardEvent.of(createRecruitBoardEvent, volunteerId, centerId);
4334
serverEventPublisher.publish(event);
4435
}
4536
}

src/main/java/com/somemore/domains/notification/controller/NotificationQueryController.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import com.somemore.domains.notification.dto.NotificationResponseDto;
44
import com.somemore.domains.notification.usecase.NotificationQueryUseCase;
5-
import com.somemore.global.auth.annotation.CurrentUser;
5+
import com.somemore.global.auth.annotation.UserId;
66
import com.somemore.global.common.response.ApiResponse;
77
import io.swagger.v3.oas.annotations.Operation;
88
import io.swagger.v3.oas.annotations.tags.Tag;
@@ -27,7 +27,7 @@ public class NotificationQueryController {
2727
@Operation(summary = "읽지 않은 알림 조회", description = "읽지 않은 알림들을 조회합니다.")
2828
@GetMapping("/unread")
2929
public ApiResponse<List<NotificationResponseDto>> getUnreadNotifications(
30-
@CurrentUser UUID userId
30+
@UserId UUID userId
3131
) {
3232
return ApiResponse.ok(200,
3333
notificationQueryUseCase.getUnreadNotifications(userId),
@@ -39,7 +39,7 @@ public ApiResponse<List<NotificationResponseDto>> getUnreadNotifications(
3939
@Operation(summary = "읽은 알림 조회", description = "읽은 알림들을 조회합니다.")
4040
@GetMapping("/read")
4141
public ApiResponse<List<NotificationResponseDto>> getReadNotifications(
42-
@CurrentUser UUID userId
42+
@UserId UUID userId
4343
) {
4444

4545
return ApiResponse.ok(200,

src/main/java/com/somemore/domains/notification/event/converter/NotificationMessageConverter.java

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.fasterxml.jackson.core.JsonProcessingException;
44
import com.fasterxml.jackson.databind.JsonNode;
55
import com.fasterxml.jackson.databind.ObjectMapper;
6+
import com.somemore.center.usecase.NEWCenterQueryUseCase;
67
import com.somemore.domains.community.event.CommentAddedEvent;
78
import com.somemore.domains.interestcenter.event.domain.InterestCenterCreateRecruitBoardEvent;
89
import com.somemore.domains.notification.domain.Notification;
@@ -11,18 +12,23 @@
1112
import com.somemore.domains.volunteerapply.event.VolunteerApplyEvent;
1213
import com.somemore.domains.volunteerapply.event.VolunteerApplyStatusChangeEvent;
1314
import com.somemore.domains.volunteerapply.event.VolunteerReviewRequestEvent;
15+
import com.somemore.volunteer.usecase.NEWVolunteerQueryUseCase;
1416
import lombok.RequiredArgsConstructor;
1517
import lombok.extern.slf4j.Slf4j;
1618
import org.springframework.stereotype.Component;
1719

20+
import java.util.UUID;
21+
1822
@Slf4j
1923
@RequiredArgsConstructor
2024
@Component
2125
public class NotificationMessageConverter {
2226

2327
private final ObjectMapper objectMapper;
28+
private final NEWVolunteerQueryUseCase volunteerQueryUseCase;
29+
private final NEWCenterQueryUseCase centerQueryUseCase;
2430

25-
public static final String SUB_TYPE = "subType";
31+
private static final String SUB_TYPE = "subType";
2632

2733
public Notification from(String message) {
2834
try {
@@ -50,8 +56,10 @@ private Notification buildNewNoteNotification(String message) {
5056
private Notification buildVolunteerReviewRequestNotification(String message) throws JsonProcessingException {
5157
VolunteerReviewRequestEvent event = objectMapper.readValue(message, VolunteerReviewRequestEvent.class);
5258

59+
UUID volunteerUserId = volunteerQueryUseCase.getUserIdById(event.getVolunteerId());
60+
5361
return Notification.builder()
54-
.receiverId(event.getVolunteerId())
62+
.receiverId(volunteerUserId)
5563
.title(createVolunteerReviewRequestNotificationTitle())
5664
.type(NotificationSubType.VOLUNTEER_REVIEW_REQUEST)
5765
.relatedId(event.getRecruitBoardId())
@@ -61,8 +69,10 @@ private Notification buildVolunteerReviewRequestNotification(String message) thr
6169
private Notification buildVolunteerApplyStatusChangeNotification(String message) throws JsonProcessingException {
6270
VolunteerApplyStatusChangeEvent event = objectMapper.readValue(message, VolunteerApplyStatusChangeEvent.class);
6371

72+
UUID volunteerUserId = volunteerQueryUseCase.getUserIdById(event.getVolunteerId());
73+
6474
return Notification.builder()
65-
.receiverId(event.getVolunteerId())
75+
.receiverId(volunteerUserId)
6676
.title(createVolunteerApplyStatusChangeNotificationTitle(event.getNewStatus()))
6777
.type(NotificationSubType.VOLUNTEER_APPLY_STATUS_CHANGE)
6878
.relatedId(event.getRecruitBoardId())
@@ -72,8 +82,10 @@ private Notification buildVolunteerApplyStatusChangeNotification(String message)
7282
private Notification buildCommentAddedNotification(String message) throws JsonProcessingException {
7383
CommentAddedEvent event = objectMapper.readValue(message, CommentAddedEvent.class);
7484

85+
UUID volunteerUserId = volunteerQueryUseCase.getUserIdById(event.getVolunteerId());
86+
7587
return Notification.builder()
76-
.receiverId(event.getVolunteerId())
88+
.receiverId(volunteerUserId)
7789
.title(createCommentAddedNotificationTitle())
7890
.type(NotificationSubType.COMMENT_ADDED)
7991
.relatedId(event.getCommunityBoardId())
@@ -83,8 +95,10 @@ private Notification buildCommentAddedNotification(String message) throws JsonPr
8395
private Notification buildVolunteerApplyNotification(String message) throws JsonProcessingException {
8496
VolunteerApplyEvent event = objectMapper.readValue(message, VolunteerApplyEvent.class);
8597

98+
UUID centerUserId = centerQueryUseCase.getUserIdById(event.getCenterId());
99+
86100
return Notification.builder()
87-
.receiverId(event.getCenterId())
101+
.receiverId(centerUserId)
88102
.title(createVolunteerApplyNotificationTitle())
89103
.type(NotificationSubType.VOLUNTEER_APPLY)
90104
.relatedId(event.getRecruitBoardId())
@@ -94,8 +108,10 @@ private Notification buildVolunteerApplyNotification(String message) throws Json
94108
private Notification buildInterestCenterCreateRecruitBoardNotification(String message) throws JsonProcessingException {
95109
InterestCenterCreateRecruitBoardEvent event = objectMapper.readValue(message, InterestCenterCreateRecruitBoardEvent.class);
96110

111+
UUID volunteerUserId = volunteerQueryUseCase.getUserIdById(event.getVolunteerId());
112+
97113
return Notification.builder()
98-
.receiverId(event.getVolunteerId())
114+
.receiverId(volunteerUserId)
99115
.title(createInterestCenterCreateRecruitBoardNotificationTitle())
100116
.type(NotificationSubType.INTEREST_CENTER_CREATE_RECRUIT_BOARD)
101117
.relatedId(event.getRecruitBoardId())

src/main/java/com/somemore/domains/recruitboard/event/CreateRecruitBoardEvent.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.fasterxml.jackson.annotation.JsonCreator;
44
import com.fasterxml.jackson.annotation.JsonProperty;
5+
import com.somemore.domains.recruitboard.domain.RecruitBoard;
56
import com.somemore.global.common.event.DomainEventSubType;
67
import com.somemore.global.common.event.ServerEvent;
78
import com.somemore.global.common.event.ServerEventType;
@@ -26,4 +27,13 @@ public CreateRecruitBoardEvent(
2627
this.centerId = centerId;
2728
this.recruitBoardId = recruitBoardId;
2829
}
30+
31+
public static CreateRecruitBoardEvent of(UUID centerId, RecruitBoard recruitBoard) {
32+
return CreateRecruitBoardEvent.builder()
33+
.type(ServerEventType.DOMAIN_EVENT)
34+
.subType(DomainEventSubType.CREATE_RECRUIT_BOARD)
35+
.centerId(centerId)
36+
.recruitBoardId(recruitBoard.getId())
37+
.build();
38+
}
2939
}

src/main/java/com/somemore/domains/recruitboard/service/CreateRecruitBoardService.java

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,7 @@
77
import com.somemore.domains.recruitboard.repository.RecruitBoardRepository;
88
import com.somemore.domains.recruitboard.service.validator.RecruitBoardValidator;
99
import com.somemore.domains.recruitboard.usecase.CreateRecruitBoardUseCase;
10-
import com.somemore.global.common.event.DomainEventSubType;
1110
import com.somemore.global.common.event.ServerEventPublisher;
12-
import com.somemore.global.common.event.ServerEventType;
1311
import lombok.RequiredArgsConstructor;
1412
import org.springframework.stereotype.Service;
1513
import org.springframework.transaction.annotation.Transactional;
@@ -41,13 +39,7 @@ public Long createRecruitBoard(RecruitBoardCreateRequestDto dto, UUID centerId)
4139
}
4240

4341
private void publishCreateRecruitBoardEvent(UUID centerId, RecruitBoard recruitBoard) {
44-
CreateRecruitBoardEvent event = CreateRecruitBoardEvent.builder()
45-
.type(ServerEventType.DOMAIN_EVENT)
46-
.subType(DomainEventSubType.CREATE_RECRUIT_BOARD)
47-
.centerId(centerId)
48-
.recruitBoardId(recruitBoard.getId())
49-
.build();
50-
42+
CreateRecruitBoardEvent event = CreateRecruitBoardEvent.of(centerId, recruitBoard);
5143
serverEventPublisher.publish(event);
5244
}
5345
}

0 commit comments

Comments
 (0)