Skip to content

Commit cf0532b

Browse files
authored
Refactor/#35 팔로우 기능의 메인 로직과 푸시 알림 로직을 event 적용 및 비동기 처리 (#36)
* feat: 팔로우 신청 및 수락용 event 추가 * feat: push 알림 이벤트용 리스너 추가 * refactor: 푸시 알림 이벤트를 발행하도록 수정
1 parent f942ef9 commit cf0532b

File tree

4 files changed

+176
-75
lines changed

4 files changed

+176
-75
lines changed
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.vp.voicepocket.domain.friend.event;
2+
3+
import com.vp.voicepocket.domain.friend.entity.Friend;
4+
import lombok.AllArgsConstructor;
5+
import lombok.Getter;
6+
7+
@Getter
8+
@AllArgsConstructor
9+
public class FriendAcceptPushEvent {
10+
private Friend friend;
11+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.vp.voicepocket.domain.friend.event;
2+
3+
import com.vp.voicepocket.domain.friend.entity.Friend;
4+
import lombok.AllArgsConstructor;
5+
import lombok.Getter;
6+
7+
@Getter
8+
@AllArgsConstructor
9+
public class FriendRequestPushEvent {
10+
private Friend friend;
11+
}
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
package com.vp.voicepocket.domain.friend.event;
2+
3+
import com.google.firebase.messaging.FirebaseMessaging;
4+
import com.google.firebase.messaging.FirebaseMessagingException;
5+
import com.google.firebase.messaging.Message;
6+
import com.google.firebase.messaging.Notification;
7+
import com.vp.voicepocket.domain.firebase.entity.FCMUserToken;
8+
import com.vp.voicepocket.domain.firebase.exception.CFCMTokenNotFoundException;
9+
import com.vp.voicepocket.domain.firebase.repository.FCMRepository;
10+
import com.vp.voicepocket.domain.user.entity.User;
11+
import lombok.RequiredArgsConstructor;
12+
import lombok.extern.slf4j.Slf4j;
13+
import org.springframework.scheduling.annotation.Async;
14+
import org.springframework.stereotype.Component;
15+
import org.springframework.transaction.annotation.Propagation;
16+
import org.springframework.transaction.annotation.Transactional;
17+
import org.springframework.transaction.event.TransactionPhase;
18+
import org.springframework.transaction.event.TransactionalEventListener;
19+
20+
import java.util.HashMap;
21+
22+
@Slf4j
23+
@Component
24+
@RequiredArgsConstructor
25+
public class PushEventListener {
26+
private final FirebaseMessaging firebaseMessaging;
27+
private final FCMRepository fcmRepository;
28+
29+
@Async
30+
@Transactional(propagation = Propagation.REQUIRES_NEW)
31+
@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
32+
public void sendFriendRequestPushMessage(FriendRequestPushEvent friendRequestPushEvent) {
33+
User toUser = friendRequestPushEvent.getFriend().getRequest_to();
34+
User fromUser = friendRequestPushEvent.getFriend().getRequest_from();
35+
36+
FCMUserToken fcmEntity = fcmRepository.findByUserId(toUser)
37+
.orElseThrow(CFCMTokenNotFoundException::new);
38+
String fcmToken = fcmEntity.getFireBaseToken();
39+
40+
try {
41+
Message message = getFriendRequestPushMessage(fromUser.getName(), fcmToken);
42+
firebaseMessaging.send(message);
43+
} catch (FirebaseMessagingException e) {
44+
log.error("PUSH NOTIFICATION ERROR: {}", e.getMessage());
45+
}
46+
}
47+
48+
@Async
49+
@Transactional(propagation = Propagation.REQUIRES_NEW)
50+
@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
51+
public void sendFriendAcceptPushMessage(FriendAcceptPushEvent friendAcceptPushEvent) {
52+
User toUser = friendAcceptPushEvent.getFriend().getRequest_to();
53+
User fromUser = friendAcceptPushEvent.getFriend().getRequest_from();
54+
55+
FCMUserToken fcmEntity = fcmRepository.findByUserId(fromUser)
56+
.orElseThrow(CFCMTokenNotFoundException::new);
57+
String fcmToken = fcmEntity.getFireBaseToken();
58+
59+
try {
60+
Message message = getFriendAcceptPushMessage(toUser.getName(), fcmToken);
61+
firebaseMessaging.send(message);
62+
} catch (FirebaseMessagingException e) {
63+
log.error("PUSH NOTIFICATION ERROR: {}", e.getMessage());
64+
}
65+
}
66+
67+
private Message getFriendRequestPushMessage(String fromUserName, String fcmToken) {
68+
Notification notification = Notification.builder()
69+
.setTitle("Friend Request")
70+
.setBody(fromUserName + " request Friend to you!")
71+
.build();
72+
73+
HashMap<String, String> data = new HashMap<>();
74+
data.put("ID", "1");
75+
76+
return Message.builder()
77+
.setToken(fcmToken)
78+
.setNotification(notification)
79+
.putAllData(data)
80+
.build();
81+
}
82+
83+
private Message getFriendAcceptPushMessage(String toUserName, String fcmToken) {
84+
Notification notification = Notification.builder()
85+
.setTitle("Friend Accept")
86+
.setBody(toUserName + " Accept your Friend Request!")
87+
.build();
88+
89+
HashMap<String, String> data = new HashMap<>();
90+
data.put("ID", "2");
91+
92+
return Message.builder()
93+
.setToken(fcmToken)
94+
.setNotification(notification)
95+
.putAllData(data)
96+
.build();
97+
}
98+
}
Lines changed: 56 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,11 @@
11
package com.vp.voicepocket.domain.friend.service;
22

3-
import com.vp.voicepocket.domain.firebase.dto.FCMNotificationRequestDto;
4-
import com.vp.voicepocket.domain.firebase.entity.FCMUserToken;
5-
import com.vp.voicepocket.domain.firebase.exception.CFCMTokenNotFoundException;
6-
import com.vp.voicepocket.domain.firebase.repository.FCMRepository;
7-
import com.vp.voicepocket.domain.firebase.service.FCMNotificationService;
83
import com.vp.voicepocket.domain.friend.dto.request.FriendRequestDto;
94
import com.vp.voicepocket.domain.friend.dto.response.FriendResponseDto;
105
import com.vp.voicepocket.domain.friend.entity.Friend;
116
import com.vp.voicepocket.domain.friend.entity.Status;
7+
import com.vp.voicepocket.domain.friend.event.FriendAcceptPushEvent;
8+
import com.vp.voicepocket.domain.friend.event.FriendRequestPushEvent;
129
import com.vp.voicepocket.domain.friend.exception.CFriendRequestNotExistException;
1310
import com.vp.voicepocket.domain.friend.exception.CFriendRequestOnGoingException;
1411
import com.vp.voicepocket.domain.friend.repository.FriendRepository;
@@ -19,58 +16,43 @@
1916
import com.vp.voicepocket.domain.user.exception.CUserNotFoundException;
2017
import com.vp.voicepocket.domain.user.repository.UserRepository;
2118
import lombok.RequiredArgsConstructor;
19+
import org.springframework.context.ApplicationEventPublisher;
2220
import org.springframework.security.core.Authentication;
2321
import org.springframework.stereotype.Service;
2422
import org.springframework.transaction.annotation.Transactional;
2523

26-
import java.util.HashMap;
2724
import java.util.List;
2825
import java.util.stream.Collectors;
2926

3027
@Service
3128
@RequiredArgsConstructor
3229
public class FriendService {
3330
private final UserRepository userRepository;
34-
private final FCMRepository fcmRepository;
3531
private final FriendRepository friendRepository;
36-
private final FCMNotificationService fcmNotificationService;
32+
private final ApplicationEventPublisher eventPublisher;
3733

3834
private final JwtProvider jwtProvider;
35+
3936
@Transactional
4037
public FriendResponseDto requestFriend(FriendRequestDto friendRequestDto, String accessToken) {
41-
Authentication authentication= getAuthByAccessToken(accessToken);
38+
Authentication authentication = getAuthByAccessToken(accessToken);
4239

43-
User to_user =
44-
userRepository.findByEmail(friendRequestDto.getEmail())
45-
.orElseThrow(CUserNotFoundException::new);
40+
User to_user = userRepository.findByEmail(friendRequestDto.getEmail())
41+
.orElseThrow(CUserNotFoundException::new);
4642

47-
User from_user =
48-
userRepository.findById(Long.parseLong(authentication.getName()))
49-
.orElseThrow(CUserNotFoundException::new);
43+
User from_user = userRepository.findById(Long.parseLong(authentication.getName()))
44+
.orElseThrow(CUserNotFoundException::new);
5045

5146
if (friendRepository.findByRequest(from_user, to_user, Status.ONGOING).isPresent() ||
52-
friendRepository.findByRequest(from_user, to_user, Status.ACCEPT).isPresent()) {
47+
friendRepository.findByRequest(from_user, to_user, Status.ACCEPT).isPresent()) {
5348
throw new CFriendRequestOnGoingException();
5449
}
5550

56-
Friend friend = friendRequestDto.toEntity(from_user, to_user, Status.ONGOING);
57-
58-
HashMap<String, String> data = new HashMap<>();
59-
data.put("ID", "1");
60-
61-
FCMUserToken fcmEntity = fcmRepository.findByUserId(to_user)
62-
.orElseThrow(CFCMTokenNotFoundException::new);
63-
String fcmToken = fcmEntity.getFireBaseToken();
64-
65-
FCMNotificationRequestDto fcmNotificationRequestDto = FCMNotificationRequestDto.builder()
66-
.firebaseToken(fcmToken)
67-
.title("Friend Request")
68-
.body(from_user.getName() + " request Friend to you!")
69-
.build();
51+
Friend friendRequest = friendRequestDto.toEntity(from_user, to_user, Status.ONGOING);
7052

71-
fcmNotificationService.sendNotificationWithData(fcmNotificationRequestDto, data);
53+
eventPublisher.publishEvent(new FriendRequestPushEvent(friendRequest));
7254

73-
return mapFriendEntityToFriendResponseDTO(friendRepository.save(friend));
55+
return mapFriendEntityToFriendResponseDTO(friendRepository.save(friendRequest));
7456
}
7557

7658
private Authentication getAuthByAccessToken(String accessToken) {
@@ -83,73 +65,72 @@ private Authentication getAuthByAccessToken(String accessToken) {
8365
return jwtProvider.getAuthentication(accessToken);
8466
}
8567

86-
private FriendResponseDto mapFriendEntityToFriendResponseDTO(Friend friend){
68+
private FriendResponseDto mapFriendEntityToFriendResponseDTO(Friend friend) {
8769
return FriendResponseDto.builder()
88-
.id(friend.getId())
89-
.request_from(new UserResponseDto(friend.getRequest_from()))
90-
.request_to(new UserResponseDto(friend.getRequest_to()))
91-
.status(friend.getStatus())
92-
.build();
70+
.id(friend.getId())
71+
.request_from(new UserResponseDto(friend.getRequest_from()))
72+
.request_to(new UserResponseDto(friend.getRequest_to()))
73+
.status(friend.getStatus())
74+
.build();
9375
}
9476

9577
@Transactional
9678
public List<FriendResponseDto> checkRequest(String accessToken) {
97-
Authentication authentication= getAuthByAccessToken(accessToken);
98-
User to_user = userRepository.findById(Long.parseLong(authentication.getName())).orElseThrow(CUserNotFoundException::new);
79+
Authentication authentication = getAuthByAccessToken(accessToken);
80+
81+
User to_user = userRepository.findById(Long.parseLong(authentication.getName()))
82+
.orElseThrow(CUserNotFoundException::new);
83+
9984
return friendRepository.findByToUser(to_user, Status.ONGOING) // 없을 때 공백 리스트를 반환하기
100-
.stream()
101-
.map(this::mapFriendEntityToFriendResponseDTO)
102-
.collect(Collectors.toList());
85+
.stream()
86+
.map(this::mapFriendEntityToFriendResponseDTO)
87+
.collect(Collectors.toList());
10388
}
10489

10590
@Transactional
10691
public List<FriendResponseDto> checkResponse(String accessToken) {
107-
Authentication authentication= getAuthByAccessToken(accessToken);
108-
User from_user = userRepository.findById(Long.parseLong(authentication.getName())).orElseThrow(CUserNotFoundException::new);
92+
Authentication authentication = getAuthByAccessToken(accessToken);
93+
94+
User from_user = userRepository.findById(Long.parseLong(authentication.getName()))
95+
.orElseThrow(CUserNotFoundException::new);
96+
10997
return friendRepository.findByFromUser(from_user, Status.ACCEPT) // 없을 때 공백 리스트를 반환하기
110-
.stream()
111-
.map(this::mapFriendEntityToFriendResponseDTO)
112-
.collect(Collectors.toList());
98+
.stream()
99+
.map(this::mapFriendEntityToFriendResponseDTO)
100+
.collect(Collectors.toList());
113101
}
114102

115103

116104
@Transactional
117-
public void update(FriendRequestDto friendRequestDto, String accessToken, Status status){
118-
Authentication authentication= getAuthByAccessToken(accessToken);
105+
public void update(FriendRequestDto friendRequestDto, String accessToken, Status status) {
106+
Authentication authentication = getAuthByAccessToken(accessToken);
119107

120108
User from_user = userRepository.findByEmail(friendRequestDto.getEmail())
121-
.orElseThrow(CUserNotFoundException::new);
109+
.orElseThrow(CUserNotFoundException::new);
122110
User to_user = userRepository.findById(Long.parseLong(authentication.getName()))
123-
.orElseThrow(CUserNotFoundException::new);
124-
125-
Friend modifiedFriend = friendRepository.findByRequest(from_user, to_user, Status.ONGOING)
126-
.orElseThrow(CFriendRequestNotExistException::new);
127-
modifiedFriend.updateStatus(status);
128-
129-
if(status.equals(Status.ACCEPT)){
130-
HashMap<String, String> data = new HashMap<>();
131-
data.put("ID", "2");
132-
133-
FCMUserToken fcmEntity = fcmRepository.findByUserId(from_user)
134-
.orElseThrow(CFCMTokenNotFoundException::new);
135-
String fcmToken = fcmEntity.getFireBaseToken();
111+
.orElseThrow(CUserNotFoundException::new);
136112

137-
FCMNotificationRequestDto fcmNotificationRequestDto = FCMNotificationRequestDto.builder()
138-
.firebaseToken(fcmToken)
139-
.title("Friend Accept")
140-
.body(to_user.getName() + " Accept your Friend Request!")
141-
.build();
113+
Friend friendRequest = friendRepository.findByRequest(from_user, to_user, Status.ONGOING)
114+
.orElseThrow(CFriendRequestNotExistException::new);
115+
friendRequest.updateStatus(status);
142116

143-
fcmNotificationService.sendNotificationWithData(fcmNotificationRequestDto, data);
117+
if (status.equals(Status.ACCEPT)) {
118+
eventPublisher.publishEvent(new FriendAcceptPushEvent(friendRequest));
144119
}
145120
}
146121

147122
@Transactional
148-
public void delete(FriendRequestDto friendRequestDto, String accessToken, Status status){
149-
Authentication authentication= getAuthByAccessToken(accessToken);
150-
User from_user = userRepository.findById(Long.parseLong(authentication.getName())).orElseThrow(CUserNotFoundException::new);
151-
User to_user = userRepository.findByEmail(friendRequestDto.getEmail()).orElseThrow(CUserNotFoundException::new);
152-
Friend friend = friendRepository.findByRequest(from_user, to_user, status).orElseThrow(CFriendRequestNotExistException::new);
123+
public void delete(FriendRequestDto friendRequestDto, String accessToken, Status status) {
124+
Authentication authentication = getAuthByAccessToken(accessToken);
125+
126+
User from_user = userRepository.findById(Long.parseLong(authentication.getName()))
127+
.orElseThrow(CUserNotFoundException::new);
128+
User to_user = userRepository.findByEmail(friendRequestDto.getEmail())
129+
.orElseThrow(CUserNotFoundException::new);
130+
131+
Friend friend = friendRepository.findByRequest(from_user, to_user, status)
132+
.orElseThrow(CFriendRequestNotExistException::new);
133+
153134
friendRepository.delete(friend);
154135
}
155136
}

0 commit comments

Comments
 (0)