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

@@ -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.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 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.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,
)

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
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())
}
}

View File

@@ -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