Skip to content

Commit 0d79ac6

Browse files
authored
Feature/backup import add backup flags (#1697)
* Add backup flags to backup restore * Cleanup default backup flags handling * Optionally exclude manga from backup
1 parent 3ce9f72 commit 0d79ac6

File tree

7 files changed

+213
-135
lines changed

7 files changed

+213
-135
lines changed

server/src/main/kotlin/suwayomi/tachidesk/graphql/mutations/BackupMutation.kt

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
package suwayomi.tachidesk.graphql.mutations
22

3+
import com.expediagroup.graphql.generator.annotations.GraphQLDeprecated
34
import io.javalin.http.UploadedFile
45
import kotlinx.coroutines.flow.first
56
import kotlinx.coroutines.withTimeout
67
import suwayomi.tachidesk.graphql.directives.RequireAuth
78
import suwayomi.tachidesk.graphql.server.TemporaryFileStorage
89
import suwayomi.tachidesk.graphql.types.BackupRestoreStatus
10+
import suwayomi.tachidesk.graphql.types.PartialBackupFlags
911
import suwayomi.tachidesk.graphql.types.toStatus
1012
import suwayomi.tachidesk.manga.impl.backup.BackupFlags
1113
import suwayomi.tachidesk.manga.impl.backup.proto.ProtoBackupExport
@@ -19,6 +21,7 @@ class BackupMutation {
1921
data class RestoreBackupInput(
2022
val clientMutationId: String? = null,
2123
val backup: UploadedFile,
24+
val flags: PartialBackupFlags? = null,
2225
)
2326

2427
data class RestoreBackupPayload(
@@ -29,10 +32,14 @@ class BackupMutation {
2932

3033
@RequireAuth
3134
fun restoreBackup(input: RestoreBackupInput): CompletableFuture<RestoreBackupPayload> {
32-
val (clientMutationId, backup) = input
35+
val (clientMutationId, backup, flags) = input
3336

3437
return future {
35-
val restoreId = ProtoBackupImport.restore(backup.content())
38+
val restoreId =
39+
ProtoBackupImport.restore(
40+
backup.content(),
41+
BackupFlags.fromPartial(flags),
42+
)
3643

3744
withTimeout(10.seconds) {
3845
ProtoBackupImport.notifyFlow.first {
@@ -46,11 +53,18 @@ class BackupMutation {
4653

4754
data class CreateBackupInput(
4855
val clientMutationId: String? = null,
56+
val flags: PartialBackupFlags? = null,
57+
@GraphQLDeprecated("Will get removed", replaceWith = ReplaceWith("flags"))
4958
val includeChapters: Boolean? = null,
59+
@GraphQLDeprecated("Will get removed", replaceWith = ReplaceWith("flags"))
5060
val includeCategories: Boolean? = null,
61+
@GraphQLDeprecated("Will get removed", replaceWith = ReplaceWith("flags"))
5162
val includeTracking: Boolean? = null,
63+
@GraphQLDeprecated("Will get removed", replaceWith = ReplaceWith("flags"))
5264
val includeHistory: Boolean? = null,
65+
@GraphQLDeprecated("Will get removed", replaceWith = ReplaceWith("flags"))
5366
val includeClientData: Boolean? = null,
67+
@GraphQLDeprecated("Will get removed", replaceWith = ReplaceWith("flags"))
5468
val includeServerSettings: Boolean? = null,
5569
)
5670

@@ -65,15 +79,19 @@ class BackupMutation {
6579

6680
val backup =
6781
ProtoBackupExport.createBackup(
68-
BackupFlags(
69-
includeManga = true,
70-
includeCategories = input?.includeCategories ?: true,
71-
includeChapters = input?.includeChapters ?: true,
72-
includeTracking = input?.includeTracking ?: true,
73-
includeHistory = input?.includeHistory ?: true,
74-
includeClientData = input?.includeClientData ?: true,
75-
includeServerSettings = input?.includeServerSettings ?: true,
76-
),
82+
if (input?.flags != null) {
83+
BackupFlags.fromPartial(input.flags)
84+
} else {
85+
BackupFlags(
86+
includeManga = BackupFlags.DEFAULT.includeManga,
87+
includeCategories = input?.includeCategories ?: BackupFlags.DEFAULT.includeCategories,
88+
includeChapters = input?.includeChapters ?: BackupFlags.DEFAULT.includeChapters,
89+
includeTracking = input?.includeTracking ?: BackupFlags.DEFAULT.includeTracking,
90+
includeHistory = input?.includeHistory ?: BackupFlags.DEFAULT.includeHistory,
91+
includeClientData = input?.includeClientData ?: BackupFlags.DEFAULT.includeClientData,
92+
includeServerSettings = input?.includeServerSettings ?: BackupFlags.DEFAULT.includeServerSettings,
93+
)
94+
},
7795
)
7896

7997
TemporaryFileStorage.saveFile(filename, backup)

server/src/main/kotlin/suwayomi/tachidesk/graphql/types/BackupTypes.kt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,18 @@
11
package suwayomi.tachidesk.graphql.types
22

3+
import suwayomi.tachidesk.manga.impl.backup.IBackupFlags
34
import suwayomi.tachidesk.manga.impl.backup.proto.ProtoBackupImport
45

6+
data class PartialBackupFlags(
7+
override val includeManga: Boolean?,
8+
override val includeCategories: Boolean?,
9+
override val includeChapters: Boolean?,
10+
override val includeTracking: Boolean?,
11+
override val includeHistory: Boolean?,
12+
override val includeClientData: Boolean?,
13+
override val includeServerSettings: Boolean?,
14+
) : IBackupFlags
15+
516
enum class BackupRestoreState {
617
IDLE,
718
SUCCESS,

server/src/main/kotlin/suwayomi/tachidesk/manga/controller/BackupController.kt

Lines changed: 2 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -89,17 +89,7 @@ object BackupController {
8989
ctx.contentType("application/octet-stream")
9090
ctx.future {
9191
future {
92-
ProtoBackupExport.createBackup(
93-
BackupFlags(
94-
includeManga = true,
95-
includeCategories = true,
96-
includeChapters = true,
97-
includeTracking = true,
98-
includeHistory = true,
99-
includeClientData = true,
100-
includeServerSettings = true,
101-
),
102-
)
92+
ProtoBackupExport.createBackup(BackupFlags.DEFAULT)
10393
}.thenApply { ctx.result(it) }
10494
}
10595
},
@@ -124,17 +114,7 @@ object BackupController {
124114
ctx.header("Content-Disposition", """attachment; filename="${Backup.getFilename()}"""")
125115
ctx.future {
126116
future {
127-
ProtoBackupExport.createBackup(
128-
BackupFlags(
129-
includeManga = true,
130-
includeCategories = true,
131-
includeChapters = true,
132-
includeTracking = true,
133-
includeHistory = true,
134-
includeClientData = true,
135-
includeServerSettings = true,
136-
),
137-
)
117+
ProtoBackupExport.createBackup(BackupFlags.DEFAULT)
138118
}.thenApply { ctx.result(it) }
139119
}
140120
},
Lines changed: 44 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,54 @@
11
package suwayomi.tachidesk.manga.impl.backup
22

3+
import suwayomi.tachidesk.manga.impl.backup.proto.models.Backup
4+
35
/*
46
* Copyright (C) Contributors to the Suwayomi project
57
*
68
* This Source Code Form is subject to the terms of the Mozilla Public
79
* License, v. 2.0. If a copy of the MPL was not distributed with this
810
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
911

12+
interface IBackupFlags {
13+
val includeManga: Boolean?
14+
val includeCategories: Boolean?
15+
val includeChapters: Boolean?
16+
val includeTracking: Boolean?
17+
val includeHistory: Boolean?
18+
val includeClientData: Boolean?
19+
val includeServerSettings: Boolean?
20+
}
21+
1022
data class BackupFlags(
11-
val includeManga: Boolean,
12-
val includeCategories: Boolean,
13-
val includeChapters: Boolean,
14-
val includeTracking: Boolean,
15-
val includeHistory: Boolean,
16-
val includeClientData: Boolean,
17-
val includeServerSettings: Boolean,
18-
)
23+
override val includeManga: Boolean,
24+
override val includeCategories: Boolean,
25+
override val includeChapters: Boolean,
26+
override val includeTracking: Boolean,
27+
override val includeHistory: Boolean,
28+
override val includeClientData: Boolean,
29+
override val includeServerSettings: Boolean,
30+
) : IBackupFlags {
31+
companion object {
32+
val DEFAULT =
33+
BackupFlags(
34+
includeManga = true,
35+
includeCategories = true,
36+
includeChapters = true,
37+
includeTracking = true,
38+
includeHistory = true,
39+
includeClientData = true,
40+
includeServerSettings = true,
41+
)
42+
43+
fun fromPartial(partialFlags: IBackupFlags?): BackupFlags =
44+
BackupFlags(
45+
includeManga = partialFlags?.includeManga ?: DEFAULT.includeManga,
46+
includeCategories = partialFlags?.includeCategories ?: DEFAULT.includeCategories,
47+
includeChapters = partialFlags?.includeChapters ?: DEFAULT.includeChapters,
48+
includeTracking = partialFlags?.includeTracking ?: DEFAULT.includeTracking,
49+
includeHistory = partialFlags?.includeHistory ?: DEFAULT.includeHistory,
50+
includeClientData = partialFlags?.includeClientData ?: DEFAULT.includeClientData,
51+
includeServerSettings = partialFlags?.includeServerSettings ?: DEFAULT.includeServerSettings,
52+
)
53+
}
54+
}

server/src/main/kotlin/suwayomi/tachidesk/manga/impl/backup/proto/ProtoBackupExport.kt

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import okio.Sink
2121
import okio.buffer
2222
import okio.gzip
2323
import org.jetbrains.exposed.sql.Query
24+
import org.jetbrains.exposed.sql.ResultRow
2425
import org.jetbrains.exposed.sql.SortOrder
2526
import org.jetbrains.exposed.sql.selectAll
2627
import org.jetbrains.exposed.sql.transactions.transaction
@@ -118,17 +119,7 @@ object ProtoBackupExport : ProtoBackupBase() {
118119
private fun createAutomatedBackup() {
119120
logger.info { "Creating automated backup..." }
120121

121-
createBackup(
122-
BackupFlags(
123-
includeManga = true,
124-
includeCategories = true,
125-
includeChapters = true,
126-
includeTracking = true,
127-
includeHistory = true,
128-
includeClientData = true,
129-
includeServerSettings = true,
130-
),
131-
).use { input ->
122+
createBackup(BackupFlags.DEFAULT).use { input ->
132123
val automatedBackupDir = File(applicationDirs.automatedBackupRoot)
133124
automatedBackupDir.mkdirs()
134125

@@ -179,7 +170,12 @@ object ProtoBackupExport : ProtoBackupBase() {
179170
fun createBackup(flags: BackupFlags): InputStream {
180171
// Create root object
181172

182-
val databaseManga = transaction { MangaTable.selectAll().where { MangaTable.inLibrary eq true } }
173+
val databaseManga =
174+
if (flags.includeManga) {
175+
transaction { MangaTable.selectAll().where { MangaTable.inLibrary eq true }.toList() }
176+
} else {
177+
emptyList()
178+
}
183179

184180
val backup: Backup =
185181
transaction {
@@ -204,7 +200,7 @@ object ProtoBackupExport : ProtoBackupBase() {
204200
}
205201

206202
private fun backupManga(
207-
databaseManga: Query,
203+
databaseManga: List<ResultRow>,
208204
flags: BackupFlags,
209205
): List<BackupManga> =
210206
databaseManga.map { mangaRow ->
@@ -336,7 +332,7 @@ object ProtoBackupExport : ProtoBackupBase() {
336332
}
337333

338334
private fun backupExtensionInfo(
339-
mangas: Query,
335+
mangas: List<ResultRow>,
340336
flags: BackupFlags,
341337
): List<BackupSource> {
342338
val inLibraryMangaSourceIds =

0 commit comments

Comments
 (0)