Ensure webui "channel" is always of corresponding enum (#1334)

The "channel" was just the string from the config file, which will never equal the enum unless via case-insensitive comparison
This commit is contained in:
schroda
2025-04-06 21:10:07 +02:00
committed by GitHub
parent 3167d8aa15
commit 96b50f52ec
6 changed files with 79 additions and 76 deletions

View File

@@ -7,10 +7,10 @@ import suwayomi.tachidesk.graphql.asDataFetcherResult
import suwayomi.tachidesk.graphql.types.UpdateState.DOWNLOADING import suwayomi.tachidesk.graphql.types.UpdateState.DOWNLOADING
import suwayomi.tachidesk.graphql.types.UpdateState.ERROR import suwayomi.tachidesk.graphql.types.UpdateState.ERROR
import suwayomi.tachidesk.graphql.types.UpdateState.IDLE import suwayomi.tachidesk.graphql.types.UpdateState.IDLE
import suwayomi.tachidesk.graphql.types.WebUIFlavor
import suwayomi.tachidesk.graphql.types.WebUIUpdateStatus import suwayomi.tachidesk.graphql.types.WebUIUpdateStatus
import suwayomi.tachidesk.server.JavalinSetup.future import suwayomi.tachidesk.server.JavalinSetup.future
import suwayomi.tachidesk.server.util.WebInterfaceManager import suwayomi.tachidesk.server.util.WebInterfaceManager
import suwayomi.tachidesk.server.util.WebUIFlavor
import java.util.concurrent.CompletableFuture import java.util.concurrent.CompletableFuture
import kotlin.time.Duration.Companion.seconds import kotlin.time.Duration.Companion.seconds

View File

@@ -3,13 +3,14 @@ package suwayomi.tachidesk.graphql.queries
import com.expediagroup.graphql.generator.annotations.GraphQLDeprecated import com.expediagroup.graphql.generator.annotations.GraphQLDeprecated
import suwayomi.tachidesk.global.impl.AppUpdate import suwayomi.tachidesk.global.impl.AppUpdate
import suwayomi.tachidesk.graphql.types.AboutWebUI import suwayomi.tachidesk.graphql.types.AboutWebUI
import suwayomi.tachidesk.graphql.types.WebUIChannel
import suwayomi.tachidesk.graphql.types.WebUIFlavor
import suwayomi.tachidesk.graphql.types.WebUIUpdateCheck import suwayomi.tachidesk.graphql.types.WebUIUpdateCheck
import suwayomi.tachidesk.graphql.types.WebUIUpdateStatus import suwayomi.tachidesk.graphql.types.WebUIUpdateStatus
import suwayomi.tachidesk.server.JavalinSetup.future import suwayomi.tachidesk.server.JavalinSetup.future
import suwayomi.tachidesk.server.generated.BuildConfig import suwayomi.tachidesk.server.generated.BuildConfig
import suwayomi.tachidesk.server.serverConfig import suwayomi.tachidesk.server.serverConfig
import suwayomi.tachidesk.server.util.WebInterfaceManager import suwayomi.tachidesk.server.util.WebInterfaceManager
import suwayomi.tachidesk.server.util.WebUIFlavor
import java.util.concurrent.CompletableFuture import java.util.concurrent.CompletableFuture
class InfoQuery { class InfoQuery {
@@ -62,7 +63,7 @@ class InfoQuery {
future { future {
val (version, updateAvailable) = WebInterfaceManager.isUpdateAvailable(WebUIFlavor.current, raiseError = true) val (version, updateAvailable) = WebInterfaceManager.isUpdateAvailable(WebUIFlavor.current, raiseError = true)
WebUIUpdateCheck( WebUIUpdateCheck(
channel = serverConfig.webUIChannel.value, channel = WebUIChannel.from(serverConfig.webUIChannel.value),
tag = version, tag = version,
updateAvailable, updateAvailable,
) )

View File

@@ -11,9 +11,6 @@ import com.expediagroup.graphql.generator.annotations.GraphQLDeprecated
import suwayomi.tachidesk.graphql.server.primitives.Node import suwayomi.tachidesk.graphql.server.primitives.Node
import suwayomi.tachidesk.server.ServerConfig import suwayomi.tachidesk.server.ServerConfig
import suwayomi.tachidesk.server.serverConfig import suwayomi.tachidesk.server.serverConfig
import suwayomi.tachidesk.server.util.WebUIChannel
import suwayomi.tachidesk.server.util.WebUIFlavor
import suwayomi.tachidesk.server.util.WebUIInterface
interface Settings : Node { interface Settings : Node {
val ip: String? val ip: String?

View File

@@ -1,18 +1,20 @@
package suwayomi.tachidesk.graphql.types package suwayomi.tachidesk.graphql.types
import suwayomi.tachidesk.server.serverConfig
data class AboutWebUI( data class AboutWebUI(
val channel: String, val channel: WebUIChannel,
val tag: String, val tag: String,
) )
data class WebUIUpdateCheck( data class WebUIUpdateCheck(
val channel: String, val channel: WebUIChannel,
val tag: String, val tag: String,
val updateAvailable: Boolean, val updateAvailable: Boolean,
) )
data class WebUIUpdateInfo( data class WebUIUpdateInfo(
val channel: String, val channel: WebUIChannel,
val tag: String, val tag: String,
) )
@@ -28,3 +30,68 @@ data class WebUIUpdateStatus(
val state: UpdateState, val state: UpdateState,
val progress: Int, val progress: Int,
) )
enum class WebUIInterface {
BROWSER,
ELECTRON,
;
companion object {
fun from(value: String): WebUIInterface = entries.find { it.name.lowercase() == value.lowercase() } ?: BROWSER
}
}
enum class WebUIChannel {
BUNDLED, // the default webUI version bundled with the server release
STABLE,
PREVIEW,
;
companion object {
fun from(channel: String): WebUIChannel = entries.find { it.name.lowercase() == channel.lowercase() } ?: STABLE
fun doesConfigChannelEqual(channel: WebUIChannel): Boolean = serverConfig.webUIChannel.value.equals(channel.name, true)
}
}
enum class WebUIFlavor(
val uiName: String,
val repoUrl: String,
val versionMappingUrl: String,
val latestReleaseInfoUrl: String,
val baseFileName: String,
) {
WEBUI(
"WebUI",
"https://github.com/Suwayomi/Suwayomi-WebUI-preview",
"https://raw.githubusercontent.com/Suwayomi/Suwayomi-WebUI/master/versionToServerVersionMapping.json",
"https://api.github.com/repos/Suwayomi/Suwayomi-WebUI-preview/releases/latest",
"Suwayomi-WebUI",
),
VUI(
"VUI",
"https://github.com/Suwayomi/Suwayomi-VUI",
"https://raw.githubusercontent.com/Suwayomi/Suwayomi-VUI/main/versionToServerVersionMapping.json",
"https://api.github.com/repos/Suwayomi/Suwayomi-VUI/releases/latest",
"Suwayomi-VUI-Web",
),
CUSTOM(
"Custom",
"repoURL",
"versionMappingUrl",
"latestReleaseInfoURL",
"baseFileName",
),
;
companion object {
val default: WebUIFlavor = WEBUI
fun from(value: String): WebUIFlavor = entries.find { it.uiName == value } ?: default
val current: WebUIFlavor
get() = from(serverConfig.webUIFlavor.value)
}
}

View File

@@ -9,6 +9,7 @@ package suwayomi.tachidesk.server.util
import dorkbox.desktop.Desktop import dorkbox.desktop.Desktop
import io.github.oshai.kotlinlogging.KotlinLogging import io.github.oshai.kotlinlogging.KotlinLogging
import suwayomi.tachidesk.graphql.types.WebUIInterface
import suwayomi.tachidesk.server.serverConfig import suwayomi.tachidesk.server.serverConfig
object Browser { object Browser {

View File

@@ -41,6 +41,8 @@ import suwayomi.tachidesk.graphql.types.UpdateState.DOWNLOADING
import suwayomi.tachidesk.graphql.types.UpdateState.ERROR import suwayomi.tachidesk.graphql.types.UpdateState.ERROR
import suwayomi.tachidesk.graphql.types.UpdateState.FINISHED import suwayomi.tachidesk.graphql.types.UpdateState.FINISHED
import suwayomi.tachidesk.graphql.types.UpdateState.IDLE import suwayomi.tachidesk.graphql.types.UpdateState.IDLE
import suwayomi.tachidesk.graphql.types.WebUIChannel
import suwayomi.tachidesk.graphql.types.WebUIFlavor
import suwayomi.tachidesk.graphql.types.WebUIUpdateInfo import suwayomi.tachidesk.graphql.types.WebUIUpdateInfo
import suwayomi.tachidesk.graphql.types.WebUIUpdateStatus import suwayomi.tachidesk.graphql.types.WebUIUpdateStatus
import suwayomi.tachidesk.server.ApplicationDirs import suwayomi.tachidesk.server.ApplicationDirs
@@ -68,71 +70,6 @@ private fun ByteArray.toHex(): String = joinToString(separator = "") { eachByte
class BundledWebUIMissing : Exception("No bundled webUI version found") class BundledWebUIMissing : Exception("No bundled webUI version found")
enum class WebUIInterface {
BROWSER,
ELECTRON,
;
companion object {
fun from(value: String): WebUIInterface = entries.find { it.name.lowercase() == value.lowercase() } ?: BROWSER
}
}
enum class WebUIChannel {
BUNDLED, // the default webUI version bundled with the server release
STABLE,
PREVIEW,
;
companion object {
fun from(channel: String): WebUIChannel = entries.find { it.name.lowercase() == channel.lowercase() } ?: STABLE
fun doesConfigChannelEqual(channel: WebUIChannel): Boolean = serverConfig.webUIChannel.value.equals(channel.name, true)
}
}
enum class WebUIFlavor(
val uiName: String,
val repoUrl: String,
val versionMappingUrl: String,
val latestReleaseInfoUrl: String,
val baseFileName: String,
) {
WEBUI(
"WebUI",
"https://github.com/Suwayomi/Suwayomi-WebUI-preview",
"https://raw.githubusercontent.com/Suwayomi/Suwayomi-WebUI/master/versionToServerVersionMapping.json",
"https://api.github.com/repos/Suwayomi/Suwayomi-WebUI-preview/releases/latest",
"Suwayomi-WebUI",
),
VUI(
"VUI",
"https://github.com/Suwayomi/Suwayomi-VUI",
"https://raw.githubusercontent.com/Suwayomi/Suwayomi-VUI/main/versionToServerVersionMapping.json",
"https://api.github.com/repos/Suwayomi/Suwayomi-VUI/releases/latest",
"Suwayomi-VUI-Web",
),
CUSTOM(
"Custom",
"repoURL",
"versionMappingUrl",
"latestReleaseInfoURL",
"baseFileName",
),
;
companion object {
val default: WebUIFlavor = WEBUI
fun from(value: String): WebUIFlavor = entries.find { it.uiName == value } ?: default
val current: WebUIFlavor
get() = from(serverConfig.webUIFlavor.value)
}
}
fun WebUIFlavor.isDefault(): Boolean = this == WebUIFlavor.default fun WebUIFlavor.isDefault(): Boolean = this == WebUIFlavor.default
object WebInterfaceManager { object WebInterfaceManager {
@@ -188,7 +125,7 @@ object WebInterfaceManager {
} }
return AboutWebUI( return AboutWebUI(
channel = serverConfig.webUIChannel.value, channel = WebUIChannel.from(serverConfig.webUIChannel.value),
tag = currentVersion, tag = currentVersion,
) )
} }
@@ -201,7 +138,7 @@ object WebInterfaceManager {
WebUIUpdateStatus( WebUIUpdateStatus(
info = info =
WebUIUpdateInfo( WebUIUpdateInfo(
channel = serverConfig.webUIChannel.value, channel = WebUIChannel.from(serverConfig.webUIChannel.value),
tag = version, tag = version,
), ),
state, state,