Новый юзкейс удаления хранилищ
This commit is contained in:
@@ -0,0 +1,15 @@
|
||||
package com.github.nullptroma.wallenc.domain.enums
|
||||
|
||||
/**
|
||||
* Политика удаления/закрытия хранилища.
|
||||
*
|
||||
* [CLOSE_ENCRYPTED_OVERLAYS_ONLY] — только закрыть расшифрованные представления (overlay),
|
||||
* физические данные не трогаем.
|
||||
*
|
||||
* [REMOVE_PHYSICAL] — удалить физическое хранилище у провайдера (сейчас local vault),
|
||||
* предварительно закрыв все overlay.
|
||||
*/
|
||||
enum class StorageDeletionPolicy {
|
||||
CLOSE_ENCRYPTED_OVERLAYS_ONLY,
|
||||
REMOVE_PHYSICAL,
|
||||
}
|
||||
@@ -3,7 +3,6 @@ package com.github.nullptroma.wallenc.domain.usecases
|
||||
import com.github.nullptroma.wallenc.domain.interfaces.IStorageInfo
|
||||
import com.github.nullptroma.wallenc.domain.interfaces.IUnlockManager
|
||||
import kotlinx.coroutines.flow.StateFlow
|
||||
import kotlinx.coroutines.flow.map
|
||||
import java.util.UUID
|
||||
|
||||
class GetOpenedStoragesUseCase(private val unlockManager: IUnlockManager) {
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
package com.github.nullptroma.wallenc.domain.usecases
|
||||
|
||||
import com.github.nullptroma.wallenc.domain.interfaces.IStorage
|
||||
import com.github.nullptroma.wallenc.domain.interfaces.IStorageInfo
|
||||
import com.github.nullptroma.wallenc.domain.interfaces.IVaultsManager
|
||||
import kotlinx.coroutines.flow.StateFlow
|
||||
@@ -12,10 +11,4 @@ class ManageLocalVaultUseCase(private val manager: IVaultsManager) {
|
||||
suspend fun createStorage() {
|
||||
manager.localVault.createStorage()
|
||||
}
|
||||
|
||||
suspend fun remove(storage: IStorageInfo) {
|
||||
when(storage) {
|
||||
is IStorage -> manager.localVault.remove(storage)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,12 +1,45 @@
|
||||
package com.github.nullptroma.wallenc.domain.usecases
|
||||
|
||||
import com.github.nullptroma.wallenc.domain.enums.StorageDeletionPolicy
|
||||
import com.github.nullptroma.wallenc.domain.interfaces.IStorage
|
||||
import com.github.nullptroma.wallenc.domain.interfaces.IStorageInfo
|
||||
import com.github.nullptroma.wallenc.domain.interfaces.IUnlockManager
|
||||
import com.github.nullptroma.wallenc.domain.interfaces.IVaultsManager
|
||||
import java.util.UUID
|
||||
|
||||
class RemoveStorageUseCase {
|
||||
suspend fun rename(storage: IStorageInfo, newName: String) {
|
||||
when (storage) {
|
||||
is IStorage -> storage.rename(newName)
|
||||
class RemoveStorageUseCase(
|
||||
private val vaultsManager: IVaultsManager,
|
||||
private val unlockManager: IUnlockManager,
|
||||
) {
|
||||
|
||||
suspend fun remove(storage: IStorageInfo, policy: StorageDeletionPolicy) {
|
||||
if (storage !is IStorage) return
|
||||
|
||||
when (policy) {
|
||||
StorageDeletionPolicy.CLOSE_ENCRYPTED_OVERLAYS_ONLY -> {
|
||||
unlockManager.close(storage)
|
||||
}
|
||||
StorageDeletionPolicy.REMOVE_PHYSICAL -> {
|
||||
val physical = findPhysicalRootStorage(storage) ?: return
|
||||
unlockManager.close(physical.uuid)
|
||||
vaultsManager.localVault.remove(physical)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Поднимается по цепочке overlay (sourceUuid -> decrypted view), пока не дойдёт
|
||||
* до корневого физического storage из [IVaultsManager.localVault].
|
||||
*/
|
||||
private fun findPhysicalRootStorage(storage: IStorage): IStorage? {
|
||||
val locals = vaultsManager.localVault.storages.value ?: return null
|
||||
val opened = unlockManager.openedStorages.value
|
||||
|
||||
var id: UUID = storage.uuid
|
||||
while (true) {
|
||||
val parent = opened.entries.firstOrNull { it.value.uuid == id }?.key ?: break
|
||||
id = parent
|
||||
}
|
||||
return locals.firstOrNull { it.uuid == id }
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user