avatars.js 2.1 KB

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