add backup validation endpoints

This commit is contained in:
Aria Moradi
2021-08-21 06:08:17 +04:30
parent c29a749833
commit e93d66d8a1
4 changed files with 38 additions and 3 deletions

View File

@@ -96,6 +96,9 @@ object MangaAPI {
post("import", BackupController::protobufImport) post("import", BackupController::protobufImport)
post("import/file", BackupController::protobufImportFile) post("import/file", BackupController::protobufImportFile)
post("validate", BackupController::protobufValidate)
post("validate/file", BackupController::protobufValidateFile)
get("export", BackupController::protobufExport) get("export", BackupController::protobufExport)
get("export/file", BackupController::protobufExportFile) get("export/file", BackupController::protobufExportFile)
} }

View File

@@ -6,6 +6,7 @@ import suwayomi.tachidesk.manga.impl.backup.legacy.LegacyBackupExport
import suwayomi.tachidesk.manga.impl.backup.legacy.LegacyBackupImport import suwayomi.tachidesk.manga.impl.backup.legacy.LegacyBackupImport
import suwayomi.tachidesk.manga.impl.backup.proto.ProtoBackupExport import suwayomi.tachidesk.manga.impl.backup.proto.ProtoBackupExport
import suwayomi.tachidesk.manga.impl.backup.proto.ProtoBackupImport import suwayomi.tachidesk.manga.impl.backup.proto.ProtoBackupImport
import suwayomi.tachidesk.manga.impl.backup.proto.ProtoBackupValidator
import suwayomi.tachidesk.server.JavalinSetup import suwayomi.tachidesk.server.JavalinSetup
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.Date import java.util.Date
@@ -77,7 +78,7 @@ object BackupController {
/** expects a Tachiyomi protobuf backup in the body */ /** expects a Tachiyomi protobuf backup in the body */
fun protobufImport(ctx: Context) { fun protobufImport(ctx: Context) {
ctx.result( ctx.json(
JavalinSetup.future { JavalinSetup.future {
ProtoBackupImport.performRestore(ctx.bodyAsInputStream()) ProtoBackupImport.performRestore(ctx.bodyAsInputStream())
} }
@@ -86,7 +87,7 @@ object BackupController {
/** expects a Tachiyomi protobuf backup as a file upload, the file must be named "backup.proto.gz" */ /** expects a Tachiyomi protobuf backup as a file upload, the file must be named "backup.proto.gz" */
fun protobufImportFile(ctx: Context) { fun protobufImportFile(ctx: Context) {
ctx.result( ctx.json(
JavalinSetup.future { JavalinSetup.future {
ProtoBackupImport.performRestore(ctx.uploadedFile("backup.proto.gz")!!.content) ProtoBackupImport.performRestore(ctx.uploadedFile("backup.proto.gz")!!.content)
} }
@@ -94,7 +95,7 @@ object BackupController {
} }
/** returns a Tachiyomi protobuf backup created from the current database as a body */ /** returns a Tachiyomi protobuf backup created from the current database as a body */
fun protobufExport(ctx: Context) { // TODO fun protobufExport(ctx: Context) {
ctx.contentType("application/octet-stream") ctx.contentType("application/octet-stream")
ctx.result( ctx.result(
JavalinSetup.future { JavalinSetup.future {
@@ -131,4 +132,22 @@ object BackupController {
} }
) )
} }
/** Reports missing sources and trackers, expects a Tachiyomi protobuf backup in the body */
fun protobufValidate(ctx: Context) { // TODO
ctx.json(
JavalinSetup.future {
ProtoBackupValidator.validate(ctx.bodyAsInputStream())
}
)
}
/** Reports missing sources and trackers, expects a Tachiyomi protobuf backup as a file upload, the file must be named "backup.proto.gz" */
fun protobufValidateFile(ctx: Context) {
ctx.json(
JavalinSetup.future {
ProtoBackupValidator.validate(ctx.uploadedFile("backup.proto.gz")!!.content)
}
)
}
} }

View File

@@ -79,6 +79,7 @@ object ProtoBackupImport : ProtoBackupBase() {
""".trimIndent() """.trimIndent()
} }
println("fek fek")
return validationResult return validationResult
} }

View File

@@ -7,11 +7,16 @@ package suwayomi.tachidesk.manga.impl.backup.proto
* License, v. 2.0. If a copy of the MPL was not distributed with this * License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
import okio.buffer
import okio.gzip
import okio.source
import org.jetbrains.exposed.sql.select import org.jetbrains.exposed.sql.select
import org.jetbrains.exposed.sql.transactions.transaction import org.jetbrains.exposed.sql.transactions.transaction
import suwayomi.tachidesk.manga.impl.backup.AbstractBackupValidator import suwayomi.tachidesk.manga.impl.backup.AbstractBackupValidator
import suwayomi.tachidesk.manga.impl.backup.proto.models.Backup import suwayomi.tachidesk.manga.impl.backup.proto.models.Backup
import suwayomi.tachidesk.manga.impl.backup.proto.models.BackupSerializer
import suwayomi.tachidesk.manga.model.table.SourceTable import suwayomi.tachidesk.manga.model.table.SourceTable
import java.io.InputStream
object ProtoBackupValidator : AbstractBackupValidator() { object ProtoBackupValidator : AbstractBackupValidator() {
fun validate(backup: Backup): ValidationResult { fun validate(backup: Backup): ValidationResult {
@@ -42,4 +47,11 @@ object ProtoBackupValidator : AbstractBackupValidator() {
return ValidationResult(missingSources, missingTrackers) return ValidationResult(missingSources, missingTrackers)
} }
fun validate(sourceStream: InputStream): ValidationResult {
val backupString = sourceStream.source().gzip().buffer().use { it.readByteArray() }
val backup = ProtoBackupImport.parser.decodeFromByteArray(BackupSerializer, backupString)
return validate(backup)
}
} }