diff --git a/app/src/main/java/com/github/nullptroma/wallenc/app/di/modules/data/SingletonModule.kt b/app/src/main/java/com/github/nullptroma/wallenc/app/di/modules/data/SingletonModule.kt index 7804aed..629fa7c 100644 --- a/app/src/main/java/com/github/nullptroma/wallenc/app/di/modules/data/SingletonModule.kt +++ b/app/src/main/java/com/github/nullptroma/wallenc/app/di/modules/data/SingletonModule.kt @@ -5,10 +5,12 @@ import com.github.nullptroma.wallenc.app.di.modules.app.IoDispatcher import com.github.nullptroma.wallenc.data.db.app.dao.StorageKeyMapDao import com.github.nullptroma.wallenc.data.db.app.dao.StorageMetaInfoDao import com.github.nullptroma.wallenc.data.db.app.dao.YandexAccountDao -import com.github.nullptroma.wallenc.data.network.YandexUserInfoApi -import com.github.nullptroma.wallenc.data.network.YandexUserInfoApiFactory import com.github.nullptroma.wallenc.data.db.app.repository.StorageKeyMapRepository import com.github.nullptroma.wallenc.data.db.app.repository.StorageMetaInfoRepository +import com.github.nullptroma.wallenc.data.db.app.repository.YandexAccountRepository +import com.github.nullptroma.wallenc.data.network.yandexuserinfo.YandexUserInfoApi +import com.github.nullptroma.wallenc.data.network.yandexuserinfo.YandexUserInfoApiFactory +import com.github.nullptroma.wallenc.data.network.yandexuserinfo.repository.YandexUserInfoRepository import com.github.nullptroma.wallenc.data.tasks.TaskOrchestrator import com.github.nullptroma.wallenc.data.vaults.VaultsManager import com.github.nullptroma.wallenc.domain.interfaces.IUnlockManager @@ -41,10 +43,16 @@ class SingletonModule { @IoDispatcher ioDispatcher: CoroutineDispatcher, @ApplicationContext context: Context, keyRepo: StorageKeyMapRepository, - yandexAccountDao: YandexAccountDao, - yandexUserInfoApi: YandexUserInfoApi, + yandexAccountRepository: YandexAccountRepository, + yandexUserInfoRepository: YandexUserInfoRepository, ): IVaultsManager { - return VaultsManager(ioDispatcher, context, keyRepo, yandexAccountDao, yandexUserInfoApi) + return VaultsManager( + ioDispatcher = ioDispatcher, + context = context, + keyRepo = keyRepo, + yandexAccountRepository = yandexAccountRepository, + yandexUserInfoRepository = yandexUserInfoRepository, + ) } @Provides @@ -71,4 +79,22 @@ class SingletonModule { ): StorageMetaInfoRepository { return StorageMetaInfoRepository(dao, ioDispatcher) } + + @Provides + @Singleton + fun provideYandexAccountRepository( + dao: YandexAccountDao, + @IoDispatcher ioDispatcher: CoroutineDispatcher + ): YandexAccountRepository { + return YandexAccountRepository(dao, ioDispatcher) + } + + @Provides + @Singleton + fun provideYandexUserInfoRepository( + api: YandexUserInfoApi, + @IoDispatcher ioDispatcher: CoroutineDispatcher + ): YandexUserInfoRepository { + return YandexUserInfoRepository(api, ioDispatcher) + } } \ No newline at end of file diff --git a/data/src/main/java/com/github/nullptroma/wallenc/data/db/app/repository/YandexAccountRepository.kt b/data/src/main/java/com/github/nullptroma/wallenc/data/db/app/repository/YandexAccountRepository.kt new file mode 100644 index 0000000..06f9b59 --- /dev/null +++ b/data/src/main/java/com/github/nullptroma/wallenc/data/db/app/repository/YandexAccountRepository.kt @@ -0,0 +1,31 @@ +package com.github.nullptroma.wallenc.data.db.app.repository + +import com.github.nullptroma.wallenc.data.db.app.dao.YandexAccountDao +import com.github.nullptroma.wallenc.data.db.app.model.DbYandexAccount +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.withContext + +class YandexAccountRepository( + private val dao: YandexAccountDao, + private val ioDispatcher: CoroutineDispatcher +) { + fun observeAll(): Flow> = dao.observeAll() + + suspend fun getByYandexUserId(id: String): DbYandexAccount? = withContext(ioDispatcher) { + dao.getByYandexUserId(id) + } + + suspend fun insert(account: DbYandexAccount) = withContext(ioDispatcher) { + dao.insert(account) + } + + suspend fun updateCredentials(vaultUuid: String, email: String, token: String) = + withContext(ioDispatcher) { + dao.updateCredentials(vaultUuid, email, token) + } + + suspend fun deleteByVaultUuid(vaultUuid: String) = withContext(ioDispatcher) { + dao.deleteByVaultUuid(vaultUuid) + } +} diff --git a/data/src/main/java/com/github/nullptroma/wallenc/data/network/YandexUserInfoApi.kt b/data/src/main/java/com/github/nullptroma/wallenc/data/network/yandexuserinfo/YandexUserInfoApi.kt similarity index 81% rename from data/src/main/java/com/github/nullptroma/wallenc/data/network/YandexUserInfoApi.kt rename to data/src/main/java/com/github/nullptroma/wallenc/data/network/yandexuserinfo/YandexUserInfoApi.kt index 0c55e15..c8f45a9 100644 --- a/data/src/main/java/com/github/nullptroma/wallenc/data/network/YandexUserInfoApi.kt +++ b/data/src/main/java/com/github/nullptroma/wallenc/data/network/yandexuserinfo/YandexUserInfoApi.kt @@ -1,4 +1,4 @@ -package com.github.nullptroma.wallenc.data.network +package com.github.nullptroma.wallenc.data.network.yandexuserinfo import retrofit2.http.GET import retrofit2.http.Header diff --git a/data/src/main/java/com/github/nullptroma/wallenc/data/network/YandexUserInfoApiFactory.kt b/data/src/main/java/com/github/nullptroma/wallenc/data/network/yandexuserinfo/YandexUserInfoApiFactory.kt similarity index 89% rename from data/src/main/java/com/github/nullptroma/wallenc/data/network/YandexUserInfoApiFactory.kt rename to data/src/main/java/com/github/nullptroma/wallenc/data/network/yandexuserinfo/YandexUserInfoApiFactory.kt index 29e0a03..89dd09e 100644 --- a/data/src/main/java/com/github/nullptroma/wallenc/data/network/YandexUserInfoApiFactory.kt +++ b/data/src/main/java/com/github/nullptroma/wallenc/data/network/yandexuserinfo/YandexUserInfoApiFactory.kt @@ -1,4 +1,4 @@ -package com.github.nullptroma.wallenc.data.network +package com.github.nullptroma.wallenc.data.network.yandexuserinfo import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper import retrofit2.Retrofit diff --git a/data/src/main/java/com/github/nullptroma/wallenc/data/network/YandexUserInfoDto.kt b/data/src/main/java/com/github/nullptroma/wallenc/data/network/yandexuserinfo/YandexUserInfoDto.kt similarity index 62% rename from data/src/main/java/com/github/nullptroma/wallenc/data/network/YandexUserInfoDto.kt rename to data/src/main/java/com/github/nullptroma/wallenc/data/network/yandexuserinfo/YandexUserInfoDto.kt index 9ebebf7..ce691ff 100644 --- a/data/src/main/java/com/github/nullptroma/wallenc/data/network/YandexUserInfoDto.kt +++ b/data/src/main/java/com/github/nullptroma/wallenc/data/network/yandexuserinfo/YandexUserInfoDto.kt @@ -1,4 +1,4 @@ -package com.github.nullptroma.wallenc.data.network +package com.github.nullptroma.wallenc.data.network.yandexuserinfo import com.fasterxml.jackson.annotation.JsonIgnoreProperties import com.fasterxml.jackson.annotation.JsonProperty @@ -7,5 +7,5 @@ import com.fasterxml.jackson.annotation.JsonProperty data class YandexUserInfoDto( val id: String, val login: String, - @JsonProperty("default_email") val defaultEmail: String? = null, + @param:JsonProperty("default_email") val defaultEmail: String? = null, ) diff --git a/data/src/main/java/com/github/nullptroma/wallenc/data/network/yandexuserinfo/repository/YandexUserInfoRepository.kt b/data/src/main/java/com/github/nullptroma/wallenc/data/network/yandexuserinfo/repository/YandexUserInfoRepository.kt new file mode 100644 index 0000000..fc4d470 --- /dev/null +++ b/data/src/main/java/com/github/nullptroma/wallenc/data/network/yandexuserinfo/repository/YandexUserInfoRepository.kt @@ -0,0 +1,15 @@ +package com.github.nullptroma.wallenc.data.network.yandexuserinfo.repository + +import com.github.nullptroma.wallenc.data.network.yandexuserinfo.YandexUserInfoApi +import com.github.nullptroma.wallenc.data.network.yandexuserinfo.YandexUserInfoDto +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.withContext + +class YandexUserInfoRepository( + private val api: YandexUserInfoApi, + private val ioDispatcher: CoroutineDispatcher +) { + suspend fun userInfo(accessToken: String): YandexUserInfoDto = withContext(ioDispatcher) { + api.userInfo(format = "json", authorization = "OAuth $accessToken") + } +} diff --git a/data/src/main/java/com/github/nullptroma/wallenc/data/vaults/VaultsManager.kt b/data/src/main/java/com/github/nullptroma/wallenc/data/vaults/VaultsManager.kt index 43ca755..275c71d 100644 --- a/data/src/main/java/com/github/nullptroma/wallenc/data/vaults/VaultsManager.kt +++ b/data/src/main/java/com/github/nullptroma/wallenc/data/vaults/VaultsManager.kt @@ -1,10 +1,10 @@ package com.github.nullptroma.wallenc.data.vaults import android.content.Context -import com.github.nullptroma.wallenc.data.db.app.dao.YandexAccountDao import com.github.nullptroma.wallenc.data.db.app.model.DbYandexAccount import com.github.nullptroma.wallenc.data.db.app.repository.StorageKeyMapRepository -import com.github.nullptroma.wallenc.data.network.YandexUserInfoApi +import com.github.nullptroma.wallenc.data.db.app.repository.YandexAccountRepository +import com.github.nullptroma.wallenc.data.network.yandexuserinfo.repository.YandexUserInfoRepository import com.github.nullptroma.wallenc.data.storages.UnlockManager import com.github.nullptroma.wallenc.domain.interfaces.IStorage import com.github.nullptroma.wallenc.domain.interfaces.IUnlockManager @@ -24,8 +24,8 @@ class VaultsManager( private val ioDispatcher: CoroutineDispatcher, context: Context, keyRepo: StorageKeyMapRepository, - private val yandexAccountDao: YandexAccountDao, - private val yandexUserInfoApi: YandexUserInfoApi, + private val yandexAccountRepository: YandexAccountRepository, + private val yandexUserInfoRepository: YandexUserInfoRepository, ) : IVaultsManager { private val scope = CoroutineScope(SupervisorJob() + ioDispatcher) @@ -40,7 +40,7 @@ class VaultsManager( vaultsManager = this ) - private val _remoteVaults = yandexAccountDao.observeAll() + private val _remoteVaults = yandexAccountRepository.observeAll() .map { rows -> rows.map { row -> YandexVault( @@ -59,15 +59,15 @@ class VaultsManager( .stateIn(scope, SharingStarted.Eagerly, listOf(localVault)) override suspend fun addYandexVault(accessToken: String) = withContext(ioDispatcher) { - val info = yandexUserInfoApi.userInfo("json", "OAuth $accessToken") + val info = yandexUserInfoRepository.userInfo(accessToken) val email = info.defaultEmail?.takeIf { it.isNotBlank() } ?: "${info.login}@yandex.ru" - val existing = yandexAccountDao.getByYandexUserId(info.id) + val existing = yandexAccountRepository.getByYandexUserId(info.id) val vaultUuid = existing?.vaultUuid ?: UUID.randomUUID().toString() if (existing != null) { - yandexAccountDao.updateCredentials(vaultUuid, email, accessToken) + yandexAccountRepository.updateCredentials(vaultUuid, email, accessToken) } else { - yandexAccountDao.insert( + yandexAccountRepository.insert( DbYandexAccount( vaultUuid = vaultUuid, yandexUserId = info.id, @@ -79,6 +79,6 @@ class VaultsManager( } override suspend fun removeRemoteVault(vaultUuid: UUID) = withContext(ioDispatcher) { - yandexAccountDao.deleteByVaultUuid(vaultUuid.toString()) + yandexAccountRepository.deleteByVaultUuid(vaultUuid.toString()) } } diff --git a/data/src/main/java/com/github/nullptroma/wallenc/data/vaults/YandexVault.kt b/data/src/main/java/com/github/nullptroma/wallenc/data/vaults/YandexVault.kt index 7746148..f92ac97 100644 --- a/data/src/main/java/com/github/nullptroma/wallenc/data/vaults/YandexVault.kt +++ b/data/src/main/java/com/github/nullptroma/wallenc/data/vaults/YandexVault.kt @@ -14,7 +14,7 @@ import java.util.UUID class YandexVault( override val uuid: UUID, override val accountEmail: String, - @Suppress("unused") val oauthToken: String, + val oauthToken: String, ) : IYandexVault { override val type: VaultType = VaultType.YANDEX