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 @@
+
+
+ $emit('keyup', e)"
+ >
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ 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 @@