From 5eccff6ebe866d51943e90fa8b8be8c6406bdd06 Mon Sep 17 00:00:00 2001 From: Ujjwal Kumar Date: Thu, 12 Jun 2025 17:07:19 +0530 Subject: [PATCH] NTP-70793 | Priority API onboarding for UPI module & updated contract for merchantInfo (#16561) --- .../common/usecase/MerchantInfoSyncUseCase.kt | 4 +-- .../com/navi/pay/db/NaviPayAppDatabase.kt | 12 +------ .../com/navi/pay/network/di/NaviPayModule.kt | 8 +++++ .../retrofit/NaviPayRetrofitService.kt | 35 +++++++++++++++++++ .../model/network/MerchantInfoResponse.kt | 1 - .../merchant/model/view/MerchantInfoEntity.kt | 9 ++--- 6 files changed, 49 insertions(+), 20 deletions(-) diff --git a/android/navi-pay/src/main/kotlin/com/navi/pay/common/usecase/MerchantInfoSyncUseCase.kt b/android/navi-pay/src/main/kotlin/com/navi/pay/common/usecase/MerchantInfoSyncUseCase.kt index e0b5660473..f3bddbac93 100644 --- a/android/navi-pay/src/main/kotlin/com/navi/pay/common/usecase/MerchantInfoSyncUseCase.kt +++ b/android/navi-pay/src/main/kotlin/com/navi/pay/common/usecase/MerchantInfoSyncUseCase.kt @@ -22,6 +22,7 @@ import com.navi.pay.tstore.merchant.repository.MerchantInfoRepository import com.navi.pay.utils.NAVI_PAY_DATA_REFRESH_DEFAULT_MIN_TIMESTAMP import com.navi.pay.utils.NAVI_PAY_MERCHANT_INFO_SYNC_PAGINATION_TOKEN_KEY import com.navi.pay.utils.NAVI_PAY_SYNC_TABLE_MERCHANT_INFO_KEY +import java.util.Locale import javax.inject.Inject class MerchantInfoSyncUseCase @@ -88,8 +89,7 @@ constructor( val merchantInfoEntities = merchantInfoList.map { item -> MerchantInfoEntity( - id = item.id, - name = item.name, + name = item.name.trim().lowercase(Locale.US), iconUrl = item.iconUrl, isDeleted = item.isDeleted, updatedAt = item.updatedAt, diff --git a/android/navi-pay/src/main/kotlin/com/navi/pay/db/NaviPayAppDatabase.kt b/android/navi-pay/src/main/kotlin/com/navi/pay/db/NaviPayAppDatabase.kt index c0aee8df58..cbdbd4b7cf 100644 --- a/android/navi-pay/src/main/kotlin/com/navi/pay/db/NaviPayAppDatabase.kt +++ b/android/navi-pay/src/main/kotlin/com/navi/pay/db/NaviPayAppDatabase.kt @@ -605,8 +605,7 @@ val NAVI_PAY_APP_DATABASE_MIGRATION_20_21 = db.execSQL( """ CREATE TABLE IF NOT EXISTS $NAVI_PAY_DATABASE_MERCHANT_INFO_TABLE_NAME ( - id TEXT NOT NULL PRIMARY KEY, - name TEXT NOT NULL, + name TEXT NOT NULL PRIMARY KEY, iconUrl TEXT NOT NULL, isDeleted INTEGER NOT NULL DEFAULT 0, updatedAt TEXT NOT NULL DEFAULT '' @@ -614,14 +613,5 @@ val NAVI_PAY_APP_DATABASE_MIGRATION_20_21 = """ .trimIndent() ) - - // Create index on name column for faster lookups - db.execSQL( - """ - CREATE INDEX IF NOT EXISTS index_merchantInfo_name - ON $NAVI_PAY_DATABASE_MERCHANT_INFO_TABLE_NAME (name) - """ - .trimIndent() - ) } } diff --git a/android/navi-pay/src/main/kotlin/com/navi/pay/network/di/NaviPayModule.kt b/android/navi-pay/src/main/kotlin/com/navi/pay/network/di/NaviPayModule.kt index fcc44eb527..f2a29d55b8 100644 --- a/android/navi-pay/src/main/kotlin/com/navi/pay/network/di/NaviPayModule.kt +++ b/android/navi-pay/src/main/kotlin/com/navi/pay/network/di/NaviPayModule.kt @@ -16,6 +16,7 @@ import com.navi.common.model.ModuleName import com.navi.common.model.ModuleNameV2 import com.navi.common.model.NetworkInfo import com.navi.common.network.converter.EmptyBodyHandlingConverterFactory +import com.navi.common.network.requestmanager.PriorityRequestManagerFacade import com.navi.pay.common.batman.DarkKnightScheduler import com.navi.pay.common.batman.DarkKnightSchedulerImpl import com.navi.pay.common.connectivity.NaviPayNetworkConnectivity @@ -133,9 +134,16 @@ object NaviPayNetworkModule { fun providesRetrofitClient( naviPayHttpClient: NaviPayHttpClient, @NaviPayGsonBuilder deserializer: Gson, + priorityRequestManagerFacade: PriorityRequestManagerFacade, ): Retrofit = Retrofit.Builder() .baseUrl(naviPayHttpClient.networkInfo.baseUrl) + .callFactory( + priorityRequestManagerFacade.getPriorityHandlerFactory( + naviPayHttpClient.httpClientBuilder, + naviPayHttpClient.networkInfo.baseUrl, + ) + ) .client(naviPayHttpClient.httpClientBuilder.build()) .addConverterFactory(EmptyBodyHandlingConverterFactory(ModuleNameV2.NAVIPAY.name)) .addConverterFactory(GsonConverterFactory.create(deserializer)) diff --git a/android/navi-pay/src/main/kotlin/com/navi/pay/network/retrofit/NaviPayRetrofitService.kt b/android/navi-pay/src/main/kotlin/com/navi/pay/network/retrofit/NaviPayRetrofitService.kt index 87aaf0e6b3..1ec1e3bf25 100644 --- a/android/navi-pay/src/main/kotlin/com/navi/pay/network/retrofit/NaviPayRetrofitService.kt +++ b/android/navi-pay/src/main/kotlin/com/navi/pay/network/retrofit/NaviPayRetrofitService.kt @@ -10,6 +10,7 @@ package com.navi.pay.network.retrofit import com.navi.common.model.ModuleNameV2 import com.navi.common.model.common.InvoiceDownloadData import com.navi.common.network.models.GenericResponse +import com.navi.common.network.requestmanager.request.Priority import com.navi.common.network.retry.annotations.RetryPolicy import com.navi.pay.common.model.network.ActivateVpaRequest import com.navi.pay.common.model.network.DeactivateVpaRequest @@ -129,6 +130,7 @@ interface NaviPayRetrofitService { private const val NAVI_PAY_API_VERSION4 = "v4" } + @Priority(Priority.Order.HIGH) @RetryPolicy @POST("/gateway-service/$NAVI_PAY_API_VERSION3/navipay/customer/fetch") suspend fun getCustomer( @@ -138,32 +140,38 @@ interface NaviPayRetrofitService { @GET("/gateway-service/$NAVI_PAY_API_VERSION2/navipay/list-banks") suspend fun getAllBanks(): Response> + @Priority(Priority.Order.HIGH) @RetryPolicy @POST("/gateway-service/$NAVI_PAY_API_VERSION2/navipay/banks/fetch-accounts") suspend fun getBankAccounts( @Body fetchAccountsRequest: FetchAccountsRequest ): Response> + @Priority(Priority.Order.HIGH) @POST("/gateway-service/$NAVI_PAY_API_VERSION2/navipay/banks/add-account") suspend fun addBankAccount( @Body addAccountRequest: AddAccountRequest ): Response> + @Priority(Priority.Order.HIGH) @POST("/gateway-service/$NAVI_PAY_API_VERSION3/navipay/customer/bind") suspend fun bindDevice( @Body bindDeviceRequest: BindDeviceRequest ): Response> + @Priority(Priority.Order.HIGH) @POST("/gateway-service/$NAVI_PAY_API_VERSION3/navipay/bind-device/status") suspend fun bindDeviceStatus( @Body bindDeviceStatusRequest: BindDeviceStatusRequest ): Response> + @Priority(Priority.Order.LOW) @POST("/gateway-service/$NAVI_PAY_API_VERSION3/navipay/bind-device/decline") suspend fun declineDeviceBinding( @Body declineDeviceRequest: DeclineDeviceRequest ): Response> + @Priority(Priority.Order.HIGH) @GET("/gateway-service/$NAVI_PAY_API_VERSION3/navipay/account/linked-accounts") suspend fun fetchLinkedAccounts(): Response> @@ -182,40 +190,49 @@ interface NaviPayRetrofitService { @Body deleteAccountRequest: DeleteAccountRequest ): Response> + @Priority(Priority.Order.HIGH) @POST("/gateway-service/$NAVI_PAY_API_VERSION2/navipay/account/otp") suspend fun getOtp(@Body otpRequest: OtpRequest): Response> + @Priority(Priority.Order.HIGH) @POST("/gateway-service/$NAVI_PAY_API_VERSION2/navipay/account/pin/reset") suspend fun setResetPin(@Body pinResetRequest: PinResetRequest): Response> + @Priority(Priority.Order.HIGH) @POST("/gateway-service/$NAVI_PAY_API_VERSION2/navipay/banks/aadhaar-consent") suspend fun checkAadhaarSupport( @Body aadhaarConsentRequest: AadhaarConsentRequest ): Response> + @Priority(Priority.Order.HIGH) @POST("/gateway-service/$NAVI_PAY_API_VERSION2/navipay/account/pin/change") suspend fun changePin(@Body pinChangeRequest: PinChangeRequest): Response> + @Priority(Priority.Order.HIGH) @POST("/gateway-service/$NAVI_PAY_API_VERSION2/navipay/npci/token") suspend fun fetchNpciToken( @Body npciTokenRequest: NpciTokenRequest ): Response> + @Priority(Priority.Order.HIGH) @RetryPolicy @GET("/gateway-service/$NAVI_PAY_API_VERSION/navipay/npci/key") suspend fun fetchNpciKeys(): Response> + @Priority(Priority.Order.HIGH) @RetryPolicy @POST("/gateway-service/$NAVI_PAY_API_VERSION2/navipay/account/balance") suspend fun checkBalance( @Body checkBalanceRequest: CheckBalanceRequest ): Response> + @Priority(Priority.Order.HIGH) @POST("/gateway-service/navipay/$NAVI_PAY_API_VERSION4/txn/sendMoney") suspend fun sendMoney( @Body sendMoneyRequest: SendMoneyRequest ): Response> + @Priority(Priority.Order.HIGH) @POST("/valhalla/navipay/$NAVI_PAY_API_VERSION/transactions") suspend fun coreSendMoney( @Header("X-Upi-Request-Id") upiRequestId: String, @@ -228,6 +245,7 @@ interface NaviPayRetrofitService { @Body mandateListRequest: MandateListRequest ): Response> + @Priority(Priority.Order.HIGH) @RetryPolicy @POST("/gateway-service/navipay/$NAVI_PAY_API_VERSION2/vpa/validate") suspend fun validateVpa( @@ -237,41 +255,49 @@ interface NaviPayRetrofitService { @GET("/gateway-service/$NAVI_PAY_API_VERSION2/navipay/txn/listPending") suspend fun fetchPendingCollectRequests(): Response> + @Priority(Priority.Order.LOW) @POST("/gateway-service/navipay/$NAVI_PAY_API_VERSION2/vpa/blockAndSpam") suspend fun blockSpamUser( @Body blockSpamUserRequest: BlockSpamUserRequest ): Response> + @Priority(Priority.Order.LOW) @POST("/gateway-service/navipay/$NAVI_PAY_API_VERSION2/vpa/block/list") suspend fun fetchBlockedUsers( @Body blockedUsersListRequest: BlockedUsersListRequest ): Response> + @Priority(Priority.Order.LOW) @POST("/gateway-service/navipay/$NAVI_PAY_API_VERSION2/vpa/unblock") suspend fun unblockUser( @Body unblockActionRequest: UnblockActionRequest ): Response> + @Priority(Priority.Order.HIGH) @POST("/gateway-service/navipay/$NAVI_PAY_API_VERSION4/txn/approve-decline") suspend fun processCollectRequest( @Body collectRequestActionRequest: CollectRequestActionRequest ): Response> + @Priority(Priority.Order.HIGH) @POST("/gateway-service/navipay/$NAVI_PAY_API_VERSION2/mandates/create") suspend fun createMandate( @Body createMandateRequest: CreateMandateRequest ): Response> + @Priority(Priority.Order.HIGH) @POST("/gateway-service/navipay/$NAVI_PAY_API_VERSION2/mandates/review") suspend fun reviewMandate( @Body reviewMandateRequest: ReviewMandateRequest ): Response> + @Priority(Priority.Order.HIGH) @POST("/gateway-service/navipay/$NAVI_PAY_API_VERSION2/mandates/pause") suspend fun pauseUnpauseMandate( @Body pauseUnpauseRequest: PauseUnpauseRequest ): Response> + @Priority(Priority.Order.HIGH) @POST("/gateway-service/navipay/$NAVI_PAY_API_VERSION2/mandates/revoke") suspend fun revokeMandate( @Body revokeMandateRequest: RevokeMandateRequest @@ -282,11 +308,13 @@ interface NaviPayRetrofitService { @Body mandateStatusRequest: MandateStatusRequest ): Response> + @Priority(Priority.Order.HIGH) @POST("/gateway-service/$NAVI_PAY_API_VERSION/navipay/mandates/execute") suspend fun executeMandate( @Body executeMandateRequest: ExecuteMandateRequest ): Response> + @Priority(Priority.Order.HIGH) @POST("/gateway-service/$NAVI_PAY_API_VERSION/navipay/mandates/update-lite") suspend fun updateMandate( @Body updateMandateRequest: UpdateMandateRequest @@ -325,25 +353,30 @@ interface NaviPayRetrofitService { @Body mandateDetailRequest: MandateDetailRequest ): Response> + @Priority(Priority.Order.HIGH) @GET("/gateway-service/$NAVI_PAY_API_VERSION2/navipay/fetch/requestId/list") suspend fun getRequestIdSuffixList(): Response> + @Priority(Priority.Order.HIGH) @RetryPolicy @POST("/gateway-service/navipay/$NAVI_PAY_API_VERSION2/vpa/phone-number/vpa") suspend fun payToContact( @Body payToContactRequest: PayToContactRequest ): Response> + @Priority(Priority.Order.LOW) @POST("/gateway-service/$NAVI_PAY_API_VERSION2/navipay/comms/send") suspend fun sendNpsComms( @Body npsCommsRequest: NpsCommsRequest ): Response> + @Priority(Priority.Order.HIGH) @POST("/gateway-service/$NAVI_PAY_API_VERSION2/navipay/upi-lite/lite-registration") suspend fun liteRegistration( @Body liteRegistrationRequest: LiteRegistrationRequest ): Response> + @Priority(Priority.Order.HIGH) @POST("/gateway-service/$NAVI_PAY_API_VERSION2/navipay/upi-lite/lite-sync") suspend fun liteSync( @Body liteSyncRequest: LiteSyncRequest @@ -386,6 +419,7 @@ interface NaviPayRetrofitService { @Body createConversationRequest: CreateConversationRequest, ): Response> + @Priority(Priority.Order.HIGH) @POST("/gateway-service/$NAVI_PAY_API_VERSION/upi-management/vpa/activate") suspend fun activateVpa( @Body activateVpaRequest: ActivateVpaRequest @@ -446,6 +480,7 @@ interface NaviPayRetrofitService { @Body forecloseEmiRequest: ForecloseEmiRequest ): Response> + @Priority(Priority.Order.LOW) @POST("/gateway-service/$NAVI_PAY_API_VERSION2/navipay/customer/deregister") suspend fun deregisterNaviPay( @Body deregisterNaviPayRequest: DeregisterNaviPayRequest diff --git a/android/navi-pay/src/main/kotlin/com/navi/pay/tstore/merchant/model/network/MerchantInfoResponse.kt b/android/navi-pay/src/main/kotlin/com/navi/pay/tstore/merchant/model/network/MerchantInfoResponse.kt index 8dcff8d816..790cddcae3 100644 --- a/android/navi-pay/src/main/kotlin/com/navi/pay/tstore/merchant/model/network/MerchantInfoResponse.kt +++ b/android/navi-pay/src/main/kotlin/com/navi/pay/tstore/merchant/model/network/MerchantInfoResponse.kt @@ -16,7 +16,6 @@ data class MerchantInfoResponse( ) data class MerchantInfoItem( - @SerializedName("id") val id: String, @SerializedName("name") val name: String, @SerializedName("iconUrl") val iconUrl: String, @SerializedName("isDeleted") val isDeleted: Boolean, diff --git a/android/navi-pay/src/main/kotlin/com/navi/pay/tstore/merchant/model/view/MerchantInfoEntity.kt b/android/navi-pay/src/main/kotlin/com/navi/pay/tstore/merchant/model/view/MerchantInfoEntity.kt index d55f4ec4fd..fbe2c0f60d 100644 --- a/android/navi-pay/src/main/kotlin/com/navi/pay/tstore/merchant/model/view/MerchantInfoEntity.kt +++ b/android/navi-pay/src/main/kotlin/com/navi/pay/tstore/merchant/model/view/MerchantInfoEntity.kt @@ -9,7 +9,6 @@ package com.navi.pay.tstore.merchant.model.view import androidx.room.ColumnInfo import androidx.room.Entity -import androidx.room.Index import androidx.room.PrimaryKey import com.navi.pay.utils.NAVI_PAY_DATABASE_MERCHANT_INFO_TABLE_NAME @@ -19,16 +18,14 @@ import com.navi.pay.utils.NAVI_PAY_DATABASE_MERCHANT_INFO_TABLE_NAME * history, the merchant name is looked up in this table to fetch the appropriate icon URL for * display in the transaction list. * - * @property id Unique identifier for the merchant, serves as primary key - * @property name Merchant name, indexed for lookups + * @property name Merchant name, primary key * @property iconUrl URL of the merchant's logo/icon to be displayed in transaction history * @property isDeleted Whether this merchant is marked as deleted * @property updatedAt Last update timestamp for this merchant */ -@Entity(tableName = NAVI_PAY_DATABASE_MERCHANT_INFO_TABLE_NAME, indices = [Index(value = ["name"])]) +@Entity(tableName = NAVI_PAY_DATABASE_MERCHANT_INFO_TABLE_NAME) data class MerchantInfoEntity( - @PrimaryKey @ColumnInfo("id") val id: String, - @ColumnInfo("name") val name: String, + @PrimaryKey @ColumnInfo("name") val name: String, @ColumnInfo("iconUrl") val iconUrl: String, @ColumnInfo("isDeleted") val isDeleted: Boolean, @ColumnInfo("updatedAt") val updatedAt: String,