avatars.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. import { Meteor } from 'meteor/meteor';
  2. import { FilesCollection } from 'meteor/ostrio:files';
  3. import { formatFleURL } from 'meteor/ostrio:files/lib';
  4. import { isFileValid } from './fileValidation';
  5. import { createBucket } from './lib/grid/createBucket';
  6. import fs from 'fs';
  7. import path from 'path';
  8. import FileStoreStrategyFactory, { FileStoreStrategyFilesystem, FileStoreStrategyGridFs, STORAGE_NAME_FILESYSTEM } from '/models/lib/fileStoreStrategy';
  9. let avatarsUploadExternalProgram;
  10. let avatarsUploadMimeTypes = [];
  11. let avatarsUploadSize = 72000;
  12. let avatarsBucket;
  13. let storagePath;
  14. if (Meteor.isServer) {
  15. if (process.env.AVATARS_UPLOAD_MIME_TYPES) {
  16. avatarsUploadMimeTypes = process.env.AVATARS_UPLOAD_MIME_TYPES.split(',');
  17. avatarsUploadMimeTypes = avatarsUploadMimeTypes.map(value => value.trim());
  18. }
  19. if (process.env.AVATARS_UPLOAD_MAX_SIZE) {
  20. avatarsUploadSize = parseInt(process.env.AVATARS_UPLOAD_MAX_SIZE);
  21. if (isNaN(avatarsUploadSize)) {
  22. avatarsUploadSize = 0
  23. }
  24. }
  25. if (process.env.AVATARS_UPLOAD_EXTERNAL_PROGRAM) {
  26. avatarsUploadExternalProgram = process.env.AVATARS_UPLOAD_EXTERNAL_PROGRAM;
  27. if (!avatarsUploadExternalProgram.includes("{file}")) {
  28. avatarsUploadExternalProgram = undefined;
  29. }
  30. }
  31. avatarsBucket = createBucket('avatars');
  32. storagePath = path.join(process.env.WRITABLE_PATH, 'avatars');
  33. }
  34. const fileStoreStrategyFactory = new FileStoreStrategyFactory(FileStoreStrategyFilesystem, storagePath, FileStoreStrategyGridFs, avatarsBucket);
  35. Avatars = new FilesCollection({
  36. debug: false, // Change to `true` for debugging
  37. collectionName: 'avatars',
  38. allowClientCode: true,
  39. storagePath() {
  40. const ret = fileStoreStrategyFactory.storagePath;
  41. return ret;
  42. },
  43. onBeforeUpload(file) {
  44. if (file.size <= avatarsUploadSize && file.type.startsWith('image/')) {
  45. return true;
  46. }
  47. return 'avatar-too-big';
  48. },
  49. onAfterUpload(fileObj) {
  50. // current storage is the filesystem, update object and database
  51. Object.keys(fileObj.versions).forEach(versionName => {
  52. fileObj.versions[versionName].storage = STORAGE_NAME_FILESYSTEM;
  53. });
  54. Avatars.update({ _id: fileObj._id }, { $set: { "versions": fileObj.versions } });
  55. const isValid = Promise.await(isFileValid(fileObj, avatarsUploadMimeTypes, avatarsUploadSize, avatarsUploadExternalProgram));
  56. if (isValid) {
  57. Users.findOne(fileObj.userId).setAvatarUrl(`${formatFleURL(fileObj)}?auth=false&brokenIsFine=true`);
  58. } else {
  59. Avatars.remove(fileObj._id);
  60. }
  61. },
  62. interceptDownload(http, fileObj, versionName) {
  63. const ret = fileStoreStrategyFactory.getFileStrategy(fileObj, versionName).interceptDownload(http, this.cacheControl);
  64. return ret;
  65. },
  66. onBeforeRemove(files) {
  67. files.forEach(fileObj => {
  68. if (fileObj.userId) {
  69. Users.findOne(fileObj.userId).setAvatarUrl('');
  70. }
  71. });
  72. return true;
  73. },
  74. onAfterRemove(files) {
  75. files.forEach(fileObj => {
  76. Object.keys(fileObj.versions).forEach(versionName => {
  77. fileStoreStrategyFactory.getFileStrategy(fileObj, versionName).onAfterRemove();
  78. });
  79. });
  80. },
  81. });
  82. function isOwner(userId, doc) {
  83. return userId && userId === doc.userId;
  84. }
  85. if (Meteor.isServer) {
  86. Avatars.allow({
  87. insert: isOwner,
  88. update: isOwner,
  89. remove: isOwner,
  90. fetch: ['userId'],
  91. });
  92. Meteor.startup(() => {
  93. const storagePath = fileStoreStrategyFactory.storagePath;
  94. if (!fs.existsSync(storagePath)) {
  95. console.log("create storagePath because it doesn't exist: " + storagePath);
  96. fs.mkdirSync(storagePath, { recursive: true });
  97. }
  98. });
  99. }
  100. export default Avatars;