NTP-21170 | PS | fix token not found error (#14287)

This commit is contained in:
Prakhar Saxena
2024-12-20 19:51:58 +05:30
committed by GitHub
parent 6c0862178d
commit 1b5dca6719
5 changed files with 75 additions and 88 deletions

View File

@@ -24,7 +24,6 @@ import com.navi.payment.nativepayment.NaviPaymentAnalyticScreenName
import com.navi.payment.nativepayment.dataprovider.PaymentDataProvider
import com.navi.payment.nativepayment.dataprovider.PaymentDataProvider.Companion.ACTION_TYPE
import com.navi.payment.nativepayment.dataprovider.PaymentDataProvider.Companion.ERROR_RESPONSE
import com.navi.payment.nativepayment.dataprovider.PaymentDataProvider.Companion.GET_METHOD_RESPONSE
import com.navi.payment.nativepayment.dataprovider.PaymentDataProvider.Companion.PAYMENT_INITIATE_START_TIME
import com.navi.payment.nativepayment.dataprovider.PaymentDataProvider.Companion.SCREEN_TYPE
import com.navi.payment.nativepayment.dataprovider.PaymentDataProvider.Companion.SDK_PARAMS
@@ -34,6 +33,7 @@ import com.navi.payment.nativepayment.model.PaymentActionType
import com.navi.payment.nativepayment.model.S2sPaymentMethodResponse
import com.navi.payment.nativepayment.repository.PaymentRepository
import com.navi.payment.nativepayment.usecase.NetBankingUseCase
import com.navi.payment.nativepayment.usecase.PmsLinkedAccountUseCase
import com.navi.payment.nativepayment.utils.getPayloadBasedOnType
import com.navi.payment.nativepayment.utils.toGenericErrorResponse
import com.navi.payment.nativepayment.viewmodel.NaviPaymentBaseVM
@@ -62,6 +62,7 @@ constructor(
private val paymentDataProvider: PaymentDataProvider,
@PaymentsSdkRetrofit private val deserializer: Gson,
private val netBankingUseCase: NetBankingUseCase,
private val pmsLinkedAccountUseCase: PmsLinkedAccountUseCase,
private val litmusExperimentsUseCase: LitmusExperimentsUseCase
) : NaviPaymentBaseVM(NaviPaymentAnalyticScreenName.CHECKOUT_SCREEN.screenName) {
@@ -72,8 +73,8 @@ constructor(
paymentSdkInitParams: PaymentSdkInitParams,
) {
viewModelScope.safeLaunch {
fetchPmsExperimentsData(paymentSdkInitParams.paymentSource.orEmpty())
clearPaymentData()
fetchPmsExperimentsData(paymentSdkInitParams.paymentSource.orEmpty())
paymentDataProvider.add(PAYMENT_INITIATE_START_TIME, System.currentTimeMillis())
_paymentResponse.emit(false)
val connectedAccountsData =
@@ -194,8 +195,7 @@ constructor(
}
private fun clearPaymentData() {
paymentDataProvider.remove(GET_METHOD_RESPONSE)
paymentDataProvider.remove(ERROR_RESPONSE)
paymentDataProvider.remove(PAYMENT_INITIATE_START_TIME)
paymentDataProvider.clear()
pmsLinkedAccountUseCase.clear()
}
}

View File

@@ -8,6 +8,8 @@
package com.navi.payment.nativepayment.usecase
import com.navi.base.AppServiceManager
import com.navi.base.utils.isNull
import com.navi.base.utils.orTrue
import com.navi.pay.common.usecase.LinkedAccountsUseCase
import com.navi.pay.onboarding.account.detail.model.view.LinkedAccountEntity
import com.navi.payment.R
@@ -20,6 +22,8 @@ import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.flatMapLatest
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
@OptIn(ExperimentalCoroutinesApi::class)
@Singleton
@@ -27,56 +31,62 @@ class PmsLinkedAccountUseCase
@Inject
constructor(private val linkedAccountsUseCase: LinkedAccountsUseCase) {
private val disabledAccountId = mutableSetOf<String>()
private val mutex = Mutex()
private var disabledAccountIdSet: MutableSet<String>? = null
suspend fun execute(
pmsConnectedAccounts: List<LinkedAccountEntity> = emptyList(),
requireDisabledAccountUpdate: Boolean = false
pmsConnectedAccounts: List<LinkedAccountEntity> = emptyList()
): Flow<List<LinkedAccountEntity>> {
if (pmsConnectedAccounts.isNotEmpty() && requireDisabledAccountUpdate) {
val pmsConnectedAccountId = pmsConnectedAccounts.associateBy { it.accountId }
linkedAccountsUseCase.execute(true).first().forEach { account ->
if (
pmsConnectedAccountId.contains(account.accountId).not() ||
pmsConnectedAccountId[account.accountId]?.isDisabled == true
) {
disabledAccountId.add(account.accountId)
mutex.withLock {
if (pmsConnectedAccounts.isNotEmpty() && disabledAccountIdSet.isNull()) {
disabledAccountIdSet = mutableSetOf()
val pmsConnectedAccountId = pmsConnectedAccounts.associateBy { it.accountId }
linkedAccountsUseCase.execute(true).first().forEach { account ->
if (
pmsConnectedAccountId.contains(account.accountId).not() ||
pmsConnectedAccountId[account.accountId]?.isDisabled == true
) {
disabledAccountIdSet?.add(account.accountId)
}
}
}
}
return linkedAccountsUseCase.execute(true).flatMapLatest { list ->
flow {
coroutineScope {
val updatedList =
list.map { newAccount ->
val isAccountEnabled =
disabledAccountId.contains(newAccount.accountId).not()
newAccount.apply {
if (!isAccountEnabled) {
isDisabled = true
infoMessage =
newAccount.infoMessage
?: AppServiceManager.application.getString(
R.string.payment_instrument_not_support
)
return linkedAccountsUseCase.execute(true).flatMapLatest { list ->
flow {
coroutineScope {
val updatedList =
list.map { newAccount ->
val isAccountEnabled =
disabledAccountIdSet
?.contains(newAccount.accountId)
?.not()
.orTrue()
newAccount.apply {
if (!isAccountEnabled) {
isDisabled = true
infoMessage =
newAccount.infoMessage
?: AppServiceManager.application.getString(
R.string.payment_instrument_not_support
)
}
}
}
}
val connectedAccountsEligibilityMap =
list.associate { it.accountId to it.eligibilityState }
val connectedAccountsEligibilityMap =
list.associate { it.accountId to it.eligibilityState }
updateAccountEligibilityStatus(
connectedAccountsEligibilityMap = connectedAccountsEligibilityMap,
connectedAccounts = updatedList,
)
emit(updatedList)
updateAccountEligibilityStatus(
connectedAccountsEligibilityMap = connectedAccountsEligibilityMap,
connectedAccounts = updatedList,
)
emit(updatedList)
}
}
}
}
}
fun clear() {
disabledAccountId.clear()
disabledAccountIdSet = null
}
}

View File

@@ -581,26 +581,18 @@ constructor(
}
}
val finalList = mutableListOf<LinkedAccountEntity>()
pmsLinkedAccountUseCase
.execute(
pmsConnectedAccounts = accountList,
requireDisabledAccountUpdate =
(paymentDataProvider.get(SCREEN_TYPE) as? String) ==
NaviPaymentScreenType.MINI_PAYMENT_SCREEN.name
)
.first()
.let {
it.filter { account -> account.accountId.isAccountIdOfTypeUpiLite() }
.forEach {
it.eligibilityState =
getEligibilityStateForUpiLiteAccount(
paymentAmount.value,
resourceProvider,
it
)
}
finalList.addAll(updateUpiAccountsRanking(it))
}
pmsLinkedAccountUseCase.execute(pmsConnectedAccounts = accountList).first().let {
it.filter { account -> account.accountId.isAccountIdOfTypeUpiLite() }
.forEach {
it.eligibilityState =
getEligibilityStateForUpiLiteAccount(
paymentAmount.value,
resourceProvider,
it
)
}
finalList.addAll(updateUpiAccountsRanking(it))
}
finalList.forEach {
accountListCheckBalanceUseCase.updateCheckBalanceStateForLinkedAccount(
linkedAccountEntity = it,

View File

@@ -54,7 +54,6 @@ import com.navi.payment.nativepayment.NaviPaymentAnalytics
import com.navi.payment.nativepayment.common.usecase.TransactionStatusUseCase
import com.navi.payment.nativepayment.dataprovider.PaymentDataProvider
import com.navi.payment.nativepayment.dataprovider.PaymentDataProvider.Companion.PAYMENT_ORDER_REFERENCE_ID
import com.navi.payment.nativepayment.dataprovider.PaymentDataProvider.Companion.SCREEN_TYPE
import com.navi.payment.nativepayment.dataprovider.PaymentDataProvider.Companion.TRANSACTION_REFERENCE_ID
import com.navi.payment.nativepayment.dataprovider.getMpinSetAction
import com.navi.payment.nativepayment.db.model.BankEntity
@@ -413,26 +412,18 @@ constructor(
paymentAmount
}
val finalList = mutableListOf<LinkedAccountEntity>()
pmsLinkedAccountUseCase
.execute(
pmsConnectedAccounts = accountList,
requireDisabledAccountUpdate =
(paymentDataProvider.get(SCREEN_TYPE) as? String) ==
NaviPaymentScreenType.FULL_PAYMENT_SCREEN.name
)
.first()
.let {
it.filter { account -> account.accountId.isAccountIdOfTypeUpiLite() }
.forEach {
it.eligibilityState =
getEligibilityStateForUpiLiteAccount(
discountAdjustedAmount,
resourceProvider,
it
)
}
finalList.addAll(updateUpiAccountsRanking(it))
}
pmsLinkedAccountUseCase.execute(pmsConnectedAccounts = accountList).first().let {
it.filter { account -> account.accountId.isAccountIdOfTypeUpiLite() }
.forEach {
it.eligibilityState =
getEligibilityStateForUpiLiteAccount(
discountAdjustedAmount,
resourceProvider,
it
)
}
finalList.addAll(updateUpiAccountsRanking(it))
}
finalList.forEach {
accountListCheckBalanceUseCase.updateCheckBalanceStateForLinkedAccount(
linkedAccountEntity = it,

View File

@@ -112,10 +112,4 @@ constructor(
)
}
}
override fun onCleared() {
super.onCleared()
paymentDataProvider.clear()
pmsLinkedAccountUseCase.clear()
}
}