mirror of
https://github.com/Suwayomi/Suwayomi-Server.git
synced 2026-07-05 03:44:36 -05:00
* Export meta data * Import meta data * Add missing "opdsUseBinaryFileSize" setting to gql * Export server settings * Import server settings * Streamline server config enum handling * Use "restore amount" in backup import progress
80 lines
2.7 KiB
Kotlin
80 lines
2.7 KiB
Kotlin
package suwayomi.tachidesk.graphql.mutations
|
|
|
|
import io.javalin.http.UploadedFile
|
|
import kotlinx.coroutines.flow.first
|
|
import kotlinx.coroutines.withTimeout
|
|
import suwayomi.tachidesk.graphql.server.TemporaryFileStorage
|
|
import suwayomi.tachidesk.graphql.types.BackupRestoreStatus
|
|
import suwayomi.tachidesk.graphql.types.toStatus
|
|
import suwayomi.tachidesk.manga.impl.backup.BackupFlags
|
|
import suwayomi.tachidesk.manga.impl.backup.proto.ProtoBackupExport
|
|
import suwayomi.tachidesk.manga.impl.backup.proto.ProtoBackupImport
|
|
import suwayomi.tachidesk.manga.impl.backup.proto.models.Backup
|
|
import suwayomi.tachidesk.server.JavalinSetup.future
|
|
import java.util.concurrent.CompletableFuture
|
|
import kotlin.time.Duration.Companion.seconds
|
|
|
|
class BackupMutation {
|
|
data class RestoreBackupInput(
|
|
val clientMutationId: String? = null,
|
|
val backup: UploadedFile,
|
|
)
|
|
|
|
data class RestoreBackupPayload(
|
|
val clientMutationId: String?,
|
|
val id: String,
|
|
val status: BackupRestoreStatus?,
|
|
)
|
|
|
|
fun restoreBackup(input: RestoreBackupInput): CompletableFuture<RestoreBackupPayload> {
|
|
val (clientMutationId, backup) = input
|
|
|
|
return future {
|
|
val restoreId = ProtoBackupImport.restore(backup.content())
|
|
|
|
withTimeout(10.seconds) {
|
|
ProtoBackupImport.notifyFlow.first {
|
|
ProtoBackupImport.getRestoreState(restoreId) != null
|
|
}
|
|
}
|
|
|
|
RestoreBackupPayload(clientMutationId, restoreId, ProtoBackupImport.getRestoreState(restoreId)?.toStatus())
|
|
}
|
|
}
|
|
|
|
data class CreateBackupInput(
|
|
val clientMutationId: String? = null,
|
|
val includeChapters: Boolean? = null,
|
|
val includeCategories: Boolean? = null,
|
|
)
|
|
|
|
data class CreateBackupPayload(
|
|
val clientMutationId: String?,
|
|
val url: String,
|
|
)
|
|
|
|
fun createBackup(input: CreateBackupInput? = null): CreateBackupPayload {
|
|
val filename = Backup.getFilename()
|
|
|
|
val backup =
|
|
ProtoBackupExport.createBackup(
|
|
BackupFlags(
|
|
includeManga = true,
|
|
includeCategories = input?.includeCategories ?: true,
|
|
includeChapters = input?.includeChapters ?: true,
|
|
includeTracking = true,
|
|
includeHistory = true,
|
|
includeClientData = true,
|
|
includeServerSettings = true,
|
|
),
|
|
)
|
|
|
|
TemporaryFileStorage.saveFile(filename, backup)
|
|
|
|
return CreateBackupPayload(
|
|
clientMutationId = input?.clientMutationId,
|
|
url = "/api/graphql/files/backup/$filename",
|
|
)
|
|
}
|
|
}
|