BIT-1336: Adding random word username generation (#540)

This commit is contained in:
Joshua Queen
2024-01-08 17:50:17 -05:00
committed by Álison Fernandes
parent b6e7655938
commit 35ef4e4252
10 changed files with 201 additions and 1 deletions

View File

@@ -33,6 +33,13 @@ interface GeneratorSdkSource {
request: UsernameGeneratorRequest.Catchall,
): Result<String>
/**
* Generates a random word username returning a [String] wrapped in a [Result].
*/
suspend fun generateRandomWord(
request: UsernameGeneratorRequest.Word,
): Result<String>
/**
* Generates a forwarded service email returning a [String] wrapped in a [Result].
*/

View File

@@ -38,6 +38,12 @@ class GeneratorSdkSourceImpl(
clientGenerator.username(request)
}
override suspend fun generateRandomWord(
request: UsernameGeneratorRequest.Word,
): Result<String> = runCatching {
clientGenerator.username(request)
}
override suspend fun generateForwardedServiceEmail(
request: UsernameGeneratorRequest.Forwarded,
): Result<String> = runCatching {

View File

@@ -10,6 +10,7 @@ import com.x8bit.bitwarden.data.tools.generator.repository.model.GeneratedForwar
import com.x8bit.bitwarden.data.tools.generator.repository.model.GeneratedPassphraseResult
import com.x8bit.bitwarden.data.tools.generator.repository.model.GeneratedPasswordResult
import com.x8bit.bitwarden.data.tools.generator.repository.model.GeneratedPlusAddressedUsernameResult
import com.x8bit.bitwarden.data.tools.generator.repository.model.GeneratedRandomWordUsernameResult
import com.x8bit.bitwarden.data.tools.generator.repository.model.PasscodeGenerationOptions
import kotlinx.coroutines.flow.StateFlow
@@ -54,6 +55,13 @@ interface GeneratorRepository {
catchAllEmailGeneratorRequest: UsernameGeneratorRequest.Catchall,
): GeneratedCatchAllUsernameResult
/**
* Attempt to generate a random word username.
*/
suspend fun generateRandomWordUsername(
randomWordGeneratorRequest: UsernameGeneratorRequest.Word,
): GeneratedRandomWordUsernameResult
/**
* Attempt to generate a forwarded service username.
*/

View File

@@ -1,3 +1,5 @@
@file:Suppress("TooManyFunctions")
package com.x8bit.bitwarden.data.tools.generator.repository
import com.bitwarden.core.PassphraseGeneratorRequest
@@ -18,6 +20,7 @@ import com.x8bit.bitwarden.data.tools.generator.repository.model.GeneratedForwar
import com.x8bit.bitwarden.data.tools.generator.repository.model.GeneratedPassphraseResult
import com.x8bit.bitwarden.data.tools.generator.repository.model.GeneratedPasswordResult
import com.x8bit.bitwarden.data.tools.generator.repository.model.GeneratedPlusAddressedUsernameResult
import com.x8bit.bitwarden.data.tools.generator.repository.model.GeneratedRandomWordUsernameResult
import com.x8bit.bitwarden.data.tools.generator.repository.model.PasscodeGenerationOptions
import com.x8bit.bitwarden.data.vault.datasource.sdk.VaultSdkSource
import kotlinx.coroutines.CoroutineScope
@@ -154,6 +157,19 @@ class GeneratorRepositoryImpl(
},
)
override suspend fun generateRandomWordUsername(
randomWordGeneratorRequest: UsernameGeneratorRequest.Word,
): GeneratedRandomWordUsernameResult =
generatorSdkSource.generateRandomWord(randomWordGeneratorRequest)
.fold(
onSuccess = { generatedUsername ->
GeneratedRandomWordUsernameResult.Success(generatedUsername)
},
onFailure = {
GeneratedRandomWordUsernameResult.InvalidRequest
},
)
override suspend fun generateForwardedServiceUsername(
forwardedServiceGeneratorRequest: UsernameGeneratorRequest.Forwarded,
): GeneratedForwardedServiceUsernameResult =

View File

@@ -0,0 +1,19 @@
package com.x8bit.bitwarden.data.tools.generator.repository.model
/**
* Represents the outcome of a generator operation.
*/
sealed class GeneratedRandomWordUsernameResult {
/**
* Operation succeeded with a value.
*/
data class Success(
val generatedUsername: String,
) : GeneratedRandomWordUsernameResult()
/**
* There was an error during the operation.
*/
data object InvalidRequest : GeneratedRandomWordUsernameResult()
}

View File

@@ -18,6 +18,7 @@ import com.x8bit.bitwarden.data.tools.generator.repository.model.GeneratedForwar
import com.x8bit.bitwarden.data.tools.generator.repository.model.GeneratedPassphraseResult
import com.x8bit.bitwarden.data.tools.generator.repository.model.GeneratedPasswordResult
import com.x8bit.bitwarden.data.tools.generator.repository.model.GeneratedPlusAddressedUsernameResult
import com.x8bit.bitwarden.data.tools.generator.repository.model.GeneratedRandomWordUsernameResult
import com.x8bit.bitwarden.data.tools.generator.repository.model.PasscodeGenerationOptions
import com.x8bit.bitwarden.ui.platform.base.BaseViewModel
import com.x8bit.bitwarden.ui.platform.base.util.Text
@@ -134,6 +135,10 @@ class GeneratorViewModel @Inject constructor(
handleUpdateCatchAllGeneratedUsernameResult(action)
}
is GeneratorAction.Internal.UpdateGeneratedRandomWordUsernameResult -> {
handleUpdateRandomWordGeneratedUsernameResult(action)
}
is GeneratorAction.Internal.UpdateGeneratedForwardedServiceUsernameResult -> {
handleUpdateForwadedServiceGeneratedUsernameResult(action)
}
@@ -402,6 +407,22 @@ class GeneratorViewModel @Inject constructor(
}
}
private fun handleUpdateRandomWordGeneratedUsernameResult(
action: GeneratorAction.Internal.UpdateGeneratedRandomWordUsernameResult,
) {
when (val result = action.result) {
is GeneratedRandomWordUsernameResult.Success -> {
mutableStateFlow.update {
it.copy(generatedText = result.generatedUsername)
}
}
GeneratedRandomWordUsernameResult.InvalidRequest -> {
sendEvent(GeneratorEvent.ShowSnackbar(R.string.an_error_has_occurred.asText()))
}
}
}
private fun handleUpdateForwadedServiceGeneratedUsernameResult(
action: GeneratorAction.Internal.UpdateGeneratedForwardedServiceUsernameResult,
) {
@@ -959,7 +980,9 @@ class GeneratorViewModel @Inject constructor(
}
is RandomWord -> {
// TODO: Implement random word generation (BIT-1336)
if (isManualRegeneration) {
generateRandomWordUsername(selectedType)
}
}
}
}
@@ -992,6 +1015,15 @@ class GeneratorViewModel @Inject constructor(
sendAction(GeneratorAction.Internal.UpdateGeneratedCatchAllUsernameResult(result))
}
private suspend fun generateRandomWordUsername(randomWord: RandomWord) {
val result = generatorRepository.generateRandomWordUsername(
UsernameGeneratorRequest.Word(
capitalize = randomWord.capitalize,
includeNumber = randomWord.includeNumber,
),
)
sendAction(GeneratorAction.Internal.UpdateGeneratedRandomWordUsernameResult(result))
}
private inline fun updateGeneratorMainTypePasscode(
crossinline block: (Passcode) -> Passcode,
) {
@@ -1969,6 +2001,13 @@ sealed class GeneratorAction {
val result: GeneratedCatchAllUsernameResult,
) : Internal()
/**
* Indicates a generated text update is received.
*/
data class UpdateGeneratedRandomWordUsernameResult(
val result: GeneratedRandomWordUsernameResult,
) : Internal()
/**
* Indicates a generated text update is received.
*/