From 8489ef5ec0f1fae7a7f3947fe5b50b6eef18b76e Mon Sep 17 00:00:00 2001 From: Stefan Zermatten Date: Mon, 11 Feb 2019 13:04:14 +0200 Subject: [PATCH] Fixed restoring characters not working correctly for sub documents --- .../views/characterList/characterList.js | 12 +--------- .../characterRestoreDialog.html | 3 +++ .../characterRestoreDialog.js | 21 ++++++++++++++++-- app/lib/functions/backupRestoreCharacter.js | 22 ++++++++++++++++--- 4 files changed, 42 insertions(+), 16 deletions(-) diff --git a/app/client/views/characterList/characterList.js b/app/client/views/characterList/characterList.js index 53f6940b..f1113243 100644 --- a/app/client/views/characterList/characterList.js +++ b/app/client/views/characterList/characterList.js @@ -86,17 +86,7 @@ Template.characterList.events({ template: "characterRestoreDialog", element: event.currentTarget, callback(dump){ - if (!dump) return; - dump.character.name += " - Restored" - dump.character.owner = Meteor.userId(); - dump.character.readers = []; - dump.character.writers = []; - giveCharacterDumpNewIds(dump); - restoreCharacter(dump); - Router.go("characterSheet", { - _id: dump.character._id, - urlName: dump.character.urlName || '-', - }); + return; }, }) }, diff --git a/app/client/views/characterList/characterRestoreDialog/characterRestoreDialog.html b/app/client/views/characterList/characterRestoreDialog/characterRestoreDialog.html index d37292cb..5ff68c04 100644 --- a/app/client/views/characterList/characterRestoreDialog/characterRestoreDialog.html +++ b/app/client/views/characterList/characterRestoreDialog/characterRestoreDialog.html @@ -17,6 +17,9 @@ {{error}}

{{/if}} + {{#if loading}} + + {{/if}}
diff --git a/app/client/views/characterList/characterRestoreDialog/characterRestoreDialog.js b/app/client/views/characterList/characterRestoreDialog/characterRestoreDialog.js index 560a2429..ebc6a4dd 100644 --- a/app/client/views/characterList/characterRestoreDialog/characterRestoreDialog.js +++ b/app/client/views/characterList/characterRestoreDialog/characterRestoreDialog.js @@ -2,14 +2,18 @@ Template.characterRestoreDialog.onCreated(function(){ this.dump = {}; this.valid = new ReactiveVar(false); this.error = new ReactiveVar(null); + this.loading = new ReactiveVar(false); }); Template.characterRestoreDialog.helpers({ invalid(){ return !Template.instance().valid.get(); }, - error(){ + error(){ return Template.instance().error.get(); + }, + loading(){ + return Template.instance().loading.get(); }, }); @@ -44,6 +48,19 @@ Template.characterRestoreDialog.events({ popDialogStack(); }, "click .addButton": function(event, instance){ - popDialogStack(instance.dump); + let dump = instance.dump; + if (!dump) return; + Meteor.call('restoreCharacter', dump, (e, char) => { + instance.loading.set(false); + if (!char){ + instance.error.set(e.message) + } else { + popDialogStack(); + Router.go("characterSheet", { + _id: char._id, + urlName: char.urlName || '-', + }); + } + }); }, }); diff --git a/app/lib/functions/backupRestoreCharacter.js b/app/lib/functions/backupRestoreCharacter.js index 9863d12f..31fced03 100644 --- a/app/lib/functions/backupRestoreCharacter.js +++ b/app/lib/functions/backupRestoreCharacter.js @@ -73,11 +73,27 @@ giveCharacterDumpNewIds = function(characterDump){ } restoreCharacter = function(characterDump){ - Characters.insert(characterDump.character); + Characters.direct.insert(characterDump.character); for (collectionName in characterDump.collections){ let collection = Meteor.Collection.get(collectionName); - for (doc in characterDump[collectionName]){ - collection.insert(doc); + for (doc of characterDump.collections[collectionName]){ + // delete problematic keys that shouldn't ever be available on insert + delete doc.restoredAt; + delete doc.restoredBy; + // Insert the doc with no hooks + collection.direct.insert(doc); } } }; + +Meteor.methods({ + restoreCharacter(characterDump){ + characterDump.character.name += " - Restored" + characterDump.character.owner = Meteor.userId(); + characterDump.character.readers = []; + characterDump.character.writers = []; + giveCharacterDumpNewIds(characterDump); + restoreCharacter(characterDump); + return characterDump.character + }, +});