diff --git a/app/imports/api/creature/archive/ArchiveCreatureFiles.js b/app/imports/api/creature/archive/ArchiveCreatureFiles.js index dda1499f..10280566 100644 --- a/app/imports/api/creature/archive/ArchiveCreatureFiles.js +++ b/app/imports/api/creature/archive/ArchiveCreatureFiles.js @@ -3,6 +3,7 @@ import SimpleSchema from 'simpl-schema'; import { incrementFileStorageUsed } from '/imports/api/users/methods/updateFileStorageUsed'; import { CreaturePropertySchema } from '/imports/api/creature/creatureProperties/CreatureProperties'; import { CreatureSchema } from '/imports/api/creature/creatures/Creatures'; +import assertUserHasFileSpace from '/imports/api/files/assertUserHasFileSpace'; let createS3FilesCollection; if (Meteor.isServer) { createS3FilesCollection = require('/imports/api/files/server/s3FileStorage').createS3FilesCollection @@ -18,6 +19,9 @@ const ArchiveCreatureFiles = createS3FilesCollection({ if (file.size > 10485760) { return 'Please upload with size equal or less than 10MB'; } + // Make sure the user has enough space + assertUserHasFileSpace(Meteor.userId(), file.size); + // Only accept JSON if (!/json/i.test(file.extension)) { return 'Please upload only a JSON file'; } diff --git a/app/imports/api/files/assertUserHasFileSpace.ts b/app/imports/api/files/assertUserHasFileSpace.ts new file mode 100644 index 00000000..59d79713 --- /dev/null +++ b/app/imports/api/files/assertUserHasFileSpace.ts @@ -0,0 +1,23 @@ +import { getUserTier } from '/imports/api/users/patreon/tiers'; +import prettyBytes from 'pretty-bytes'; + +export default function assertUserHasFileSpace(userId: string | null, spaceRequiredInBytes: number) { + // Get the user + if (!userId) throw new Meteor.Error('permission-denied', 'No user was provided'); + const user = Meteor.users.findOne(userId, { fields: { fileStorageUsed: 1 } }); + if (!user) throw new Meteor.Error('permission-denied', 'User not found'); + + // Work out how much space they have and need + const fileStorageUsed = user.fileStorageUsed || 0; + const fileStorageAllowed = getUserTier(Meteor.userId()).fileStorage * 1000000; + let fileStorageLeft = fileStorageAllowed - fileStorageUsed; + if (fileStorageLeft < 0) fileStorageLeft = 0; + + // Throw an error if they don't have space + if (fileStorageLeft < spaceRequiredInBytes) { + throw new Meteor.Error('insufficient-space', + `Not enough storage space left, you need ${prettyBytes(spaceRequiredInBytes)}, ` + + `but only have ${prettyBytes(fileStorageLeft)} available` + ); + } +} \ No newline at end of file diff --git a/app/imports/api/files/userImages/UserImages.ts b/app/imports/api/files/userImages/UserImages.ts index 895aaed7..e6dff275 100644 --- a/app/imports/api/files/userImages/UserImages.ts +++ b/app/imports/api/files/userImages/UserImages.ts @@ -1,5 +1,6 @@ import { incrementFileStorageUsed } from '/imports/api/users/methods/updateFileStorageUsed'; +import assertUserHasFileSpace from '/imports/api/files/assertUserHasFileSpace'; let createS3FilesCollection; if (Meteor.isServer) { createS3FilesCollection = require('/imports/api/files/server/s3FileStorage').createS3FilesCollection @@ -11,10 +12,12 @@ const UserImages = createS3FilesCollection({ collectionName: 'userImages', storagePath: Meteor.isDevelopment ? '../../../../../fileStorage/userImages' : 'assets/app/userImages', onBeforeUpload(file) { - // Allow upload files under 10MB - if (file.size > 10485760) { - return 'Please upload with size equal or less than 10MB'; + // Allow upload files under 30MB + if (file.size > 30_000_000) { + return 'Images must be less than 30MB'; } + // Make sure the user has enough space + assertUserHasFileSpace(Meteor.userId(), file.size); // Allow common image extensions if (!/gif|png|jpe?g|webp/i.test(file.extension || '')) { return 'Please upload an image file only'; diff --git a/app/imports/client/ui/components/ImageUploadInput.vue b/app/imports/client/ui/components/ImageUploadInput.vue index 8a331ff8..970076c5 100644 --- a/app/imports/client/ui/components/ImageUploadInput.vue +++ b/app/imports/client/ui/components/ImageUploadInput.vue @@ -1,34 +1,46 @@