From b12556120cc669e18ccfe8928b282f4c2cb25616 Mon Sep 17 00:00:00 2001 From: DJj123dj <80536295+DJj123dj@users.noreply.github.com> Date: Mon, 17 Feb 2025 19:44:18 +0100 Subject: [PATCH] Made database migration compatible with plugins --- src/core/startup/init.ts | 16 ++++++++++++++-- src/core/startup/manageMigration.ts | 24 +++++++++++++++++++++++- src/core/startup/migration.ts | 6 ++++++ src/index.ts | 7 +++++-- 4 files changed, 48 insertions(+), 5 deletions(-) diff --git a/src/core/startup/init.ts b/src/core/startup/init.ts index 6f0cf62..bd39e7b 100644 --- a/src/core/startup/init.ts +++ b/src/core/startup/init.ts @@ -112,7 +112,7 @@ export interface ODUtilities { * * It shouldn't be used by plugins because this is an internal API feature! */ - ODVersionMigration:new (version:api.ODVersion,func:() => void|Promise) => ODVersionMigration + ODVersionMigration:new (version:api.ODVersion,func:() => void|Promise,afterInitFunc:() => void|Promise) => ODVersionMigration } /**## ODVersionMigration `utility class` @@ -125,10 +125,13 @@ export class ODVersionMigration { version: api.ODVersion /**The migration function */ #func: () => void|Promise + /**The migration function */ + #afterInitFunc: () => void|Promise - constructor(version:api.ODVersion,func:() => void|Promise){ + constructor(version:api.ODVersion,func:() => void|Promise,afterInitFunc:() => void|Promise){ this.version = version this.#func = func + this.#afterInitFunc = afterInitFunc } /**Run this version migration as a plugin. Returns `false` when someting goes wrong. */ async migrate(): Promise { @@ -139,6 +142,15 @@ export class ODVersionMigration { return false } } + /**Run this version migration as a plugin. Returns `false` when someting goes wrong. */ + async migrateAfterInit(): Promise { + try{ + await this.#afterInitFunc() + return true + }catch{ + return false + } + } } export const utilities: ODUtilities = { diff --git a/src/core/startup/manageMigration.ts b/src/core/startup/manageMigration.ts index 07bc19c..8ac3f1c 100644 --- a/src/core/startup/manageMigration.ts +++ b/src/core/startup/manageMigration.ts @@ -29,6 +29,8 @@ export const loadVersionMigrationSystem = async () => { //LEAVE MIGRATION CONTEXT await unloadMigrationContext() + + return lastVersion } const preloadMigrationContext = async () => { @@ -71,7 +73,27 @@ const loadAllVersionMigrations = async (lastVersion:api.ODVersion) => { if (migration.version.compare(lastVersion) == "higher"){ const success = await migration.migrate() if (success) opendiscord.log("Migrated data to "+migration.version.toString()+"!","debug",[ - {key:"success",value:success ? "true" : "false"} + {key:"success",value:success ? "true" : "false"}, + {key:"afterInit",value:"false"} + ]) + } + } +} + +export const loadAllAfterInitVersionMigrations = async (lastVersion:api.ODVersion) => { + const migrations = (await import("./migration.js")).migrations + migrations.sort((a,b) => { + const comparison = a.version.compare(b.version) + if (comparison == "equal") return 0 + else if (comparison == "higher") return 1 + else return -1 + }) + for (const migration of migrations){ + if (migration.version.compare(lastVersion) == "higher"){ + const success = await migration.migrateAfterInit() + if (success) opendiscord.log("Migrated data to "+migration.version.toString()+"!","debug",[ + {key:"success",value:success ? "true" : "false"}, + {key:"afterInit",value:"true"} ]) } } diff --git a/src/core/startup/migration.ts b/src/core/startup/migration.ts index 46e72cf..d3af5f0 100644 --- a/src/core/startup/migration.ts +++ b/src/core/startup/migration.ts @@ -3,6 +3,12 @@ import {opendiscord, api, utilities} from "../../index" export const migrations = [ //MIGRATE TO v4.0.0 new utilities.ODVersionMigration(api.ODVersion.fromString("opendiscord:version","v4.0.0"),async () => { + //MIGRATE BEFORE STARTUP + + //nothing needs to be transferred :) + },() => { + //MIGRATE AFTER INITIAL STARTUP (plugins, flags, config, database, language, ... => loaded) + //nothing needs to be transferred :) }) ] \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index 507e744..1bb3b3e 100644 --- a/src/index.ts +++ b/src/index.ts @@ -76,8 +76,8 @@ const main = async () => { } }) - //handle data migration - await (await import("./core/startup/manageMigration.js")).loadVersionMigrationSystem() + //handle data migration (PART 1) + const lastVersion = await (await import("./core/startup/manageMigration.js")).loadVersionMigrationSystem() //load plugins if (opendiscord.defaults.getDefault("pluginLoading")){ @@ -222,6 +222,9 @@ const main = async () => { await opendiscord.events.get("afterLanguagesSelected").emit([opendiscord.languages.get(languageId),opendiscord.languages.get(backupLanguageId),opendiscord.languages]) } + + //handle data migration (PART 2) + if (lastVersion) await (await import("./core/startup/manageMigration.js")).loadAllAfterInitVersionMigrations(lastVersion) //load config checker opendiscord.log("Loading config checker...","system")