From 56aeae61def1ee4b3e8c460c4b7b21a3dffe6fe2 Mon Sep 17 00:00:00 2001 From: Louis Legrand Date: Fri, 13 Dec 2024 15:13:23 +0100 Subject: [PATCH] feat(CON-206) : [UI] - Create Data / Domain layer to retrive the configuration. --- consentium-ui/build.gradle.kts | 17 ++++ .../consentium_ui/data/di/NetworkModule.kt | 49 +++++++++++ .../data/remote/ConsentiumUIApi.kt | 15 ++++ .../data/remote/model/GetConsentConfigDTO.kt | 16 ++++ .../model/MainConsentTextTranslationDTO.kt | 13 +++ .../data/remote/model/PurposeDTO.kt | 14 ++++ .../remote/model/PurposeTranslationDTO.kt | 11 +++ .../data/remote/model/VendorDTO.kt | 13 +++ .../data/remote/model/VendorTranslationDTO.kt | 11 +++ .../adapter/ConsentConfigDataAdapter.kt | 12 +++ .../MainConsentTextTranslationDataAdapter.kt | 15 ++++ .../domain/adapter/PurposeDataAdapter.kt | 16 ++++ .../adapter/PurposeTranslationDataAdapter.kt | 13 +++ .../domain/adapter/VendorDataAdapter.kt | 15 ++++ .../adapter/VendorTranslationDataAdapter.kt | 13 +++ .../domain/di/ConsentiumUseCaseModule.kt | 19 +++++ .../domain/model/ContentConfigData.kt | 8 ++ .../model/MainConsentTextTranslationData.kt | 9 ++ .../consentium_ui/domain/model/PurposeData.kt | 10 +++ .../domain/model/PurposeTranslationData.kt | 7 ++ .../consentium_ui/domain/model/VendorData.kt | 9 ++ .../domain/model/VendorTranslationData.kt | 7 ++ .../repository/ConsentiumUIRepository.kt | 41 +++++++++ .../usecase/GetConfigTextForLanguage.kt | 83 +++++++++++++++++++ ...ule.kt => ConsentiumDebugNetworkModule.kt} | 2 +- .../fr/openium/consentium/api/Consentium.kt | 8 +- .../consentium/data/di/NetworkModule.kt | 8 +- .../di/RepositoryEntryPoint.kt | 4 +- .../repository/ConsentiumRepository.kt | 2 +- ...etConsentiumUniqueInstallationIdUseCase.kt | 18 ++++ .../useCase/di/ConsentiumUseCaseModule.kt | 19 +++++ 31 files changed, 485 insertions(+), 12 deletions(-) create mode 100644 consentium-ui/src/main/java/fr/openium/consentium_ui/data/di/NetworkModule.kt create mode 100644 consentium-ui/src/main/java/fr/openium/consentium_ui/data/remote/ConsentiumUIApi.kt create mode 100644 consentium-ui/src/main/java/fr/openium/consentium_ui/data/remote/model/GetConsentConfigDTO.kt create mode 100644 consentium-ui/src/main/java/fr/openium/consentium_ui/data/remote/model/MainConsentTextTranslationDTO.kt create mode 100644 consentium-ui/src/main/java/fr/openium/consentium_ui/data/remote/model/PurposeDTO.kt create mode 100644 consentium-ui/src/main/java/fr/openium/consentium_ui/data/remote/model/PurposeTranslationDTO.kt create mode 100644 consentium-ui/src/main/java/fr/openium/consentium_ui/data/remote/model/VendorDTO.kt create mode 100644 consentium-ui/src/main/java/fr/openium/consentium_ui/data/remote/model/VendorTranslationDTO.kt create mode 100644 consentium-ui/src/main/java/fr/openium/consentium_ui/domain/adapter/ConsentConfigDataAdapter.kt create mode 100644 consentium-ui/src/main/java/fr/openium/consentium_ui/domain/adapter/MainConsentTextTranslationDataAdapter.kt create mode 100644 consentium-ui/src/main/java/fr/openium/consentium_ui/domain/adapter/PurposeDataAdapter.kt create mode 100644 consentium-ui/src/main/java/fr/openium/consentium_ui/domain/adapter/PurposeTranslationDataAdapter.kt create mode 100644 consentium-ui/src/main/java/fr/openium/consentium_ui/domain/adapter/VendorDataAdapter.kt create mode 100644 consentium-ui/src/main/java/fr/openium/consentium_ui/domain/adapter/VendorTranslationDataAdapter.kt create mode 100644 consentium-ui/src/main/java/fr/openium/consentium_ui/domain/di/ConsentiumUseCaseModule.kt create mode 100644 consentium-ui/src/main/java/fr/openium/consentium_ui/domain/model/ContentConfigData.kt create mode 100644 consentium-ui/src/main/java/fr/openium/consentium_ui/domain/model/MainConsentTextTranslationData.kt create mode 100644 consentium-ui/src/main/java/fr/openium/consentium_ui/domain/model/PurposeData.kt create mode 100644 consentium-ui/src/main/java/fr/openium/consentium_ui/domain/model/PurposeTranslationData.kt create mode 100644 consentium-ui/src/main/java/fr/openium/consentium_ui/domain/model/VendorData.kt create mode 100644 consentium-ui/src/main/java/fr/openium/consentium_ui/domain/model/VendorTranslationData.kt create mode 100644 consentium-ui/src/main/java/fr/openium/consentium_ui/domain/repository/ConsentiumUIRepository.kt create mode 100644 consentium-ui/src/main/java/fr/openium/consentium_ui/domain/usecase/GetConfigTextForLanguage.kt rename consentium/src/debug/kotlin/fr/openium/consentium/{DebugNetworkModule.kt => ConsentiumDebugNetworkModule.kt} (96%) rename consentium/src/main/java/fr/openium/consentium/{data => domain}/di/RepositoryEntryPoint.kt (70%) rename consentium/src/main/java/fr/openium/consentium/{data => domain}/repository/ConsentiumRepository.kt (98%) create mode 100644 consentium/src/main/java/fr/openium/consentium/domain/useCase/GetConsentiumUniqueInstallationIdUseCase.kt create mode 100644 consentium/src/main/java/fr/openium/consentium/domain/useCase/di/ConsentiumUseCaseModule.kt diff --git a/consentium-ui/build.gradle.kts b/consentium-ui/build.gradle.kts index 9a390ad..a680e58 100644 --- a/consentium-ui/build.gradle.kts +++ b/consentium-ui/build.gradle.kts @@ -1,6 +1,8 @@ plugins { alias(libs.plugins.android.library) alias(libs.plugins.kotlin.android) + alias(libs.plugins.serialization) + alias(libs.plugins.ksp) } android { @@ -37,6 +39,21 @@ dependencies { implementation(libs.androidx.core.ktx) implementation(libs.androidx.appcompat) + // Serialization + implementation(libs.kotlin.serialization) + + // Retrofit + api(libs.retrofit) + implementation(libs.retrofitConverter) + implementation(libs.logging.interceptor) + + // Hilt + implementation(libs.hilt.android) + ksp(libs.hilt.compiler) + + // Timber + implementation(libs.timber) + // Tests testImplementation(libs.test.junit) androidTestImplementation(libs.androidx.junit) diff --git a/consentium-ui/src/main/java/fr/openium/consentium_ui/data/di/NetworkModule.kt b/consentium-ui/src/main/java/fr/openium/consentium_ui/data/di/NetworkModule.kt new file mode 100644 index 0000000..456b1fc --- /dev/null +++ b/consentium-ui/src/main/java/fr/openium/consentium_ui/data/di/NetworkModule.kt @@ -0,0 +1,49 @@ +package fr.openium.consentium_ui.data.di + +import dagger.Lazy +import dagger.Module +import dagger.Provides +import dagger.Reusable +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import fr.openium.consentium.data.di.ConsentiumUrl +import fr.openium.consentium.data.di.OkHttpClientDefault +import fr.openium.consentium_ui.data.remote.ConsentiumUIApi +import kotlinx.serialization.json.Json +import okhttp3.HttpUrl +import okhttp3.MediaType.Companion.toMediaType +import okhttp3.OkHttpClient +import retrofit2.Retrofit +import retrofit2.converter.kotlinx.serialization.asConverterFactory + +private val json by lazy { + Json { + isLenient = true + ignoreUnknownKeys = true + } +} + +@Module +@InstallIn(SingletonComponent::class) +internal object NetworkModule { + + @Reusable + @Provides + fun provideConsentiumUIApi( + @ConsentiumUrl url: HttpUrl, + @OkHttpClientDefault okHttpClient: Lazy, + ): ConsentiumUIApi = + createRetrofit( + url, + okHttpClient + ).create(ConsentiumUIApi::class.java) + + private fun createRetrofit(url: HttpUrl, okHttpClient: Lazy): Retrofit = + Retrofit.Builder() + .callFactory { request -> + okHttpClient.get().newCall(request) + }.addConverterFactory(json.asConverterFactory("application/json".toMediaType())) + .baseUrl(url) + .build() + +} diff --git a/consentium-ui/src/main/java/fr/openium/consentium_ui/data/remote/ConsentiumUIApi.kt b/consentium-ui/src/main/java/fr/openium/consentium_ui/data/remote/ConsentiumUIApi.kt new file mode 100644 index 0000000..c97bf2d --- /dev/null +++ b/consentium-ui/src/main/java/fr/openium/consentium_ui/data/remote/ConsentiumUIApi.kt @@ -0,0 +1,15 @@ +package fr.openium.consentium_ui.data.remote + +import fr.openium.consentium_ui.data.remote.model.GetConsentConfigDTO +import retrofit2.Response +import retrofit2.http.GET + +internal interface ConsentiumUIApi { + + @GET("consent-config") + suspend fun getConsentConfig( + applicationID: String, + installationID: String, + ): Response + +} \ No newline at end of file diff --git a/consentium-ui/src/main/java/fr/openium/consentium_ui/data/remote/model/GetConsentConfigDTO.kt b/consentium-ui/src/main/java/fr/openium/consentium_ui/data/remote/model/GetConsentConfigDTO.kt new file mode 100644 index 0000000..118c107 --- /dev/null +++ b/consentium-ui/src/main/java/fr/openium/consentium_ui/data/remote/model/GetConsentConfigDTO.kt @@ -0,0 +1,16 @@ +package fr.openium.consentium_ui.data.remote.model + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +internal data class GetConsentConfigDTO( + @SerialName("id") val installationId: String, + @SerialName("name") val appName: String, + @SerialName("icon") val icon: String, + @SerialName("primaryColor") val primaryColor: String, + @SerialName("secondaryColor") val secondaryColor: String, + @SerialName("textColor") val textColor: String, + @SerialName("translation") val consentMainTextTranslation: List, + @SerialName("purposes") val purposes: List, +) \ No newline at end of file diff --git a/consentium-ui/src/main/java/fr/openium/consentium_ui/data/remote/model/MainConsentTextTranslationDTO.kt b/consentium-ui/src/main/java/fr/openium/consentium_ui/data/remote/model/MainConsentTextTranslationDTO.kt new file mode 100644 index 0000000..69b52bf --- /dev/null +++ b/consentium-ui/src/main/java/fr/openium/consentium_ui/data/remote/model/MainConsentTextTranslationDTO.kt @@ -0,0 +1,13 @@ +package fr.openium.consentium_ui.data.remote.model + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +internal data class MainConsentTextTranslationDTO( + @SerialName("id") val id: String, + @SerialName("lang") val language: String, + @SerialName("consentPageUrl") val consentPageUrl: String, + @SerialName("mainConsentText") val mainConsentText: String, + @SerialName("durationText") val durationText: String, +) \ No newline at end of file diff --git a/consentium-ui/src/main/java/fr/openium/consentium_ui/data/remote/model/PurposeDTO.kt b/consentium-ui/src/main/java/fr/openium/consentium_ui/data/remote/model/PurposeDTO.kt new file mode 100644 index 0000000..c3bcff5 --- /dev/null +++ b/consentium-ui/src/main/java/fr/openium/consentium_ui/data/remote/model/PurposeDTO.kt @@ -0,0 +1,14 @@ +package fr.openium.consentium_ui.data.remote.model + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +internal data class PurposeDTO( + @SerialName("identifier") val id: String, + @SerialName("order") val order: Int, + @SerialName("isRequired") val isRequired: Boolean, + @SerialName("isAccepted") val isAccepted: Boolean, + @SerialName("translations") val translations: List, + @SerialName("vendors") val vendors: List, +) \ No newline at end of file diff --git a/consentium-ui/src/main/java/fr/openium/consentium_ui/data/remote/model/PurposeTranslationDTO.kt b/consentium-ui/src/main/java/fr/openium/consentium_ui/data/remote/model/PurposeTranslationDTO.kt new file mode 100644 index 0000000..4c733ef --- /dev/null +++ b/consentium-ui/src/main/java/fr/openium/consentium_ui/data/remote/model/PurposeTranslationDTO.kt @@ -0,0 +1,11 @@ +package fr.openium.consentium_ui.data.remote.model + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +internal data class PurposeTranslationDTO( + @SerialName("id") val id: String, + @SerialName("lang") val language: String, + @SerialName("text") val text: String, +) \ No newline at end of file diff --git a/consentium-ui/src/main/java/fr/openium/consentium_ui/data/remote/model/VendorDTO.kt b/consentium-ui/src/main/java/fr/openium/consentium_ui/data/remote/model/VendorDTO.kt new file mode 100644 index 0000000..63983ba --- /dev/null +++ b/consentium-ui/src/main/java/fr/openium/consentium_ui/data/remote/model/VendorDTO.kt @@ -0,0 +1,13 @@ +package fr.openium.consentium_ui.data.remote.model + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +internal data class VendorDTO( + @SerialName("identifier") val id: String, + @SerialName("order") val order: Int, + @SerialName("isRequired") val isRequired: Boolean, + @SerialName("isAccepted") val isAccepted: Boolean, + @SerialName("translations") val translations: List, +) \ No newline at end of file diff --git a/consentium-ui/src/main/java/fr/openium/consentium_ui/data/remote/model/VendorTranslationDTO.kt b/consentium-ui/src/main/java/fr/openium/consentium_ui/data/remote/model/VendorTranslationDTO.kt new file mode 100644 index 0000000..346cf4d --- /dev/null +++ b/consentium-ui/src/main/java/fr/openium/consentium_ui/data/remote/model/VendorTranslationDTO.kt @@ -0,0 +1,11 @@ +package fr.openium.consentium_ui.data.remote.model + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +internal data class VendorTranslationDTO( + @SerialName("id") val id: String, + @SerialName("lang") val language: String, + @SerialName("text") val text: String, +) \ No newline at end of file diff --git a/consentium-ui/src/main/java/fr/openium/consentium_ui/domain/adapter/ConsentConfigDataAdapter.kt b/consentium-ui/src/main/java/fr/openium/consentium_ui/domain/adapter/ConsentConfigDataAdapter.kt new file mode 100644 index 0000000..5158088 --- /dev/null +++ b/consentium-ui/src/main/java/fr/openium/consentium_ui/domain/adapter/ConsentConfigDataAdapter.kt @@ -0,0 +1,12 @@ +package fr.openium.consentium_ui.domain.adapter + +import fr.openium.consentium_ui.data.remote.model.GetConsentConfigDTO +import fr.openium.consentium_ui.domain.model.ContentConfigData + +internal fun GetConsentConfigDTO.toConsentConfigData() = + ContentConfigData( + applicationName = appName, + iconUrl = icon, + mainTextTranslation = consentMainTextTranslation.toMainConsentTextTranslationDataList(), + purposes = purposes.toPurposeDataList() + ) \ No newline at end of file diff --git a/consentium-ui/src/main/java/fr/openium/consentium_ui/domain/adapter/MainConsentTextTranslationDataAdapter.kt b/consentium-ui/src/main/java/fr/openium/consentium_ui/domain/adapter/MainConsentTextTranslationDataAdapter.kt new file mode 100644 index 0000000..2b592d0 --- /dev/null +++ b/consentium-ui/src/main/java/fr/openium/consentium_ui/domain/adapter/MainConsentTextTranslationDataAdapter.kt @@ -0,0 +1,15 @@ +package fr.openium.consentium_ui.domain.adapter + +import fr.openium.consentium_ui.data.remote.model.MainConsentTextTranslationDTO +import fr.openium.consentium_ui.domain.model.MainConsentTextTranslationData + +internal fun MainConsentTextTranslationDTO.toMainConsentTextTranslationData() = + MainConsentTextTranslationData( + id = id, + language = language, + consentPageUrl = consentPageUrl, + mainConsentText = mainConsentText, + durationText = durationText, + ) + +internal fun List.toMainConsentTextTranslationDataList() = map { it.toMainConsentTextTranslationData() } \ No newline at end of file diff --git a/consentium-ui/src/main/java/fr/openium/consentium_ui/domain/adapter/PurposeDataAdapter.kt b/consentium-ui/src/main/java/fr/openium/consentium_ui/domain/adapter/PurposeDataAdapter.kt new file mode 100644 index 0000000..9288100 --- /dev/null +++ b/consentium-ui/src/main/java/fr/openium/consentium_ui/domain/adapter/PurposeDataAdapter.kt @@ -0,0 +1,16 @@ +package fr.openium.consentium_ui.domain.adapter + +import fr.openium.consentium_ui.data.remote.model.PurposeDTO +import fr.openium.consentium_ui.domain.model.PurposeData + +internal fun PurposeDTO.toPurposeData() = + PurposeData( + identifier = id, + isRequired = isRequired, + isAccepted = isAccepted, + order = order, + vendors = vendors.toVendorDataList(), + translations = translations.toPurposeTranslationDataList(), + ) + +internal fun List.toPurposeDataList() = map { it.toPurposeData() } \ No newline at end of file diff --git a/consentium-ui/src/main/java/fr/openium/consentium_ui/domain/adapter/PurposeTranslationDataAdapter.kt b/consentium-ui/src/main/java/fr/openium/consentium_ui/domain/adapter/PurposeTranslationDataAdapter.kt new file mode 100644 index 0000000..f0274ec --- /dev/null +++ b/consentium-ui/src/main/java/fr/openium/consentium_ui/domain/adapter/PurposeTranslationDataAdapter.kt @@ -0,0 +1,13 @@ +package fr.openium.consentium_ui.domain.adapter + +import fr.openium.consentium_ui.data.remote.model.PurposeTranslationDTO +import fr.openium.consentium_ui.domain.model.PurposeTranslationData + +internal fun PurposeTranslationDTO.toPurposeTranslationData() = + PurposeTranslationData( + id = id, + language = language, + text = text, + ) + +internal fun List.toPurposeTranslationDataList() = map { it.toPurposeTranslationData() } \ No newline at end of file diff --git a/consentium-ui/src/main/java/fr/openium/consentium_ui/domain/adapter/VendorDataAdapter.kt b/consentium-ui/src/main/java/fr/openium/consentium_ui/domain/adapter/VendorDataAdapter.kt new file mode 100644 index 0000000..59ab04f --- /dev/null +++ b/consentium-ui/src/main/java/fr/openium/consentium_ui/domain/adapter/VendorDataAdapter.kt @@ -0,0 +1,15 @@ +package fr.openium.consentium_ui.domain.adapter + +import fr.openium.consentium_ui.data.remote.model.VendorDTO +import fr.openium.consentium_ui.domain.model.VendorData + +internal fun VendorDTO.toVendorData() = + VendorData( + identifier = id, + order = order, + isRequired = isRequired, + isAccepted = isAccepted, + translations = translations.toVendorTranslationDataList(), + ) + +internal fun List.toVendorDataList() = map { it.toVendorData() } \ No newline at end of file diff --git a/consentium-ui/src/main/java/fr/openium/consentium_ui/domain/adapter/VendorTranslationDataAdapter.kt b/consentium-ui/src/main/java/fr/openium/consentium_ui/domain/adapter/VendorTranslationDataAdapter.kt new file mode 100644 index 0000000..429cb48 --- /dev/null +++ b/consentium-ui/src/main/java/fr/openium/consentium_ui/domain/adapter/VendorTranslationDataAdapter.kt @@ -0,0 +1,13 @@ +package fr.openium.consentium_ui.domain.adapter + +import fr.openium.consentium_ui.data.remote.model.VendorTranslationDTO +import fr.openium.consentium_ui.domain.model.VendorTranslationData + +internal fun VendorTranslationDTO.toVendorTranslationData() = + VendorTranslationData( + id = id, + language = language, + text = text, + ) + +internal fun List.toVendorTranslationDataList() = map { it.toVendorTranslationData() } \ No newline at end of file diff --git a/consentium-ui/src/main/java/fr/openium/consentium_ui/domain/di/ConsentiumUseCaseModule.kt b/consentium-ui/src/main/java/fr/openium/consentium_ui/domain/di/ConsentiumUseCaseModule.kt new file mode 100644 index 0000000..283a320 --- /dev/null +++ b/consentium-ui/src/main/java/fr/openium/consentium_ui/domain/di/ConsentiumUseCaseModule.kt @@ -0,0 +1,19 @@ +package fr.openium.consentium_ui.domain.di + +import dagger.Binds +import dagger.Module +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import fr.openium.consentium_ui.domain.usecase.GetConfigTextForLanguageUseCase +import fr.openium.consentium_ui.domain.usecase.GetConfigTextForLanguageUseCaseImpl + +@Module +@InstallIn(SingletonComponent::class) +internal interface ConsentiumUseCaseModule { + + @Binds + fun bindsGetConfigTextForLanguageUseCase( + getConfigTextForLanguageUseCaseImpl: GetConfigTextForLanguageUseCaseImpl, + ): GetConfigTextForLanguageUseCase + +} \ No newline at end of file diff --git a/consentium-ui/src/main/java/fr/openium/consentium_ui/domain/model/ContentConfigData.kt b/consentium-ui/src/main/java/fr/openium/consentium_ui/domain/model/ContentConfigData.kt new file mode 100644 index 0000000..e0d6a9c --- /dev/null +++ b/consentium-ui/src/main/java/fr/openium/consentium_ui/domain/model/ContentConfigData.kt @@ -0,0 +1,8 @@ +package fr.openium.consentium_ui.domain.model + +internal data class ContentConfigData( + val applicationName: String, + val iconUrl : String, + val mainTextTranslation: List, + val purposes: List +) diff --git a/consentium-ui/src/main/java/fr/openium/consentium_ui/domain/model/MainConsentTextTranslationData.kt b/consentium-ui/src/main/java/fr/openium/consentium_ui/domain/model/MainConsentTextTranslationData.kt new file mode 100644 index 0000000..0c994e3 --- /dev/null +++ b/consentium-ui/src/main/java/fr/openium/consentium_ui/domain/model/MainConsentTextTranslationData.kt @@ -0,0 +1,9 @@ +package fr.openium.consentium_ui.domain.model + +internal data class MainConsentTextTranslationData( + val id: String, + val language: String, + val consentPageUrl: String, + val mainConsentText: String, + val durationText: String, +) \ No newline at end of file diff --git a/consentium-ui/src/main/java/fr/openium/consentium_ui/domain/model/PurposeData.kt b/consentium-ui/src/main/java/fr/openium/consentium_ui/domain/model/PurposeData.kt new file mode 100644 index 0000000..9b40568 --- /dev/null +++ b/consentium-ui/src/main/java/fr/openium/consentium_ui/domain/model/PurposeData.kt @@ -0,0 +1,10 @@ +package fr.openium.consentium_ui.domain.model + +internal data class PurposeData( + val identifier: String, + val order: Int, + val isRequired: Boolean, + val isAccepted: Boolean, + val translations: List, + val vendors: List, +) diff --git a/consentium-ui/src/main/java/fr/openium/consentium_ui/domain/model/PurposeTranslationData.kt b/consentium-ui/src/main/java/fr/openium/consentium_ui/domain/model/PurposeTranslationData.kt new file mode 100644 index 0000000..a305e91 --- /dev/null +++ b/consentium-ui/src/main/java/fr/openium/consentium_ui/domain/model/PurposeTranslationData.kt @@ -0,0 +1,7 @@ +package fr.openium.consentium_ui.domain.model + +internal data class PurposeTranslationData( + val id: String, + val language: String, + val text: String, +) \ No newline at end of file diff --git a/consentium-ui/src/main/java/fr/openium/consentium_ui/domain/model/VendorData.kt b/consentium-ui/src/main/java/fr/openium/consentium_ui/domain/model/VendorData.kt new file mode 100644 index 0000000..c15cb62 --- /dev/null +++ b/consentium-ui/src/main/java/fr/openium/consentium_ui/domain/model/VendorData.kt @@ -0,0 +1,9 @@ +package fr.openium.consentium_ui.domain.model + +internal data class VendorData( + val identifier: String, + val order: Int, + val isRequired: Boolean, + val isAccepted: Boolean, + val translations: List, +) \ No newline at end of file diff --git a/consentium-ui/src/main/java/fr/openium/consentium_ui/domain/model/VendorTranslationData.kt b/consentium-ui/src/main/java/fr/openium/consentium_ui/domain/model/VendorTranslationData.kt new file mode 100644 index 0000000..4b1b4df --- /dev/null +++ b/consentium-ui/src/main/java/fr/openium/consentium_ui/domain/model/VendorTranslationData.kt @@ -0,0 +1,7 @@ +package fr.openium.consentium_ui.domain.model + +internal data class VendorTranslationData( + val id: String, + val language: String, + val text: String, +) \ No newline at end of file diff --git a/consentium-ui/src/main/java/fr/openium/consentium_ui/domain/repository/ConsentiumUIRepository.kt b/consentium-ui/src/main/java/fr/openium/consentium_ui/domain/repository/ConsentiumUIRepository.kt new file mode 100644 index 0000000..4161123 --- /dev/null +++ b/consentium-ui/src/main/java/fr/openium/consentium_ui/domain/repository/ConsentiumUIRepository.kt @@ -0,0 +1,41 @@ +package fr.openium.consentium_ui.domain.repository + +import fr.openium.consentium.domain.useCase.GetConsentiumUniqueInstallationIdUseCase +import fr.openium.consentium_ui.data.remote.ConsentiumUIApi +import fr.openium.consentium_ui.domain.adapter.toConsentConfigData +import fr.openium.consentium_ui.domain.model.ContentConfigData +import javax.inject.Inject + +internal class ConsentiumRepository @Inject constructor( + private val getConsentiumUniqueInstallationIdUseCase: GetConsentiumUniqueInstallationIdUseCase, + private val consentiumUIApi: ConsentiumUIApi, +) { + + suspend fun getConsentiumConfig( + applicationId: String, + ): ConsentiumUIRepositoryResponse { + val installationId = getConsentiumUniqueInstallationIdUseCase.invoke() + val consentsResponse = consentiumUIApi.getConsentConfig(applicationId, installationId) + + return try { + val consentsBody = if (consentsResponse.isSuccessful) { + consentsResponse.body() ?: throw Exception() + } else { + throw Exception() + } + + ConsentiumUIRepositoryResponse.Success(consentsBody.toConsentConfigData()) + } catch (e: Exception) { + ConsentiumUIRepositoryResponse.Error + } + } + +} + +internal interface ConsentiumUIRepositoryResponse { + + data object Error : ConsentiumUIRepositoryResponse + + data class Success(val contentConfigData: ContentConfigData) : ConsentiumUIRepositoryResponse + +} \ No newline at end of file diff --git a/consentium-ui/src/main/java/fr/openium/consentium_ui/domain/usecase/GetConfigTextForLanguage.kt b/consentium-ui/src/main/java/fr/openium/consentium_ui/domain/usecase/GetConfigTextForLanguage.kt new file mode 100644 index 0000000..3b8ca2c --- /dev/null +++ b/consentium-ui/src/main/java/fr/openium/consentium_ui/domain/usecase/GetConfigTextForLanguage.kt @@ -0,0 +1,83 @@ +package fr.openium.consentium_ui.domain.usecase + +import fr.openium.consentium_ui.domain.model.ContentConfigData +import javax.inject.Inject + +private const val FALLBACK_LANGUAGE = "en" + +internal interface GetConfigTextForLanguageUseCase { + suspend fun invoke( + language: String = FALLBACK_LANGUAGE, + configData: ContentConfigData, + ): GetConfigTextForLanguageUseCaseResponce +} + +internal class GetConfigTextForLanguageUseCaseImpl @Inject constructor() : GetConfigTextForLanguageUseCase { + + override suspend fun invoke( + language: String, + configData: ContentConfigData, + ): GetConfigTextForLanguageUseCaseResponce { + + return try { + + val canIUseTheTranslation = configData.mainTextTranslation.any { it.language == language } && + configData.purposes.all { purposeData -> + purposeData.translations.any { it.language == language } && + purposeData.vendors.all { vendorData -> + vendorData.translations.any { it.language == language } + } + } + + val languageToUse = if (canIUseTheTranslation) { + language + } else { + val isThereAGoodFallbackLanguage = configData.mainTextTranslation.any { it.language == FALLBACK_LANGUAGE } && + configData.purposes.all { purposeData -> + purposeData.translations.any { it.language == FALLBACK_LANGUAGE } && + purposeData.vendors.all { vendorData -> + vendorData.translations.any { it.language == FALLBACK_LANGUAGE } + } + } + if (isThereAGoodFallbackLanguage) { + FALLBACK_LANGUAGE + } else { + throw Exception() + } + } + + val filteredConfigData = configData.copy( + mainTextTranslation = configData.mainTextTranslation.filter { it.language == languageToUse }, + purposes = configData.purposes.map { purposeData -> + purposeData.copy( + translations = purposeData.translations.filter { it.language == languageToUse }, + vendors = purposeData.vendors.map { vendorData -> + vendorData.copy( + translations = vendorData.translations.filter { it.language == languageToUse } + ) + } + ) + } + ) + + if (languageToUse == FALLBACK_LANGUAGE) { + GetConfigTextForLanguageUseCaseResponce.DefaultLanguage(filteredConfigData) + } else { + GetConfigTextForLanguageUseCaseResponce.Success(filteredConfigData) + } + } catch (e: Exception) { + GetConfigTextForLanguageUseCaseResponce.Error + } + } + +} + +internal interface GetConfigTextForLanguageUseCaseResponce { + + data object Error : GetConfigTextForLanguageUseCaseResponce + + data class Success(val configData: ContentConfigData) : GetConfigTextForLanguageUseCaseResponce + + data class DefaultLanguage(val configData: ContentConfigData) : GetConfigTextForLanguageUseCaseResponce + +} diff --git a/consentium/src/debug/kotlin/fr/openium/consentium/DebugNetworkModule.kt b/consentium/src/debug/kotlin/fr/openium/consentium/ConsentiumDebugNetworkModule.kt similarity index 96% rename from consentium/src/debug/kotlin/fr/openium/consentium/DebugNetworkModule.kt rename to consentium/src/debug/kotlin/fr/openium/consentium/ConsentiumDebugNetworkModule.kt index c09d32a..e2f1513 100644 --- a/consentium/src/debug/kotlin/fr/openium/consentium/DebugNetworkModule.kt +++ b/consentium/src/debug/kotlin/fr/openium/consentium/ConsentiumDebugNetworkModule.kt @@ -16,7 +16,7 @@ import timber.log.Timber @Module @InstallIn(SingletonComponent::class) -class DebugNetworkModule { +class ConsentiumDebugNetworkModule { @Provides fun provideOkHttpBuilder( diff --git a/consentium/src/main/java/fr/openium/consentium/api/Consentium.kt b/consentium/src/main/java/fr/openium/consentium/api/Consentium.kt index 9427663..9d85af3 100644 --- a/consentium/src/main/java/fr/openium/consentium/api/Consentium.kt +++ b/consentium/src/main/java/fr/openium/consentium/api/Consentium.kt @@ -9,10 +9,10 @@ import fr.openium.consentium.api.model.VendorIdentifier import fr.openium.consentium.api.model.VendorStatus import fr.openium.consentium.api.state.FetchConsentiumState import fr.openium.consentium.api.state.SetConsentiumState -import fr.openium.consentium.data.di.RepositoryEntryPoint -import fr.openium.consentium.data.repository.ConsentiumRepository -import fr.openium.consentium.data.repository.ConsentiumRepositoryGetResponse -import fr.openium.consentium.data.repository.ConsentiumRepositorySetResponse +import fr.openium.consentium.domain.di.RepositoryEntryPoint +import fr.openium.consentium.domain.repository.ConsentiumRepository +import fr.openium.consentium.domain.repository.ConsentiumRepositoryGetResponse +import fr.openium.consentium.domain.repository.ConsentiumRepositorySetResponse import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow diff --git a/consentium/src/main/java/fr/openium/consentium/data/di/NetworkModule.kt b/consentium/src/main/java/fr/openium/consentium/data/di/NetworkModule.kt index 3680992..39ff191 100644 --- a/consentium/src/main/java/fr/openium/consentium/data/di/NetworkModule.kt +++ b/consentium/src/main/java/fr/openium/consentium/data/di/NetworkModule.kt @@ -28,7 +28,7 @@ private val json by lazy { @Module @InstallIn(SingletonComponent::class) -internal object NetworkModule { +object NetworkModule { @OkHttpClientDefault @Provides @@ -51,7 +51,7 @@ internal object NetworkModule { @Reusable @Provides - fun provideConsentiumApi( + internal fun provideConsentiumApi( @ConsentiumUrl url: HttpUrl, @OkHttpClientDefault okHttpClient: Lazy, ): ConsentiumApi = @@ -71,8 +71,8 @@ internal object NetworkModule { @Qualifier @Retention(AnnotationRetention.BINARY) -internal annotation class ConsentiumUrl +annotation class ConsentiumUrl @Qualifier @Retention(AnnotationRetention.BINARY) -internal annotation class OkHttpClientDefault +annotation class OkHttpClientDefault diff --git a/consentium/src/main/java/fr/openium/consentium/data/di/RepositoryEntryPoint.kt b/consentium/src/main/java/fr/openium/consentium/domain/di/RepositoryEntryPoint.kt similarity index 70% rename from consentium/src/main/java/fr/openium/consentium/data/di/RepositoryEntryPoint.kt rename to consentium/src/main/java/fr/openium/consentium/domain/di/RepositoryEntryPoint.kt index f39a140..31a6fba 100644 --- a/consentium/src/main/java/fr/openium/consentium/data/di/RepositoryEntryPoint.kt +++ b/consentium/src/main/java/fr/openium/consentium/domain/di/RepositoryEntryPoint.kt @@ -1,9 +1,9 @@ -package fr.openium.consentium.data.di +package fr.openium.consentium.domain.di import dagger.hilt.EntryPoint import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent -import fr.openium.consentium.data.repository.ConsentiumRepository +import fr.openium.consentium.domain.repository.ConsentiumRepository @EntryPoint @InstallIn(SingletonComponent::class) diff --git a/consentium/src/main/java/fr/openium/consentium/data/repository/ConsentiumRepository.kt b/consentium/src/main/java/fr/openium/consentium/domain/repository/ConsentiumRepository.kt similarity index 98% rename from consentium/src/main/java/fr/openium/consentium/data/repository/ConsentiumRepository.kt rename to consentium/src/main/java/fr/openium/consentium/domain/repository/ConsentiumRepository.kt index 1674025..f5a0d18 100644 --- a/consentium/src/main/java/fr/openium/consentium/data/repository/ConsentiumRepository.kt +++ b/consentium/src/main/java/fr/openium/consentium/domain/repository/ConsentiumRepository.kt @@ -1,4 +1,4 @@ -package fr.openium.consentium.data.repository +package fr.openium.consentium.domain.repository import fr.openium.consentium.api.adapter.toPatchConsentPurposeDTO import fr.openium.consentium.api.adapter.toPurpose diff --git a/consentium/src/main/java/fr/openium/consentium/domain/useCase/GetConsentiumUniqueInstallationIdUseCase.kt b/consentium/src/main/java/fr/openium/consentium/domain/useCase/GetConsentiumUniqueInstallationIdUseCase.kt new file mode 100644 index 0000000..18362b3 --- /dev/null +++ b/consentium/src/main/java/fr/openium/consentium/domain/useCase/GetConsentiumUniqueInstallationIdUseCase.kt @@ -0,0 +1,18 @@ +package fr.openium.consentium.domain.useCase + +import fr.openium.consentium.data.local.ConsentiumDataStore +import javax.inject.Inject + +interface GetConsentiumUniqueInstallationIdUseCase { + suspend fun invoke(): String +} + +class GetConsentiumUniqueInstallationIdUseCaseImpl @Inject internal constructor( + private val consentiumDataStore: ConsentiumDataStore, +) : GetConsentiumUniqueInstallationIdUseCase { + + override suspend fun invoke(): String { + return consentiumDataStore.getInstallationUniqueId() + } + +} diff --git a/consentium/src/main/java/fr/openium/consentium/domain/useCase/di/ConsentiumUseCaseModule.kt b/consentium/src/main/java/fr/openium/consentium/domain/useCase/di/ConsentiumUseCaseModule.kt new file mode 100644 index 0000000..5bcf03e --- /dev/null +++ b/consentium/src/main/java/fr/openium/consentium/domain/useCase/di/ConsentiumUseCaseModule.kt @@ -0,0 +1,19 @@ +package fr.openium.consentium.domain.useCase.di + +import dagger.Binds +import dagger.Module +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import fr.openium.consentium.domain.useCase.GetConsentiumUniqueInstallationIdUseCase +import fr.openium.consentium.domain.useCase.GetConsentiumUniqueInstallationIdUseCaseImpl + +@Module +@InstallIn(SingletonComponent::class) +interface ConsentiumUseCaseModule { + + @Binds + fun bindGetUniqueInstallationIdUseCase( + getUniqueInstallationIdUseCaseImpl: GetConsentiumUniqueInstallationIdUseCaseImpl, + ): GetConsentiumUniqueInstallationIdUseCase + +}