4
4
import com .google .firebase .messaging .FirebaseMessagingException ;
5
5
import com .google .firebase .messaging .Message ;
6
6
import com .google .firebase .messaging .Notification ;
7
+ import lombok .AllArgsConstructor ;
7
8
import lombok .RequiredArgsConstructor ;
8
9
import org .slf4j .Logger ;
9
10
import org .slf4j .LoggerFactory ;
19
20
import treehouse .server .global .fcm .dto .FCMDto ;
20
21
21
22
import java .util .List ;
23
+ import java .util .Optional ;
22
24
23
25
@ Service
24
26
@ RequiredArgsConstructor
25
- @ Transactional (readOnly = true )
27
+ // @Transactional(readOnly = true)
26
28
public class FcmService {
27
29
Logger logger = LoggerFactory .getLogger (FcmService .class );
28
30
@@ -49,53 +51,54 @@ public void testFCMService(String fcmToken)
49
51
50
52
@ Transactional (readOnly = false )
51
53
public UserResponseDTO .saveFcmToken saveFcmToken (User user , FCMDto .saveFcmTokenDto request ) {
52
- boolean isSuccess = false ;
53
- logger .error ("토큰 값 : {}" ,request .getFcmToken ());
54
- if (fcmTokenRepository .existsByUserAndToken (user , request .getFcmToken ())) {
55
- throw new FcmException (GlobalErrorCode .FCM_ALREADY_EXISTS_TOKEN );
56
- }else {
54
+ boolean isSuccess = true ;
55
+ logger .info ("토큰 값 : {}" , request .getFcmToken ());
56
+
57
+
58
+ // 한 user 당 가장 최신의 fcm token 값 하나만 db 에 저장하도록 수정
59
+ if (fcmTokenRepository .existsByUser (user )) {
60
+ FcmToken fcmToken = fcmTokenRepository .findByUser (user ).orElseThrow (() -> new FcmException (GlobalErrorCode .FCM_TOKEN_NOT_EXISTS ));
61
+ fcmToken .update (request .getFcmToken ());
62
+ } else {
57
63
fcmTokenRepository .save (FcmToken .builder ()
58
64
.user (user )
59
65
.token (request .getFcmToken ())
60
66
.build ()
61
67
);
62
- isSuccess = true ;
63
68
}
64
69
return UserMapper .toSaveFcmToken (user , isSuccess );
65
70
}
66
71
67
72
68
73
public void sendFcmMessage (User receiver , String title , String body ) {
69
74
70
- List <FcmToken > fcmTokenList = fcmTokenRepository .findAllByUser (receiver );
71
- if (fcmTokenList .isEmpty ()) {
72
- return ;
73
- }
75
+ FcmToken fcmToken = fcmTokenRepository .findByUser (receiver ).orElseThrow (() -> new FcmException (GlobalErrorCode .FCM_TOKEN_NOT_EXISTS ));
74
76
75
- for (FcmToken fcmToken : fcmTokenList ) {
76
- String token = fcmToken .getToken ();
77
- logger .info ("전송하고자 하는 FCM 토큰 값 : " + token );
78
- Message message = Message .builder ()
79
- .setToken (token )
80
- .setNotification (
81
- Notification .builder ()
82
- .setTitle (title )
83
- .setBody (body )
84
- .build ())
85
- .build ();
86
- try {
87
- String response = FirebaseMessaging .getInstance ().send (message );
88
- logger .info ("the response of request FCM : {}" ,response );
89
- } catch (FirebaseMessagingException e ) {
90
- throw new FcmException (GlobalErrorCode .FCM_SEND_MESSAGE_ERROR );
91
- }
92
- }
77
+ String token = fcmToken .getToken ();
78
+ logger .info ("전송하고자 하는 FCM 토큰 값 : " + token );
79
+
80
+ Message message = Message .builder ()
81
+ .setToken (token )
82
+ .setNotification (
83
+ Notification .builder ()
84
+ .setTitle (title )
85
+ .setBody (body )
86
+ .build ())
87
+ .build ();
93
88
89
+ try {
90
+ String response = FirebaseMessaging .getInstance ().send (message );
91
+ logger .info ("the response of request FCM : {}" ,response );
92
+ } catch (FirebaseMessagingException e ) {
93
+ logger .error ("FCM 푸시 알림 전송 실패, 이유 : {}" , e .getMessage ());
94
+ throw new FcmException (GlobalErrorCode .FCM_SEND_MESSAGE_ERROR );
95
+ }
94
96
95
97
}
96
98
97
99
@ Transactional
98
100
public void deleteAllFcmToken (User user ) {
99
101
fcmTokenRepository .deleteAllByUser (user );
100
102
}
103
+
101
104
}
0 commit comments