From 37054e453d93356a858cfe26b5b957e12a8b78f6 Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 15 Nov 2022 10:26:15 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../api/referral/models/ReferralResponse.kt | 4 +- core/utils/.gitignore | 1 + core/utils/build.gradle.kts | 35 ++++++++++++ core/utils/src/main/AndroidManifest.xml | 2 + .../com/tangem/utils/converter/Converter.kt | 8 +++ .../coroutines/CoroutineDispatcherProvider.kt | 20 +++++++ features/referral/data/build.gradle.kts | 8 +++ .../referral/converters/ReferralConverter.kt | 57 +++++++++++++++++++ .../referral/data/ReferralRepositoryImpl.kt | 43 ++++++++++++++ features/referral/domain/build.gradle.kts | 3 + .../referral/domain/ReferralRepository.kt | 17 ++++++ .../referral/domain/models/ReferralData.kt | 52 +++++++++++++++++ settings.gradle.kts | 1 + 13 files changed, 249 insertions(+), 2 deletions(-) create mode 100644 core/utils/.gitignore create mode 100644 core/utils/build.gradle.kts create mode 100644 core/utils/src/main/AndroidManifest.xml create mode 100644 core/utils/src/main/java/com/tangem/utils/converter/Converter.kt create mode 100644 core/utils/src/main/java/com/tangem/utils/coroutines/CoroutineDispatcherProvider.kt create mode 100644 features/referral/data/src/main/java/com/tangem/feature/referral/converters/ReferralConverter.kt create mode 100644 features/referral/data/src/main/java/com/tangem/feature/referral/data/ReferralRepositoryImpl.kt create mode 100644 features/referral/domain/src/main/java/com/tangem/feature/referral/domain/ReferralRepository.kt create mode 100644 features/referral/domain/src/main/java/com/tangem/feature/referral/domain/models/ReferralData.kt diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/referral/models/ReferralResponse.kt b/core/datasource/src/main/java/com/tangem/datasource/api/referral/models/ReferralResponse.kt index 16c6cd1fa6..ef8823e877 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/api/referral/models/ReferralResponse.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/api/referral/models/ReferralResponse.kt @@ -9,15 +9,15 @@ import org.joda.time.DateTime */ data class ReferralResponse( @Json(name = "conditions") val conditions: Conditions, + @Json(name = "referral") val referral: Referral?, ) data class Conditions( - @Json(name = "conditions") val award: Int, + @Json(name = "award") val award: Int, @Json(name = "discount") val discount: Int, @Json(name = "discountType") val discountType: DiscountType, @Json(name = "tosLink") val tosLink: String, @Json(name = "tokens") val tokens: List, - @Json(name = "referral") val referral: Referral, ) data class Token( diff --git a/core/utils/.gitignore b/core/utils/.gitignore new file mode 100644 index 0000000000..42afabfd2a --- /dev/null +++ b/core/utils/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/core/utils/build.gradle.kts b/core/utils/build.gradle.kts new file mode 100644 index 0000000000..917187555f --- /dev/null +++ b/core/utils/build.gradle.kts @@ -0,0 +1,35 @@ +plugins { + id("com.android.library") + kotlin("android") + kotlin("kapt") + id("com.google.dagger.hilt.android") +} + +android { + + defaultConfig { + compileSdk = AppConfig.compileSdkVersion + minSdk = AppConfig.minSdkVersion + targetSdk = AppConfig.targetSdkVersion + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_1_8.toString() + } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + isCoreLibraryDesugaringEnabled = false + } +} + +dependencies { + + /** DI */ + implementation(Library.hilt) + kapt(Library.hiltKapt) + + /** Coroutines */ + implementation(Library.coroutine) +} \ No newline at end of file diff --git a/core/utils/src/main/AndroidManifest.xml b/core/utils/src/main/AndroidManifest.xml new file mode 100644 index 0000000000..02f6bf24ad --- /dev/null +++ b/core/utils/src/main/AndroidManifest.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/core/utils/src/main/java/com/tangem/utils/converter/Converter.kt b/core/utils/src/main/java/com/tangem/utils/converter/Converter.kt new file mode 100644 index 0000000000..6af667ae08 --- /dev/null +++ b/core/utils/src/main/java/com/tangem/utils/converter/Converter.kt @@ -0,0 +1,8 @@ +package com.tangem.utils.converter + +interface Converter { + fun convert(value: I): O + fun convertList(input: List): List { + return input.map { convert(it) } + } +} \ No newline at end of file diff --git a/core/utils/src/main/java/com/tangem/utils/coroutines/CoroutineDispatcherProvider.kt b/core/utils/src/main/java/com/tangem/utils/coroutines/CoroutineDispatcherProvider.kt new file mode 100644 index 0000000000..952424e215 --- /dev/null +++ b/core/utils/src/main/java/com/tangem/utils/coroutines/CoroutineDispatcherProvider.kt @@ -0,0 +1,20 @@ +package com.tangem.utils.coroutines + +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.Dispatchers +import javax.inject.Inject + +interface CoroutineDispatcherProvider { + val main: CoroutineDispatcher + val io: CoroutineDispatcher +} + +class AppCoroutineDispatcherProvider @Inject constructor() : CoroutineDispatcherProvider { + override val main: CoroutineDispatcher = Dispatchers.Main + override val io: CoroutineDispatcher = Dispatchers.IO +} + +class TestingCoroutineDispatcherProvider( + override val main: CoroutineDispatcher = Dispatchers.Unconfined, + override val io: CoroutineDispatcher = Dispatchers.Unconfined, +) : CoroutineDispatcherProvider \ No newline at end of file diff --git a/features/referral/data/build.gradle.kts b/features/referral/data/build.gradle.kts index 4a5dd97a5c..497d0af645 100644 --- a/features/referral/data/build.gradle.kts +++ b/features/referral/data/build.gradle.kts @@ -26,6 +26,14 @@ android { dependencies { + /** Project*/ + implementation(project(":core:datasource")) + implementation(project(":core:utils")) + implementation(project(":features:referral:domain")) + + /** Time */ + implementation(Library.jodatime) + /** DI */ implementation(Library.hilt) kapt(Library.hiltKapt) diff --git a/features/referral/data/src/main/java/com/tangem/feature/referral/converters/ReferralConverter.kt b/features/referral/data/src/main/java/com/tangem/feature/referral/converters/ReferralConverter.kt new file mode 100644 index 0000000000..bc55726c4b --- /dev/null +++ b/features/referral/data/src/main/java/com/tangem/feature/referral/converters/ReferralConverter.kt @@ -0,0 +1,57 @@ +package com.tangem.feature.referral.converters + +import com.tangem.datasource.api.referral.models.ReferralResponse +import com.tangem.datasource.api.referral.models.Token +import com.tangem.feature.referral.domain.models.DiscountType +import com.tangem.feature.referral.domain.models.ReferralData +import com.tangem.feature.referral.domain.models.ReferralInfo +import com.tangem.feature.referral.domain.models.TokenData +import com.tangem.utils.converter.Converter +import javax.inject.Inject + +class ReferralConverter @Inject constructor() : Converter { + + override fun convert(value: ReferralResponse): ReferralData { + val conditions = value.conditions + val referral = value.referral + val tokenConverter = TokenConverter() + return if (referral != null) { + ReferralData.ParticipantData( + award = conditions.award, + discount = conditions.discount, + discountType = DiscountType.valueOf(conditions.discountType.name), + tosLink = conditions.tosLink, + tokens = tokenConverter.convertList(conditions.tokens), + referral = ReferralInfo( + shareLink = referral.shareLink, + address = referral.address, + promocode = referral.promocode, + walletsPurchased = referral.walletsPurchased, + termsAcceptedAt = referral.termsAcceptedAt, + ), + ) + } else { + ReferralData.NonParticipantData( + award = conditions.award, + discount = conditions.discount, + discountType = DiscountType.valueOf(conditions.discountType.name), + tosLink = conditions.tosLink, + tokens = tokenConverter.convertList(conditions.tokens), + ) + } + } +} + +private class TokenConverter : Converter { + + override fun convert(value: Token): TokenData { + return TokenData( + id = value.id, + name = value.name, + symbol = value.symbol, + networkId = value.networkId, + contractAddress = value.contractAddress, + decimalCount = value.decimalCount, + ) + } +} \ No newline at end of file diff --git a/features/referral/data/src/main/java/com/tangem/feature/referral/data/ReferralRepositoryImpl.kt b/features/referral/data/src/main/java/com/tangem/feature/referral/data/ReferralRepositoryImpl.kt new file mode 100644 index 0000000000..bf2387f070 --- /dev/null +++ b/features/referral/data/src/main/java/com/tangem/feature/referral/data/ReferralRepositoryImpl.kt @@ -0,0 +1,43 @@ +package com.tangem.feature.referral.data + +import com.tangem.datasource.api.referral.ReferralApi +import com.tangem.datasource.api.referral.models.StartReferralBody +import com.tangem.feature.referral.converters.ReferralConverter +import com.tangem.feature.referral.domain.ReferralRepository +import com.tangem.feature.referral.domain.models.ReferralData +import com.tangem.utils.coroutines.CoroutineDispatcherProvider +import kotlinx.coroutines.withContext +import javax.inject.Inject + +internal class ReferralRepositoryImpl @Inject constructor( + private val referralApi: ReferralApi, + private val referralConverter: ReferralConverter, + private val coroutineDispatcher: CoroutineDispatcherProvider, +) : ReferralRepository { + + override suspend fun getReferralStatus(walletId: String): ReferralData { + return withContext(coroutineDispatcher.io) { + referralConverter.convert(referralApi.getReferralStatus(walletId)) + } + } + + override suspend fun startReferral( + walletId: String, + networkId: String, + tokenId: String, + address: String, + ): ReferralData { + return withContext(coroutineDispatcher.io) { + referralConverter.convert( + referralApi.startReferral( + StartReferralBody( + walletId = walletId, + networkId = networkId, + tokenId = tokenId, + address = address, + ), + ), + ) + } + } +} \ No newline at end of file diff --git a/features/referral/domain/build.gradle.kts b/features/referral/domain/build.gradle.kts index 4a5dd97a5c..561cbe2b15 100644 --- a/features/referral/domain/build.gradle.kts +++ b/features/referral/domain/build.gradle.kts @@ -26,6 +26,9 @@ android { dependencies { + /** Time */ + implementation(Library.jodatime) + /** DI */ implementation(Library.hilt) kapt(Library.hiltKapt) diff --git a/features/referral/domain/src/main/java/com/tangem/feature/referral/domain/ReferralRepository.kt b/features/referral/domain/src/main/java/com/tangem/feature/referral/domain/ReferralRepository.kt new file mode 100644 index 0000000000..a329077747 --- /dev/null +++ b/features/referral/domain/src/main/java/com/tangem/feature/referral/domain/ReferralRepository.kt @@ -0,0 +1,17 @@ +package com.tangem.feature.referral.domain + +import com.tangem.feature.referral.domain.models.ReferralData + +interface ReferralRepository { + + /** Returns data object of [ReferralData] depends on user program status */ + suspend fun getReferralStatus(walletId: String): ReferralData + + /** Starts user referral program */ + suspend fun startReferral( + walletId: String, + networkId: String, + tokenId: String, + address: String, + ): ReferralData +} \ No newline at end of file diff --git a/features/referral/domain/src/main/java/com/tangem/feature/referral/domain/models/ReferralData.kt b/features/referral/domain/src/main/java/com/tangem/feature/referral/domain/models/ReferralData.kt new file mode 100644 index 0000000000..ba5f803e59 --- /dev/null +++ b/features/referral/domain/src/main/java/com/tangem/feature/referral/domain/models/ReferralData.kt @@ -0,0 +1,52 @@ +package com.tangem.feature.referral.domain.models + +import org.joda.time.DateTime + +sealed interface ReferralData { + + val award: Int + val discount: Int + val discountType: DiscountType + val tosLink: String + val tokens: List + + /** Data class that used if user is participant of program */ + data class ParticipantData( + override val award: Int, + override val discount: Int, + override val discountType: DiscountType, + override val tosLink: String, + override val tokens: List, + val referral: ReferralInfo, + ) : ReferralData + + /** Data class that used if user is not participant of program */ + data class NonParticipantData( + override val award: Int, + override val discount: Int, + override val discountType: DiscountType, + override val tosLink: String, + override val tokens: List, + ) : ReferralData +} + +data class TokenData( + val id: String, + val name: String, + val symbol: String, + val networkId: String?, + val contractAddress: String?, + val decimalCount: Int, +) + +data class ReferralInfo( + val shareLink: String, + val address: String, + val promocode: String, + val walletsPurchased: Int, + val termsAcceptedAt: DateTime?, +) + +enum class DiscountType { + PERCENTAGE, VALUE +} \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index 878d6a3498..05eaab6228 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -3,6 +3,7 @@ include(":domain") include(":network") include(":common") include(":core:datasource") +include(":core:utils") include(":features:referral:data") include(":features:referral:domain") include(":features:referral:presentation") \ No newline at end of file