diff --git a/server/src/main/kotlin/ir/armor/tachidesk/impl/backup/legacy/LegacyBackupBase.kt b/server/src/main/kotlin/ir/armor/tachidesk/impl/backup/legacy/LegacyBackupBase.kt new file mode 100644 index 00000000..02fcbe4d --- /dev/null +++ b/server/src/main/kotlin/ir/armor/tachidesk/impl/backup/legacy/LegacyBackupBase.kt @@ -0,0 +1,40 @@ +package ir.armor.tachidesk.impl.backup.legacy + +/* + * Copyright (C) Contributors to the Suwayomi project + * + * This Source Code Form is subject to the terms of the Mozilla Public + * 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/. */ + +import com.github.salomonbrys.kotson.registerTypeAdapter +import com.github.salomonbrys.kotson.registerTypeHierarchyAdapter +import com.google.gson.Gson +import com.google.gson.GsonBuilder +import ir.armor.tachidesk.impl.backup.legacy.models.DHistory +import ir.armor.tachidesk.impl.backup.legacy.serializer.CategoryTypeAdapter +import ir.armor.tachidesk.impl.backup.legacy.serializer.ChapterTypeAdapter +import ir.armor.tachidesk.impl.backup.legacy.serializer.HistoryTypeAdapter +import ir.armor.tachidesk.impl.backup.legacy.serializer.MangaTypeAdapter +import ir.armor.tachidesk.impl.backup.legacy.serializer.TrackTypeAdapter +import ir.armor.tachidesk.impl.backup.models.CategoryImpl +import ir.armor.tachidesk.impl.backup.models.ChapterImpl +import ir.armor.tachidesk.impl.backup.models.MangaImpl +import ir.armor.tachidesk.impl.backup.models.TrackImpl + +open class LegacyBackupBase { + internal val parser: Gson = when (version) { + 2 -> GsonBuilder() + .registerTypeAdapter(MangaTypeAdapter.build()) + .registerTypeHierarchyAdapter(ChapterTypeAdapter.build()) + .registerTypeAdapter(CategoryTypeAdapter.build()) + .registerTypeAdapter(HistoryTypeAdapter.build()) + .registerTypeHierarchyAdapter(TrackTypeAdapter.build()) + .create() + else -> throw Exception("Unknown backup version") + } + + companion object { + internal const val version = 2 + } +} diff --git a/server/src/main/kotlin/ir/armor/tachidesk/impl/backup/legacy/LegacyBackupExport.kt b/server/src/main/kotlin/ir/armor/tachidesk/impl/backup/legacy/LegacyBackupExport.kt index 1c35a3cf..593ef068 100644 --- a/server/src/main/kotlin/ir/armor/tachidesk/impl/backup/legacy/LegacyBackupExport.kt +++ b/server/src/main/kotlin/ir/armor/tachidesk/impl/backup/legacy/LegacyBackupExport.kt @@ -7,11 +7,7 @@ package ir.armor.tachidesk.impl.backup.legacy * 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/. */ -import com.github.salomonbrys.kotson.registerTypeAdapter -import com.github.salomonbrys.kotson.registerTypeHierarchyAdapter import com.github.salomonbrys.kotson.set -import com.google.gson.Gson -import com.google.gson.GsonBuilder import com.google.gson.JsonArray import com.google.gson.JsonElement import com.google.gson.JsonObject @@ -19,38 +15,18 @@ import eu.kanade.tachiyomi.source.LocalSource import ir.armor.tachidesk.impl.backup.BackupFlags import ir.armor.tachidesk.impl.backup.legacy.models.Backup import ir.armor.tachidesk.impl.backup.legacy.models.Backup.CURRENT_VERSION -import ir.armor.tachidesk.impl.backup.legacy.models.DHistory -import ir.armor.tachidesk.impl.backup.legacy.serializer.CategoryTypeAdapter -import ir.armor.tachidesk.impl.backup.legacy.serializer.ChapterTypeAdapter -import ir.armor.tachidesk.impl.backup.legacy.serializer.HistoryTypeAdapter -import ir.armor.tachidesk.impl.backup.legacy.serializer.MangaTypeAdapter -import ir.armor.tachidesk.impl.backup.legacy.serializer.TrackTypeAdapter -import ir.armor.tachidesk.impl.backup.models.CategoryImpl import ir.armor.tachidesk.impl.backup.models.ChapterImpl import ir.armor.tachidesk.impl.backup.models.Manga import ir.armor.tachidesk.impl.backup.models.MangaImpl -import ir.armor.tachidesk.impl.backup.models.TrackImpl import ir.armor.tachidesk.impl.util.GetHttpSource.getHttpSource import ir.armor.tachidesk.model.database.ChapterTable import ir.armor.tachidesk.model.database.MangaTable import org.jetbrains.exposed.sql.select import org.jetbrains.exposed.sql.transactions.transaction -object LegacyBackupExport { - const val version = 2 +object LegacyBackupExport : LegacyBackupBase() { - private val parser: Gson = when (version) { - 2 -> GsonBuilder() - .registerTypeAdapter(MangaTypeAdapter.build()) - .registerTypeHierarchyAdapter(ChapterTypeAdapter.build()) - .registerTypeAdapter(CategoryTypeAdapter.build()) - .registerTypeAdapter(HistoryTypeAdapter.build()) - .registerTypeHierarchyAdapter(TrackTypeAdapter.build()) - .create() - else -> throw Exception("Unknown backup version") - } - - suspend fun createBackup(flags: BackupFlags): String? { + suspend fun createLegacyBackup(flags: BackupFlags): String? { // Create root object val root = JsonObject() diff --git a/server/src/main/kotlin/ir/armor/tachidesk/impl/backup/legacy/LegacyBackupImport.kt b/server/src/main/kotlin/ir/armor/tachidesk/impl/backup/legacy/LegacyBackupImport.kt new file mode 100644 index 00000000..ecdb2ec1 --- /dev/null +++ b/server/src/main/kotlin/ir/armor/tachidesk/impl/backup/legacy/LegacyBackupImport.kt @@ -0,0 +1,23 @@ +package ir.armor.tachidesk.impl.backup.legacy + +import com.google.gson.JsonParser +import mu.KotlinLogging +import java.io.InputStream + +/* + * Copyright (C) Contributors to the Suwayomi project + * + * This Source Code Form is subject to the terms of the Mozilla Public + * 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/. */ + +private val logger = KotlinLogging.logger {} + +object LegacyBackupImport : LegacyBackupBase() { + fun restoreLegacyBackup(sourceStream: InputStream) { + val reader = sourceStream.bufferedReader() + val json = JsonParser.parseReader(reader).asJsonObject + + logger.info("$json") + } +} diff --git a/server/src/main/kotlin/ir/armor/tachidesk/server/JavalinSetup.kt b/server/src/main/kotlin/ir/armor/tachidesk/server/JavalinSetup.kt index 43601aec..25cf25b0 100644 --- a/server/src/main/kotlin/ir/armor/tachidesk/server/JavalinSetup.kt +++ b/server/src/main/kotlin/ir/armor/tachidesk/server/JavalinSetup.kt @@ -31,7 +31,8 @@ import ir.armor.tachidesk.impl.Search.sourceSearch import ir.armor.tachidesk.impl.Source.getSource import ir.armor.tachidesk.impl.Source.getSourceList import ir.armor.tachidesk.impl.backup.BackupFlags -import ir.armor.tachidesk.impl.backup.legacy.LegacyBackupExport.createBackup +import ir.armor.tachidesk.impl.backup.legacy.LegacyBackupExport.createLegacyBackup +import ir.armor.tachidesk.impl.backup.legacy.LegacyBackupImport.restoreLegacyBackup import ir.armor.tachidesk.server.util.openInBrowser import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -325,17 +326,17 @@ object JavalinSetup { ctx.json(getCategoryMangaList(categoryId)) } - // expects a Tachiyomi legacy backup file to be uploaded + // expects a Tachiyomi legacy backup json to be uploaded app.get("/api/v1/backup/legacy/import") { ctx -> - TODO() + restoreLegacyBackup(ctx.bodyAsInputStream()) } - // returns a Tachiyomi legacy backup file created from the current database + // returns a Tachiyomi legacy backup json created from the current database app.get("/api/v1/backup/legacy/export") { ctx -> ctx.contentType("application/json") ctx.result( future { - createBackup( + createLegacyBackup( BackupFlags( includeManga = true, includeCategories = true,