diff --git a/core/datasource/build.gradle.kts b/core/datasource/build.gradle.kts index 1359125527..082885c1d7 100644 --- a/core/datasource/build.gradle.kts +++ b/core/datasource/build.gradle.kts @@ -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) } \ No newline at end of file diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/AuthHeaderInterceptor.kt b/core/datasource/src/main/java/com/tangem/datasource/api/AuthHeaderInterceptor.kt deleted file mode 100644 index 5a50c5215e..0000000000 --- a/core/datasource/src/main/java/com/tangem/datasource/api/AuthHeaderInterceptor.kt +++ /dev/null @@ -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" - } -} \ No newline at end of file diff --git a/core/datasource/src/main/java/com/tangem/datasource/di/OneInchApiFactory.kt b/core/datasource/src/main/java/com/tangem/datasource/api/oneinch/OneInchApiFactory.kt similarity index 79% rename from core/datasource/src/main/java/com/tangem/datasource/di/OneInchApiFactory.kt rename to core/datasource/src/main/java/com/tangem/datasource/api/oneinch/OneInchApiFactory.kt index e9493488d1..da21f86558 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/di/OneInchApiFactory.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/api/oneinch/OneInchApiFactory.kt @@ -1,6 +1,4 @@ -package com.tangem.datasource.di - -import com.tangem.datasource.api.oneinch.OneInchApi +package com.tangem.datasource.api.oneinch class OneInchApiFactory { 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 51dabf7253..fc33504a48 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 @@ -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/" diff --git a/core/datasource/src/main/java/com/tangem/datasource/di/OneInchApisModule.kt b/core/datasource/src/main/java/com/tangem/datasource/di/OneInchApisModule.kt index e23d2849c2..55ee683715 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/di/OneInchApisModule.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/di/OneInchApisModule.kt @@ -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() diff --git a/core/datasource/src/main/java/com/tangem/datasource/utils/HttpClientExt.kt b/core/datasource/src/main/java/com/tangem/datasource/utils/HttpClientExt.kt new file mode 100644 index 0000000000..dffc98c05a --- /dev/null +++ b/core/datasource/src/main/java/com/tangem/datasource/utils/HttpClientExt.kt @@ -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 \ No newline at end of file diff --git a/core/datasource/src/main/java/com/tangem/datasource/utils/RequestHeader.kt b/core/datasource/src/main/java/com/tangem/datasource/utils/RequestHeader.kt new file mode 100644 index 0000000000..9e9e143cf2 --- /dev/null +++ b/core/datasource/src/main/java/com/tangem/datasource/utils/RequestHeader.kt @@ -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) { + + /** Header list */ + val values: List> = 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() + ) +} \ No newline at end of file diff --git a/features/swap/data/src/main/java/com/tangem/feature/swap/SwapRepositoryImpl.kt b/features/swap/data/src/main/java/com/tangem/feature/swap/SwapRepositoryImpl.kt index 25ffc2bea2..088a47045f 100644 --- a/features/swap/data/src/main/java/com/tangem/feature/swap/SwapRepositoryImpl.kt +++ b/features/swap/data/src/main/java/com/tangem/feature/swap/SwapRepositoryImpl.kt @@ -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 diff --git a/features/swap/data/src/main/java/com/tangem/feature/swap/di/SwapDataModule.kt b/features/swap/data/src/main/java/com/tangem/feature/swap/di/SwapDataModule.kt index bb35020942..6cc1d6c846 100644 --- a/features/swap/data/src/main/java/com/tangem/feature/swap/di/SwapDataModule.kt +++ b/features/swap/data/src/main/java/com/tangem/feature/swap/di/SwapDataModule.kt @@ -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