mirror of
https://github.com/gotson/komga.git
synced 2026-04-22 06:50:51 +02:00
refactor: harden BCP47 functions
This commit is contained in:
parent
1a2acac71c
commit
82dd23a870
7 changed files with 38 additions and 25 deletions
|
|
@ -36,10 +36,12 @@ class V20230801104436__fix_incorrect_language_codes : BaseJavaMigration() {
|
|||
}
|
||||
}
|
||||
|
||||
private fun normalize(value: String): String =
|
||||
try {
|
||||
private fun normalize(value: String?): String {
|
||||
if (value.isNullOrBlank()) return ""
|
||||
return try {
|
||||
ULocale.forLanguageTag(value).toLanguageTag()
|
||||
} catch (e: Exception) {
|
||||
""
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,23 @@
|
|||
package org.gotson.komga.domain.model
|
||||
|
||||
import com.ibm.icu.util.ULocale
|
||||
|
||||
object BCP47TagValidator {
|
||||
private val languages by lazy { ULocale.getISOLanguages().toSet() }
|
||||
|
||||
fun isValid(value: String?): Boolean {
|
||||
if (value == null) return false
|
||||
return ULocale.forLanguageTag(value).let {
|
||||
it.language.isNotBlank() && languages.contains(it.language)
|
||||
}
|
||||
}
|
||||
|
||||
fun normalize(value: String?): String {
|
||||
if (value.isNullOrBlank()) return ""
|
||||
return try {
|
||||
ULocale.forLanguageTag(value).toLanguageTag()
|
||||
} catch (e: Exception) {
|
||||
""
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,6 +1,5 @@
|
|||
package org.gotson.komga.domain.model
|
||||
|
||||
import org.gotson.komga.infrastructure.validation.BCP47TagValidator
|
||||
import org.gotson.komga.language.lowerNotBlank
|
||||
import java.time.LocalDateTime
|
||||
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@ import com.fasterxml.jackson.dataformat.xml.XmlMapper
|
|||
import mu.KotlinLogging
|
||||
import org.apache.commons.validator.routines.ISBNValidator
|
||||
import org.gotson.komga.domain.model.Author
|
||||
import org.gotson.komga.domain.model.BCP47TagValidator
|
||||
import org.gotson.komga.domain.model.BookMetadataPatch
|
||||
import org.gotson.komga.domain.model.BookMetadataPatchCapability
|
||||
import org.gotson.komga.domain.model.BookWithMedia
|
||||
|
|
@ -17,7 +18,6 @@ import org.gotson.komga.infrastructure.metadata.BookMetadataProvider
|
|||
import org.gotson.komga.infrastructure.metadata.SeriesMetadataFromBookProvider
|
||||
import org.gotson.komga.infrastructure.metadata.comicrack.dto.ComicInfo
|
||||
import org.gotson.komga.infrastructure.metadata.comicrack.dto.Manga
|
||||
import org.gotson.komga.infrastructure.validation.BCP47TagValidator
|
||||
import org.springframework.beans.factory.annotation.Autowired
|
||||
import org.springframework.stereotype.Service
|
||||
import java.net.URI
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@ package org.gotson.komga.infrastructure.metadata.epub
|
|||
|
||||
import org.apache.commons.validator.routines.ISBNValidator
|
||||
import org.gotson.komga.domain.model.Author
|
||||
import org.gotson.komga.domain.model.BCP47TagValidator
|
||||
import org.gotson.komga.domain.model.BookMetadataPatch
|
||||
import org.gotson.komga.domain.model.BookMetadataPatchCapability
|
||||
import org.gotson.komga.domain.model.BookWithMedia
|
||||
|
|
@ -13,7 +14,6 @@ import org.gotson.komga.domain.model.SeriesMetadataPatch
|
|||
import org.gotson.komga.infrastructure.mediacontainer.EpubExtractor
|
||||
import org.gotson.komga.infrastructure.metadata.BookMetadataProvider
|
||||
import org.gotson.komga.infrastructure.metadata.SeriesMetadataFromBookProvider
|
||||
import org.gotson.komga.infrastructure.validation.BCP47TagValidator
|
||||
import org.jsoup.Jsoup
|
||||
import org.jsoup.parser.Parser
|
||||
import org.jsoup.safety.Safelist
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
package org.gotson.komga.infrastructure.validation
|
||||
|
||||
import com.ibm.icu.util.ULocale
|
||||
import jakarta.validation.Constraint
|
||||
import jakarta.validation.ConstraintValidator
|
||||
import jakarta.validation.ConstraintValidatorContext
|
||||
import org.gotson.komga.domain.model.BCP47TagValidator
|
||||
import kotlin.reflect.KClass
|
||||
|
||||
@Constraint(validatedBy = [BCP47Validator::class])
|
||||
|
|
@ -23,19 +23,4 @@ class BCP47Validator : ConstraintValidator<BCP47, String> {
|
|||
}
|
||||
}
|
||||
|
||||
object BCP47TagValidator {
|
||||
private val languages by lazy { ULocale.getISOLanguages().toSet() }
|
||||
|
||||
fun isValid(value: String): Boolean {
|
||||
return ULocale.forLanguageTag(value).let {
|
||||
it.language.isNotBlank() && languages.contains(it.language)
|
||||
}
|
||||
}
|
||||
|
||||
fun normalize(value: String): String =
|
||||
try {
|
||||
ULocale.forLanguageTag(value).toLanguageTag()
|
||||
} catch (e: Exception) {
|
||||
""
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
package org.gotson.komga.infrastructure.validation
|
||||
package org.gotson.komga.domain.model
|
||||
|
||||
import org.assertj.core.api.Assertions.assertThat
|
||||
import org.junit.jupiter.params.ParameterizedTest
|
||||
|
|
@ -10,12 +10,14 @@ class BCP47TagValidatorTest {
|
|||
|
||||
@ParameterizedTest
|
||||
@MethodSource("languagesNormalized")
|
||||
fun `given source languageTag when normalizing then result is expected`(source: String, expected: String) {
|
||||
fun `given source languageTag when normalizing then result is expected`(source: String?, expected: String) {
|
||||
assertThat(BCP47TagValidator.normalize(source)).isEqualTo(expected)
|
||||
}
|
||||
|
||||
private fun languagesNormalized(): Stream<Arguments> =
|
||||
Stream.of(
|
||||
Arguments.of(null, ""),
|
||||
Arguments.of("", ""),
|
||||
Arguments.of("fra", "fr"),
|
||||
Arguments.of("fra-be", "fr-BE"),
|
||||
Arguments.of("JA", "ja"),
|
||||
|
|
@ -26,12 +28,14 @@ class BCP47TagValidatorTest {
|
|||
|
||||
@ParameterizedTest
|
||||
@MethodSource("languagesValid")
|
||||
fun `given source languageTag when validating then result is expected`(source: String, expected: Boolean) {
|
||||
fun `given source languageTag when validating then result is expected`(source: String?, expected: Boolean) {
|
||||
assertThat(BCP47TagValidator.isValid(source)).isEqualTo(expected)
|
||||
}
|
||||
|
||||
fun languagesValid(): Stream<Arguments> =
|
||||
private fun languagesValid(): Stream<Arguments> =
|
||||
Stream.of(
|
||||
Arguments.of(null, false),
|
||||
Arguments.of("", false),
|
||||
Arguments.of("fra", true),
|
||||
Arguments.of("fra-BE", true),
|
||||
Arguments.of("en-us", true),
|
||||
Loading…
Reference in a new issue