From 0260824c2f13cf8307a5edab282483ccf02ff6f0 Mon Sep 17 00:00:00 2001 From: Stefan Zermatten Date: Mon, 11 Feb 2019 10:09:18 +0200 Subject: [PATCH] Made gave backup and restore the ability to change ids for all docs --- app/lib/functions/backupRestoreCharacter.js | 47 ++++++++++++++++++--- 1 file changed, 41 insertions(+), 6 deletions(-) diff --git a/app/lib/functions/backupRestoreCharacter.js b/app/lib/functions/backupRestoreCharacter.js index ba95f4af..d08ef919 100644 --- a/app/lib/functions/backupRestoreCharacter.js +++ b/app/lib/functions/backupRestoreCharacter.js @@ -3,6 +3,7 @@ let characterCollections = [ Attacks, Buffs, Classes, + Conditions, CustomBuffs, Effects, Experiences, @@ -10,21 +11,55 @@ let characterCollections = [ Notes, Proficiencies, SpellLists, + Spells, + TemporaryHitPoints, Items, Containers, ]; -function backupCharacter(charId){ +function dumpCharacter(charId){ let characterDump = {}; - characterDump.characters = [Characters.findOne(charId)]; - characterCollections.map( - c => characterDump[c._name] = c.find({charId}).fetch() - ); + characterDump.character = Characters.findOne(charId); + characterCollections.forEach(c => { + characterDump.collections[c._name] = c.find({charId}).fetch(); + }); return characterDump; }; +function giveCharacterDumpNewIds(characterDump){ + // Give the character a new Id + const newCharId = Random.id(); + characterDump.character._id = newCharId; + + // Give all documents a new Id, and store the mapping from old to new + let idMap = {}; // {oldId: newId} + for (let colName in characterDump.collections){ + for (let doc of characterDump.collections[colName]){ + let oldId = doc._id; + let newId = Random.id(); + doc._id = newId; + idMap[oldId] = newId; + } + } + + // Replace all references to old Ids with new ones + for (let colName in characterDump.collections){ + for (let doc of characterDump.collections[colName]){ + // Replace the character Id with the new one + doc.charId = newCharId; + // Replace the parent reference id with a new id + if (doc.parent && doc.parent.id){ + let newParentId = idMap[doc.parent.id]; + if(!newParentId) throw `Can't find the mapping for id ${doc.parent.id}`; + doc.parent.id = newParentId; + } + } + } +} + function restoreCharacter(characterDump){ - for (collectionName in characterDump){ + Characters.insert(characterDump.character); + for (collectionName in characterDump.collections){ let collection = Meteor.Collection.get(collectionName); for (doc in characterDump[collectionName]){ collection.insert(doc);