diff --git a/push-message-provider-fcm/src/main/kotlin/ru/touchin/push/message/provider/fcm/clients/FcmClient.kt b/push-message-provider-fcm/src/main/kotlin/ru/touchin/push/message/provider/fcm/clients/FcmClient.kt index 605d892..ec51bbe 100644 --- a/push-message-provider-fcm/src/main/kotlin/ru/touchin/push/message/provider/fcm/clients/FcmClient.kt +++ b/push-message-provider-fcm/src/main/kotlin/ru/touchin/push/message/provider/fcm/clients/FcmClient.kt @@ -3,9 +3,11 @@ package ru.touchin.push.message.provider.fcm.clients import com.google.firebase.messaging.FirebaseMessaging import com.google.firebase.messaging.FirebaseMessagingException import org.springframework.stereotype.Component +import ru.touchin.push.message.provider.dto.request.PushTokenCheck import ru.touchin.push.message.provider.dto.request.PushTokenMessage import ru.touchin.push.message.provider.dto.result.SendPushResult import ru.touchin.push.message.provider.dto.result.SendPushTokenMessageResult +import ru.touchin.push.message.provider.enums.PushTokenStatus import ru.touchin.push.message.provider.exceptions.InvalidPushTokenException import ru.touchin.push.message.provider.exceptions.PushMessageProviderException import ru.touchin.push.message.provider.fcm.converters.FirebaseMessagingExceptionConverter @@ -24,10 +26,33 @@ class FcmClient( @Throws(PushMessageProviderException::class, InvalidPushTokenException::class) fun sendPushTokenMessage(request: PushTokenMessage): SendPushResult { + return sendToPushToken(request, dryRun = false) + } + + fun check(request: PushTokenCheck): PushTokenStatus { + val validationRequest = PushTokenMessage( + token = request.pushToken, + notification = null, + data = emptyMap() + ) + + return try { + sendToPushToken(validationRequest, dryRun = true) + + PushTokenStatus.VALID + } catch (ipte: InvalidPushTokenException) { + PushTokenStatus.INVALID + } catch (pmpe: PushMessageProviderException) { + PushTokenStatus.UNKNOWN + } + } + + @Throws(PushMessageProviderException::class, InvalidPushTokenException::class) + private fun sendToPushToken(request: PushTokenMessage, dryRun: Boolean): SendPushResult { val message = pushTokenMessageConverter(request) return try { - val messageId = firebaseMessaging.send(message) + val messageId = firebaseMessaging.send(message, dryRun) SendPushTokenMessageResult(messageId) } catch (e: FirebaseMessagingException) { diff --git a/push-message-provider-fcm/src/main/kotlin/ru/touchin/push/message/provider/fcm/services/PushMessageProviderFcmService.kt b/push-message-provider-fcm/src/main/kotlin/ru/touchin/push/message/provider/fcm/services/PushMessageProviderFcmService.kt index 10435fd..a9b79da 100644 --- a/push-message-provider-fcm/src/main/kotlin/ru/touchin/push/message/provider/fcm/services/PushMessageProviderFcmService.kt +++ b/push-message-provider-fcm/src/main/kotlin/ru/touchin/push/message/provider/fcm/services/PushMessageProviderFcmService.kt @@ -1,8 +1,10 @@ package ru.touchin.push.message.provider.fcm.services import org.springframework.stereotype.Service +import ru.touchin.push.message.provider.dto.request.PushTokenCheck import ru.touchin.push.message.provider.dto.request.PushTokenMessage import ru.touchin.push.message.provider.dto.request.SendPushRequest +import ru.touchin.push.message.provider.dto.result.CheckPushTokenResult import ru.touchin.push.message.provider.dto.result.SendPushResult import ru.touchin.push.message.provider.enums.PushMessageProviderType import ru.touchin.push.message.provider.exceptions.InvalidPushTokenException @@ -24,4 +26,10 @@ class PushMessageProviderFcmService( } } + override fun check(request: PushTokenCheck): CheckPushTokenResult { + val status = fcmClient.check(request) + + return CheckPushTokenResult(status) + } + } diff --git a/push-message-provider-fcm/src/test/kotlin/ru/touchin/push/message/provider/fcm/services/PushMessageProviderFcmServiceTest.kt b/push-message-provider-fcm/src/test/kotlin/ru/touchin/push/message/provider/fcm/services/PushMessageProviderFcmServiceTest.kt index 37452a1..c502fa6 100644 --- a/push-message-provider-fcm/src/test/kotlin/ru/touchin/push/message/provider/fcm/services/PushMessageProviderFcmServiceTest.kt +++ b/push-message-provider-fcm/src/test/kotlin/ru/touchin/push/message/provider/fcm/services/PushMessageProviderFcmServiceTest.kt @@ -7,8 +7,11 @@ import org.mockito.Mockito import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.test.context.SpringBootTest import org.springframework.boot.test.mock.mockito.MockBean +import ru.touchin.push.message.provider.dto.request.PushTokenCheck import ru.touchin.push.message.provider.dto.request.PushTokenMessage +import ru.touchin.push.message.provider.dto.result.CheckPushTokenResult import ru.touchin.push.message.provider.dto.result.SendPushTokenMessageResult +import ru.touchin.push.message.provider.enums.PushTokenStatus import ru.touchin.push.message.provider.fcm.clients.FcmClient import ru.touchin.push.message.provider.services.PushMessageProviderService @@ -47,4 +50,25 @@ class PushMessageProviderFcmServiceTest { ) } + @Test + @DisplayName("Обработка запроса на валидацию пуш-токена происходит корректно") + fun isValid_basic() { + val expectedClientResult = PushTokenStatus.VALID + + Mockito.`when`( + fcmClient.check(PushTokenCheck("testToken")) + ).thenReturn( + expectedClientResult + ) + + val expectedResult = CheckPushTokenResult(expectedClientResult) + val realResult = pushMessageProviderService.check(PushTokenCheck("testToken")) + + Assert.assertEquals( + "Обработка запроса на валидацию пуш-токена происходит корректно", + expectedResult, + realResult + ) + } + }