From 78266a93eeb09ffbe2ef72ef1e2e65b46dedc027 Mon Sep 17 00:00:00 2001 From: Thaum Rystra <9525416+ThaumRystra@users.noreply.github.com> Date: Wed, 17 Apr 2024 09:03:21 +0200 Subject: [PATCH] Some progress on user image uploading --- .../UserImages.ts} | 5 ++ .../api/files/userImages/methods/index.js | 3 + .../userImages/methods/removeUserImage.ts | 45 ++++++++++++ .../ui/components/global/SmartImageInput.vue | 71 +++++++++++++++++++ app/imports/client/ui/files/UserImageCard.vue | 5 +- 5 files changed, 128 insertions(+), 1 deletion(-) rename app/imports/api/files/{UserImages.js => userImages/UserImages.ts} (80%) create mode 100644 app/imports/api/files/userImages/methods/index.js create mode 100644 app/imports/api/files/userImages/methods/removeUserImage.ts create mode 100644 app/imports/client/ui/components/global/SmartImageInput.vue diff --git a/app/imports/api/files/UserImages.js b/app/imports/api/files/userImages/UserImages.ts similarity index 80% rename from app/imports/api/files/UserImages.js rename to app/imports/api/files/userImages/UserImages.ts index 51cf9030..b053e540 100644 --- a/app/imports/api/files/UserImages.js +++ b/app/imports/api/files/userImages/UserImages.ts @@ -1,3 +1,5 @@ + +import { incrementFileStorageUsed } from '/imports/api/users/methods/updateFileStorageUsed'; let createS3FilesCollection; if (Meteor.isServer) { createS3FilesCollection = require('/imports/api/files/server/s3FileStorage').createS3FilesCollection @@ -18,6 +20,9 @@ const UserImages = createS3FilesCollection({ return 'Please upload an image file only'; } return true + }, + onAfterUpload(file) { + if (Meteor.isServer) incrementFileStorageUsed(file.userId, file.size); } }); diff --git a/app/imports/api/files/userImages/methods/index.js b/app/imports/api/files/userImages/methods/index.js new file mode 100644 index 00000000..abb0d9b6 --- /dev/null +++ b/app/imports/api/files/userImages/methods/index.js @@ -0,0 +1,3 @@ +import '/imports/api/creature/archive/methods/archiveCreatureToFile'; +import '/imports/api/creature/archive/methods/restoreCreatureFromFile'; +import '/imports/api/creature/archive/methods/removeArchiveCreature'; diff --git a/app/imports/api/files/userImages/methods/removeUserImage.ts b/app/imports/api/files/userImages/methods/removeUserImage.ts new file mode 100644 index 00000000..a9463bc2 --- /dev/null +++ b/app/imports/api/files/userImages/methods/removeUserImage.ts @@ -0,0 +1,45 @@ +import SimpleSchema from 'simpl-schema'; +import { ValidatedMethod } from 'meteor/mdg:validated-method'; +import { RateLimiterMixin } from 'ddp-rate-limiter-mixin'; +import { incrementFileStorageUsed } from '/imports/api/users/methods/updateFileStorageUsed'; +import UserImages from '/imports/api/files/userImages/UserImages'; + +const removeArchiveCreature = new ValidatedMethod({ + name: 'ArchiveCreatureFiles.methods.removeArchiveCreature', + validate: new SimpleSchema({ + 'fileId': { + type: String, + regEx: SimpleSchema.RegEx.Id, + }, + }).validator(), + mixins: [RateLimiterMixin], + // @ts-expect-error Rate limit not defined + rateLimit: { + numRequests: 5, + timeInterval: 5000, + }, + async run({ fileId }) { + if (!this.userId) { + throw new Meteor.Error('logged-out', + 'The user must be logged in to remove a file'); + } + // fetch the file + const file = UserImages.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 + UserImages.remove({ _id: fileId }); + // Update the user's file storage limits + incrementFileStorageUsed(userId, -file.size); + }, +}); + +export default removeArchiveCreature; diff --git a/app/imports/client/ui/components/global/SmartImageInput.vue b/app/imports/client/ui/components/global/SmartImageInput.vue new file mode 100644 index 00000000..29625455 --- /dev/null +++ b/app/imports/client/ui/components/global/SmartImageInput.vue @@ -0,0 +1,71 @@ + + + \ No newline at end of file diff --git a/app/imports/client/ui/files/UserImageCard.vue b/app/imports/client/ui/files/UserImageCard.vue index 85c5d155..7a445a57 100644 --- a/app/imports/client/ui/files/UserImageCard.vue +++ b/app/imports/client/ui/files/UserImageCard.vue @@ -34,6 +34,7 @@