avatars.js 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import { Meteor } from 'meteor/meteor';
  2. import { FilesCollection } from 'meteor/ostrio:files';
  3. import { createBucket } from './lib/grid/createBucket';
  4. import fs from 'fs';
  5. import path from 'path';
  6. import FileStoreStrategyFactory, { FileStoreStrategyFilesystem, FileStoreStrategyGridFs} from '/models/lib/fileStoreStrategy';
  7. let avatarsBucket;
  8. let storagePath;
  9. if (Meteor.isServer) {
  10. avatarsBucket = createBucket('avatars');
  11. storagePath = path.join(process.env.WRITABLE_PATH, 'avatars');
  12. }
  13. const fileStoreStrategyFactory = new FileStoreStrategyFactory(FileStoreStrategyFilesystem, storagePath, FileStoreStrategyGridFs, avatarsBucket);
  14. Avatars = new FilesCollection({
  15. debug: false, // Change to `true` for debugging
  16. collectionName: 'avatars',
  17. allowClientCode: true,
  18. storagePath() {
  19. const ret = fileStoreStrategyFactory.storagePath;
  20. return ret;
  21. },
  22. onBeforeUpload(file) {
  23. if (file.size <= 72000 && file.type.startsWith('image/')) {
  24. return true;
  25. }
  26. return 'avatar-too-big';
  27. },
  28. onAfterUpload(fileObj) {
  29. // current storage is the filesystem, update object and database
  30. Object.keys(fileObj.versions).forEach(versionName => {
  31. fileObj.versions[versionName].storage = "fs";
  32. });
  33. Avatars.update({ _id: fileObj._id }, { $set: { "versions" : fileObj.versions } });
  34. },
  35. interceptDownload(http, fileObj, versionName) {
  36. const ret = fileStoreStrategyFactory.getFileStrategy(fileObj, versionName).interceptDownload(http, this.cacheControl);
  37. return ret;
  38. },
  39. onAfterRemove(files) {
  40. files.forEach(fileObj => {
  41. Object.keys(fileObj.versions).forEach(versionName => {
  42. fileStoreStrategyFactory.getFileStrategy(fileObj, versionName).onAfterRemove();
  43. });
  44. });
  45. },
  46. });
  47. function isOwner(userId, doc) {
  48. return userId && userId === doc.userId;
  49. }
  50. if (Meteor.isServer) {
  51. Avatars.allow({
  52. insert: isOwner,
  53. update: isOwner,
  54. remove: isOwner,
  55. fetch: ['userId'],
  56. });
  57. Meteor.startup(() => {
  58. const storagePath = fileStoreStrategyFactory.storagePath;
  59. if (!fs.existsSync(storagePath)) {
  60. console.log("create storagePath because it doesn't exist: " + storagePath);
  61. fs.mkdirSync(storagePath, { recursive: true });
  62. }
  63. });
  64. }
  65. export default Avatars;