diff --git a/app/src/main/java/com/tangem/tap/domain/tasks/visa/TangemPayGenerateAddressAndSignChallengeTask.kt b/app/src/main/java/com/tangem/tap/domain/tasks/visa/TangemPayGenerateAddressAndSignChallengeTask.kt index 5c813c1a93..bc05e53d63 100644 --- a/app/src/main/java/com/tangem/tap/domain/tasks/visa/TangemPayGenerateAddressAndSignChallengeTask.kt +++ b/app/src/main/java/com/tangem/tap/domain/tasks/visa/TangemPayGenerateAddressAndSignChallengeTask.kt @@ -11,7 +11,7 @@ import com.tangem.common.core.TangemSdkError import com.tangem.core.error.ext.tangemError import com.tangem.crypto.hdWallet.bip32.ExtendedPublicKey import com.tangem.domain.card.common.visa.VisaUtilities -import com.tangem.domain.visa.datasource.VisaAuthRemoteDataSource +import com.tangem.domain.visa.datasource.TangemPayRemoteDataSource import com.tangem.domain.visa.error.VisaActivationError import com.tangem.domain.visa.model.TangemPayInitialCredentials import com.tangem.domain.visa.model.VisaDataToSignByCustomerWallet @@ -31,7 +31,7 @@ import kotlinx.coroutines.withContext class TangemPayGenerateAddressAndSignChallengeTask @AssistedInject constructor( @Assisted private val coroutineScope: CoroutineScope, private val dispatchersProvider: CoroutineDispatcherProvider, - private val visaAuthRemoteDataSource: VisaAuthRemoteDataSource, + private val tangemPayRemoteDataSource: TangemPayRemoteDataSource, ) : CardSessionRunnable { override fun run(session: CardSession, callback: CompletionCallback) { @@ -52,7 +52,7 @@ class TangemPayGenerateAddressAndSignChallengeTask @AssistedInject constructor( val userWalletId = UserWalletIdBuilder.walletPublicKey(wallet.publicKey) val challenge = withContext(dispatchersProvider.io) { - visaAuthRemoteDataSource.getCustomerWalletAuthChallenge( + tangemPayRemoteDataSource.getCustomerWalletAuthChallenge( customerWalletAddress = address, customerWalletId = userWalletId.stringValue, ) @@ -71,7 +71,7 @@ class TangemPayGenerateAddressAndSignChallengeTask @AssistedInject constructor( } val authTokens = withContext(dispatchersProvider.io) { - visaAuthRemoteDataSource.getTokenWithCustomerWallet( + tangemPayRemoteDataSource.getTokenWithCustomerWallet( sessionId = challenge.session.sessionId, signature = signedData.signature, nonce = signedData.dataToSign.hashToSign, diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/common/config/TangemPay.kt b/core/datasource/src/main/java/com/tangem/datasource/api/common/config/TangemPay.kt index 30a3300678..c0a5c07775 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/api/common/config/TangemPay.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/api/common/config/TangemPay.kt @@ -31,7 +31,7 @@ internal class TangemPay( private fun createDevEnvironment(): ApiEnvironmentConfig = ApiEnvironmentConfig( environment = ApiEnvironment.DEV, - baseUrl = "https://api.dev.us.paera.com/bff/", + baseUrl = "https://api.dev.us.paera.com/bff-v2/", headers = createHeaders(), ) @@ -43,7 +43,7 @@ internal class TangemPay( private fun createProdEnvironment(): ApiEnvironmentConfig = ApiEnvironmentConfig( environment = ApiEnvironment.PROD, - baseUrl = "https://api.us.paera.com/bff/", + baseUrl = "https://api.us.paera.com/bff-v2/", headers = createHeaders(), ) diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/pay/TangemPayApi.kt b/core/datasource/src/main/java/com/tangem/datasource/api/pay/TangemPayApi.kt index 57d31d6a0d..07719ff953 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/api/pay/TangemPayApi.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/api/pay/TangemPayApi.kt @@ -3,109 +3,13 @@ package com.tangem.datasource.api.pay import com.tangem.datasource.api.common.response.ApiResponse import com.tangem.datasource.api.pay.models.request.* import com.tangem.datasource.api.pay.models.response.* -import retrofit2.http.Body -import retrofit2.http.GET -import retrofit2.http.Header -import retrofit2.http.POST -import retrofit2.http.PUT -import retrofit2.http.Path -import retrofit2.http.Query +import retrofit2.http.* private const val TX_HISTORY_PAGING_DEFAULT_LIMIT = 20 @Suppress("TooManyFunctions") interface TangemPayApi { - // region: auth - - @POST("v1/auth/challenge") - suspend fun generateNonceByCardId(@Body request: GenerateNoneByCardIdRequest): ApiResponse - - @POST("v1/auth/challenge") - suspend fun generateNonceByCardWallet( - @Body request: GenerateNoneByCardWalletRequest, - ): ApiResponse - - @POST("v1/auth/token") - suspend fun getAccessTokenByCardId(@Body request: GetAccessTokenByCardIdRequest): ApiResponse - - @POST("v1/auth/token") - suspend fun getTokenByCustomerWallet(@Body request: GetTokenByCustomerWalletRequest): ApiResponse - - @POST("v1/auth/token/refresh") - suspend fun refreshCustomerWalletAccessToken( - @Body request: RefreshCustomerWalletAccessTokenRequest, - ): ApiResponse - - @POST("v1/auth/token") - suspend fun getAccessTokenByCardWallet(@Body request: GetAccessTokenByCardWalletRequest): ApiResponse - - @POST("v1/auth/token/refresh") - suspend fun refreshCardIdAccessToken(@Body request: RefreshTokenByCardIdRequest): ApiResponse - - @POST("v1/auth/token/refresh") - suspend fun refreshCardWalletAccessToken(@Body request: RefreshTokenByCardWalletRequest): ApiResponse - - @POST("v1/auth/token/exchange") - suspend fun exchangeAccessToken(@Body request: ExchangeAccessTokenRequest): ApiResponse - - // endregion - - // region: activation - - @POST("v1/activation/status") - suspend fun getRemoteActivationStatus( - @Header("Authorization") authHeader: String, - @Body request: ActivationStatusRequest, - ): ApiResponse - - @POST("v1/activation/acceptance/message") - suspend fun getCardWalletAcceptance( - @Header("Authorization") authHeader: String, - @Body request: GetCardWalletAcceptanceRequest, - ): ApiResponse - - @POST("v1/activation/acceptance/message") - suspend fun getCustomerWalletAcceptance( - @Header("Authorization") authHeader: String, - @Body request: GetCustomerWalletAcceptanceRequest, - ): ApiResponse - - @POST("v1/activation/data") - suspend fun activateByCardWallet( - @Header("Authorization") authHeader: String, - @Body body: ActivationByCardWalletRequest, - ): ApiResponse - - @POST("v1/activation/data") - suspend fun activateByCustomerWallet( - @Header("Authorization") authHeader: String, - @Body body: ActivationByCustomerWalletRequest, - ): ApiResponse - - @POST("v1/activation/pin") - suspend fun setPinCode( - @Header("Authorization") authHeader: String, - @Body body: SetPinCodeRequest, - ): ApiResponse - - // endregion - - @GET("customer/info") - suspend fun getCustomerInfo( - @Header("Authorization") authHeader: String, - @Query("card_id") cardId: String, - ): ApiResponse - - @GET("product_instance/transactions") - suspend fun getTxHistory( - @Header("Authorization") authHeader: String, - @Query("customer_id") customerId: String, - @Query("product_instance_id") productInstanceId: String, - @Query("limit") limit: Int, - @Query("offset") offset: Int, - ): ApiResponse - @GET("v1/customer/transactions") suspend fun getTangemPayTxHistory( @Header("Authorization") authHeader: String, diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/pay/models/response/CustomerMeResponse.kt b/core/datasource/src/main/java/com/tangem/datasource/api/pay/models/response/CustomerMeResponse.kt index fd89823bea..baf6d5d265 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/api/pay/models/response/CustomerMeResponse.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/api/pay/models/response/CustomerMeResponse.kt @@ -12,11 +12,11 @@ data class CustomerMeResponse( data class Result( @Json(name = "id") val id: String, @Json(name = "state") val state: String, - @Json(name = "createdAt") val createdAt: String, + @Json(name = "created_at") val createdAt: String, @Json(name = "product_instance") val productInstance: ProductInstance?, @Json(name = "payment_account") val paymentAccount: PaymentAccount?, @Json(name = "kyc") val kyc: Kyc?, - @Json(name = "depositAddress") val depositAddress: String?, + @Json(name = "deposit_address") val depositAddress: String?, @Json(name = "card") val card: Card?, @Json(name = "balance") val balance: BalanceResponse?, ) @@ -24,49 +24,49 @@ data class CustomerMeResponse( @JsonClass(generateAdapter = true) data class ProductInstance( @Json(name = "id") val id: String, - @Json(name = "cid") val cid: String, + @Json(name = "cid") val cid: String?, @Json(name = "card_id") val cardId: String, - @Json(name = "card_wallet_address") val cardWalletAddress: String, + @Json(name = "card_wallet_address") val cardWalletAddress: String?, @Json(name = "status") val status: Status, @Json(name = "updated_at") val updatedAt: String, @Json(name = "payment_account_id") val paymentAccountId: String, ) { @JsonClass(generateAdapter = false) enum class Status { - @Json(name = "new") + @Json(name = "NEW") NEW, - @Json(name = "ready_for_manufacturing") + @Json(name = "READY_FOR_MANUFACTURING") READY_FOR_MANUFACTURING, - @Json(name = "manufacturing") + @Json(name = "MANUFACTURING") MANUFACTURING, - @Json(name = "sent_to_delivery") + @Json(name = "SENT_TO_DELIVERY") SENT_TO_DELIVERY, - @Json(name = "delivered") + @Json(name = "DELIVERED") DELIVERED, - @Json(name = "activating") + @Json(name = "ACTIVATING") ACTIVATING, - @Json(name = "active") + @Json(name = "ACTIVE") ACTIVE, - @Json(name = "blocked") + @Json(name = "BLOCKED") BLOCKED, - @Json(name = "deactivating") + @Json(name = "DEACTIVATING") DEACTIVATING, - @Json(name = "deactivated") + @Json(name = "DEACTIVATED") DEACTIVATED, - @Json(name = "canceled") + @Json(name = "CANCELED") CANCELED, - @Json(name = "unknown") + @Json(name = "UNKNOWN") UNKNOWN, } } @@ -91,8 +91,8 @@ data class CustomerMeResponse( @JsonClass(generateAdapter = true) data class Card( @Json(name = "token") val token: String, - @Json(name = "expiration_month") val expirationMonth: Int, - @Json(name = "expiration_year") val expirationYear: Int, + @Json(name = "expiration_month") val expirationMonth: String, + @Json(name = "expiration_year") val expirationYear: String, @Json(name = "emboss_name") val embossName: String, @Json(name = "card_type") val cardType: String, @Json(name = "card_status") val cardStatus: String, diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/pay/models/response/VisaErrorResponse.kt b/core/datasource/src/main/java/com/tangem/datasource/api/pay/models/response/TangemPayErrorResponse.kt similarity index 90% rename from core/datasource/src/main/java/com/tangem/datasource/api/pay/models/response/VisaErrorResponse.kt rename to core/datasource/src/main/java/com/tangem/datasource/api/pay/models/response/TangemPayErrorResponse.kt index b211405000..7ae65cd653 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/api/pay/models/response/VisaErrorResponse.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/api/pay/models/response/TangemPayErrorResponse.kt @@ -4,7 +4,7 @@ import com.squareup.moshi.Json import com.squareup.moshi.JsonClass @JsonClass(generateAdapter = true) -data class VisaErrorResponse( +data class TangemPayErrorResponse( @Json(name = "error") val error: Error, ) { @JsonClass(generateAdapter = true) diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/visa/VisaApi.kt b/core/datasource/src/main/java/com/tangem/datasource/api/visa/VisaApi.kt new file mode 100644 index 0000000000..cda093a821 --- /dev/null +++ b/core/datasource/src/main/java/com/tangem/datasource/api/visa/VisaApi.kt @@ -0,0 +1,104 @@ +package com.tangem.datasource.api.visa + +import com.tangem.datasource.api.common.response.ApiResponse +import com.tangem.datasource.api.pay.models.request.RefreshTokenByCardIdRequest +import com.tangem.datasource.api.pay.models.request.RefreshTokenByCardWalletRequest +import com.tangem.datasource.api.pay.models.request.SetPinCodeRequest +import com.tangem.datasource.api.visa.models.request.ActivationByCardWalletRequest +import com.tangem.datasource.api.visa.models.request.ActivationByCustomerWalletRequest +import com.tangem.datasource.api.visa.models.request.ActivationStatusRequest +import com.tangem.datasource.api.visa.models.request.ExchangeAccessTokenRequest +import com.tangem.datasource.api.visa.models.request.GenerateNoneByCardIdRequest +import com.tangem.datasource.api.visa.models.request.GenerateNoneByCardWalletRequest +import com.tangem.datasource.api.visa.models.request.GetAccessTokenByCardIdRequest +import com.tangem.datasource.api.visa.models.request.GetAccessTokenByCardWalletRequest +import com.tangem.datasource.api.visa.models.request.GetCardWalletAcceptanceRequest +import com.tangem.datasource.api.visa.models.request.GetCustomerWalletAcceptanceRequest +import com.tangem.datasource.api.visa.models.response.CardActivationRemoteStateResponse +import com.tangem.datasource.api.visa.models.response.GenerateNonceResponse +import com.tangem.datasource.api.visa.models.response.JWTResponse +import com.tangem.datasource.api.visa.models.response.VisaCustomerInfo +import com.tangem.datasource.api.visa.models.response.VisaDataToSignResponse +import com.tangem.datasource.api.visa.models.response.VisaTxHistoryResponse +import retrofit2.http.Body +import retrofit2.http.GET +import retrofit2.http.Header +import retrofit2.http.POST +import retrofit2.http.Query + +interface VisaApi { + + @POST("v1/auth/token/refresh") + suspend fun refreshCardWalletAccessToken(@Body request: RefreshTokenByCardWalletRequest): ApiResponse + + @POST("v1/auth/challenge") + suspend fun generateNonceByCardId(@Body request: GenerateNoneByCardIdRequest): ApiResponse + + @POST("v1/auth/challenge") + suspend fun generateNonceByCardWallet( + @Body request: GenerateNoneByCardWalletRequest, + ): ApiResponse + + @POST("v1/auth/token") + suspend fun getAccessTokenByCardId(@Body request: GetAccessTokenByCardIdRequest): ApiResponse + + @POST("v1/auth/token") + suspend fun getAccessTokenByCardWallet(@Body request: GetAccessTokenByCardWalletRequest): ApiResponse + + @POST("v1/auth/token/refresh") + suspend fun refreshCardIdAccessToken(@Body request: RefreshTokenByCardIdRequest): ApiResponse + + @POST("v1/auth/token/exchange") + suspend fun exchangeAccessToken(@Body request: ExchangeAccessTokenRequest): ApiResponse + + @POST("v1/activation/status") + suspend fun getRemoteActivationStatus( + @Header("Authorization") authHeader: String, + @Body request: ActivationStatusRequest, + ): ApiResponse + + @POST("v1/activation/acceptance/message") + suspend fun getCardWalletAcceptance( + @Header("Authorization") authHeader: String, + @Body request: GetCardWalletAcceptanceRequest, + ): ApiResponse + + @POST("v1/activation/acceptance/message") + suspend fun getCustomerWalletAcceptance( + @Header("Authorization") authHeader: String, + @Body request: GetCustomerWalletAcceptanceRequest, + ): ApiResponse + + @POST("v1/activation/data") + suspend fun activateByCardWallet( + @Header("Authorization") authHeader: String, + @Body body: ActivationByCardWalletRequest, + ): ApiResponse + + @POST("v1/activation/data") + suspend fun activateByCustomerWallet( + @Header("Authorization") authHeader: String, + @Body body: ActivationByCustomerWalletRequest, + ): ApiResponse + + @POST("v1/activation/pin") + suspend fun setPinCode( + @Header("Authorization") authHeader: String, + @Body body: SetPinCodeRequest, + ): ApiResponse + + @GET("customer/info") + suspend fun getCustomerInfo( + @Header("Authorization") authHeader: String, + @Query("card_id") cardId: String, + ): ApiResponse + + @GET("product_instance/transactions") + suspend fun getTxHistory( + @Header("Authorization") authHeader: String, + @Query("customer_id") customerId: String, + @Query("product_instance_id") productInstanceId: String, + @Query("limit") limit: Int, + @Query("offset") offset: Int, + ): ApiResponse +} \ No newline at end of file diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/pay/models/request/ActivationByCardWalletRequest.kt b/core/datasource/src/main/java/com/tangem/datasource/api/visa/models/request/ActivationByCardWalletRequest.kt similarity index 95% rename from core/datasource/src/main/java/com/tangem/datasource/api/pay/models/request/ActivationByCardWalletRequest.kt rename to core/datasource/src/main/java/com/tangem/datasource/api/visa/models/request/ActivationByCardWalletRequest.kt index a5dafd7b32..c16198f0c6 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/api/pay/models/request/ActivationByCardWalletRequest.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/api/visa/models/request/ActivationByCardWalletRequest.kt @@ -1,4 +1,4 @@ -package com.tangem.datasource.api.pay.models.request +package com.tangem.datasource.api.visa.models.request import com.squareup.moshi.Json import com.squareup.moshi.JsonClass diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/pay/models/request/ActivationByCustomerWalletRequest.kt b/core/datasource/src/main/java/com/tangem/datasource/api/visa/models/request/ActivationByCustomerWalletRequest.kt similarity index 90% rename from core/datasource/src/main/java/com/tangem/datasource/api/pay/models/request/ActivationByCustomerWalletRequest.kt rename to core/datasource/src/main/java/com/tangem/datasource/api/visa/models/request/ActivationByCustomerWalletRequest.kt index 731188d92a..ace2090603 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/api/pay/models/request/ActivationByCustomerWalletRequest.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/api/visa/models/request/ActivationByCustomerWalletRequest.kt @@ -1,4 +1,4 @@ -package com.tangem.datasource.api.pay.models.request +package com.tangem.datasource.api.visa.models.request import com.squareup.moshi.Json import com.squareup.moshi.JsonClass diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/pay/models/request/ActivationStatusRequest.kt b/core/datasource/src/main/java/com/tangem/datasource/api/visa/models/request/ActivationStatusRequest.kt similarity index 82% rename from core/datasource/src/main/java/com/tangem/datasource/api/pay/models/request/ActivationStatusRequest.kt rename to core/datasource/src/main/java/com/tangem/datasource/api/visa/models/request/ActivationStatusRequest.kt index 9f3e017e55..7ce0614abc 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/api/pay/models/request/ActivationStatusRequest.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/api/visa/models/request/ActivationStatusRequest.kt @@ -1,4 +1,4 @@ -package com.tangem.datasource.api.pay.models.request +package com.tangem.datasource.api.visa.models.request import com.squareup.moshi.Json import com.squareup.moshi.JsonClass diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/pay/models/request/ExchangeAccessTokenRequest.kt b/core/datasource/src/main/java/com/tangem/datasource/api/visa/models/request/ExchangeAccessTokenRequest.kt similarity index 82% rename from core/datasource/src/main/java/com/tangem/datasource/api/pay/models/request/ExchangeAccessTokenRequest.kt rename to core/datasource/src/main/java/com/tangem/datasource/api/visa/models/request/ExchangeAccessTokenRequest.kt index 164d71fa5c..63b9fe43d8 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/api/pay/models/request/ExchangeAccessTokenRequest.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/api/visa/models/request/ExchangeAccessTokenRequest.kt @@ -1,4 +1,4 @@ -package com.tangem.datasource.api.pay.models.request +package com.tangem.datasource.api.visa.models.request import com.squareup.moshi.Json import com.squareup.moshi.JsonClass diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/pay/models/request/GenerateNoneByCardIdRequest.kt b/core/datasource/src/main/java/com/tangem/datasource/api/visa/models/request/GenerateNoneByCardIdRequest.kt similarity index 85% rename from core/datasource/src/main/java/com/tangem/datasource/api/pay/models/request/GenerateNoneByCardIdRequest.kt rename to core/datasource/src/main/java/com/tangem/datasource/api/visa/models/request/GenerateNoneByCardIdRequest.kt index 7ab945b8f8..d3aa5eaa50 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/api/pay/models/request/GenerateNoneByCardIdRequest.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/api/visa/models/request/GenerateNoneByCardIdRequest.kt @@ -1,4 +1,4 @@ -package com.tangem.datasource.api.pay.models.request +package com.tangem.datasource.api.visa.models.request import com.squareup.moshi.Json import com.squareup.moshi.JsonClass diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/pay/models/request/GenerateNoneByCardWalletRequest.kt b/core/datasource/src/main/java/com/tangem/datasource/api/visa/models/request/GenerateNoneByCardWalletRequest.kt similarity index 86% rename from core/datasource/src/main/java/com/tangem/datasource/api/pay/models/request/GenerateNoneByCardWalletRequest.kt rename to core/datasource/src/main/java/com/tangem/datasource/api/visa/models/request/GenerateNoneByCardWalletRequest.kt index 95d2f8f9bf..69c2f7a7d5 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/api/pay/models/request/GenerateNoneByCardWalletRequest.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/api/visa/models/request/GenerateNoneByCardWalletRequest.kt @@ -1,4 +1,4 @@ -package com.tangem.datasource.api.pay.models.request +package com.tangem.datasource.api.visa.models.request import com.squareup.moshi.Json import com.squareup.moshi.JsonClass diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/pay/models/request/GetAccessTokenByCardIdRequest.kt b/core/datasource/src/main/java/com/tangem/datasource/api/visa/models/request/GetAccessTokenByCardIdRequest.kt similarity index 86% rename from core/datasource/src/main/java/com/tangem/datasource/api/pay/models/request/GetAccessTokenByCardIdRequest.kt rename to core/datasource/src/main/java/com/tangem/datasource/api/visa/models/request/GetAccessTokenByCardIdRequest.kt index 380284bab7..c212c81412 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/api/pay/models/request/GetAccessTokenByCardIdRequest.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/api/visa/models/request/GetAccessTokenByCardIdRequest.kt @@ -1,4 +1,4 @@ -package com.tangem.datasource.api.pay.models.request +package com.tangem.datasource.api.visa.models.request import com.squareup.moshi.Json import com.squareup.moshi.JsonClass diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/pay/models/request/GetAccessTokenByCardWalletRequest.kt b/core/datasource/src/main/java/com/tangem/datasource/api/visa/models/request/GetAccessTokenByCardWalletRequest.kt similarity index 87% rename from core/datasource/src/main/java/com/tangem/datasource/api/pay/models/request/GetAccessTokenByCardWalletRequest.kt rename to core/datasource/src/main/java/com/tangem/datasource/api/visa/models/request/GetAccessTokenByCardWalletRequest.kt index 50fc683c9b..df5d0c3935 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/api/pay/models/request/GetAccessTokenByCardWalletRequest.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/api/visa/models/request/GetAccessTokenByCardWalletRequest.kt @@ -1,4 +1,4 @@ -package com.tangem.datasource.api.pay.models.request +package com.tangem.datasource.api.visa.models.request import com.squareup.moshi.Json import com.squareup.moshi.JsonClass diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/pay/models/request/GetCardWalletAcceptanceRequest.kt b/core/datasource/src/main/java/com/tangem/datasource/api/visa/models/request/GetCardWalletAcceptanceRequest.kt similarity index 86% rename from core/datasource/src/main/java/com/tangem/datasource/api/pay/models/request/GetCardWalletAcceptanceRequest.kt rename to core/datasource/src/main/java/com/tangem/datasource/api/visa/models/request/GetCardWalletAcceptanceRequest.kt index de4cec941b..dd084fa326 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/api/pay/models/request/GetCardWalletAcceptanceRequest.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/api/visa/models/request/GetCardWalletAcceptanceRequest.kt @@ -1,4 +1,4 @@ -package com.tangem.datasource.api.pay.models.request +package com.tangem.datasource.api.visa.models.request import com.squareup.moshi.Json import com.squareup.moshi.JsonClass diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/pay/models/request/GetCustomerWalletAcceptanceRequest.kt b/core/datasource/src/main/java/com/tangem/datasource/api/visa/models/request/GetCustomerWalletAcceptanceRequest.kt similarity index 87% rename from core/datasource/src/main/java/com/tangem/datasource/api/pay/models/request/GetCustomerWalletAcceptanceRequest.kt rename to core/datasource/src/main/java/com/tangem/datasource/api/visa/models/request/GetCustomerWalletAcceptanceRequest.kt index 7ff5c16337..3948fc43b3 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/api/pay/models/request/GetCustomerWalletAcceptanceRequest.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/api/visa/models/request/GetCustomerWalletAcceptanceRequest.kt @@ -1,4 +1,4 @@ -package com.tangem.datasource.api.pay.models.request +package com.tangem.datasource.api.visa.models.request import com.squareup.moshi.Json import com.squareup.moshi.JsonClass diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/pay/models/response/CardActivationRemoteStateResponse.kt b/core/datasource/src/main/java/com/tangem/datasource/api/visa/models/response/CardActivationRemoteStateResponse.kt similarity index 93% rename from core/datasource/src/main/java/com/tangem/datasource/api/pay/models/response/CardActivationRemoteStateResponse.kt rename to core/datasource/src/main/java/com/tangem/datasource/api/visa/models/response/CardActivationRemoteStateResponse.kt index ae9c701b06..a34a31a366 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/api/pay/models/response/CardActivationRemoteStateResponse.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/api/visa/models/response/CardActivationRemoteStateResponse.kt @@ -1,4 +1,4 @@ -package com.tangem.datasource.api.pay.models.response +package com.tangem.datasource.api.visa.models.response import com.squareup.moshi.Json import com.squareup.moshi.JsonClass diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/pay/models/response/GenerateNonceResponse.kt b/core/datasource/src/main/java/com/tangem/datasource/api/visa/models/response/GenerateNonceResponse.kt similarity index 86% rename from core/datasource/src/main/java/com/tangem/datasource/api/pay/models/response/GenerateNonceResponse.kt rename to core/datasource/src/main/java/com/tangem/datasource/api/visa/models/response/GenerateNonceResponse.kt index 958580bc5e..9a79a457b8 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/api/pay/models/response/GenerateNonceResponse.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/api/visa/models/response/GenerateNonceResponse.kt @@ -1,4 +1,4 @@ -package com.tangem.datasource.api.pay.models.response +package com.tangem.datasource.api.visa.models.response import com.squareup.moshi.Json import com.squareup.moshi.JsonClass diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/pay/models/response/JWTResponse.kt b/core/datasource/src/main/java/com/tangem/datasource/api/visa/models/response/JWTResponse.kt similarity index 93% rename from core/datasource/src/main/java/com/tangem/datasource/api/pay/models/response/JWTResponse.kt rename to core/datasource/src/main/java/com/tangem/datasource/api/visa/models/response/JWTResponse.kt index c28a882ae9..0380074d02 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/api/pay/models/response/JWTResponse.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/api/visa/models/response/JWTResponse.kt @@ -1,4 +1,4 @@ -package com.tangem.datasource.api.pay.models.response +package com.tangem.datasource.api.visa.models.response import com.squareup.moshi.Json import com.squareup.moshi.JsonClass diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/pay/models/response/VisaCustomerInfo.kt b/core/datasource/src/main/java/com/tangem/datasource/api/visa/models/response/VisaCustomerInfo.kt similarity index 89% rename from core/datasource/src/main/java/com/tangem/datasource/api/pay/models/response/VisaCustomerInfo.kt rename to core/datasource/src/main/java/com/tangem/datasource/api/visa/models/response/VisaCustomerInfo.kt index b6a227f62f..70d5f6ac94 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/api/pay/models/response/VisaCustomerInfo.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/api/visa/models/response/VisaCustomerInfo.kt @@ -1,4 +1,4 @@ -package com.tangem.datasource.api.pay.models.response +package com.tangem.datasource.api.visa.models.response import com.squareup.moshi.Json import com.squareup.moshi.JsonClass diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/pay/models/response/VisaDataToSignResponse.kt b/core/datasource/src/main/java/com/tangem/datasource/api/visa/models/response/VisaDataToSignResponse.kt similarity index 84% rename from core/datasource/src/main/java/com/tangem/datasource/api/pay/models/response/VisaDataToSignResponse.kt rename to core/datasource/src/main/java/com/tangem/datasource/api/visa/models/response/VisaDataToSignResponse.kt index a35c99ab59..a19d3e7ca4 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/api/pay/models/response/VisaDataToSignResponse.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/api/visa/models/response/VisaDataToSignResponse.kt @@ -1,4 +1,4 @@ -package com.tangem.datasource.api.pay.models.response +package com.tangem.datasource.api.visa.models.response import com.squareup.moshi.Json import com.squareup.moshi.JsonClass diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/pay/models/response/VisaTxHistoryResponse.kt b/core/datasource/src/main/java/com/tangem/datasource/api/visa/models/response/VisaTxHistoryResponse.kt similarity index 98% rename from core/datasource/src/main/java/com/tangem/datasource/api/pay/models/response/VisaTxHistoryResponse.kt rename to core/datasource/src/main/java/com/tangem/datasource/api/visa/models/response/VisaTxHistoryResponse.kt index aea17cc4c1..7c4d7d0a22 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/api/pay/models/response/VisaTxHistoryResponse.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/api/visa/models/response/VisaTxHistoryResponse.kt @@ -1,4 +1,4 @@ -package com.tangem.datasource.api.pay.models.response +package com.tangem.datasource.api.visa.models.response import com.squareup.moshi.Json import com.squareup.moshi.JsonClass diff --git a/core/datasource/src/main/java/com/tangem/datasource/di/NetworkModule.kt b/core/datasource/src/main/java/com/tangem/datasource/di/NetworkModule.kt index 6c07212416..511a2dab3d 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/di/NetworkModule.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/di/NetworkModule.kt @@ -5,7 +5,6 @@ import com.tangem.datasource.api.common.blockaid.BlockAidApi import com.tangem.datasource.api.common.config.ApiConfig import com.tangem.datasource.api.common.config.ApiConfig.Companion.MOCKED_BUILD_TYPE import com.tangem.datasource.api.common.config.ApiConfigs -import com.tangem.datasource.api.common.config.MoonPay import com.tangem.datasource.api.common.config.managers.ApiConfigsManager import com.tangem.datasource.api.common.config.managers.DevApiConfigsManager import com.tangem.datasource.api.common.config.managers.MockApiConfigsManager @@ -21,6 +20,7 @@ import com.tangem.datasource.api.pay.TangemPayAuthApi import com.tangem.datasource.api.stakekit.StakeKitApi import com.tangem.datasource.api.tangemTech.TangemTechApi import com.tangem.datasource.api.tangemTech.YieldSupplyApi +import com.tangem.datasource.api.visa.VisaApi import com.tangem.datasource.di.utils.RetrofitApiBuilder import com.tangem.datasource.di.utils.RetrofitApiBuilder.Timeouts import com.tangem.datasource.local.preferences.AppPreferencesStore @@ -129,7 +129,16 @@ internal object NetworkModule { @Provides @Singleton - fun provideTangemVisaApi(retrofitApiBuilder: RetrofitApiBuilder): TangemPayApi { + fun provideTangemPayApi(retrofitApiBuilder: RetrofitApiBuilder): TangemPayApi { + return retrofitApiBuilder.build( + apiConfigId = ApiConfig.ID.TangemPay, + applyTimeoutAnnotations = false, + ) + } + + @Provides + @Singleton + fun provideVisaApi(retrofitApiBuilder: RetrofitApiBuilder): VisaApi { return retrofitApiBuilder.build( apiConfigId = ApiConfig.ID.TangemPay, applyTimeoutAnnotations = false, diff --git a/core/datasource/src/test/kotlin/com/tangem/datasource/api/common/config/managers/ProdApiConfigsManagerTest.kt b/core/datasource/src/test/kotlin/com/tangem/datasource/api/common/config/managers/ProdApiConfigsManagerTest.kt index bf6b755bc5..e176d0b768 100644 --- a/core/datasource/src/test/kotlin/com/tangem/datasource/api/common/config/managers/ProdApiConfigsManagerTest.kt +++ b/core/datasource/src/test/kotlin/com/tangem/datasource/api/common/config/managers/ProdApiConfigsManagerTest.kt @@ -251,7 +251,7 @@ internal class ProdApiConfigsManagerTest { id = ApiConfig.ID.TangemPay, expected = ApiEnvironmentConfig( environment = ApiEnvironment.DEV, - baseUrl = "https://api.dev.us.paera.com/bff/", + baseUrl = "https://api.dev.us.paera.com/bff-v2/", headers = mapOf( "version" to ProviderSuspend { VERSION_NAME }, "platform" to ProviderSuspend { "Android" }, diff --git a/data/visa/src/main/kotlin/com/tangem/data/pay/util/TangemPayErrorConverter.kt b/data/visa/src/main/kotlin/com/tangem/data/pay/util/TangemPayErrorConverter.kt index 8080f3b642..1b81ab80eb 100644 --- a/data/visa/src/main/kotlin/com/tangem/data/pay/util/TangemPayErrorConverter.kt +++ b/data/visa/src/main/kotlin/com/tangem/data/pay/util/TangemPayErrorConverter.kt @@ -2,7 +2,7 @@ package com.tangem.data.pay.util import com.squareup.moshi.Moshi import com.tangem.datasource.api.common.response.ApiResponseError -import com.tangem.datasource.api.pay.models.response.VisaErrorResponse +import com.tangem.datasource.api.pay.models.response.TangemPayErrorResponse import com.tangem.datasource.di.NetworkMoshi import com.tangem.domain.visa.error.VisaApiError import com.tangem.utils.converter.Converter @@ -14,7 +14,7 @@ internal class TangemPayErrorConverter @Inject constructor( @NetworkMoshi moshi: Moshi, ) : Converter { - private val visaErrorAdapter by lazy { moshi.adapter(VisaErrorResponse::class.java) } + private val tangemPayErrorAdapter by lazy { moshi.adapter(TangemPayErrorResponse::class.java) } override fun convert(value: Throwable): VisaApiError { return if (value is ApiResponseError.HttpException) { @@ -23,7 +23,7 @@ internal class TangemPayErrorConverter @Inject constructor( val errorBody = value.errorBody ?: return VisaApiError.UnknownWithoutCode return runCatching { - visaErrorAdapter.fromJson(errorBody)?.error?.code ?: value.code.numericCode + tangemPayErrorAdapter.fromJson(errorBody)?.error?.code ?: value.code.numericCode }.map { VisaApiError.fromBackendError(it) }.getOrElse { diff --git a/data/visa/src/main/kotlin/com/tangem/data/visa/DefaultTangemPayRemoteDataSource.kt b/data/visa/src/main/kotlin/com/tangem/data/visa/DefaultTangemPayRemoteDataSource.kt new file mode 100644 index 0000000000..c2a927964b --- /dev/null +++ b/data/visa/src/main/kotlin/com/tangem/data/visa/DefaultTangemPayRemoteDataSource.kt @@ -0,0 +1,87 @@ +package com.tangem.data.visa + +import arrow.core.Either +import com.squareup.moshi.Moshi +import com.tangem.datasource.api.common.response.ApiResponseError +import com.tangem.datasource.api.common.response.getOrThrow +import com.tangem.datasource.api.pay.TangemPayAuthApi +import com.tangem.datasource.api.pay.models.request.GenerateNonceByCustomerWalletRequest +import com.tangem.datasource.api.pay.models.request.GetTokenByCustomerWalletRequest +import com.tangem.datasource.api.pay.models.response.TangemPayErrorResponse +import com.tangem.datasource.di.NetworkMoshi +import com.tangem.domain.visa.datasource.TangemPayRemoteDataSource +import com.tangem.domain.visa.error.VisaApiError +import com.tangem.domain.visa.model.TangemPayAuthTokens +import com.tangem.domain.visa.model.VisaAuthChallenge +import com.tangem.domain.visa.model.VisaAuthSession +import com.tangem.utils.coroutines.CoroutineDispatcherProvider +import kotlinx.coroutines.withContext +import javax.inject.Inject + +internal class DefaultTangemPayRemoteDataSource @Inject constructor( + @NetworkMoshi private val moshi: Moshi, + private val tangemPayAuthApi: TangemPayAuthApi, + private val dispatchers: CoroutineDispatcherProvider, +) : TangemPayRemoteDataSource { + + private val errorAdapter by lazy { moshi.adapter(TangemPayErrorResponse::class.java) } + + override suspend fun getCustomerWalletAuthChallenge( + customerWalletAddress: String, + customerWalletId: String, + ): Either = withContext(dispatchers.io) { + request { + tangemPayAuthApi.generateNonceByCustomerWallet( + request = GenerateNonceByCustomerWalletRequest( + customerWalletAddress = customerWalletAddress, + customerWalletId = customerWalletId, + ), + ).getOrThrow() + }.map { response -> + VisaAuthChallenge.Wallet( + challenge = response.nonce, + session = VisaAuthSession(response.sessionId), + ) + } + } + + override suspend fun getTokenWithCustomerWallet( + sessionId: String, + signature: String, + nonce: String, + ): Either = withContext(dispatchers.io) { + request { + tangemPayAuthApi.getTokenByCustomerWallet( + request = GetTokenByCustomerWalletRequest( + authType = "customer_wallet", + sessionId = sessionId, + signature = signature, + messageFormat = "Tangem Pay wants to sign in with your account. Nonce: $nonce", + ), + ).getOrThrow() + }.map { response -> + TangemPayAuthTokens( + accessToken = response.accessToken, + expiresAt = response.expiresAt, + refreshToken = response.refreshToken, + refreshExpiresAt = response.refreshExpiresAt, + ) + } + } + + private suspend fun request(requestBlock: suspend () -> T): Either { + return runCatching { + Either.Right(requestBlock()) + }.getOrElse { responseError -> + if (responseError is ApiResponseError.HttpException && + responseError.errorBody != null + ) { + val errorCode = + errorAdapter.fromJson(responseError.errorBody)?.error?.code ?: responseError.code.numericCode + return Either.Left(VisaApiError.fromBackendError(errorCode)) + } + + return Either.Left(VisaApiError.UnknownWithoutCode) + } + } +} \ No newline at end of file diff --git a/data/visa/src/main/kotlin/com/tangem/data/visa/DefaultVisaActivationRepository.kt b/data/visa/src/main/kotlin/com/tangem/data/visa/DefaultVisaActivationRepository.kt index 5b5ee71abe..0b617bfe36 100644 --- a/data/visa/src/main/kotlin/com/tangem/data/visa/DefaultVisaActivationRepository.kt +++ b/data/visa/src/main/kotlin/com/tangem/data/visa/DefaultVisaActivationRepository.kt @@ -10,15 +10,16 @@ import com.tangem.datasource.api.common.config.ApiEnvironment import com.tangem.datasource.api.common.config.managers.ApiConfigsManager import com.tangem.datasource.api.common.response.ApiResponseError import com.tangem.datasource.api.common.response.getOrThrow -import com.tangem.datasource.api.pay.TangemPayApi -import com.tangem.datasource.api.pay.models.request.* -import com.tangem.datasource.api.pay.models.response.VisaErrorResponseJsonAdapter +import com.tangem.datasource.api.pay.models.request.SetPinCodeRequest +import com.tangem.datasource.api.pay.models.response.TangemPayErrorResponse +import com.tangem.datasource.api.visa.VisaApi +import com.tangem.datasource.api.visa.models.request.* import com.tangem.datasource.di.NetworkMoshi import com.tangem.datasource.local.visa.VisaAuthTokenStorage +import com.tangem.domain.visa.datasource.VisaAuthRemoteDataSource import com.tangem.domain.visa.error.VisaApiError import com.tangem.domain.visa.model.* import com.tangem.domain.visa.repository.VisaActivationRepository -import com.tangem.domain.visa.datasource.VisaAuthRemoteDataSource import com.tangem.utils.coroutines.CoroutineDispatcherProvider import dagger.assisted.Assisted import dagger.assisted.AssistedFactory @@ -29,7 +30,7 @@ import kotlinx.coroutines.withContext internal class DefaultVisaActivationRepository @AssistedInject constructor( @Assisted private val visaCardId: VisaCardId, @NetworkMoshi private val moshi: Moshi, - private val visaApi: TangemPayApi, + private val visaApi: VisaApi, private val dispatcherProvider: CoroutineDispatcherProvider, private val visaAuthTokenStorage: VisaAuthTokenStorage, private val visaAuthRemoteDataSource: VisaAuthRemoteDataSource, @@ -37,7 +38,7 @@ internal class DefaultVisaActivationRepository @AssistedInject constructor( private val apiConfigsManager: ApiConfigsManager, ) : VisaActivationRepository { - private val visaErrorAdapter = VisaErrorResponseJsonAdapter(moshi) + private val errorAdapter by lazy { moshi.adapter(TangemPayErrorResponse::class.java) } override suspend fun getActivationRemoteState(): Either = withContext(dispatcherProvider.io) { @@ -187,7 +188,7 @@ internal class DefaultVisaActivationRepository @AssistedInject constructor( responseError.errorBody != null ) { val errorCode = - visaErrorAdapter.fromJson(responseError.errorBody!!)?.error?.code ?: responseError.code.numericCode + errorAdapter.fromJson(responseError.errorBody!!)?.error?.code ?: responseError.code.numericCode return Either.Left(VisaApiError.fromBackendError(errorCode)) } @@ -207,7 +208,7 @@ internal class DefaultVisaActivationRepository @AssistedInject constructor( }.getOrElse { responseError -> if (responseError is ApiResponseError.HttpException && responseError.errorBody != null) { val errorCode = - visaErrorAdapter.fromJson(responseError.errorBody!!)?.error?.code + errorAdapter.fromJson(responseError.errorBody!!)?.error?.code ?: responseError.code.numericCode Either.Left(VisaApiError.fromBackendError(errorCode)) } else { diff --git a/data/visa/src/main/kotlin/com/tangem/data/visa/DefaultVisaAuthRemoteDataSource.kt b/data/visa/src/main/kotlin/com/tangem/data/visa/DefaultVisaAuthRemoteDataSource.kt index ded2ed2d27..2f358e3a0f 100644 --- a/data/visa/src/main/kotlin/com/tangem/data/visa/DefaultVisaAuthRemoteDataSource.kt +++ b/data/visa/src/main/kotlin/com/tangem/data/visa/DefaultVisaAuthRemoteDataSource.kt @@ -4,33 +4,35 @@ import arrow.core.Either import com.squareup.moshi.Moshi import com.tangem.datasource.api.common.response.ApiResponseError import com.tangem.datasource.api.common.response.getOrThrow -import com.tangem.datasource.api.pay.TangemPayApi -import com.tangem.datasource.api.pay.TangemPayAuthApi -import com.tangem.datasource.api.pay.models.request.* -import com.tangem.datasource.api.pay.models.response.VisaErrorResponseJsonAdapter +import com.tangem.datasource.api.pay.models.request.RefreshTokenByCardIdRequest +import com.tangem.datasource.api.pay.models.response.TangemPayErrorResponse +import com.tangem.datasource.api.visa.VisaApi +import com.tangem.datasource.api.visa.models.request.* import com.tangem.datasource.di.NetworkMoshi import com.tangem.domain.visa.datasource.VisaAuthRemoteDataSource import com.tangem.domain.visa.error.VisaApiError -import com.tangem.domain.visa.model.* +import com.tangem.domain.visa.model.VisaAuthChallenge +import com.tangem.domain.visa.model.VisaAuthSession +import com.tangem.domain.visa.model.VisaAuthSignedChallenge +import com.tangem.domain.visa.model.VisaAuthTokens import com.tangem.utils.coroutines.CoroutineDispatcherProvider import kotlinx.coroutines.withContext import javax.inject.Inject internal class DefaultVisaAuthRemoteDataSource @Inject constructor( @NetworkMoshi private val moshi: Moshi, - private val visaAuthApi: TangemPayApi, - private val tangemPayAuthApi: TangemPayAuthApi, + private val visaApi: VisaApi, private val dispatchers: CoroutineDispatcherProvider, ) : VisaAuthRemoteDataSource { - private val visaErrorAdapter = VisaErrorResponseJsonAdapter(moshi) + private val errorAdapter by lazy { moshi.adapter(TangemPayErrorResponse::class.java) } override suspend fun getCardAuthChallenge( cardId: String, cardPublicKey: String, ): Either = withContext(dispatchers.io) { request { - visaAuthApi.generateNonceByCardId( + visaApi.generateNonceByCardId( GenerateNoneByCardIdRequest( cardId = cardId, cardPublicKey = cardPublicKey, @@ -49,7 +51,7 @@ internal class DefaultVisaAuthRemoteDataSource @Inject constructor( cardWalletAddress: String, ): Either = withContext(dispatchers.io) { request { - visaAuthApi.generateNonceByCardWallet( + visaApi.generateNonceByCardWallet( GenerateNoneByCardWalletRequest( cardWalletAddress = cardWalletAddress, cardId = cardId, @@ -63,56 +65,13 @@ internal class DefaultVisaAuthRemoteDataSource @Inject constructor( } } - override suspend fun getCustomerWalletAuthChallenge( - customerWalletAddress: String, - customerWalletId: String, - ): Either = withContext(dispatchers.io) { - request { - tangemPayAuthApi.generateNonceByCustomerWallet( - request = GenerateNonceByCustomerWalletRequest( - customerWalletAddress = customerWalletAddress, - customerWalletId = customerWalletId, - ), - ).getOrThrow() - }.map { response -> - VisaAuthChallenge.Wallet( - challenge = response.nonce, - session = VisaAuthSession(response.sessionId), - ) - } - } - - override suspend fun getTokenWithCustomerWallet( - sessionId: String, - signature: String, - nonce: String, - ): Either = withContext(dispatchers.io) { - request { - tangemPayAuthApi.getTokenByCustomerWallet( - request = GetTokenByCustomerWalletRequest( - authType = "customer_wallet", - sessionId = sessionId, - signature = signature, - messageFormat = "Tangem Pay wants to sign in with your account. Nonce: $nonce", - ), - ).getOrThrow() - }.map { response -> - TangemPayAuthTokens( - accessToken = response.accessToken, - expiresAt = response.expiresAt, - refreshToken = response.refreshToken, - refreshExpiresAt = response.refreshExpiresAt, - ) - } - } - override suspend fun getAccessTokens( signedChallenge: VisaAuthSignedChallenge, ): Either = withContext(dispatchers.io) { request { when (signedChallenge) { is VisaAuthSignedChallenge.ByCardPublicKey -> { - visaAuthApi.getAccessTokenByCardId( + visaApi.getAccessTokenByCardId( GetAccessTokenByCardIdRequest( sessionId = signedChallenge.challenge.session.sessionId, signature = signedChallenge.signature, @@ -121,7 +80,7 @@ internal class DefaultVisaAuthRemoteDataSource @Inject constructor( ).getOrThrow() } is VisaAuthSignedChallenge.ByWallet -> { - visaAuthApi.getAccessTokenByCardWallet( + visaApi.getAccessTokenByCardWallet( GetAccessTokenByCardWalletRequest( sessionId = signedChallenge.challenge.session.sessionId, signature = signedChallenge.signature, @@ -150,11 +109,11 @@ internal class DefaultVisaAuthRemoteDataSource @Inject constructor( request { when (refreshToken.authType) { VisaAuthTokens.RefreshToken.Type.CardId -> - visaAuthApi.refreshCardIdAccessToken( + visaApi.refreshCardIdAccessToken( RefreshTokenByCardIdRequest(refreshToken = refreshToken.value), ) VisaAuthTokens.RefreshToken.Type.CardWallet -> - visaAuthApi.refreshCardIdAccessToken( + visaApi.refreshCardIdAccessToken( RefreshTokenByCardIdRequest(refreshToken = refreshToken.value), ) }.getOrThrow() @@ -169,7 +128,7 @@ internal class DefaultVisaAuthRemoteDataSource @Inject constructor( override suspend fun exchangeAccessToken(tokens: VisaAuthTokens): Either = withContext(dispatchers.io) { request { - visaAuthApi.exchangeAccessToken( + visaApi.exchangeAccessToken( ExchangeAccessTokenRequest( accessToken = tokens.accessToken, refreshToken = tokens.refreshToken.value, @@ -194,7 +153,7 @@ internal class DefaultVisaAuthRemoteDataSource @Inject constructor( responseError.errorBody != null ) { val errorCode = - visaErrorAdapter.fromJson(responseError.errorBody!!)?.error?.code ?: responseError.code.numericCode + errorAdapter.fromJson(responseError.errorBody!!)?.error?.code ?: responseError.code.numericCode return Either.Left(VisaApiError.fromBackendError(errorCode)) } diff --git a/data/visa/src/main/kotlin/com/tangem/data/visa/DefaultVisaRepository.kt b/data/visa/src/main/kotlin/com/tangem/data/visa/DefaultVisaRepository.kt index 2a81db61e6..2372e3639e 100644 --- a/data/visa/src/main/kotlin/com/tangem/data/visa/DefaultVisaRepository.kt +++ b/data/visa/src/main/kotlin/com/tangem/data/visa/DefaultVisaRepository.kt @@ -14,8 +14,8 @@ import com.tangem.data.common.cache.CacheRegistry import com.tangem.data.common.quote.QuotesFetcher import com.tangem.data.visa.config.VisaLibLoader import com.tangem.data.visa.utils.* -import com.tangem.datasource.api.pay.TangemPayApi -import com.tangem.datasource.api.pay.models.response.VisaTxHistoryResponse +import com.tangem.datasource.api.visa.VisaApi +import com.tangem.datasource.api.visa.models.response.VisaTxHistoryResponse import com.tangem.datasource.local.userwallet.UserWalletsStore import com.tangem.domain.card.common.util.cardTypesResolver import com.tangem.domain.models.wallet.UserWallet @@ -43,7 +43,7 @@ internal class DefaultVisaRepository @Inject constructor( private val userWalletsStore: UserWalletsStore, private val dispatchers: CoroutineDispatcherProvider, private val visaApiRequestMaker: VisaApiRequestMaker, - private val visaApi: TangemPayApi, + private val visaApi: VisaApi, private val visaCurrencyFactory: VisaCurrencyFactory, ) : VisaRepository { diff --git a/data/visa/src/main/kotlin/com/tangem/data/visa/converter/VisaActivationStatusConverterWithState.kt b/data/visa/src/main/kotlin/com/tangem/data/visa/converter/VisaActivationStatusConverterWithState.kt index 09128b4324..cc00430f80 100644 --- a/data/visa/src/main/kotlin/com/tangem/data/visa/converter/VisaActivationStatusConverterWithState.kt +++ b/data/visa/src/main/kotlin/com/tangem/data/visa/converter/VisaActivationStatusConverterWithState.kt @@ -1,6 +1,6 @@ package com.tangem.data.visa.converter -import com.tangem.datasource.api.pay.models.response.CardActivationRemoteStateResponse +import com.tangem.datasource.api.visa.models.response.CardActivationRemoteStateResponse import com.tangem.domain.visa.model.VisaActivationOrderInfo import com.tangem.domain.visa.model.VisaActivationRemoteState import com.tangem.utils.converter.Converter diff --git a/data/visa/src/main/kotlin/com/tangem/data/visa/di/VisaDataModule.kt b/data/visa/src/main/kotlin/com/tangem/data/visa/di/VisaDataModule.kt index a5efc3d025..0810a2640c 100644 --- a/data/visa/src/main/kotlin/com/tangem/data/visa/di/VisaDataModule.kt +++ b/data/visa/src/main/kotlin/com/tangem/data/visa/di/VisaDataModule.kt @@ -1,10 +1,12 @@ package com.tangem.data.visa.di import com.tangem.data.pay.datasource.DefaultTangemPayAuthDataSource +import com.tangem.data.visa.DefaultTangemPayRemoteDataSource import com.tangem.data.visa.DefaultVisaActivationRepository import com.tangem.data.visa.DefaultVisaAuthRemoteDataSource import com.tangem.data.visa.MockVisaRepository import com.tangem.domain.pay.datasource.TangemPayAuthDataSource +import com.tangem.domain.visa.datasource.TangemPayRemoteDataSource import com.tangem.domain.visa.repository.VisaActivationRepository import com.tangem.domain.visa.datasource.VisaAuthRemoteDataSource import com.tangem.domain.visa.repository.VisaRepository @@ -22,22 +24,16 @@ internal interface VisaDataModule { @Singleton fun bindVisaAuthRemoteDataSource(repository: DefaultVisaAuthRemoteDataSource): VisaAuthRemoteDataSource + @Binds + @Singleton + fun bindTangemPayRemoteDataSource(impl: DefaultTangemPayRemoteDataSource): TangemPayRemoteDataSource + @Binds @Singleton fun bindVisaActivationRepositoryFactory( repository: DefaultVisaActivationRepository.Factory, ): VisaActivationRepository.Factory - // Mocked - // @Binds - // @Singleton - // fun bindVisaActivationRepositoryFactory( - // repository: MockVisaActivationRepository.Factory, - // ): VisaActivationRepository.Factory - - // @Binds - // fun bindVisaRepository(repository: DefaultVisaRepository): VisaRepository - // Mocked @Binds fun bindVisaRepository(repository: MockVisaRepository): VisaRepository diff --git a/data/visa/src/main/kotlin/com/tangem/data/visa/utils/VisaApiRequestMaker.kt b/data/visa/src/main/kotlin/com/tangem/data/visa/utils/VisaApiRequestMaker.kt index 04aa38e0d9..a5f2592c55 100644 --- a/data/visa/src/main/kotlin/com/tangem/data/visa/utils/VisaApiRequestMaker.kt +++ b/data/visa/src/main/kotlin/com/tangem/data/visa/utils/VisaApiRequestMaker.kt @@ -5,8 +5,8 @@ import com.tangem.data.visa.model.AccessCodeData import com.tangem.datasource.api.common.response.ApiResponse import com.tangem.datasource.api.common.response.ApiResponseError import com.tangem.datasource.api.common.response.getOrThrow -import com.tangem.datasource.api.pay.TangemPayApi import com.tangem.datasource.api.pay.models.request.RefreshTokenByCardWalletRequest +import com.tangem.datasource.api.visa.VisaApi import com.tangem.datasource.local.userwallet.UserWalletsStore import com.tangem.domain.card.common.util.cardTypesResolver import com.tangem.domain.models.wallet.UserWallet @@ -24,7 +24,7 @@ typealias VisaAuthorizationHeader = String internal class VisaApiRequestMaker @Inject constructor( private val userWalletsStore: UserWalletsStore, - private val visaAuthApi: TangemPayApi, + private val visaAuthApi: VisaApi, private val accessCodeDataConverter: AccessCodeDataConverter, private val dispatcherProvider: CoroutineDispatcherProvider, ) { diff --git a/data/visa/src/main/kotlin/com/tangem/data/visa/utils/VisaTxDetailsFactory.kt b/data/visa/src/main/kotlin/com/tangem/data/visa/utils/VisaTxDetailsFactory.kt index b33a0cafb9..8f9b41148f 100644 --- a/data/visa/src/main/kotlin/com/tangem/data/visa/utils/VisaTxDetailsFactory.kt +++ b/data/visa/src/main/kotlin/com/tangem/data/visa/utils/VisaTxDetailsFactory.kt @@ -2,7 +2,7 @@ package com.tangem.data.visa.utils import com.tangem.blockchain.common.Blockchain import com.tangem.blockchain.externallinkprovider.TxExploreState -import com.tangem.datasource.api.pay.models.response.VisaTxHistoryResponse +import com.tangem.datasource.api.visa.models.response.VisaTxHistoryResponse import com.tangem.domain.visa.model.VisaTxDetails internal class VisaTxDetailsFactory { diff --git a/data/visa/src/main/kotlin/com/tangem/data/visa/utils/VisaTxHistoryItemConverter.kt b/data/visa/src/main/kotlin/com/tangem/data/visa/utils/VisaTxHistoryItemConverter.kt index 6311b23e70..83cc10faa3 100644 --- a/data/visa/src/main/kotlin/com/tangem/data/visa/utils/VisaTxHistoryItemConverter.kt +++ b/data/visa/src/main/kotlin/com/tangem/data/visa/utils/VisaTxHistoryItemConverter.kt @@ -1,6 +1,6 @@ package com.tangem.data.visa.utils -import com.tangem.datasource.api.pay.models.response.VisaTxHistoryResponse +import com.tangem.datasource.api.visa.models.response.VisaTxHistoryResponse import com.tangem.domain.visa.model.VisaTxHistoryItem import com.tangem.utils.converter.Converter diff --git a/data/visa/src/main/kotlin/com/tangem/data/visa/utils/VisaTxHistoryPagingSource.kt b/data/visa/src/main/kotlin/com/tangem/data/visa/utils/VisaTxHistoryPagingSource.kt index 01950d27b7..07ebc8a190 100644 --- a/data/visa/src/main/kotlin/com/tangem/data/visa/utils/VisaTxHistoryPagingSource.kt +++ b/data/visa/src/main/kotlin/com/tangem/data/visa/utils/VisaTxHistoryPagingSource.kt @@ -3,7 +3,7 @@ package com.tangem.data.visa.utils import androidx.paging.PagingSource import androidx.paging.PagingState import com.tangem.data.common.cache.CacheRegistry -import com.tangem.datasource.api.pay.models.response.VisaTxHistoryResponse +import com.tangem.datasource.api.visa.models.response.VisaTxHistoryResponse import com.tangem.domain.models.wallet.UserWallet import com.tangem.domain.visa.model.VisaTxHistoryItem import com.tangem.utils.coroutines.CoroutineDispatcherProvider diff --git a/domain/visa/src/main/kotlin/com/tangem/domain/visa/datasource/TangemPayRemoteDataSource.kt b/domain/visa/src/main/kotlin/com/tangem/domain/visa/datasource/TangemPayRemoteDataSource.kt new file mode 100644 index 0000000000..ac5eeedaa1 --- /dev/null +++ b/domain/visa/src/main/kotlin/com/tangem/domain/visa/datasource/TangemPayRemoteDataSource.kt @@ -0,0 +1,20 @@ +package com.tangem.domain.visa.datasource + +import arrow.core.Either +import com.tangem.domain.visa.error.VisaApiError +import com.tangem.domain.visa.model.TangemPayAuthTokens +import com.tangem.domain.visa.model.VisaAuthChallenge + +interface TangemPayRemoteDataSource { + + suspend fun getCustomerWalletAuthChallenge( + customerWalletAddress: String, + customerWalletId: String, + ): Either + + suspend fun getTokenWithCustomerWallet( + sessionId: String, + signature: String, + nonce: String, + ): Either +} \ No newline at end of file diff --git a/domain/visa/src/main/kotlin/com/tangem/domain/visa/datasource/VisaAuthRemoteDataSource.kt b/domain/visa/src/main/kotlin/com/tangem/domain/visa/datasource/VisaAuthRemoteDataSource.kt index c5cbbee4b9..e559eb80aa 100644 --- a/domain/visa/src/main/kotlin/com/tangem/domain/visa/datasource/VisaAuthRemoteDataSource.kt +++ b/domain/visa/src/main/kotlin/com/tangem/domain/visa/datasource/VisaAuthRemoteDataSource.kt @@ -2,7 +2,6 @@ package com.tangem.domain.visa.datasource import arrow.core.Either import com.tangem.domain.visa.error.VisaApiError -import com.tangem.domain.visa.model.TangemPayAuthTokens import com.tangem.domain.visa.model.VisaAuthChallenge import com.tangem.domain.visa.model.VisaAuthSignedChallenge import com.tangem.domain.visa.model.VisaAuthTokens @@ -19,17 +18,6 @@ interface VisaAuthRemoteDataSource { cardWalletAddress: String, ): Either - suspend fun getCustomerWalletAuthChallenge( - customerWalletAddress: String, - customerWalletId: String, - ): Either - - suspend fun getTokenWithCustomerWallet( - sessionId: String, - signature: String, - nonce: String, - ): Either - suspend fun getAccessTokens(signedChallenge: VisaAuthSignedChallenge): Either suspend fun refreshAccessTokens(refreshToken: VisaAuthTokens.RefreshToken): Either