Skip to content

Commit

Permalink
Migrate tags to new validation
Browse files Browse the repository at this point in the history
  • Loading branch information
Faltenreich committed Feb 20, 2024
1 parent a362ace commit 028e433
Show file tree
Hide file tree
Showing 9 changed files with 46 additions and 65 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@ import com.faltenreich.diaguard.shared.networking.networkingModule
import com.faltenreich.diaguard.shared.primitive.primitiveModule
import com.faltenreich.diaguard.shared.serialization.serializationModule
import com.faltenreich.diaguard.shared.theme.themeModule
import com.faltenreich.diaguard.shared.validation.validationModule
import com.faltenreich.diaguard.statistic.statisticModule
import com.faltenreich.diaguard.tag.tagModule
import com.faltenreich.diaguard.timeline.timelineModule
Expand All @@ -45,7 +44,6 @@ private fun mainModules() = listOf(
primitiveModule(),
coroutineModule(),
configModule(),
validationModule(),
localizationModule(),
clipboardModule(),
serializationModule(),
Expand Down

This file was deleted.

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ import com.faltenreich.diaguard.tag.detail.TagDetailViewModel
import com.faltenreich.diaguard.tag.form.CreateTagUseCase
import com.faltenreich.diaguard.tag.form.HasTagUseCase
import com.faltenreich.diaguard.tag.form.TagFormViewModel
import com.faltenreich.diaguard.tag.form.UniqueTagRule
import com.faltenreich.diaguard.tag.form.ValidateTagUseCase
import com.faltenreich.diaguard.tag.list.DeleteTagUseCase
import com.faltenreich.diaguard.tag.list.GetTagsUseCase
import com.faltenreich.diaguard.tag.list.TagListViewModel
Expand All @@ -20,6 +22,7 @@ fun tagModule() = module {
singleOf(::GetTagsUseCase)
singleOf(::HasTagUseCase)
singleOf(::CreateTagUseCase)
single { ValidateTagUseCase(listOf(UniqueTagRule())) }
singleOf(::CountEntriesByTagUseCase)
singleOf(::GetEntriesOfTagUseCase)
singleOf(::DeleteTagUseCase)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,16 @@
package com.faltenreich.diaguard.tag.detail

import com.faltenreich.diaguard.MR
import com.faltenreich.diaguard.navigation.NavigateToScreenUseCase
import com.faltenreich.diaguard.navigation.OpenModalUseCase
import com.faltenreich.diaguard.navigation.modal.TagDeleteModal
import com.faltenreich.diaguard.navigation.screen.EntryFormScreen
import com.faltenreich.diaguard.shared.architecture.ViewModel
import com.faltenreich.diaguard.shared.datetime.DateTimeConstants
import com.faltenreich.diaguard.shared.di.inject
import com.faltenreich.diaguard.shared.localization.getString
import com.faltenreich.diaguard.shared.validation.ValidateUseCase
import com.faltenreich.diaguard.shared.validation.ValidationResult
import com.faltenreich.diaguard.tag.Tag
import com.faltenreich.diaguard.tag.UpdateTagUseCase
import com.faltenreich.diaguard.tag.form.RedundantTagException
import com.faltenreich.diaguard.tag.form.UniqueTagRule
import com.faltenreich.diaguard.tag.form.ValidateTagUseCase
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.collectLatest
Expand All @@ -25,8 +22,8 @@ import kotlinx.coroutines.launch
class TagDetailViewModel(
tag: Tag,
getEntriesOfTag: GetEntriesOfTagUseCase = inject(),
private val validateTag: ValidateTagUseCase = inject(),
private val updateTag: UpdateTagUseCase = inject(),
private val validate: ValidateUseCase = inject(),
private val openModal: OpenModalUseCase = inject(),
private val navigateToScreen: NavigateToScreenUseCase = inject(),
) : ViewModel<TagDetailState, TagDetailIntent>() {
Expand Down Expand Up @@ -57,14 +54,14 @@ class TagDetailViewModel(
}

private fun editTagIfValid(tag: Tag, name: String) {
val result = validate(name, UniqueTagRule())
if (result.isSuccess) {
// TODO
error.value = null
} else {
error.value = when (result.exceptionOrNull()) {
is RedundantTagException -> getString(MR.strings.tag_already_taken)
else -> getString(MR.strings.error_unknown)
when (val result = validateTag(name)) {
is ValidationResult.Success -> {
// TODO: Persist tag with new name
tag.copy(name = name)
error.value = null
}
is ValidationResult.Failure -> {
error.value = result.error
}
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,13 @@
package com.faltenreich.diaguard.tag.form

import com.faltenreich.diaguard.MR
import com.faltenreich.diaguard.navigation.CloseModalUseCase
import com.faltenreich.diaguard.shared.architecture.ViewModel
import com.faltenreich.diaguard.shared.localization.getString
import com.faltenreich.diaguard.shared.validation.ValidateUseCase
import com.faltenreich.diaguard.shared.validation.ValidationResult
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.map

class TagFormViewModel(
private val validate: ValidateUseCase,
private val validateTag: ValidateTagUseCase,
private val createTag: CreateTagUseCase,
private val closeModal: CloseModalUseCase,
) : ViewModel<TagFormState, TagFormIntent>() {
Expand All @@ -26,15 +24,14 @@ class TagFormViewModel(
}

private fun createTagIfValid(name: String) {
val result = validate(name, UniqueTagRule())
if (result.isSuccess) {
createTag(name)
closeModal()
error.value = null
} else {
error.value = when (result.exceptionOrNull()) {
is RedundantTagException -> getString(MR.strings.tag_already_taken)
else -> getString(MR.strings.error_unknown)
when (val result = validateTag(name)) {
is ValidationResult.Success -> {
createTag(name)
closeModal()
error.value = null
}
is ValidationResult.Failure -> {
error.value = result.error
}
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,17 +1,21 @@
package com.faltenreich.diaguard.tag.form

import com.faltenreich.diaguard.MR
import com.faltenreich.diaguard.shared.di.inject
import com.faltenreich.diaguard.shared.validation.Rule
import com.faltenreich.diaguard.shared.localization.Localization
import com.faltenreich.diaguard.shared.validation.ValidationResult
import com.faltenreich.diaguard.shared.validation.ValidationRule
import com.faltenreich.diaguard.tag.TagRepository

class UniqueTagRule(
private val repository: TagRepository = inject(),
) : Rule<String> {
private val localization: Localization = inject(),
) : ValidationRule<String> {

override fun check(input: String): Result<Unit> {
override fun check(input: String): ValidationResult<String> {
return when (repository.getByName(input)) {
null -> Result.success(Unit)
else -> Result.failure(RedundantTagException(input))
null -> ValidationResult.Success(input)
else -> ValidationResult.Failure(input, error = localization.getString(MR.strings.tag_already_taken))
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.faltenreich.diaguard.tag.form

import com.faltenreich.diaguard.shared.validation.ValidationResult
import com.faltenreich.diaguard.shared.validation.ValidationRule

class ValidateTagUseCase(private val rules: List<ValidationRule<String>>) {

operator fun invoke(input: String): ValidationResult<String> {
return rules.map { it.check(input) }
.firstOrNull { it is ValidationResult.Failure }
?: ValidationResult.Success(input)
}
}

0 comments on commit 028e433

Please sign in to comment.