Backup creation and restore gql endpoints (#587)

This commit is contained in:
Mitchell Syer
2023-07-02 11:45:44 -04:00
committed by GitHub
parent 1a9a0b3394
commit a11b654c3d
13 changed files with 477 additions and 43 deletions

View File

@@ -0,0 +1,32 @@
package suwayomi.tachidesk.graphql.queries
import io.javalin.http.UploadedFile
import suwayomi.tachidesk.graphql.types.BackupRestoreStatus
import suwayomi.tachidesk.graphql.types.toStatus
import suwayomi.tachidesk.manga.impl.backup.proto.ProtoBackupImport
import suwayomi.tachidesk.manga.impl.backup.proto.ProtoBackupValidator
class BackupQuery {
data class ValidateBackupInput(
val backup: UploadedFile
)
data class ValidateBackupSource(
val id: Long,
val name: String
)
data class ValidateBackupResult(
val missingSources: List<ValidateBackupSource>
)
fun validateBackup(
input: ValidateBackupInput
): ValidateBackupResult {
val result = ProtoBackupValidator.validate(input.backup.content)
return ValidateBackupResult(
result.missingSourceIds.map { ValidateBackupSource(it.first, it.second) }
)
}
fun restoreStatus(): BackupRestoreStatus {
return ProtoBackupImport.backupRestoreState.value.toStatus()
}
}

View File

@@ -0,0 +1,42 @@
package suwayomi.tachidesk.graphql.queries
import org.jetbrains.exposed.sql.select
import org.jetbrains.exposed.sql.transactions.transaction
import org.kodein.di.DI
import org.kodein.di.conf.global
import org.kodein.di.instance
import suwayomi.tachidesk.graphql.types.MangaType
import suwayomi.tachidesk.manga.impl.update.IUpdater
import suwayomi.tachidesk.manga.impl.update.JobStatus
import suwayomi.tachidesk.manga.impl.update.UpdaterSocket
import suwayomi.tachidesk.manga.model.table.MangaTable
class UpdaterQuery {
sealed interface UpdaterStatus {
data class UpdaterJob(val status: JobStatus, val manga: MangaType)
data class Running(val jobs: Map<JobStatus, List<MangaType>>) : UpdaterStatus
// data class Idle
}
private val updater by DI.global.instance<IUpdater>()
fun updaterStatus() {
val status = updater.status.value
if (status.running) {
val mangaIds = status.statusMap.values.flatMap { mangas -> mangas.map { it.id } }
val mangaMap = transaction {
MangaTable.select { MangaTable.id inList mangaIds }
.map { MangaType(it) }
.associateBy { it.id }
}
UpdaterStatus.Running(
status.statusMap.mapValues { (_, mangas) ->
mangas.mapNotNull { mangaMap[it.id] }
}
)
}
UpdaterSocket
}
}