From a96c2066be52f58b607684ebb3604f76420d2162 Mon Sep 17 00:00:00 2001 From: Syer10 Date: Tue, 30 Nov 2021 17:54:26 -0500 Subject: [PATCH] Implement migrations --- build.gradle.kts | 3 +++ buildSrc/src/main/kotlin/Config.kt | 3 +++ src/main/kotlin/ca/gosyer/data/DataModule.kt | 10 +++++++ .../data/migration/MigrationPreferences.kt | 16 +++++++++++ .../ca/gosyer/data/migration/Migrations.kt | 27 +++++++++++++++++++ src/main/kotlin/ca/gosyer/ui/main/main.kt | 3 +++ 6 files changed, 62 insertions(+) create mode 100644 src/main/kotlin/ca/gosyer/data/migration/MigrationPreferences.kt create mode 100644 src/main/kotlin/ca/gosyer/data/migration/Migrations.kt diff --git a/build.gradle.kts b/build.gradle.kts index 0e3b3601..2b677f82 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,3 +1,4 @@ +import Config.migrationCode import Config.serverCode import Config.tachideskVersion import org.gradle.jvm.tasks.Jar @@ -228,7 +229,9 @@ buildConfig { buildConfigField("String", "NAME", project.name.wrap()) buildConfigField("String", "VERSION", project.version.toString().wrap()) + buildConfigField("int", "MIGRATION_CODE", migrationCode.toString()) + // Tachidesk buildConfigField("boolean", "DEBUG", project.hasProperty("debugApp").toString()) buildConfigField("String", "TACHIDESK_SP_VERSION", tachideskVersion.wrap()) buildConfigField("int", "SERVER_CODE", serverCode.toString()) diff --git a/buildSrc/src/main/kotlin/Config.kt b/buildSrc/src/main/kotlin/Config.kt index b176b78f..fbc0c861 100644 --- a/buildSrc/src/main/kotlin/Config.kt +++ b/buildSrc/src/main/kotlin/Config.kt @@ -1,6 +1,9 @@ import org.gradle.api.JavaVersion object Config { + const val migrationCode = 1 + + // Tachidesk const val tachideskVersion = "v0.6.0" // Match this to the Tachidesk-Server commit count const val serverCode = 1049 diff --git a/src/main/kotlin/ca/gosyer/data/DataModule.kt b/src/main/kotlin/ca/gosyer/data/DataModule.kt index 3ebb326d..35298525 100644 --- a/src/main/kotlin/ca/gosyer/data/DataModule.kt +++ b/src/main/kotlin/ca/gosyer/data/DataModule.kt @@ -12,6 +12,8 @@ import ca.gosyer.data.download.DownloadService import ca.gosyer.data.extension.ExtensionPreferences import ca.gosyer.data.library.LibraryPreferences import ca.gosyer.data.library.LibraryUpdateService +import ca.gosyer.data.migration.MigrationPreferences +import ca.gosyer.data.migration.Migrations import ca.gosyer.data.reader.ReaderPreferences import ca.gosyer.data.server.Http import ca.gosyer.data.server.HttpProvider @@ -65,6 +67,10 @@ val DataModule = module { .toProviderInstance { UiPreferences(preferenceFactory.create("ui")) } .providesSingleton() + bind() + .toProviderInstance { MigrationPreferences(preferenceFactory.create("migration")) } + .providesSingleton() + bind() .toProvider(HttpProvider::class) .providesSingleton() @@ -104,4 +110,8 @@ val DataModule = module { bind() .toClass() .singleton() + + bind() + .toClass() + .singleton() } diff --git a/src/main/kotlin/ca/gosyer/data/migration/MigrationPreferences.kt b/src/main/kotlin/ca/gosyer/data/migration/MigrationPreferences.kt new file mode 100644 index 00000000..aa53bd20 --- /dev/null +++ b/src/main/kotlin/ca/gosyer/data/migration/MigrationPreferences.kt @@ -0,0 +1,16 @@ +/* + * 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/. + */ + +package ca.gosyer.data.migration + +import ca.gosyer.common.prefs.Preference +import ca.gosyer.common.prefs.PreferenceStore + +class MigrationPreferences(private val preferenceStore: PreferenceStore) { + fun version(): Preference { + return preferenceStore.getInt("version", 0) + } +} diff --git a/src/main/kotlin/ca/gosyer/data/migration/Migrations.kt b/src/main/kotlin/ca/gosyer/data/migration/Migrations.kt new file mode 100644 index 00000000..c977699b --- /dev/null +++ b/src/main/kotlin/ca/gosyer/data/migration/Migrations.kt @@ -0,0 +1,27 @@ +/* + * 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/. + */ + +package ca.gosyer.data.migration + +import ca.gosyer.build.BuildConfig +import ca.gosyer.data.reader.ReaderPreferences +import javax.inject.Inject + +class Migrations @Inject constructor( + private val migrationPreferences: MigrationPreferences, + private val readerPreferences: ReaderPreferences +) { + + fun runMigrations() { + val code = migrationPreferences.version().get() + if (code <= 0) { + readerPreferences.modes().get().forEach { + readerPreferences.getMode(it).direction().delete() + } + migrationPreferences.version().set(BuildConfig.MIGRATION_CODE) + } + } +} diff --git a/src/main/kotlin/ca/gosyer/ui/main/main.kt b/src/main/kotlin/ca/gosyer/ui/main/main.kt index 343dfcf0..fc68cf3e 100644 --- a/src/main/kotlin/ca/gosyer/ui/main/main.kt +++ b/src/main/kotlin/ca/gosyer/ui/main/main.kt @@ -27,6 +27,7 @@ import androidx.compose.ui.window.rememberWindowState import ca.gosyer.build.BuildConfig import ca.gosyer.core.logging.initializeLogger import ca.gosyer.data.DataModule +import ca.gosyer.data.migration.Migrations import ca.gosyer.data.server.ServerService import ca.gosyer.data.server.ServerService.ServerResult import ca.gosyer.data.translation.XmlResourceBundle @@ -82,6 +83,8 @@ suspend fun main() { DataModule ) + scope.getInstance().runMigrations() + val serverService = scope.getInstance() val uiPreferences = scope.getInstance()