Updated on 2026-08-14

This commit is contained in:
Tangem 2023-01-13 20:21:38 +04:00
parent b9083752c6
commit 76f955568e
18 changed files with 134 additions and 92 deletions

View file

@ -1,33 +1,28 @@
package com.tangem.datasource.api.common
import com.squareup.moshi.JsonAdapter
import com.squareup.moshi.Moshi
import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory
import com.tangem.common.json.MoshiJsonConverter
import retrofit2.Converter
import retrofit2.converter.moshi.MoshiConverterFactory
/**
[REDACTED_AUTHOR]
*/
//todo needs to be refactored
//TODO("Remove after removing Redux")
@Deprecated("Provide by DI")
object MoshiConverter {
//todo refactor: provide via DI
var INSTANCE = MoshiJsonConverter()
private set
val networkMoshi: Moshi = Moshi.Builder()
.add(KotlinJsonAdapterFactory())
.add(BigDecimalAdapter())
.build()
fun reInitInstance(
adapters: List<Any> = listOf(),
typedAdapters: Map<Class<*>, JsonAdapter<*>> = mapOf(),
) {
INSTANCE = MoshiJsonConverter(adapters, typedAdapters)
}
val networkMoshiConverter: MoshiConverterFactory = MoshiConverterFactory.create(networkMoshi)
fun createFactory(moshi: Moshi = INSTANCE.moshi): Converter.Factory = MoshiConverterFactory.create(moshi)
val sdkMoshiConverter: MoshiJsonConverter = MoshiJsonConverter(
adapters = listOf(BigDecimalAdapter()) + MoshiJsonConverter.getTangemSdkAdapters(),
typedAdapters = MoshiJsonConverter.getTangemSdkTypedAdapters(),
)
//todo provide via DI using quealifiers
fun defaultMoshi(): Moshi = INSTANCE.moshi
//todo provide via DI using quealifiers
fun sdkMoshi(): Moshi = MoshiJsonConverter.INSTANCE.moshi
val sdkMoshi: Moshi = sdkMoshiConverter.moshi
}

View file

@ -3,16 +3,14 @@ package com.tangem.datasource.api.common
import okhttp3.Interceptor
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import retrofit2.Converter
import retrofit2.Retrofit
import java.util.concurrent.TimeUnit
// TODO: refactoring: make it better through factory
@Deprecated("Create and provide by DI")
fun createRetrofitInstance(
baseUrl: String,
okHttpBuilder: OkHttpClient.Builder = OkHttpClient.Builder(),
interceptors: List<Interceptor> = emptyList(),
converterFactory: Converter.Factory = MoshiConverter.createFactory(),
logEnabled: Boolean,
): Retrofit {
okHttpBuilder.apply {
@ -27,7 +25,7 @@ fun createRetrofitInstance(
return Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(converterFactory)
.addConverterFactory(MoshiConverter.networkMoshiConverter)
.client(okHttpBuilder.build())
.build()
}

View file

@ -3,11 +3,12 @@ package com.tangem.datasource.api.oneinch
import com.squareup.moshi.Moshi
import com.tangem.datasource.api.oneinch.errors.OneIncResponseException
import com.tangem.datasource.api.oneinch.models.SwapErrorDto
import com.tangem.datasource.di.NetworkMoshi
import retrofit2.HttpException
import retrofit2.Response
import javax.inject.Inject
class OneInchErrorsHandler @Inject constructor(moshi: Moshi) {
class OneInchErrorsHandler @Inject constructor(@NetworkMoshi moshi: Moshi) {
private val errorMoshiAdapter = moshi.adapter(SwapErrorDto::class.java)

View file

@ -17,7 +17,7 @@ object PaymentologyApiService {
private fun createApi(): PaymentologyApi {
return Retrofit.Builder()
.addConverterFactory(MoshiConverter.createFactory(MoshiConverter.sdkMoshi()))
.addConverterFactory(MoshiConverter.networkMoshiConverter)
.baseUrl(PAYMENTOLOGY_BASE_URL)
.client(
OkHttpClient.Builder()

View file

@ -28,7 +28,7 @@ object TangemTechService {
private fun createApi(header: RequestHeader? = null): TangemTechApi {
val headers = mutableListOf<RequestHeader>(CacheControlHeader).apply { header?.let(::add) }
return Retrofit.Builder()
.addConverterFactory(MoshiConverter.createFactory())
.addConverterFactory(MoshiConverter.networkMoshiConverter)
.baseUrl(TANGEM_TECH_BASE_URL)
.client(
OkHttpClient.Builder()

View file

@ -0,0 +1,13 @@
package com.tangem.datasource.di
import javax.inject.Qualifier
@Qualifier
@MustBeDocumented
@Retention(AnnotationRetention.RUNTIME)
annotation class SdkMoshi
@Qualifier
@MustBeDocumented
@Retention(AnnotationRetention.RUNTIME)
annotation class NetworkMoshi

View file

@ -0,0 +1,42 @@
package com.tangem.datasource.di
import com.squareup.moshi.Moshi
import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory
import com.tangem.common.json.MoshiJsonConverter
import com.tangem.datasource.api.common.BigDecimalAdapter
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import javax.inject.Singleton
@Module
@InstallIn(SingletonComponent::class)
class MoshiModule {
@Provides
@Singleton
@NetworkMoshi
fun provideNetworkMoshi(): Moshi {
return Moshi.Builder()
.add(KotlinJsonAdapterFactory())
.add(BigDecimalAdapter())
.build()
}
@Provides
@Singleton
@SdkMoshi
fun provideSdkMoshi(sdkMoshiJsonConverter: MoshiJsonConverter): Moshi {
return sdkMoshiJsonConverter.moshi
}
@Provides
@Singleton
fun provideSdkMoshiConverter(): MoshiJsonConverter {
return MoshiJsonConverter(
adapters = listOf(BigDecimalAdapter()) + MoshiJsonConverter.getTangemSdkAdapters(),
typedAdapters = MoshiJsonConverter.getTangemSdkTypedAdapters(),
)
}
}

View file

@ -1,11 +1,9 @@
package com.tangem.datasource.di
import com.squareup.moshi.Moshi
import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory
import com.tangem.datasource.api.common.BigDecimalAdapter
import com.tangem.datasource.api.paymentology.PaymentologyApi
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.RequestHeader.*
import com.tangem.datasource.utils.addHeaders
import com.tangem.datasource.utils.allowLogging
import com.tangem.lib.auth.AuthProvider
@ -24,16 +22,7 @@ class NetworkModule {
@Provides
@Singleton
fun provideMoshi(): Moshi {
return Moshi.Builder()
.add(KotlinJsonAdapterFactory())
.add(BigDecimalAdapter())
.build()
}
@Provides
@Singleton
fun provideTangemTechApi(authProvider: AuthProvider, moshi: Moshi): TangemTechApi {
fun provideTangemTechApi(authProvider: AuthProvider, @NetworkMoshi moshi: Moshi): TangemTechApi {
return Retrofit.Builder()
.addConverterFactory(MoshiConverterFactory.create(moshi))
.baseUrl(PROD_TANGEM_TECH_BASE_URL)
@ -50,6 +39,21 @@ class NetworkModule {
.create(TangemTechApi::class.java)
}
@Provides
@Singleton
fun providePaymentologyApi(@NetworkMoshi moshi: Moshi): PaymentologyApi {
return Retrofit.Builder()
.addConverterFactory(MoshiConverterFactory.create(moshi))
.baseUrl(PAYMENTOLOGY_BASE_URL)
.client(
OkHttpClient.Builder()
.allowLogging()
.build(),
)
.build()
.create(PaymentologyApi::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

@ -19,7 +19,7 @@ class OneInchApisModule {
@Provides
@Singleton
fun provideOneInchApiFactory(moshi: Moshi): OneInchApiFactory {
fun provideOneInchApiFactory(@NetworkMoshi moshi: Moshi): OneInchApiFactory {
val apiFactory = OneInchApiFactory()
apiFactory.putApi(ETH_NETWORK, createOneInchApiWithUrl(ONE_INCH_BASE_URL + ONE_INCH_ETH_PATH, moshi))
apiFactory.putApi(BSC_NETWORK, createOneInchApiWithUrl(ONE_INCH_BASE_URL + ONE_INCH_BSC_PATH, moshi))