Updated on 2026-08-14

This commit is contained in:
Tangem 2022-12-30 16:24:42 +03:00
parent 30c34a9e14
commit 4a47c5ab3a
9 changed files with 98 additions and 78 deletions

View file

@ -63,8 +63,6 @@ dependencies {
implementation(Library.okHttp)
implementation(Library.okHttpLogging)
// kapt("com.squareup.moshi:moshi-kotlin-codegen:1.14.0")
/** Time */
implementation(Library.jodatime)
}

View file

@ -1,25 +0,0 @@
package com.tangem.datasource.api
import com.tangem.lib.auth.AuthProvider
import okhttp3.Interceptor
import okhttp3.Response
class AuthHeaderInterceptor(
private val authProvider: AuthProvider,
) : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
val request = chain.request()
.newBuilder()
.addHeader(HEADER_CARD_KEY, authProvider.getCardPublicKey())
.addHeader(HEADER_CARD_ID, authProvider.getCardId())
.build()
return chain.proceed(request)
}
companion object {
const val HEADER_CARD_KEY = "card_public_key"
const val HEADER_CARD_ID = "card_id"
}
}

View file

@ -1,6 +1,4 @@
package com.tangem.datasource.di
import com.tangem.datasource.api.oneinch.OneInchApi
package com.tangem.datasource.api.oneinch
class OneInchApiFactory {

View file

@ -2,17 +2,19 @@ package com.tangem.datasource.di
import com.squareup.moshi.Moshi
import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory
import com.tangem.datasource.api.AuthHeaderInterceptor
import com.tangem.datasource.api.common.BigDecimalAdapter
import com.tangem.datasource.api.referral.ReferralApi
import com.tangem.datasource.api.tangemTech.TangemTechApi
import com.tangem.datasource.utils.RequestHeader.AuthenticationHeader
import com.tangem.datasource.utils.RequestHeader.CacheControlHeader
import com.tangem.datasource.utils.addHeaders
import com.tangem.datasource.utils.allowLogging
import com.tangem.lib.auth.AuthProvider
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import retrofit2.Retrofit
import retrofit2.converter.moshi.MoshiConverterFactory
import javax.inject.Singleton
@ -21,46 +23,6 @@ import javax.inject.Singleton
@InstallIn(SingletonComponent::class)
class NetworkModule {
@Provides
@Singleton
fun provideTangemTechApi(
okHttpClient: OkHttpClient,
moshi: Moshi,
): TangemTechApi {
return Retrofit.Builder()
.addConverterFactory(
MoshiConverterFactory.create(moshi),
)
.baseUrl(DEV_TANGEM_TECH_BASE_URL)
.client(okHttpClient)
.build()
.create(TangemTechApi::class.java)
}
@Provides
@Singleton
fun provideReferralApi(okHttpClient: OkHttpClient, moshi: Moshi): ReferralApi {
return Retrofit.Builder()
.addConverterFactory(
MoshiConverterFactory.create(moshi),
)
.baseUrl(DEV_TANGEM_TECH_BASE_URL)
.client(okHttpClient)
.build()
.create(ReferralApi::class.java)
}
@Provides
@Singleton
fun provideOkHttpClient(authProvider: AuthProvider): OkHttpClient {
return OkHttpClient.Builder()
.addInterceptor(AuthHeaderInterceptor(authProvider))
.addInterceptor(
HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY),
)
.build()
}
@Provides
@Singleton
fun provideMoshi(): Moshi {
@ -70,6 +32,43 @@ class NetworkModule {
.build()
}
@Provides
@Singleton
fun provideTangemTechApi(authProvider: AuthProvider, moshi: Moshi): TangemTechApi {
return Retrofit.Builder()
.addConverterFactory(MoshiConverterFactory.create(moshi))
.baseUrl(DEV_TANGEM_TECH_BASE_URL)
.client(
OkHttpClient.Builder()
.addHeaders(
CacheControlHeader,
AuthenticationHeader(authProvider)
)
.allowLogging()
.build()
)
.build()
.create(TangemTechApi::class.java)
}
@Provides
@Singleton
fun provideReferralApi(authProvider: AuthProvider, moshi: Moshi): ReferralApi {
return Retrofit.Builder()
.addConverterFactory(
MoshiConverterFactory.create(moshi),
)
.baseUrl(DEV_TANGEM_TECH_BASE_URL)
.client(
OkHttpClient.Builder()
.addHeaders(AuthenticationHeader(authProvider))
.allowLogging()
.build()
)
.build()
.create(ReferralApi::class.java)
}
private companion object {
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/"

View file

@ -2,12 +2,13 @@ package com.tangem.datasource.di
import com.squareup.moshi.Moshi
import com.tangem.datasource.api.oneinch.OneInchApi
import com.tangem.datasource.api.oneinch.OneInchApiFactory
import com.tangem.datasource.utils.allowLogging
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import retrofit2.Retrofit
import retrofit2.converter.moshi.MoshiConverterFactory
import javax.inject.Singleton
@ -33,9 +34,7 @@ class OneInchApisModule {
.baseUrl(url)
.client(
OkHttpClient.Builder()
.addInterceptor(
HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY),
)
.allowLogging()
.build(),
)
.build()

View file

@ -0,0 +1,30 @@
package com.tangem.datasource.utils
import com.tangem.datasource.BuildConfig
import okhttp3.Interceptor
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import okhttp3.logging.HttpLoggingInterceptor.Level
/** Extension for adding headers [requestHeaders] to every [OkHttpClient] request */
internal fun OkHttpClient.Builder.addHeaders(vararg requestHeaders: RequestHeader): OkHttpClient.Builder {
return addInterceptor(
Interceptor { chain ->
val request = chain.request().newBuilder().apply {
requestHeaders
.flatMap(RequestHeader::values)
.forEach { addHeader(it.first, it.second) }
}.build()
chain.proceed(request)
},
)
}
/**
* Extension for logging each [OkHttpClient] request
*
* @param level logging level. By default, only the request body.
*/
internal fun OkHttpClient.Builder.allowLogging(level: Level = Level.BODY): OkHttpClient.Builder =
if (BuildConfig.DEBUG) addInterceptor(interceptor = HttpLoggingInterceptor().setLevel(level)) else this

View file

@ -0,0 +1,21 @@
package com.tangem.datasource.utils
import com.tangem.lib.auth.AuthProvider
/**
* Presentation of request header
*
* @param pairs header name and header value pairs
*/
sealed class RequestHeader(vararg pairs: Pair<String, String>) {
/** Header list */
val values: List<Pair<String, String>> = pairs.toList()
object CacheControlHeader : RequestHeader("Cache-Control" to "max-age=600")
class AuthenticationHeader(authProvider: AuthProvider) : RequestHeader(
"card_public_key" to authProvider.getCardPublicKey(),
"card_id" to authProvider.getCardId()
)
}

View file

@ -1,10 +1,10 @@
package com.tangem.feature.swap
import com.tangem.datasource.api.oneinch.OneInchApi
import com.tangem.datasource.api.oneinch.OneInchApiFactory
import com.tangem.datasource.api.oneinch.OneInchErrorsHandler
import com.tangem.datasource.api.oneinch.errors.OneIncResponseException
import com.tangem.datasource.api.tangemTech.TangemTechApi
import com.tangem.datasource.di.OneInchApiFactory
import com.tangem.feature.swap.converters.ApproveConverter
import com.tangem.feature.swap.converters.QuotesConverter
import com.tangem.feature.swap.converters.SwapConverter

View file

@ -1,8 +1,8 @@
package com.tangem.feature.swap.di
import com.tangem.datasource.api.oneinch.OneInchApiFactory
import com.tangem.datasource.api.oneinch.OneInchErrorsHandler
import com.tangem.datasource.api.tangemTech.TangemTechApi
import com.tangem.datasource.di.OneInchApiFactory
import com.tangem.feature.swap.SwapRepositoryImpl
import com.tangem.feature.swap.converters.ApproveConverter
import com.tangem.feature.swap.converters.QuotesConverter