yandex user info repository

This commit is contained in:
2026-04-21 00:25:20 +03:00
parent c84edcf16a
commit 52353ea4a0
8 changed files with 92 additions and 20 deletions

View File

@@ -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.StorageKeyMapDao
import com.github.nullptroma.wallenc.data.db.app.dao.StorageMetaInfoDao 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.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.StorageKeyMapRepository
import com.github.nullptroma.wallenc.data.db.app.repository.StorageMetaInfoRepository 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.tasks.TaskOrchestrator
import com.github.nullptroma.wallenc.data.vaults.VaultsManager import com.github.nullptroma.wallenc.data.vaults.VaultsManager
import com.github.nullptroma.wallenc.domain.interfaces.IUnlockManager import com.github.nullptroma.wallenc.domain.interfaces.IUnlockManager
@@ -41,10 +43,16 @@ class SingletonModule {
@IoDispatcher ioDispatcher: CoroutineDispatcher, @IoDispatcher ioDispatcher: CoroutineDispatcher,
@ApplicationContext context: Context, @ApplicationContext context: Context,
keyRepo: StorageKeyMapRepository, keyRepo: StorageKeyMapRepository,
yandexAccountDao: YandexAccountDao, yandexAccountRepository: YandexAccountRepository,
yandexUserInfoApi: YandexUserInfoApi, yandexUserInfoRepository: YandexUserInfoRepository,
): IVaultsManager { ): IVaultsManager {
return VaultsManager(ioDispatcher, context, keyRepo, yandexAccountDao, yandexUserInfoApi) return VaultsManager(
ioDispatcher = ioDispatcher,
context = context,
keyRepo = keyRepo,
yandexAccountRepository = yandexAccountRepository,
yandexUserInfoRepository = yandexUserInfoRepository,
)
} }
@Provides @Provides
@@ -71,4 +79,22 @@ class SingletonModule {
): StorageMetaInfoRepository { ): StorageMetaInfoRepository {
return StorageMetaInfoRepository(dao, ioDispatcher) 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)
}
} }

View File

@@ -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<List<DbYandexAccount>> = 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)
}
}

View File

@@ -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.GET
import retrofit2.http.Header import retrofit2.http.Header

View File

@@ -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 com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
import retrofit2.Retrofit import retrofit2.Retrofit

View File

@@ -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.JsonIgnoreProperties
import com.fasterxml.jackson.annotation.JsonProperty import com.fasterxml.jackson.annotation.JsonProperty
@@ -7,5 +7,5 @@ import com.fasterxml.jackson.annotation.JsonProperty
data class YandexUserInfoDto( data class YandexUserInfoDto(
val id: String, val id: String,
val login: String, val login: String,
@JsonProperty("default_email") val defaultEmail: String? = null, @param:JsonProperty("default_email") val defaultEmail: String? = null,
) )

View File

@@ -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")
}
}

View File

@@ -1,10 +1,10 @@
package com.github.nullptroma.wallenc.data.vaults package com.github.nullptroma.wallenc.data.vaults
import android.content.Context 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.model.DbYandexAccount
import com.github.nullptroma.wallenc.data.db.app.repository.StorageKeyMapRepository 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.data.storages.UnlockManager
import com.github.nullptroma.wallenc.domain.interfaces.IStorage import com.github.nullptroma.wallenc.domain.interfaces.IStorage
import com.github.nullptroma.wallenc.domain.interfaces.IUnlockManager import com.github.nullptroma.wallenc.domain.interfaces.IUnlockManager
@@ -24,8 +24,8 @@ class VaultsManager(
private val ioDispatcher: CoroutineDispatcher, private val ioDispatcher: CoroutineDispatcher,
context: Context, context: Context,
keyRepo: StorageKeyMapRepository, keyRepo: StorageKeyMapRepository,
private val yandexAccountDao: YandexAccountDao, private val yandexAccountRepository: YandexAccountRepository,
private val yandexUserInfoApi: YandexUserInfoApi, private val yandexUserInfoRepository: YandexUserInfoRepository,
) : IVaultsManager { ) : IVaultsManager {
private val scope = CoroutineScope(SupervisorJob() + ioDispatcher) private val scope = CoroutineScope(SupervisorJob() + ioDispatcher)
@@ -40,7 +40,7 @@ class VaultsManager(
vaultsManager = this vaultsManager = this
) )
private val _remoteVaults = yandexAccountDao.observeAll() private val _remoteVaults = yandexAccountRepository.observeAll()
.map { rows -> .map { rows ->
rows.map { row -> rows.map { row ->
YandexVault( YandexVault(
@@ -59,15 +59,15 @@ class VaultsManager(
.stateIn(scope, SharingStarted.Eagerly, listOf(localVault)) .stateIn(scope, SharingStarted.Eagerly, listOf(localVault))
override suspend fun addYandexVault(accessToken: String) = withContext(ioDispatcher) { 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() } val email = info.defaultEmail?.takeIf { it.isNotBlank() }
?: "${info.login}@yandex.ru" ?: "${info.login}@yandex.ru"
val existing = yandexAccountDao.getByYandexUserId(info.id) val existing = yandexAccountRepository.getByYandexUserId(info.id)
val vaultUuid = existing?.vaultUuid ?: UUID.randomUUID().toString() val vaultUuid = existing?.vaultUuid ?: UUID.randomUUID().toString()
if (existing != null) { if (existing != null) {
yandexAccountDao.updateCredentials(vaultUuid, email, accessToken) yandexAccountRepository.updateCredentials(vaultUuid, email, accessToken)
} else { } else {
yandexAccountDao.insert( yandexAccountRepository.insert(
DbYandexAccount( DbYandexAccount(
vaultUuid = vaultUuid, vaultUuid = vaultUuid,
yandexUserId = info.id, yandexUserId = info.id,
@@ -79,6 +79,6 @@ class VaultsManager(
} }
override suspend fun removeRemoteVault(vaultUuid: UUID) = withContext(ioDispatcher) { override suspend fun removeRemoteVault(vaultUuid: UUID) = withContext(ioDispatcher) {
yandexAccountDao.deleteByVaultUuid(vaultUuid.toString()) yandexAccountRepository.deleteByVaultUuid(vaultUuid.toString())
} }
} }

View File

@@ -14,7 +14,7 @@ import java.util.UUID
class YandexVault( class YandexVault(
override val uuid: UUID, override val uuid: UUID,
override val accountEmail: String, override val accountEmail: String,
@Suppress("unused") val oauthToken: String, val oauthToken: String,
) : IYandexVault { ) : IYandexVault {
override val type: VaultType = VaultType.YANDEX override val type: VaultType = VaultType.YANDEX