diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 16d3bbc..c9e6ab8 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -72,6 +72,10 @@ android { dimension = "version" } + create("dev") { + dimension = "version" + } + create("demo") { dimension = "version" } diff --git a/app/src/main/java/fr/openium/consentium/ui/screens/splash/SplashScreen.kt b/app/src/main/java/fr/openium/consentium/ui/screens/splash/SplashScreen.kt index 59054b4..6bd44ef 100644 --- a/app/src/main/java/fr/openium/consentium/ui/screens/splash/SplashScreen.kt +++ b/app/src/main/java/fr/openium/consentium/ui/screens/splash/SplashScreen.kt @@ -14,7 +14,9 @@ import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp +import fr.openium.consentium.R import fr.openium.consentium.api.Consentium import fr.openium.consentium.api.state.FetchConsentiumState @@ -25,14 +27,17 @@ fun SplashScreen( ) { // Property val context = LocalContext.current - val consentium = remember { Consentium(context = context, applicationId = "DemoApplicationId") } + val consentiumKey = stringResource(R.string.consentium_api_key) + val consentium = remember { Consentium(context = context, applicationId = consentiumKey) } // Effect LaunchedEffect(Unit) { consentium.fetchConsentState.collect { consentState -> when (consentState) { FetchConsentiumState.Idle, - FetchConsentiumState.Loading -> {} + FetchConsentiumState.Loading, + -> { + } FetchConsentiumState.Error -> { // Handle error diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a0424b3..6e676d2 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,3 +1,4 @@ Consentium + 01938ce4-331a-7592-9e90-f09201ff4f36 \ No newline at end of file diff --git a/consentium-ui/build.gradle.kts b/consentium-ui/build.gradle.kts index 070bc38..484c953 100644 --- a/consentium-ui/build.gradle.kts +++ b/consentium-ui/build.gradle.kts @@ -34,6 +34,10 @@ android { dimension = "version" } + create("dev") { + dimension = "version" + } + create("demo") { dimension = "version" } diff --git a/consentium/build.gradle.kts b/consentium/build.gradle.kts index 566b95f..05e868a 100644 --- a/consentium/build.gradle.kts +++ b/consentium/build.gradle.kts @@ -34,6 +34,10 @@ android { dimension = "version" } + create("dev") { + dimension = "version" + } + create("demo") { dimension = "version" } diff --git a/consentium/src/debug/kotlin/fr/openium/consentium/ConsentiumDebugNetworkModule.kt b/consentium/src/dev/kotlin/fr/openium/consentium/ConsentiumDebugNetworkModule.kt similarity index 100% rename from consentium/src/debug/kotlin/fr/openium/consentium/ConsentiumDebugNetworkModule.kt rename to consentium/src/dev/kotlin/fr/openium/consentium/ConsentiumDebugNetworkModule.kt diff --git a/consentium/src/debug/res/values/strings.xml b/consentium/src/dev/res/values/strings.xml similarity index 100% rename from consentium/src/debug/res/values/strings.xml rename to consentium/src/dev/res/values/strings.xml 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 05fadb7..d8c4dc5 100644 --- a/consentium/src/main/java/fr/openium/consentium/api/Consentium.kt +++ b/consentium/src/main/java/fr/openium/consentium/api/Consentium.kt @@ -2,6 +2,7 @@ package fr.openium.consentium.api import android.content.Context import dagger.hilt.android.EntryPointAccessors +import fr.openium.consentium.api.model.ConsentState import fr.openium.consentium.api.model.PurposeChoice import fr.openium.consentium.api.state.FetchConsentiumState import fr.openium.consentium.api.state.SetConsentiumState @@ -35,7 +36,7 @@ class Consentium( ConsentiumRepositoryGetResponse.Error -> _fetchConsentState.value = FetchConsentiumState.Error is ConsentiumRepositoryGetResponse.GetConsentsSuccess -> { - val areConsentsValid = consentResponse.isValid + val areConsentsValid = consentResponse.state == ConsentState.VALID if (areConsentsValid) { _fetchConsentState.value = FetchConsentiumState.Valid(purposes = consentResponse.purposes) } else { diff --git a/consentium/src/main/java/fr/openium/consentium/api/adapter/ConsentStateAdapter.kt b/consentium/src/main/java/fr/openium/consentium/api/adapter/ConsentStateAdapter.kt new file mode 100644 index 0000000..3826e4e --- /dev/null +++ b/consentium/src/main/java/fr/openium/consentium/api/adapter/ConsentStateAdapter.kt @@ -0,0 +1,11 @@ +package fr.openium.consentium.api.adapter + +import fr.openium.consentium.api.model.ConsentState +import fr.openium.consentium.data.remote.model.GetConsent + +internal fun GetConsent.ConsentStateDTO.toConsentState(): ConsentState = when (this) { + GetConsent.ConsentStateDTO.UNSET -> ConsentState.UNSET + GetConsent.ConsentStateDTO.VALID -> ConsentState.VALID + GetConsent.ConsentStateDTO.EXPIRED -> ConsentState.EXPIRED + GetConsent.ConsentStateDTO.NEW_VERSION -> ConsentState.NEW_VERSION +} \ No newline at end of file diff --git a/consentium/src/main/java/fr/openium/consentium/api/adapter/PurposeAdapter.kt b/consentium/src/main/java/fr/openium/consentium/api/adapter/PurposeAdapter.kt index 12e9937..dd81202 100644 --- a/consentium/src/main/java/fr/openium/consentium/api/adapter/PurposeAdapter.kt +++ b/consentium/src/main/java/fr/openium/consentium/api/adapter/PurposeAdapter.kt @@ -5,7 +5,6 @@ import fr.openium.consentium.data.remote.model.GetConsent internal fun GetConsent.PurposeDTO.toPurpose() = Purpose( identifier = identifier, - isRequired = isRequired, - isAccepted = isAccepted.toPurposeStatus(), + choice = choice.toPurposeStatus(), vendors = vendors?.map { it.toVendor() } ?: emptyList(), ) diff --git a/consentium/src/main/java/fr/openium/consentium/api/adapter/PurposeChoiceAdapter.kt b/consentium/src/main/java/fr/openium/consentium/api/adapter/PurposeChoiceAdapter.kt index 2babdd8..6fa9cc4 100644 --- a/consentium/src/main/java/fr/openium/consentium/api/adapter/PurposeChoiceAdapter.kt +++ b/consentium/src/main/java/fr/openium/consentium/api/adapter/PurposeChoiceAdapter.kt @@ -4,7 +4,7 @@ import fr.openium.consentium.api.model.PurposeChoice import fr.openium.consentium.data.remote.model.PatchConsent internal fun PurposeChoice.toPatchConsentPurposeDTO() = PatchConsent.PurposeDTO( - identifier = purposeIdentifier.toString(), - isAccepted = isAccepted, + identifier = purposeIdentifier, + choice = choice.toPurposeStatusDTO(), vendors = vendors.map { it.toPatchConsentVendorDTO() } ) \ No newline at end of file diff --git a/consentium/src/main/java/fr/openium/consentium/api/adapter/PurposeStatusAdapter.kt b/consentium/src/main/java/fr/openium/consentium/api/adapter/PurposeStatusAdapter.kt index fc63bb5..ece2cda 100644 --- a/consentium/src/main/java/fr/openium/consentium/api/adapter/PurposeStatusAdapter.kt +++ b/consentium/src/main/java/fr/openium/consentium/api/adapter/PurposeStatusAdapter.kt @@ -2,9 +2,16 @@ package fr.openium.consentium.api.adapter import fr.openium.consentium.api.model.PurposeStatus import fr.openium.consentium.data.remote.model.GetConsent +import fr.openium.consentium.data.remote.model.PatchConsent internal fun GetConsent.PurposeStatusDTO.toPurposeStatus() = when (this) { GetConsent.PurposeStatusDTO.ACCEPTED -> PurposeStatus.ACCEPTED GetConsent.PurposeStatusDTO.REJECTED -> PurposeStatus.REJECTED - GetConsent.PurposeStatusDTO.NOT_DEFINED -> PurposeStatus.NOT_DEFINED + GetConsent.PurposeStatusDTO.PARTIAL -> PurposeStatus.PARTIAL +} + +internal fun PurposeStatus.toPurposeStatusDTO() = when (this) { + PurposeStatus.ACCEPTED -> PatchConsent.PurposeStatusDTO.ACCEPTED + PurposeStatus.REJECTED -> PatchConsent.PurposeStatusDTO.REJECTED + PurposeStatus.PARTIAL -> PatchConsent.PurposeStatusDTO.PARTIAL } \ No newline at end of file diff --git a/consentium/src/main/java/fr/openium/consentium/api/adapter/VendorChoiceAdapter.kt b/consentium/src/main/java/fr/openium/consentium/api/adapter/VendorChoiceAdapter.kt index ec76012..6b15a63 100644 --- a/consentium/src/main/java/fr/openium/consentium/api/adapter/VendorChoiceAdapter.kt +++ b/consentium/src/main/java/fr/openium/consentium/api/adapter/VendorChoiceAdapter.kt @@ -4,6 +4,6 @@ import fr.openium.consentium.api.model.VendorChoice import fr.openium.consentium.data.remote.model.PatchConsent internal fun VendorChoice.toPatchConsentVendorDTO() = PatchConsent.VendorDTO( - identifier = vendorIdentifier.toString(), + identifier = vendorIdentifier, isAccepted = isAccepted, ) \ No newline at end of file diff --git a/consentium/src/main/java/fr/openium/consentium/api/model/ConsentState.kt b/consentium/src/main/java/fr/openium/consentium/api/model/ConsentState.kt new file mode 100644 index 0000000..029b97e --- /dev/null +++ b/consentium/src/main/java/fr/openium/consentium/api/model/ConsentState.kt @@ -0,0 +1,8 @@ +package fr.openium.consentium.api.model + +enum class ConsentState { + UNSET, + VALID, + EXPIRED, + NEW_VERSION, +} \ No newline at end of file diff --git a/consentium/src/main/java/fr/openium/consentium/api/model/Purpose.kt b/consentium/src/main/java/fr/openium/consentium/api/model/Purpose.kt index 185444f..33d4da6 100644 --- a/consentium/src/main/java/fr/openium/consentium/api/model/Purpose.kt +++ b/consentium/src/main/java/fr/openium/consentium/api/model/Purpose.kt @@ -2,7 +2,6 @@ package fr.openium.consentium.api.model data class Purpose( val identifier: String, - val isRequired: Boolean, - val isAccepted: PurposeStatus, + val choice: PurposeStatus, val vendors: List, ) \ No newline at end of file diff --git a/consentium/src/main/java/fr/openium/consentium/api/model/PurposeChoice.kt b/consentium/src/main/java/fr/openium/consentium/api/model/PurposeChoice.kt index f926ad7..3f9b757 100644 --- a/consentium/src/main/java/fr/openium/consentium/api/model/PurposeChoice.kt +++ b/consentium/src/main/java/fr/openium/consentium/api/model/PurposeChoice.kt @@ -2,6 +2,6 @@ package fr.openium.consentium.api.model data class PurposeChoice( val purposeIdentifier: String, - val isAccepted: Boolean, + val choice: PurposeStatus, val vendors: List, ) \ No newline at end of file diff --git a/consentium/src/main/java/fr/openium/consentium/api/model/PurposeStatus.kt b/consentium/src/main/java/fr/openium/consentium/api/model/PurposeStatus.kt index 6175e2a..341a645 100644 --- a/consentium/src/main/java/fr/openium/consentium/api/model/PurposeStatus.kt +++ b/consentium/src/main/java/fr/openium/consentium/api/model/PurposeStatus.kt @@ -3,6 +3,5 @@ package fr.openium.consentium.api.model enum class PurposeStatus { ACCEPTED, REJECTED, - NOT_DEFINED, - UNKNOWN, + PARTIAL, } \ No newline at end of file diff --git a/consentium/src/main/java/fr/openium/consentium/data/remote/ConsentiumApi.kt b/consentium/src/main/java/fr/openium/consentium/data/remote/ConsentiumApi.kt index 8b70b47..23a6bdd 100644 --- a/consentium/src/main/java/fr/openium/consentium/data/remote/ConsentiumApi.kt +++ b/consentium/src/main/java/fr/openium/consentium/data/remote/ConsentiumApi.kt @@ -5,20 +5,20 @@ import fr.openium.consentium.data.remote.model.PatchConsent import retrofit2.Response import retrofit2.http.Body import retrofit2.http.GET -import retrofit2.http.PATCH +import retrofit2.http.Header +import retrofit2.http.POST internal interface ConsentiumApi { @GET("/consents") suspend fun getConsents( - applicationId: String, - installationId: String, + @Header("Authorization") token: String, ): Response - @PATCH("/consents") + @POST("/consents") suspend fun setConsents( - applicationId: String, + @Header("Authorization") token: String, @Body patchConsent: PatchConsent.PatchConsentPayloadDTO, ): Response diff --git a/consentium/src/main/java/fr/openium/consentium/data/remote/mock/ConsentiumMock.kt b/consentium/src/main/java/fr/openium/consentium/data/remote/mock/ConsentiumMock.kt index cbb46ed..f315137 100644 --- a/consentium/src/main/java/fr/openium/consentium/data/remote/mock/ConsentiumMock.kt +++ b/consentium/src/main/java/fr/openium/consentium/data/remote/mock/ConsentiumMock.kt @@ -10,41 +10,29 @@ import java.util.UUID internal object ConsentiumMockApi : ConsentiumApi { private val consents = GetConsent.GetConsentPayloadDTO( + id = UUID.randomUUID().toString(), installationId = UUID.randomUUID().toString(), purposes = listOf( GetConsent.PurposeDTO( identifier = "purpose-audience", - isRequired = true, - isAccepted = GetConsent.PurposeStatusDTO.ACCEPTED, - vendors = listOf( - GetConsent.VendorDTO( - identifier = "vendor-clarity", - isAccepted = true, - isRequired = true, - ), - GetConsent.VendorDTO( - identifier = "vendor-matomo", - isAccepted = true, - isRequired = false, - ) - ) + vendors = null, + choice = GetConsent.PurposeStatusDTO.ACCEPTED, ), GetConsent.PurposeDTO( identifier = "purpose-required", - isRequired = true, - isAccepted = GetConsent.PurposeStatusDTO.REJECTED, - vendors = null + vendors = null, + choice = GetConsent.PurposeStatusDTO.REJECTED, ), ), - isValid = false, + state = GetConsent.ConsentStateDTO.VALID, ) - override suspend fun getConsents(applicationId: String, installationId: String): Response { + override suspend fun getConsents(token: String): Response { delay(2000) return Response.success(consents) } - override suspend fun setConsents(applicationId: String, patchConsent: PatchConsent.PatchConsentPayloadDTO): Response { + override suspend fun setConsents(token: String, patchConsent: PatchConsent.PatchConsentPayloadDTO): Response { delay(2000) return Response.success(Unit) } diff --git a/consentium/src/main/java/fr/openium/consentium/data/remote/model/GetConsentPayloadDTO.kt b/consentium/src/main/java/fr/openium/consentium/data/remote/model/GetConsentPayloadDTO.kt index 2bb7169..53781f2 100644 --- a/consentium/src/main/java/fr/openium/consentium/data/remote/model/GetConsentPayloadDTO.kt +++ b/consentium/src/main/java/fr/openium/consentium/data/remote/model/GetConsentPayloadDTO.kt @@ -7,16 +7,17 @@ internal sealed interface GetConsent { @Serializable data class GetConsentPayloadDTO( + @SerialName("id") val id: String, @SerialName("installationId") val installationId: String, + @SerialName("state") val state: ConsentStateDTO? = null, + @SerialName("acceptedDate") val acceptedData: Long? = null, @SerialName("purposes") val purposes: List? = null, - @SerialName("isValid") val isValid: Boolean, ) @Serializable data class PurposeDTO( @SerialName("identifier") val identifier: String, - @SerialName("isRequired") val isRequired: Boolean, - @SerialName("isAccepted") val isAccepted: PurposeStatusDTO, + @SerialName("choice") val choice: PurposeStatusDTO, @SerialName("vendors") val vendors: List? = null, ) @@ -29,16 +30,30 @@ internal sealed interface GetConsent { @Serializable enum class PurposeStatusDTO { - @SerialName("ACCEPTED") + @SerialName("accepted") ACCEPTED, - @SerialName("REJECTED") + @SerialName("refused") REJECTED, - @SerialName("NOT_DEFINED") - NOT_DEFINED, + @SerialName("partial") + PARTIAL, } + @Serializable + enum class ConsentStateDTO { + @SerialName("unset") + UNSET, + + @SerialName("valid") + VALID, + + @SerialName("expired") + EXPIRED, + + @SerialName("new_version") + NEW_VERSION, + } } diff --git a/consentium/src/main/java/fr/openium/consentium/data/remote/model/PatchConsentPayloadDTO.kt b/consentium/src/main/java/fr/openium/consentium/data/remote/model/PatchConsentPayloadDTO.kt index f7a6202..3ef9818 100644 --- a/consentium/src/main/java/fr/openium/consentium/data/remote/model/PatchConsentPayloadDTO.kt +++ b/consentium/src/main/java/fr/openium/consentium/data/remote/model/PatchConsentPayloadDTO.kt @@ -7,14 +7,13 @@ internal sealed interface PatchConsent { @Serializable data class PatchConsentPayloadDTO( - @SerialName("installationId") val installationId: String, - @SerialName("purposes") val purposes: List? = null, + @SerialName("consentPurposes") val purposes: List? = null, ) @Serializable data class PurposeDTO( @SerialName("identifier") val identifier: String, - @SerialName("isAccepted") val isAccepted: Boolean, + @SerialName("choice") val choice: PurposeStatusDTO, @SerialName("vendors") val vendors: List? = null, ) @@ -24,4 +23,16 @@ internal sealed interface PatchConsent { @SerialName("isAccepted") val isAccepted: Boolean, ) + @Serializable + enum class PurposeStatusDTO { + @SerialName("accepted") + ACCEPTED, + + @SerialName("refused") + REJECTED, + + @SerialName("partial") + PARTIAL, + } + } diff --git a/consentium/src/main/java/fr/openium/consentium/domain/repository/ConsentiumRepository.kt b/consentium/src/main/java/fr/openium/consentium/domain/repository/ConsentiumRepository.kt index f5a0d18..f4e1472 100644 --- a/consentium/src/main/java/fr/openium/consentium/domain/repository/ConsentiumRepository.kt +++ b/consentium/src/main/java/fr/openium/consentium/domain/repository/ConsentiumRepository.kt @@ -1,22 +1,24 @@ package fr.openium.consentium.domain.repository +import fr.openium.consentium.api.adapter.toConsentState import fr.openium.consentium.api.adapter.toPatchConsentPurposeDTO import fr.openium.consentium.api.adapter.toPurpose +import fr.openium.consentium.api.model.ConsentState import fr.openium.consentium.api.model.Purpose import fr.openium.consentium.api.model.PurposeChoice -import fr.openium.consentium.data.local.ConsentiumDataStore import fr.openium.consentium.data.remote.ConsentiumApi import fr.openium.consentium.data.remote.model.PatchConsent +import fr.openium.consentium.domain.useCase.GetAuthTokenUseCase import javax.inject.Inject internal class ConsentiumRepository @Inject constructor( private val consentiumApi: ConsentiumApi, - private val consentiumDataStore: ConsentiumDataStore, + private val getAuthTokenUseCase: GetAuthTokenUseCase, ) { suspend fun getConsents(applicationId: String): ConsentiumRepositoryGetResponse { - val installationId = consentiumDataStore.getInstallationUniqueId() - val consentsResponse = consentiumApi.getConsents(applicationId, installationId) + val authToken = getAuthTokenUseCase(applicationId) + val consentsResponse = consentiumApi.getConsents(authToken) return try { val consentsBody = if (consentsResponse.isSuccessful) { consentsResponse.body() ?: throw Exception() @@ -25,7 +27,7 @@ internal class ConsentiumRepository @Inject constructor( } return ConsentiumRepositoryGetResponse.GetConsentsSuccess( - isValid = consentsBody.isValid, + state = consentsBody.state?.toConsentState() ?: ConsentState.UNSET, purposes = consentsBody.purposes?.map { purpose -> purpose.toPurpose() } ?: emptyList() ) } catch (e: Exception) { @@ -37,12 +39,11 @@ internal class ConsentiumRepository @Inject constructor( applicationId: String, consents: List, ): ConsentiumRepositorySetResponse { - val installationId = consentiumDataStore.getInstallationUniqueId() + val authToken = getAuthTokenUseCase(applicationId) val setConsentResponse = consentiumApi.setConsents( - applicationId = applicationId, + token = authToken, patchConsent = PatchConsent.PatchConsentPayloadDTO( - installationId = installationId, purposes = consents.map { it.toPatchConsentPurposeDTO() }, ) ) @@ -61,7 +62,7 @@ internal interface ConsentiumRepositoryGetResponse { data object Error : ConsentiumRepositoryGetResponse data class GetConsentsSuccess( - val isValid: Boolean, + val state: ConsentState, val purposes: List, ) : ConsentiumRepositoryGetResponse diff --git a/consentium/src/main/java/fr/openium/consentium/domain/useCase/GetAuthTokenUseCase.kt b/consentium/src/main/java/fr/openium/consentium/domain/useCase/GetAuthTokenUseCase.kt new file mode 100644 index 0000000..e6a8301 --- /dev/null +++ b/consentium/src/main/java/fr/openium/consentium/domain/useCase/GetAuthTokenUseCase.kt @@ -0,0 +1,23 @@ +package fr.openium.consentium.domain.useCase + +import javax.inject.Inject +import kotlin.io.encoding.Base64 +import kotlin.io.encoding.ExperimentalEncodingApi + +interface GetAuthTokenUseCase { + suspend operator fun invoke(applicationId: String): String +} + +class GetAuthTokenUseCaseImpl @Inject internal constructor( + private val getConsentiumUniqueInstallationIdUseCase: GetConsentiumUniqueInstallationIdUseCase, +) : GetAuthTokenUseCase { + + @OptIn(ExperimentalEncodingApi::class) + override suspend operator fun invoke(applicationId: String): String { + val uniqueInstallationId = getConsentiumUniqueInstallationIdUseCase() + val clearToken = "$applicationId.$uniqueInstallationId" + val cipheredToken = Base64.Default.encode(clearToken.toByteArray()) + return "Bearer $cipheredToken" + } + +} 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 index 18362b3..8e22453 100644 --- a/consentium/src/main/java/fr/openium/consentium/domain/useCase/GetConsentiumUniqueInstallationIdUseCase.kt +++ b/consentium/src/main/java/fr/openium/consentium/domain/useCase/GetConsentiumUniqueInstallationIdUseCase.kt @@ -4,14 +4,14 @@ import fr.openium.consentium.data.local.ConsentiumDataStore import javax.inject.Inject interface GetConsentiumUniqueInstallationIdUseCase { - suspend fun invoke(): String + suspend operator fun invoke(): String } class GetConsentiumUniqueInstallationIdUseCaseImpl @Inject internal constructor( private val consentiumDataStore: ConsentiumDataStore, ) : GetConsentiumUniqueInstallationIdUseCase { - override suspend fun invoke(): String { + override suspend operator 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 index 5bcf03e..68fa739 100644 --- 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 @@ -4,6 +4,8 @@ import dagger.Binds import dagger.Module import dagger.hilt.InstallIn import dagger.hilt.components.SingletonComponent +import fr.openium.consentium.domain.useCase.GetAuthTokenUseCase +import fr.openium.consentium.domain.useCase.GetAuthTokenUseCaseImpl import fr.openium.consentium.domain.useCase.GetConsentiumUniqueInstallationIdUseCase import fr.openium.consentium.domain.useCase.GetConsentiumUniqueInstallationIdUseCaseImpl @@ -16,4 +18,8 @@ interface ConsentiumUseCaseModule { getUniqueInstallationIdUseCaseImpl: GetConsentiumUniqueInstallationIdUseCaseImpl, ): GetConsentiumUniqueInstallationIdUseCase + @Binds + fun bindGetAuthTokenUseCase( + getAuthTokenUseCaseImpl: GetAuthTokenUseCaseImpl, + ): GetAuthTokenUseCase }