Add vault repo methods for getting vault items by ID (#256)

This commit is contained in:
David Perez
2024-06-20 17:08:07 +01:00
committed by Álison Fernandes
parent 254cd8e745
commit c00c8ac022
4 changed files with 280 additions and 0 deletions
@@ -0,0 +1,16 @@
package com.x8bit.bitwarden.data.platform.repository.util
import com.x8bit.bitwarden.data.platform.repository.model.DataState
/**
* Maps the data inside a [DataState] with the given [transform].
*/
inline fun <T : Any?, R : Any?> DataState<T>.map(
transform: (T) -> R,
): DataState<R> = when (this) {
is DataState.Loaded -> DataState.Loaded(transform(data))
is DataState.Loading -> DataState.Loading
is DataState.Pending -> DataState.Pending(transform(data))
is DataState.Error -> DataState.Error(error, data?.let(transform))
is DataState.NoNetwork -> DataState.NoNetwork(data?.let(transform))
}
@@ -1,5 +1,7 @@
package com.x8bit.bitwarden.data.vault.repository
import com.bitwarden.core.CipherView
import com.bitwarden.core.FolderView
import com.x8bit.bitwarden.data.platform.repository.model.DataState
import com.x8bit.bitwarden.data.vault.repository.model.SendData
import com.x8bit.bitwarden.data.vault.repository.model.VaultData
@@ -31,6 +33,18 @@ interface VaultRepository {
*/
fun sync()
/**
* Flow that represents the data for a specific vault item as found by ID. This may emit `null`
* if the item cannot be found.
*/
fun getVaultItemStateFlow(itemId: String): StateFlow<DataState<CipherView?>>
/**
* Flow that represents the data for a specific vault folder as found by ID. This may emit
* `null` if the folder cannot be found.
*/
fun getVaultFolderStateFlow(folderId: String): StateFlow<DataState<FolderView?>>
/**
* Attempt to initialize crypto and sync the vault data.
*/
@@ -1,11 +1,14 @@
package com.x8bit.bitwarden.data.vault.repository
import com.bitwarden.core.CipherView
import com.bitwarden.core.FolderView
import com.bitwarden.core.InitCryptoRequest
import com.x8bit.bitwarden.data.auth.datasource.disk.AuthDiskSource
import com.x8bit.bitwarden.data.auth.repository.util.toSdkParams
import com.x8bit.bitwarden.data.platform.datasource.network.util.isNoConnectionError
import com.x8bit.bitwarden.data.platform.manager.dispatcher.DispatcherManager
import com.x8bit.bitwarden.data.platform.repository.model.DataState
import com.x8bit.bitwarden.data.platform.repository.util.map
import com.x8bit.bitwarden.data.platform.util.flatMap
import com.x8bit.bitwarden.data.vault.datasource.network.model.SyncResponseJson
import com.x8bit.bitwarden.data.vault.datasource.network.service.SyncService
@@ -20,12 +23,15 @@ import com.x8bit.bitwarden.data.vault.repository.util.toVaultUnlockResult
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Job
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.onCompletion
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.flow.update
import kotlinx.coroutines.launch
@@ -102,6 +108,36 @@ class VaultRepositoryImpl constructor(
}
}
override fun getVaultItemStateFlow(itemId: String): StateFlow<DataState<CipherView?>> =
vaultDataStateFlow
.map { dataState ->
dataState.map { vaultData ->
vaultData
.cipherViewList
.find { it.id == itemId }
}
}
.stateIn(
scope = scope,
started = SharingStarted.Lazily,
initialValue = DataState.Loading,
)
override fun getVaultFolderStateFlow(folderId: String): StateFlow<DataState<FolderView?>> =
vaultDataStateFlow
.map { dataState ->
dataState.map { vaultData ->
vaultData
.folderViewList
.find { it.id == folderId }
}
}
.stateIn(
scope = scope,
started = SharingStarted.Lazily,
initialValue = DataState.Loading,
)
override suspend fun unlockVaultAndSync(masterPassword: String): VaultUnlockResult {
return flow {
willSyncAfterUnlock = true