NTP-42068 | Shiv Natani | bank downtime usecase (#15142)

This commit is contained in:
Shiv Natani
2025-02-26 20:19:00 +05:30
committed by GitHub
parent 4cafc22484
commit 8fa48455f5
3 changed files with 81 additions and 111 deletions

View File

@@ -0,0 +1,71 @@
/*
*
* * Copyright © 2025 by Navi Technologies Limited
* * All rights reserved. Strictly confidential
*
*/
package com.navi.pay.common.usecase
import com.google.firebase.firestore.QuerySnapshot
import com.navi.base.utils.FirestoreDataProvider
import com.navi.common.utils.NaviApiPoller
import com.navi.pay.analytics.NaviPayAnalytics
import com.navi.pay.common.bankuptime.model.view.toBankUptimeEntity
import com.navi.pay.common.bankuptime.repository.BankUptimeRepository
import com.navi.pay.utils.FIRESTORE_BANK_UPTIME_COLLECTION_PATH
import com.navi.pay.utils.parallelMap
import javax.inject.Inject
import kotlin.time.Duration.Companion.minutes
class BankUptimePollerUseCase
@Inject
constructor(
private val firestoreDataProvider: FirestoreDataProvider,
private val bankUptimeRepository: BankUptimeRepository,
) {
private val BANK_UPTIME_POLLING_INTERVAL = 5.minutes
private val bankUptimePoller by lazy {
NaviApiPoller(repeatInterval = BANK_UPTIME_POLLING_INTERVAL)
}
private val naviPayAnalytics: NaviPayAnalytics.NaviPayViewModel =
NaviPayAnalytics.INSTANCE.NaviPayViewModel()
suspend fun executePollerForBankUptime() {
bankUptimePoller
.startPolling {
try {
firestoreDataProvider.getQuerySnapShotForCollectionPath(
collectionPath = FIRESTORE_BANK_UPTIME_COLLECTION_PATH
)
} catch (exception: Exception) {
naviPayAnalytics.onErrorOccurredInGetQuerySnapshot(exception = exception)
bankUptimePoller.stopPolling()
}
}
.collect {
try {
val bankUptimeQuerySnapShot = it as? QuerySnapshot?
processQuerySnapShotForBankUptime(
bankUptimeQuerySnapShot = bankUptimeQuerySnapShot
)
} catch (exception: Exception) {
naviPayAnalytics.onErrorOccurredInProcessingQuerySnapshot(exception = exception)
bankUptimePoller.stopPolling()
}
}
}
private suspend fun processQuerySnapShotForBankUptime(bankUptimeQuerySnapShot: QuerySnapshot?) {
bankUptimeQuerySnapShot?.let { querySnapShot ->
val bankUptimeEntityList =
querySnapShot.documents.parallelMap { it.toBankUptimeEntity() }
if (bankUptimeEntityList.isNotEmpty()) {
bankUptimeRepository.deleteAllExistingDataAndInsertAll(
bankUptimeEntityList = bankUptimeEntityList
)
}
}
}
}

View File

@@ -32,12 +32,11 @@ import com.navi.common.utils.toJsonObject
import com.navi.pay.BuildConfig
import com.navi.pay.analytics.NaviPayAnalytics
import com.navi.pay.analytics.NaviPayAnalytics.Companion.NAVI_PAY_ACTIVITY
import com.navi.pay.common.bankuptime.model.view.toBankUptimeEntity
import com.navi.pay.common.bankuptime.repository.BankUptimeRepository
import com.navi.pay.common.model.view.NaviPayScreenType
import com.navi.pay.common.model.view.PspType
import com.navi.pay.common.setup.NaviPayCustomerStatusHandler
import com.navi.pay.common.setup.NaviPayRouter
import com.navi.pay.common.usecase.BankUptimePollerUseCase
import com.navi.pay.common.usecase.LiteAccountSyncUseCase
import com.navi.pay.common.usecase.RefreshBankListUseCase
import com.navi.pay.common.usecase.RefreshConfigUseCase
@@ -50,7 +49,6 @@ import com.navi.pay.common.viewmodel.NaviPayBaseVM
import com.navi.pay.management.upinumber.list.model.view.toUpiNumberEntity
import com.navi.pay.management.upinumber.list.repository.UpiNumberRepository
import com.navi.pay.network.di.NaviPayGsonBuilder
import com.navi.pay.utils.FIRESTORE_BANK_UPTIME_COLLECTION_PATH
import com.navi.pay.utils.FIRESTORE_CUSTOMER_DATA_COLLECTION_PATH
import com.navi.pay.utils.FIRESTORE_PSP_ROUTING_BUCKETS_COLLECTION_PATH
import com.navi.pay.utils.NAVI_PAY_LITMUS_EXPERIMENTS
@@ -61,7 +59,6 @@ import com.navi.pay.utils.NAVI_PAY_NUDGE_DETAILS_SUFFIX_TEXT
import com.navi.pay.utils.NAVI_PAY_NUDGE_OBJECTIVE
import com.navi.pay.utils.NAVI_PAY_NUDGE_PRODUCT
import com.navi.pay.utils.NAVI_PAY_PSP_ROUTING_BUCKETS_KEY
import com.navi.pay.utils.parallelMap
import com.navi.rr.scratchcard.helper.ScratchCardNudgeHelper
import com.navi.rr.scratchcard.model.states.RewardNudgeApiStatus
import com.ramcosta.composedestinations.spec.Route
@@ -85,26 +82,20 @@ constructor(
private val refreshLinkedAccountsUseCase: RefreshLinkedAccountsUseCase,
private val liteAccountSyncUseCase: LiteAccountSyncUseCase,
private val firestoreDataProvider: FirestoreDataProvider,
private val bankUptimeRepository: BankUptimeRepository,
private val scratchCardNudgeHelper: ScratchCardNudgeHelper,
private val naviCacheRepository: NaviCacheRepository,
private val syncLitmusExperimentsUseCase: SyncLitmusExperimentUseCase,
private val refreshUpiNumbersUseCase: RefreshUpiNumbersUseCase,
private val upiNumberRepository: UpiNumberRepository,
private val syncUpiLiteMandateInfoUseCase: SyncUpiLiteMandateInfoUseCase,
private val bankUptimePollerUseCase: BankUptimePollerUseCase,
@NaviPayGsonBuilder private val gson: Gson,
private val arcNudgeSyncUseCase: ArcNudgeSyncUseCase,
) : NaviPayBaseVM() {
private val BANK_UPTIME_POLLING_INTERVAL = 5.minutes
private val naviPayAnalytics: NaviPayAnalytics.NaviPayViewModel =
NaviPayAnalytics.INSTANCE.NaviPayViewModel()
private val bankUptimePoller by lazy {
NaviApiPoller(repeatInterval = BANK_UPTIME_POLLING_INTERVAL)
}
private val customerDataPoller by lazy {
NaviApiPoller(repeatInterval = 5.seconds, numberOfIterations = 1)
}
@@ -156,7 +147,9 @@ constructor(
taskList.awaitAll()
}
initFireStorePollerForBankUptime()
viewModelScope.safeLaunch(Dispatchers.IO) {
bankUptimePollerUseCase.executePollerForBankUptime()
}
initFireStorePollerForCustomerData()
@@ -201,35 +194,6 @@ constructor(
return naviPayCustomerStatusHandler.isUserDeviceBoundForAnyPsp()
}
private fun initFireStorePollerForBankUptime() {
viewModelScope.launch(Dispatchers.IO) {
bankUptimePoller
.startPolling {
try {
firestoreDataProvider.getQuerySnapShotForCollectionPath(
collectionPath = FIRESTORE_BANK_UPTIME_COLLECTION_PATH
)
} catch (exception: Exception) {
naviPayAnalytics.onErrorOccurredInGetQuerySnapshot(exception = exception)
bankUptimePoller.stopPolling()
}
}
.collect {
try {
val bankUptimeQuerySnapShot = it as? QuerySnapshot?
processQuerySnapShotForBankUptime(
bankUptimeQuerySnapShot = bankUptimeQuerySnapShot
)
} catch (exception: Exception) {
naviPayAnalytics.onErrorOccurredInProcessingQuerySnapshot(
exception = exception
)
bankUptimePoller.stopPolling()
}
}
}
}
private fun initFireStorePollerForCustomerData() {
viewModelScope.launch(Dispatchers.IO) {
customerDataPoller
@@ -297,20 +261,6 @@ constructor(
}
}
private suspend fun processQuerySnapShotForBankUptime(bankUptimeQuerySnapShot: QuerySnapshot?) {
bankUptimeQuerySnapShot?.let { querySnapShot ->
val bankUptimeEntityList =
querySnapShot.documents.parallelMap { it.toBankUptimeEntity() }
if (bankUptimeEntityList.isNotEmpty()) {
bankUptimeRepository.deleteAllExistingDataAndInsertAll(
bankUptimeEntityList = bankUptimeEntityList
)
}
}
}
private suspend fun processDocumentSnapShotForCustomerData(
customerDataDocumentSnapshot: DocumentSnapshot?
) {

View File

@@ -8,15 +8,9 @@
package com.navi.payment.nativepayment.viewmodel
import androidx.lifecycle.viewModelScope
import com.google.firebase.firestore.QuerySnapshot
import com.navi.base.utils.FirestoreDataProvider
import com.navi.base.utils.orFalse
import com.navi.common.usecase.SyncLitmusExperimentUseCase
import com.navi.common.utils.NaviApiPoller
import com.navi.pay.common.bankuptime.model.view.toBankUptimeEntity
import com.navi.pay.common.bankuptime.repository.BankUptimeRepository
import com.navi.pay.utils.FIRESTORE_BANK_UPTIME_COLLECTION_PATH
import com.navi.pay.utils.parallelMap
import com.navi.pay.common.usecase.BankUptimePollerUseCase
import com.navi.payment.analytics.NaviPaymentScreenAnalytics
import com.navi.payment.model.common.PaymentSdkInitParams
import com.navi.payment.nativepayment.NaviPaymentAnalyticScreenName
@@ -32,9 +26,7 @@ import com.navi.payment.utils.Constants.PMS_LITMUS_EXPERIMENTS
import com.navi.payment.utils.getPMSMetricInfo
import dagger.hilt.android.lifecycle.HiltViewModel
import javax.inject.Inject
import kotlin.time.Duration.Companion.minutes
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
@HiltViewModel
class NaviPaymentViewModel
@@ -43,22 +35,18 @@ constructor(
private val paymentDataProvider: PaymentDataProvider,
private val paymentRepository: PaymentRepository,
private val syncLitmusExperimentsUseCase: SyncLitmusExperimentUseCase,
private val firestoreDataProvider: FirestoreDataProvider,
private val bankUptimeRepository: BankUptimeRepository,
private val bankUptimePollerUseCase: BankUptimePollerUseCase,
) : NaviPaymentBaseVM(NaviPaymentAnalyticScreenName.PAYMENT_SCREEN.screenName) {
private var paymentSdkInitParams: PaymentSdkInitParams? = null
private val BANK_UPTIME_POLLING_INTERVAL = 5.minutes
private val bankUptimePoller by lazy {
NaviApiPoller(repeatInterval = BANK_UPTIME_POLLING_INTERVAL)
}
init {
viewModelScope.safeLaunch {
getSDKInitParams()
syncLitmusExperimentsUseCase.execute(experiments = PMS_LITMUS_EXPERIMENTS)
initFireStorePollerForBankUptime()
viewModelScope.safeLaunch(Dispatchers.IO) {
bankUptimePollerUseCase.executePollerForBankUptime()
}
}
}
@@ -114,43 +102,4 @@ constructor(
)
}
}
private fun initFireStorePollerForBankUptime() {
viewModelScope.launch(Dispatchers.IO) {
bankUptimePoller
.startPolling {
try {
firestoreDataProvider.getQuerySnapShotForCollectionPath(
collectionPath = FIRESTORE_BANK_UPTIME_COLLECTION_PATH
)
} catch (exception: Exception) {
bankUptimePoller.stopPolling()
}
}
.collect {
try {
val bankUptimeQuerySnapShot = it as? QuerySnapshot?
processQuerySnapShotForBankUptime(
bankUptimeQuerySnapShot = bankUptimeQuerySnapShot
)
} catch (exception: Exception) {
bankUptimePoller.stopPolling()
}
}
}
}
private suspend fun processQuerySnapShotForBankUptime(bankUptimeQuerySnapShot: QuerySnapshot?) {
bankUptimeQuerySnapShot?.let { querySnapShot ->
val bankUptimeEntityList =
querySnapShot.documents.parallelMap { it.toBankUptimeEntity() }
if (bankUptimeEntityList.isNotEmpty()) {
bankUptimeRepository.deleteAllExistingDataAndInsertAll(
bankUptimeEntityList = bankUptimeEntityList
)
}
}
}
}