mirror of
https://github.com/Suwayomi/Suwayomi-Server.git
synced 2026-07-11 06:44:34 -05:00
* Remove "updateAvailable" from webui update info Doesn't add anything * Extract status creation into function * Optionally emit status immediately Otherwise, some emissions can get lost due to the 1s sample period * Rename "STOPPED" state to "IDLE" * Reset webui update status Currently, the update status never gets reset. Thus, it will be "FINISHED" or "ERROR" until the next update gets triggered. Due to this, the client won't know that the update result was already handled and will handle it again the next time it gets the update status. To prevent this, the client has to be able to tell the server that it has handled the update result and that it can be resetted
70 lines
2.5 KiB
Kotlin
70 lines
2.5 KiB
Kotlin
package suwayomi.tachidesk.graphql.mutations
|
|
|
|
import kotlinx.coroutines.flow.first
|
|
import kotlinx.coroutines.withTimeout
|
|
import suwayomi.tachidesk.graphql.types.UpdateState.DOWNLOADING
|
|
import suwayomi.tachidesk.graphql.types.UpdateState.ERROR
|
|
import suwayomi.tachidesk.graphql.types.UpdateState.IDLE
|
|
import suwayomi.tachidesk.graphql.types.WebUIUpdateStatus
|
|
import suwayomi.tachidesk.server.JavalinSetup.future
|
|
import suwayomi.tachidesk.server.util.WebInterfaceManager
|
|
import java.util.concurrent.CompletableFuture
|
|
import kotlin.time.Duration.Companion.seconds
|
|
|
|
class InfoMutation {
|
|
data class WebUIUpdateInput(
|
|
val clientMutationId: String? = null,
|
|
)
|
|
|
|
data class WebUIUpdatePayload(
|
|
val clientMutationId: String?,
|
|
val updateStatus: WebUIUpdateStatus,
|
|
)
|
|
|
|
fun updateWebUI(input: WebUIUpdateInput): CompletableFuture<WebUIUpdatePayload> {
|
|
return future {
|
|
withTimeout(30.seconds) {
|
|
if (WebInterfaceManager.status.value.state === DOWNLOADING) {
|
|
return@withTimeout WebUIUpdatePayload(input.clientMutationId, WebInterfaceManager.status.value)
|
|
}
|
|
|
|
val (version, updateAvailable) = WebInterfaceManager.isUpdateAvailable()
|
|
|
|
if (!updateAvailable) {
|
|
val didUpdateCheckFail = version.isEmpty()
|
|
|
|
return@withTimeout WebUIUpdatePayload(
|
|
input.clientMutationId,
|
|
WebInterfaceManager.getStatus(version, if (didUpdateCheckFail) ERROR else IDLE),
|
|
)
|
|
}
|
|
try {
|
|
WebInterfaceManager.startDownloadInScope(version)
|
|
} catch (e: Exception) {
|
|
// ignore since we use the status anyway
|
|
}
|
|
|
|
WebUIUpdatePayload(
|
|
input.clientMutationId,
|
|
updateStatus = WebInterfaceManager.status.first { it.state == DOWNLOADING },
|
|
)
|
|
}
|
|
}
|
|
}
|
|
|
|
fun resetWebUIUpdateStatus(): CompletableFuture<WebUIUpdateStatus> {
|
|
return future {
|
|
withTimeout(30.seconds) {
|
|
val isUpdateFinished = WebInterfaceManager.status.value.state != DOWNLOADING
|
|
if (!isUpdateFinished) {
|
|
throw Exception("Status reset is not allowed during status \"$DOWNLOADING\"")
|
|
}
|
|
|
|
WebInterfaceManager.resetStatus()
|
|
|
|
WebInterfaceManager.status.first { it.state == IDLE }
|
|
}
|
|
}
|
|
}
|
|
}
|