TP-73070 | retry mechanism in validate vpa and lite sync (#11743)

This commit is contained in:
Shaurya Rehan
2024-07-08 19:59:47 +05:30
committed by GitHub
parent daaaf32bec
commit a5a6911e7f
3 changed files with 39 additions and 3 deletions

View File

@@ -8,6 +8,7 @@
package com.navi.pay.common.usecase
import com.google.gson.Gson
import com.navi.base.utils.retry
import com.navi.common.firebaseremoteconfig.FirebaseRemoteConfigHelper
import com.navi.common.firebaseremoteconfig.FirebaseRemoteConfigHelper.NAVI_PAY_ENABLE_VALIDATE_VPA_CACHING
import com.navi.common.firebaseremoteconfig.FirebaseRemoteConfigHelper.NAVI_PAY_VALIDATE_VPA_CACHING_TTL_IN_HOURS
@@ -19,6 +20,9 @@ import com.navi.pay.common.repository.CommonRepository
import com.navi.pay.common.validatevpa.model.view.ValidateVpaEntity
import com.navi.pay.management.paytocontacts.model.network.PayToContactRequest
import com.navi.pay.network.di.NaviPayGsonBuilder
import com.navi.pay.utils.DEFAULT_RETRY_COUNT
import com.navi.pay.utils.RETRY_INTERVAL_IN_SECONDS
import com.navi.pay.utils.isStatusCodeOfTypeException
import javax.inject.Inject
import kotlin.math.absoluteValue
import org.joda.time.DateTime
@@ -75,10 +79,24 @@ constructor(
val apiResponse =
when (request) {
is ValidateVpaRequest -> {
commonRepository.validateVpa(validateVpaRequest = request)
retry(
retryCount = DEFAULT_RETRY_COUNT,
retryIntervalInSeconds = RETRY_INTERVAL_IN_SECONDS,
execute = { commonRepository.validateVpa(validateVpaRequest = request) },
shouldRetry = { response ->
response.statusCode?.isStatusCodeOfTypeException() == true
}
)
}
is PayToContactRequest -> {
commonRepository.payToContact(payToContactRequest = request)
retry(
retryCount = DEFAULT_RETRY_COUNT,
retryIntervalInSeconds = RETRY_INTERVAL_IN_SECONDS,
execute = { commonRepository.payToContact(payToContactRequest = request) },
shouldRetry = { response ->
response.statusCode?.isStatusCodeOfTypeException() == true
}
)
}
else -> {
// This case should never happen

View File

@@ -7,6 +7,7 @@
package com.navi.pay.management.lite.util
import com.navi.base.utils.retry
import com.navi.common.network.models.isSuccessWithData
import com.navi.pay.common.utils.DeviceInfoProvider
import com.navi.pay.management.lite.models.network.LiteSyncRequest
@@ -14,6 +15,8 @@ import com.navi.pay.management.lite.repository.UPILiteRepository
import com.navi.pay.npcicl.NpciRepository
import com.navi.pay.npcicl.UpiLiteBoundStatusResponse
import com.navi.pay.onboarding.account.detail.model.view.LinkedAccountEntity
import com.navi.pay.utils.DEFAULT_RETRY_COUNT
import com.navi.pay.utils.RETRY_INTERVAL_IN_SECONDS
import javax.inject.Inject
import timber.log.Timber
@@ -59,7 +62,13 @@ constructor(
merchantCustomerId = deviceInfoProvider.getMerchantCustomerId()
)
val liteSyncResponse = upiLiteRepository.liteSync(liteSyncRequest = liteSyncRequest)
val liteSyncResponse =
retry(
retryCount = DEFAULT_RETRY_COUNT,
retryIntervalInSeconds = RETRY_INTERVAL_IN_SECONDS,
execute = { upiLiteRepository.liteSync(liteSyncRequest = liteSyncRequest) },
shouldRetry = { !it.isSuccessWithData() }
)
if (liteSyncResponse.isSuccessWithData()) {
return registerUPILiteState(

View File

@@ -683,3 +683,12 @@ fun Activity.launchPermissionSettingsScreen() {
)
startActivity(intent)
}
/*
2 digit custom error codes are considered for retrying the network call
This includes different exceptions viz. SocketTimeoutException, ConnectException etc.
For more ref, checkout: ApiConstants.kt
*/
fun Int.isStatusCodeOfTypeException(): Boolean {
return this.toString().length == 2
}