Updated on 2026-08-14

This commit is contained in:
Tangem 2024-04-25 18:01:03 +03:00
parent 2596a73c7b
commit 8d96d16533
8 changed files with 199 additions and 50 deletions

View file

@ -76,10 +76,54 @@ interface TangemTechApi {
@GET("promotion")
suspend fun getPromotionInfo(@Query("programName") name: String): ApiResponse<PromotionInfoResponse>
@GET("settings/{wallet_id}")
suspend fun getUserTokensSettings(
@Header("card_public_key") cardPublicKey: String,
@Header("card_id") cardId: String,
@Path("wallet_id") walletId: String,
): ApiResponse<UserTokensSettingsResponse>
@PUT("settings/{wallet_id}")
suspend fun saveUserTokensSettings(
@Header("card_public_key") cardPublicKey: String,
@Header("card_id") cardId: String,
@Path("wallet_id") walletId: String,
@Body userTokensSettings: UserTokensSettingsResponse,
): ApiResponse<Unit>
@POST("user-network-account")
suspend fun createUserNetworkAccount(
@Header("card_public_key") cardPublicKey: String,
@Header("card_id") cardId: String,
@Body body: CreateUserNetworkAccountBody,
): ApiResponse<CreateUserNetworkAccountResponse>
@POST("account")
suspend fun createUserTokensAccount(
@Header("card_public_key") cardPublicKey: String,
@Header("card_id") cardId: String,
@Body body: CreateUserTokensAccountBody,
): ApiResponse<UserTokensAccountResponse>
@PUT("account/{account_id}")
suspend fun updateUserTokensAccount(
@Header("card_public_key") cardPublicKey: String,
@Header("card_id") cardId: String,
@Path("account_id") accountId: Int,
@Body body: UpdateUserTokensAccountBody,
): ApiResponse<UserTokensAccountResponse>
@PUT("account/{account_id}/archive")
suspend fun archiveUserTokensAccount(
@Header("card_public_key") cardPublicKey: String,
@Header("card_id") cardId: String,
@Path("account_id") accountId: Int,
): ApiResponse<UserTokensAccountResponse>
@PUT("account/{account_id}/unarchive")
suspend fun restoreUserTokensAccount(
@Header("card_public_key") cardPublicKey: String,
@Header("card_id") cardId: String,
@Path("account_id") accountId: Int,
): ApiResponse<UserTokensAccountResponse>
}

View file

@ -0,0 +1,23 @@
package com.tangem.datasource.api.tangemTech
import com.tangem.datasource.api.common.response.ApiResponse
import com.tangem.datasource.api.tangemTech.models.v2.UserTokensResponseV2
import retrofit2.http.*
interface TangemTechApiV2 {
@GET("user-tokens/{wallet_id}")
suspend fun getUserTokens(
@Header("card_public_key") cardPublicKey: String,
@Header("card_id") cardId: String,
@Path("wallet_id") walletId: String,
): ApiResponse<UserTokensResponseV2>
@PUT("user-tokens/{wallet_id}")
suspend fun saveUserTokens(
@Header("card_public_key") cardPublicKey: String,
@Header("card_id") cardId: String,
@Path("wallet_id") walletId: String,
@Body userTokens: UserTokensResponseV2,
): ApiResponse<Unit>
}

View file

@ -0,0 +1,10 @@
package com.tangem.datasource.api.tangemTech.models
import com.squareup.moshi.Json
data class CreateUserTokensAccountBody(
@Json(name = "accountId")
val id: Int,
@Json(name = "accountTitle")
val title: String,
)

View file

@ -0,0 +1,8 @@
package com.tangem.datasource.api.tangemTech.models
import com.squareup.moshi.Json
data class UpdateUserTokensAccountBody(
@Json(name = "accountTitle")
val title: String,
)

View file

@ -0,0 +1,16 @@
package com.tangem.datasource.api.tangemTech.models
import com.squareup.moshi.Json
data class UserTokensAccountResponse(
@Json(name = "accountId")
val id: Int,
@Json(name = "accountTitle")
val title: String,
@Json(name = "archived")
val isArchived: Boolean,
@Json(name = "tokensCount")
val tokensCount: Int? = null,
@Json(name = "tokens")
val tokens: List<UserTokensResponse.Token>? = null,
)

View file

@ -0,0 +1,10 @@
package com.tangem.datasource.api.tangemTech.models
import com.squareup.moshi.Json
data class UserTokensSettingsResponse(
@Json(name = "group")
val group: UserTokensResponse.GroupType,
@Json(name = "sort")
val sort: UserTokensResponse.SortType,
)

View file

@ -0,0 +1,23 @@
package com.tangem.datasource.api.tangemTech.models.v2
import com.squareup.moshi.Json
import com.tangem.datasource.api.tangemTech.models.UserTokensResponse
data class UserTokensResponseV2(
@Json(name = "accounts")
val accounts: List<TokensAccount>,
) {
data class TokensAccount(
@Json(name = "id")
val id: Int,
@Json(name = "title")
val title: String,
@Json(name = "tokens")
val tokens: List<UserTokensResponse.Token>? = null,
@Json(name = "tokensCount")
val tokensCount: Int? = null,
@Json(name = "archived")
val isArchived: Boolean,
)
}

View file

@ -6,6 +6,7 @@ import com.tangem.datasource.BuildConfig
import com.tangem.datasource.api.common.response.ApiResponseCallAdapterFactory
import com.tangem.datasource.api.express.TangemExpressApi
import com.tangem.datasource.api.tangemTech.TangemTechApi
import com.tangem.datasource.api.tangemTech.TangemTechApiV2
import com.tangem.datasource.api.tangemTech.TangemTechServiceApi
import com.tangem.datasource.utils.RequestHeader.*
import com.tangem.datasource.utils.addHeaders
@ -57,45 +58,33 @@ class NetworkModule {
@Provides
@Singleton
fun provideTangemTechApi(@NetworkMoshi moshi: Moshi, @ApplicationContext context: Context): TangemTechApi {
return Retrofit.Builder()
.addConverterFactory(MoshiConverterFactory.create(moshi))
.addCallAdapterFactory(ApiResponseCallAdapterFactory.create())
.baseUrl(PROD_TANGEM_TECH_BASE_URL)
.client(
OkHttpClient.Builder()
.addHeaders(
CacheControlHeader,
// TODO("refactor header init") get auth data after biometric auth to avoid race condition
// AuthenticationHeader(authProvider),
)
.addLoggers(context)
.build(),
)
.build()
.create(TangemTechApi::class.java)
fun provideTangemTechApi(
@NetworkMoshi moshi: Moshi,
@ApplicationContext context: Context,
appVersionProvider: AppVersionProvider,
): TangemTechApi {
return provideTangemTechApiInternal(moshi, context, appVersionProvider, PROD_V1_TANGEM_TECH_BASE_URL)
}
@Provides
@Singleton
fun provideTangemTechApiV2(
@NetworkMoshi moshi: Moshi,
@ApplicationContext context: Context,
appVersionProvider: AppVersionProvider,
): TangemTechApiV2 {
return provideTangemTechApiInternal(moshi, context, appVersionProvider, PROD_V2_TANGEM_TECH_BASE_URL)
}
@Provides
@DevTangemApi
@Singleton
fun provideTangemTechDevApi(@NetworkMoshi moshi: Moshi, @ApplicationContext context: Context): TangemTechApi {
return Retrofit.Builder()
.addConverterFactory(MoshiConverterFactory.create(moshi))
.addCallAdapterFactory(ApiResponseCallAdapterFactory.create())
.baseUrl(DEV_TANGEM_TECH_BASE_URL)
.client(
OkHttpClient.Builder()
.addHeaders(
CacheControlHeader,
// TODO("refactor header init") get auth data after biometric auth to avoid race condition
// AuthenticationHeader(authProvider),
)
.addLoggers(context)
.build(),
)
.build()
.create(TangemTechApi::class.java)
fun provideTangemTechDevApi(
@NetworkMoshi moshi: Moshi,
@ApplicationContext context: Context,
appVersionProvider: AppVersionProvider,
): TangemTechApi {
return provideTangemTechApiInternal(moshi, context, appVersionProvider, DEV_V1_TANGEM_TECH_BASE_URL)
}
@Provides
@ -105,32 +94,58 @@ class NetworkModule {
@ApplicationContext context: Context,
appVersionProvider: AppVersionProvider,
): TangemTechServiceApi {
return provideTangemTechApiInternal(
moshi,
context,
appVersionProvider,
PROD_V1_TANGEM_TECH_BASE_URL,
timeoutSeconds = TANGEM_TECH_SERVICE_TIMEOUT_SECONDS,
)
}
private inline fun <reified T> provideTangemTechApiInternal(
moshi: Moshi,
context: Context,
appVersionProvider: AppVersionProvider,
baseUrl: String,
timeoutSeconds: Long? = null,
): T {
val client = OkHttpClient.Builder()
.let { builder ->
if (timeoutSeconds != null) {
builder.callTimeout(timeoutSeconds, TimeUnit.SECONDS)
} else {
builder
}
}
.addHeaders(
CacheControlHeader,
AppVersionPlatformHeaders(appVersionProvider),
// TODO("refactor header init") get auth data after biometric auth to avoid race condition
// AuthenticationHeader(authProvider),
)
.addLoggers(context)
.build()
return Retrofit.Builder()
.addConverterFactory(MoshiConverterFactory.create(moshi))
.addCallAdapterFactory(ApiResponseCallAdapterFactory.create())
.baseUrl(PROD_TANGEM_TECH_BASE_URL)
.client(
OkHttpClient.Builder()
.callTimeout(timeout = 5, unit = TimeUnit.SECONDS)
.addHeaders(
CacheControlHeader,
AppVersionPlatformHeaders(appVersionProvider),
// TODO("refactor header init") get auth data after biometric auth to avoid race condition
// AuthenticationHeader(authProvider),
)
.addLoggers(context)
.build(),
)
.baseUrl(baseUrl)
.client(client)
.build()
.create(TangemTechServiceApi::class.java)
.create(T::class.java)
}
private companion object {
const val PROD_EXPRESS_BASE_URL = "https://express.tangem.com/v1/"
const val DEV_EXPRESS_BASE_URL = "[REDACTED_ENV_URL]"
const val PROD_TANGEM_TECH_BASE_URL = "https://api.tangem-tech.com/v1/"
const val DEV_TANGEM_TECH_BASE_URL = "https://devapi.tangem-tech.com/v1/"
const val DEV_V1_TANGEM_TECH_BASE_URL = "https://devapi.tangem-tech.com/v1/"
const val PROD_V1_TANGEM_TECH_BASE_URL = "https://api.tangem-tech.com/v1/"
const val PROD_V2_TANGEM_TECH_BASE_URL = "https://api.tangem-tech.com/v2/"
const val TANGEM_TECH_SERVICE_TIMEOUT_SECONDS = 5L
const val PAYMENTOLOGY_BASE_URL: String = "https://paymentologygate.oa.r.appspot.com/"
const val API_ONE_INCH_TIMEOUT_MS = 5000L