yandex user info repository
This commit is contained in:
@@ -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)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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,
|
||||||
)
|
)
|
||||||
@@ -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")
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user