ds4/src/module/migrations.ts

88 lines
2.9 KiB
TypeScript
Raw Normal View History

import logger from "./logger";
2021-01-20 22:11:53 +01:00
import { migrate as migrate001 } from "./migrations/001";
2021-02-21 03:40:54 +01:00
import { migrate as migrate002 } from "./migrations/002";
import { migrate as migrate003 } from "./migrations/003";
2021-05-13 19:59:44 +02:00
import { migrate as migrate004 } from "./migrations/004";
2021-02-21 03:40:54 +01:00
import notifications from "./ui/notifications";
2021-01-20 22:11:53 +01:00
async function migrate(): Promise<void> {
2021-02-07 13:51:20 +01:00
if (!game.user?.isGM) {
return;
}
2021-03-22 09:04:45 +01:00
const oldMigrationVersion = game.settings.get("ds4", "systemMigrationVersion");
2021-01-20 22:11:53 +01:00
const targetMigrationVersion = migrations.length;
if (isFirstWorldStart(oldMigrationVersion)) {
game.settings.set("ds4", "systemMigrationVersion", targetMigrationVersion);
return;
}
return migrateFromTo(oldMigrationVersion, targetMigrationVersion);
}
async function migrateFromTo(oldMigrationVersion: number, targetMigrationVersion: number): Promise<void> {
2021-02-07 13:51:20 +01:00
if (!game.user?.isGM) {
return;
}
2021-01-20 22:11:53 +01:00
const migrationsToExecute = migrations.slice(oldMigrationVersion, targetMigrationVersion);
if (migrationsToExecute.length > 0) {
2021-02-21 03:40:54 +01:00
notifications.info(
game.i18n.format("DS4.InfoSystemUpdateStart", {
2021-01-20 22:11:53 +01:00
currentVersion: oldMigrationVersion,
targetVersion: targetMigrationVersion,
}),
{ permanent: true },
);
2021-01-20 22:11:53 +01:00
for (const [i, migration] of migrationsToExecute.entries()) {
const currentMigrationVersion = oldMigrationVersion + i + 1;
logger.info("executing migration script ", currentMigrationVersion);
try {
2021-01-20 22:11:53 +01:00
await migration();
game.settings.set("ds4", "systemMigrationVersion", currentMigrationVersion);
} catch (err) {
2021-02-21 03:40:54 +01:00
notifications.error(
game.i18n.format("DS4.ErrorDuringMigration", {
2021-01-20 22:11:53 +01:00
currentVersion: oldMigrationVersion,
targetVersion: targetMigrationVersion,
migrationVersion: currentMigrationVersion,
}),
{ permanent: true },
);
err.message = `Failed ds4 system migration: ${err.message}`;
logger.error(err);
return;
}
}
2021-02-21 03:40:54 +01:00
notifications.info(
game.i18n.format("DS4.InfoSystemUpdateCompleted", {
2021-01-20 22:11:53 +01:00
currentVersion: oldMigrationVersion,
targetVersion: targetMigrationVersion,
}),
{ permanent: true },
);
}
}
2021-01-20 22:11:53 +01:00
function getTargetMigrationVersion(): number {
return migrations.length;
}
2021-05-13 19:59:44 +02:00
const migrations: Array<() => Promise<void>> = [migrate001, migrate002, migrate003, migrate004];
2021-01-20 22:11:53 +01:00
function isFirstWorldStart(migrationVersion: number): boolean {
return migrationVersion < 0;
}
2021-01-20 22:11:53 +01:00
export const migration = {
migrate: migrate,
migrateFromTo: migrateFromTo,
getTargetMigrationVersion: getTargetMigrationVersion,
};