From 7609e916c65b8cfffc2005710fcd95f175a0df76 Mon Sep 17 00:00:00 2001 From: Stefan Zermatten Date: Sat, 23 Apr 2022 09:35:29 +0200 Subject: [PATCH] Implemented remove button on archive files --- .../api/creature/archive/methods/index.js | 1 + .../archive/methods/removeArchiveCreature.js | 47 +++++++++++++++++++ .../dialogStack/DeleteConfirmationDialog.vue | 5 +- app/imports/ui/files/ArchiveFileCard.vue | 23 ++++++++- app/imports/ui/pages/Files.vue | 7 +-- 5 files changed, 75 insertions(+), 8 deletions(-) create mode 100644 app/imports/api/creature/archive/methods/removeArchiveCreature.js diff --git a/app/imports/api/creature/archive/methods/index.js b/app/imports/api/creature/archive/methods/index.js index d3784bde..f2c61b6d 100644 --- a/app/imports/api/creature/archive/methods/index.js +++ b/app/imports/api/creature/archive/methods/index.js @@ -2,3 +2,4 @@ import '/imports/api/creature/archive/methods/archiveCreatureToFile.js'; import '/imports/api/creature/archive/methods/restoreCreatures.js'; import '/imports/api/creature/archive/methods/restoreCreatureFromFile.js'; +import '/imports/api/creature/archive/methods/removeArchiveCreature.js'; diff --git a/app/imports/api/creature/archive/methods/removeArchiveCreature.js b/app/imports/api/creature/archive/methods/removeArchiveCreature.js new file mode 100644 index 00000000..22bf858d --- /dev/null +++ b/app/imports/api/creature/archive/methods/removeArchiveCreature.js @@ -0,0 +1,47 @@ +import SCHEMA_VERSION from '/imports/constants/SCHEMA_VERSION.js'; +import SimpleSchema from 'simpl-schema'; +import { ValidatedMethod } from 'meteor/mdg:validated-method'; +import { RateLimiterMixin } from 'ddp-rate-limiter-mixin'; +import Creatures from '/imports/api/creature/creatures/Creatures.js'; +import CreatureProperties from '/imports/api/creature/creatureProperties/CreatureProperties.js'; +import CreatureLogs from '/imports/api/creature/log/CreatureLogs.js'; +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 assertHasCharactersSlots from '/imports/api/creature/creatures/methods/assertHasCharacterSlots.js'; +import { incrementFileStorageUsed } from '/imports/api/users/methods/updateFileStorageUsed.js'; + +const removeArchiveCreature = new ValidatedMethod({ + name: 'ArchiveCreatureFiles.methods.removeArchiveCreature', + validate: new SimpleSchema({ + 'fileId': { + type: String, + regEx: SimpleSchema.RegEx.Id, + }, + }).validator(), + mixins: [RateLimiterMixin], + rateLimit: { + numRequests: 5, + timeInterval: 5000, + }, + async run({ fileId }) { + // fetch the file + const file = ArchiveCreatureFiles.findOne({ _id: fileId }).get(); + if (!file) { + throw new Meteor.Error('File not found', + 'The requested creature archive does not exist'); + } + // Assert ownership + const userId = file?.userId; + if (!userId || userId !== this.userId) { + throw new Meteor.Error('Permission denied', + 'You can only restore creatures you own'); + } + //Remove the archive once the restore succeeded + ArchiveCreatureFiles.remove({ _id: fileId }); + // Update the user's file storage limits + incrementFileStorageUsed(userId, -file.size); + }, +}); + +export default removeArchiveCreature; diff --git a/app/imports/ui/dialogStack/DeleteConfirmationDialog.vue b/app/imports/ui/dialogStack/DeleteConfirmationDialog.vue index 90fc56c7..3802253b 100644 --- a/app/imports/ui/dialogStack/DeleteConfirmationDialog.vue +++ b/app/imports/ui/dialogStack/DeleteConfirmationDialog.vue @@ -4,8 +4,11 @@ Delete {{ typeName }}
+ + This cannot be undone +

- Type "{{ name }}" to permanenetly delete + Type "{{ name }}" to permanenetly delete.

- + {{ model.meta.creatureName }} @@ -17,6 +17,7 @@ mdi-delete @@ -34,6 +35,7 @@ import restoreCreatureFromFile from '/imports/api/creature/archive/methods/restoreCreatureFromFile.js'; import { snackbar } from '/imports/ui/components/snackbars/SnackbarQueue.js'; import { characterSlotsRemaining } from '/imports/api/creature/creatures/methods/assertHasCharacterSlots.js'; +import removeArchiveCreature from '/imports/api/creature/archive/methods/removeArchiveCreature.js'; export default { props: { @@ -62,7 +64,24 @@ export default { console.error(error); snackbar({text: error.reason}); }); - } + }, + removeArchiveCharacter(){ + let that = this; + this.$store.commit('pushDialogStack', { + component: 'delete-confirmation-dialog', + elementId: `${that.model._id}-archive-card`, + data: { + name: this.model.meta.creatureName, + typeName: 'Character Archive' + }, + callback(confirmation){ + if(!confirmation) return; + removeArchiveCreature.call({fileId: that.model._id}, (error) => { + if (error) console.error(error); + }); + } + }); + }, }, } diff --git a/app/imports/ui/pages/Files.vue b/app/imports/ui/pages/Files.vue index 80977072..376dd53d 100644 --- a/app/imports/ui/pages/Files.vue +++ b/app/imports/ui/pages/Files.vue @@ -28,7 +28,7 @@
- +