Skip to content

Commit 2ca3401

Browse files
authored
Merge pull request #120 from billilge/fix/#117
fix: FCM 만료 토큰 미삭제로 인한 알림 유실 처리
2 parents 527c54b + e9347c0 commit 2ca3401

4 files changed

Lines changed: 23 additions & 4 deletions

File tree

src/main/kotlin/site/billilge/api/backend/domain/member/entity/Member.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,4 +65,8 @@ class Member(
6565
fun updateFCMToken(fcmToken: String) {
6666
this.fcmToken = fcmToken
6767
}
68+
69+
fun clearFCMToken() {
70+
this.fcmToken = null
71+
}
6872
}

src/main/kotlin/site/billilge/api/backend/domain/member/service/MemberService.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ class MemberService(
6464
pageableCondition.pageNo,
6565
pageableCondition.size,
6666
Sort.by(Sort.Direction.ASC, "studentId")
67+
.and(Sort.by(Sort.Direction.ASC, "id"))
6768
)
6869
val adminRoles = listOf(Role.ADMIN, Role.WORKER, Role.GA)
6970
return memberRepository.findAllByRoleInAndNameContaining(adminRoles, searchCondition.search, pageRequest)
@@ -101,6 +102,7 @@ class MemberService(
101102
pageableCondition.pageNo,
102103
pageableCondition.size,
103104
Sort.by(Sort.Direction.ASC, "studentId")
105+
.and(Sort.by(Sort.Direction.ASC, "id"))
104106
)
105107

106108
return if (searchCondition.search.isEmpty()) {
@@ -118,6 +120,12 @@ class MemberService(
118120
member.updateFCMToken(token)
119121
}
120122

123+
@Transactional
124+
fun clearFcmToken(memberId: Long) {
125+
val member = memberRepository.findByIdOrNull(memberId) ?: return
126+
member.clearFCMToken()
127+
}
128+
121129
fun findById(memberId: Long): Member {
122130
return memberRepository.findByIdOrNull(memberId)
123131
?: throw ApiException(MemberErrorCode.MEMBER_NOT_FOUND)

src/main/kotlin/site/billilge/api/backend/domain/notification/service/NotificationService.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,13 +76,17 @@ class NotificationService(
7676
return
7777
}
7878

79-
fcmService.sendPushNotification(
79+
val isTokenValid = fcmService.sendPushNotification(
8080
member.fcmToken!!,
8181
status.title,
8282
status.formattedMessage(*formatValues.toTypedArray()),
8383
status.link,
8484
studentId
8585
)
86+
87+
if (!isTokenValid) {
88+
memberService.clearFcmToken(member.id!!)
89+
}
8690
}
8791

8892
@Transactional

src/main/kotlin/site/billilge/api/backend/global/external/fcm/FCMService.kt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import site.billilge.api.backend.global.logging.log
88
class FCMService(
99
private val firebaseMessaging: FirebaseMessaging,
1010
) {
11-
fun sendPushNotification(fcmToken: String, title: String, body: String, link: String, studentId: String = "20000000") {
11+
fun sendPushNotification(fcmToken: String, title: String, body: String, link: String, studentId: String = "20000000"): Boolean {
1212
val fcmMessage = Message.builder()
1313
.putData("title", title)
1414
.putData("body", body.replace("\n", " "))
@@ -21,14 +21,17 @@ class FCMService(
2121
.setToken(fcmToken)
2222
.build()
2323

24-
try {
24+
return try {
2525
firebaseMessaging.send(fcmMessage)
2626
log.info { "(studentId=$studentId) FCM Message sent." }
27+
true
2728
} catch (e: FirebaseMessagingException) {
2829
if (e.messagingErrorCode == MessagingErrorCode.UNREGISTERED) {
29-
log.error { "(studentId=$studentId) FCM token is unregistered." }
30+
log.warn { "(studentId=$studentId) FCM token is unregistered. Clearing token." }
31+
false
3032
} else {
3133
log.error { "(studentId=$studentId) FCM send failed: ${e.message}" }
34+
true
3235
}
3336
}
3437
}

0 commit comments

Comments
 (0)