BIT-1334: Adding generation for catch all email usernames (#538)

This commit is contained in:
joshua-livefront
2024-01-08 15:52:19 -05:00
committed by Álison Fernandes
parent 36d49a62a6
commit b6e7655938
10 changed files with 203 additions and 2 deletions

View File

@@ -26,6 +26,13 @@ interface GeneratorSdkSource {
request: UsernameGeneratorRequest.Subaddress,
): Result<String>
/**
* Generates a catch all email returning a [String] wrapped in a [Result].
*/
suspend fun generateCatchAllEmail(
request: UsernameGeneratorRequest.Catchall,
): Result<String>
/**
* Generates a forwarded service email returning a [String] wrapped in a [Result].
*/

View File

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

View File

@@ -5,6 +5,7 @@ import com.bitwarden.core.PasswordGeneratorRequest
import com.bitwarden.core.PasswordHistoryView
import com.bitwarden.core.UsernameGeneratorRequest
import com.x8bit.bitwarden.data.platform.repository.model.LocalDataState
import com.x8bit.bitwarden.data.tools.generator.repository.model.GeneratedCatchAllUsernameResult
import com.x8bit.bitwarden.data.tools.generator.repository.model.GeneratedForwardedServiceUsernameResult
import com.x8bit.bitwarden.data.tools.generator.repository.model.GeneratedPassphraseResult
import com.x8bit.bitwarden.data.tools.generator.repository.model.GeneratedPasswordResult
@@ -40,12 +41,19 @@ interface GeneratorRepository {
): GeneratedPassphraseResult
/**
* Attempt to generate a forwarded service username.
* Attempt to generate a plus addressed email username.
*/
suspend fun generatePlusAddressedEmail(
plusAddressedEmailGeneratorRequest: UsernameGeneratorRequest.Subaddress,
): GeneratedPlusAddressedUsernameResult
/**
* Attempt to generate a catch-all email username.
*/
suspend fun generateCatchAllEmail(
catchAllEmailGeneratorRequest: UsernameGeneratorRequest.Catchall,
): GeneratedCatchAllUsernameResult
/**
* Attempt to generate a forwarded service username.
*/

View File

@@ -13,6 +13,7 @@ import com.x8bit.bitwarden.data.tools.generator.datasource.disk.PasswordHistoryD
import com.x8bit.bitwarden.data.tools.generator.datasource.disk.entity.toPasswordHistory
import com.x8bit.bitwarden.data.tools.generator.datasource.disk.entity.toPasswordHistoryEntity
import com.x8bit.bitwarden.data.tools.generator.datasource.sdk.GeneratorSdkSource
import com.x8bit.bitwarden.data.tools.generator.repository.model.GeneratedCatchAllUsernameResult
import com.x8bit.bitwarden.data.tools.generator.repository.model.GeneratedForwardedServiceUsernameResult
import com.x8bit.bitwarden.data.tools.generator.repository.model.GeneratedPassphraseResult
import com.x8bit.bitwarden.data.tools.generator.repository.model.GeneratedPasswordResult
@@ -140,6 +141,19 @@ class GeneratorRepositoryImpl(
},
)
override suspend fun generateCatchAllEmail(
catchAllEmailGeneratorRequest: UsernameGeneratorRequest.Catchall,
): GeneratedCatchAllUsernameResult =
generatorSdkSource.generateCatchAllEmail(catchAllEmailGeneratorRequest)
.fold(
onSuccess = { generatedEmail ->
GeneratedCatchAllUsernameResult.Success(generatedEmail)
},
onFailure = {
GeneratedCatchAllUsernameResult.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 GeneratedCatchAllUsernameResult {
/**
* Operation succeeded with a value.
*/
data class Success(
val generatedEmailAddress: String,
) : GeneratedCatchAllUsernameResult()
/**
* There was an error during the operation.
*/
data object InvalidRequest : GeneratedCatchAllUsernameResult()
}

View File

@@ -13,6 +13,7 @@ import com.x8bit.bitwarden.R
import com.x8bit.bitwarden.data.auth.repository.AuthRepository
import com.x8bit.bitwarden.data.platform.manager.clipboard.BitwardenClipboardManager
import com.x8bit.bitwarden.data.tools.generator.repository.GeneratorRepository
import com.x8bit.bitwarden.data.tools.generator.repository.model.GeneratedCatchAllUsernameResult
import com.x8bit.bitwarden.data.tools.generator.repository.model.GeneratedForwardedServiceUsernameResult
import com.x8bit.bitwarden.data.tools.generator.repository.model.GeneratedPassphraseResult
import com.x8bit.bitwarden.data.tools.generator.repository.model.GeneratedPasswordResult
@@ -129,6 +130,10 @@ class GeneratorViewModel @Inject constructor(
handleUpdatePlusAddressedGeneratedUsernameResult(action)
}
is GeneratorAction.Internal.UpdateGeneratedCatchAllUsernameResult -> {
handleUpdateCatchAllGeneratedUsernameResult(action)
}
is GeneratorAction.Internal.UpdateGeneratedForwardedServiceUsernameResult -> {
handleUpdateForwadedServiceGeneratedUsernameResult(action)
}
@@ -381,6 +386,22 @@ class GeneratorViewModel @Inject constructor(
}
}
private fun handleUpdateCatchAllGeneratedUsernameResult(
action: GeneratorAction.Internal.UpdateGeneratedCatchAllUsernameResult,
) {
when (val result = action.result) {
is GeneratedCatchAllUsernameResult.Success -> {
mutableStateFlow.update {
it.copy(generatedText = result.generatedEmailAddress)
}
}
GeneratedCatchAllUsernameResult.InvalidRequest -> {
sendEvent(GeneratorEvent.ShowSnackbar(R.string.an_error_has_occurred.asText()))
}
}
}
private fun handleUpdateForwadedServiceGeneratedUsernameResult(
action: GeneratorAction.Internal.UpdateGeneratedForwardedServiceUsernameResult,
) {
@@ -926,7 +947,9 @@ class GeneratorViewModel @Inject constructor(
}
is CatchAllEmail -> {
// TODO: Implement catch all email generation (BIT-1334)
if (isManualRegeneration) {
generateCatchAllEmail(selectedType)
}
}
is PlusAddressedEmail -> {
@@ -959,6 +982,16 @@ class GeneratorViewModel @Inject constructor(
sendAction(GeneratorAction.Internal.UpdateGeneratedPlusAddessedUsernameResult(result))
}
private suspend fun generateCatchAllEmail(catchAllEmail: CatchAllEmail) {
val result = generatorRepository.generateCatchAllEmail(
UsernameGeneratorRequest.Catchall(
type = AppendType.Random,
domain = catchAllEmail.domainName,
),
)
sendAction(GeneratorAction.Internal.UpdateGeneratedCatchAllUsernameResult(result))
}
private inline fun updateGeneratorMainTypePasscode(
crossinline block: (Passcode) -> Passcode,
) {
@@ -1929,6 +1962,13 @@ sealed class GeneratorAction {
val result: GeneratedPlusAddressedUsernameResult,
) : Internal()
/**
* Indicates a generated text update is received.
*/
data class UpdateGeneratedCatchAllUsernameResult(
val result: GeneratedCatchAllUsernameResult,
) : Internal()
/**
* Indicates a generated text update is received.
*/