From 510136e07f90687f607441aae25ad05eb02d80c8 Mon Sep 17 00:00:00 2001 From: Stefan Zermatten Date: Mon, 20 Dec 2021 12:20:50 +0200 Subject: [PATCH] When restoring archived files, migration happens automatically --- .../archive/methods/archiveCreatureToFile.js | 2 +- .../methods/restoreCreatureFromFile.js | 5 ++-- .../migrations/server/2.0-beta.33-dbv1.js | 2 +- .../migrations/server/migrateArchive.js | 28 +++++++++++++++++++ 4 files changed, 33 insertions(+), 4 deletions(-) create mode 100644 app/imports/migrations/server/migrateArchive.js diff --git a/app/imports/api/creature/archive/methods/archiveCreatureToFile.js b/app/imports/api/creature/archive/methods/archiveCreatureToFile.js index d3c6f76f..1d15e85f 100644 --- a/app/imports/api/creature/archive/methods/archiveCreatureToFile.js +++ b/app/imports/api/creature/archive/methods/archiveCreatureToFile.js @@ -18,8 +18,8 @@ export function getArchiveObj(creatureId){ const logs = CreatureLogs.find({creatureId}).fetch(); let archiveCreature = { meta: { - archiveDate: new Date(), schemaVersion: SCHEMA_VERSION, + archiveDate: new Date(), }, creature, properties, diff --git a/app/imports/api/creature/archive/methods/restoreCreatureFromFile.js b/app/imports/api/creature/archive/methods/restoreCreatureFromFile.js index 8ae3ba88..9b1a9de6 100644 --- a/app/imports/api/creature/archive/methods/restoreCreatureFromFile.js +++ b/app/imports/api/creature/archive/methods/restoreCreatureFromFile.js @@ -9,15 +9,16 @@ import Experiences from '/imports/api/creature/experience/Experiences.js'; import { removeCreatureWork } from '/imports/api/creature/creatures/methods/removeCreature.js'; import ArchiveCreatureFiles from '/imports/api/creature/archive/ArchiveCreatureFiles.js'; import readFile from '/imports/api/creature/archive/methods/readFile.js'; +import migrateArchive from '/imports/migrations/server/migrateArchive.js'; function restoreCreature(file, archive){ - if (SCHEMA_VERSION < file.meta.schemaVersion){ + if (SCHEMA_VERSION < archive.meta.schemaVersion){ throw new Meteor.Error('Incompatible', 'The archive file is from a newer version. Update required to read.') } // Migrate and verify the archive meets the current schema - // migrateArchive(archive, file.meta.schemaVersion); + migrateArchive(archive); // Insert the creature sub documents // They still have their original _id's diff --git a/app/imports/migrations/server/2.0-beta.33-dbv1.js b/app/imports/migrations/server/2.0-beta.33-dbv1.js index 625ad6e3..b16aa7e3 100644 --- a/app/imports/migrations/server/2.0-beta.33-dbv1.js +++ b/app/imports/migrations/server/2.0-beta.33-dbv1.js @@ -61,7 +61,7 @@ function migrateCollection({collection, reversed}){ bulk.execute(); } -export default function migrateProperty({collection, reversed, prop}){ +export function migrateProperty({collection, reversed, prop}){ const transforms = [ ...(transformsByPropType[prop.type] || []), {from: 'dependencies'} diff --git a/app/imports/migrations/server/migrateArchive.js b/app/imports/migrations/server/migrateArchive.js new file mode 100644 index 00000000..42f04c26 --- /dev/null +++ b/app/imports/migrations/server/migrateArchive.js @@ -0,0 +1,28 @@ +import CreatureProperties from '/imports/api/creature/creatureProperties/CreatureProperties.js'; + +/* eslint no-fallthrough: "off" -- Using switch fallthrough to run all +migration steps after the current version of the file. */ +export default function migrateArchive(archive){ + switch (archive.meta.schemaVersion){ + // V1 of DiceCloud + case 'version1': + migrateLegacyArchive(archive); + // V2 of DiceCloud, Schema version 1 + case 1: + cleanAt1(archive); + } +} + +function migrateLegacyArchive(archive){ + // TODO: + throw 'Not implemented'; +} + +function cleanAt1(archive){ + archive.properties.map(prop => { + const schema = CreatureProperties.simpleSchema(prop); + const cleanProp = schema.clean(prop); + schema.validate(cleanProp); + return cleanProp; + }); +}