Browse Source

Ref: original & and use fileObj.meta

fileObj.meta is part of the ostrio:files API and be passed to the
constructor. This is less hacky than trying tu update a persistet object
after the fact.
David Arnold 4 years ago
parent
commit
97356603aa

+ 15 - 16
client/components/cards/attachments.js

@@ -67,19 +67,19 @@ Template.cardAttachmentsPopup.events({
       const uploader = Attachments.insert(
         {
           file: event.currentTarget.files[0],
+          meta: Utils.getCommonAttachmentMetaFrom(card),
           chunkSize: 'dynamic',
         },
         false,
       );
-      uploader.on('uploaded', (error, fileObj) => {
+      uploader.on('uploaded', (error, fileRef) => {
         if (!error) {
-          if (fileObj.isImage) {
-            card.setCover(fileObj._id);
+          if (fileRef.isImage) {
+            card.setCover(fileRef._id);
           }
-          Utils.addCommonMetaToAttachment(card, fileObj);
         }
       });
-      uploader.on('end', (error, fileObj) => {
+      uploader.on('end', (error, fileRef) => {
         Popup.back();
       });
       uploader.start();
@@ -131,28 +131,27 @@ Template.previewClipboardImagePopup.onRendered(() => {
 
 Template.previewClipboardImagePopup.events({
   'click .js-upload-pasted-image'() {
-    const results = pastedResults;
-    if (results && results.file) {
+    const card = this;
+    if (pastedResults && pastedResults.file) {
+      const file = pastedResults.file;
       window.oPasted = pastedResults;
-      const card = this;
       const uploader = Attachments.insert(
         {
-          file: results.file,
-          fileName:
-            results.name || results.file.type.replace('image/', 'clipboard.'),
+          file,
+          meta: Utils.getCommonAttachmentMetaFrom(card),
+          fileName: file.name || file.type.replace('image/', 'clipboard.'),
           chunkSize: 'dynamic',
         },
         false,
       );
-      uploader.on('uploaded', (error, fileObj) => {
+      uploader.on('uploaded', (error, fileRef) => {
         if (!error) {
-          if (fileObj.isImage) {
-            card.setCover(fileObj._id);
+          if (fileRef.isImage) {
+            card.setCover(fileRef._id);
           }
-          Utils.addCommonMetaToAttachment(card, fileObj);
         }
       });
-      uploader.on('end', (error, fileObj) => {
+      uploader.on('end', (error, fileRef) => {
         pastedResults = null;
         $(document.body).pasteImageReader(() => {});
         Popup.back();

+ 7 - 12
client/components/main/editor.js

@@ -160,28 +160,23 @@ BlazeComponent.extendComponent({
                   const currentCard = Utils.getCurrentCard();
                   const MAX_IMAGE_PIXEL = Utils.MAX_IMAGE_PIXEL;
                   const COMPRESS_RATIO = Utils.IMAGE_COMPRESS_RATIO;
-                  const insertImage = src => {
-                    const img = document.createElement('img');
-                    img.src = src;
-                    img.setAttribute('width', '100%');
-                    $summernote.summernote('insertNode', img);
-                  };
                   const processUpload = function(file) {
                     const uploader = Attachments.insert(
                       {
                         file,
+                        meta: Utils.getCommonAttachmentMetaFrom(card),
                         chunkSize: 'dynamic',
                       },
                       false,
                     );
-                    uploader.on('uploaded', (error, fileObj) => {
+                    uploader.on('uploaded', (error, fileRef) => {
                       if (!error) {
-                        if (fileObj.isImage) {
-                          insertImage(
-                            `${location.protocol}//${location.host}${fileObj.path}`,
-                          );
+                        if (fileRef.isImage) {
+                          const img = document.createElement('img');
+                          img.src = fileRef.link();
+                          img.setAttribute('width', '100%');
+                          $summernote.summernote('insertNode', img);
                         }
-                        Utils.addCommonMetaToAttachment(currentCard, fileObj);
                       }
                     });
                     uploader.start();

+ 1 - 1
client/components/users/userAvatar.jade

@@ -93,7 +93,7 @@ template(name="changeAvatarPopup")
           unless isSelected
             a.js-delete-avatar {{_ 'delete'}}
             |  -
-          = original.name
+          = name
     li: a.js-select-initials
       .member
         +userAvatarInitials(userId=currentUser._id)

+ 3 - 3
client/components/users/userAvatar.js

@@ -232,13 +232,13 @@ BlazeComponent.extendComponent({
               },
               false,
             );
-            uploader.on('uploaded', (error, fileObj) => {
+            uploader.on('uploaded', (error, fileRef) => {
               if (!error) {
-                self.setAvatar(fileObj.path);
+                self.setAvatar(fileRef.path);
                 // self.setAvatar(this.currentData().url(this.avatarUrlOptions()));
               }
             });
-            uploader.on('error', (error, fileObj) => {
+            uploader.on('error', (error, fileData) => {
               // XXX check for actually returned error
               self.setError('avatar-too-big');
             });

+ 11 - 13
client/lib/utils.js

@@ -162,23 +162,21 @@ Utils = {
       })
     );
   },
-  MAX_IMAGE_PIXEL: Meteor.settings.public.MAX_IMAGE_PIXEL,
-  COMPRESS_RATIO: Meteor.settings.public.IMAGE_COMPRESS_RATIO,
-  addCommonMetaToAttachment(card, file) {
+  getCommonAttachmentMetaFrom(card) {
+    let meta;
     if (card.isLinkedCard()) {
-      file.boardId = Cards.findOne(card.linkedId).boardId;
-      file.cardId = card.linkedId;
+      meta.boardId = Cards.findOne(card.linkedId).boardId;
+      meta.cardId = card.linkedId;
     } else {
-      file.boardId = card.boardId;
-      file.swimlaneId = card.swimlaneId;
-      file.listId = card.listId;
-      file.cardId = card._id;
-    }
-    file.userId = Meteor.userId();
-    if (file.original) {
-      file.original.name = file.name;
+      meta.boardId = card.boardId;
+      meta.swimlaneId = card.swimlaneId;
+      meta.listId = card.listId;
+      meta.cardId = card._id;
     }
+    return meta;
   },
+  MAX_IMAGE_PIXEL: Meteor.settings.public.MAX_IMAGE_PIXEL,
+  COMPRESS_RATIO: Meteor.settings.public.IMAGE_COMPRESS_RATIO,
   shrinkImage(options) {
     // shrink image to certain size
     const dataurl = options.dataurl,

+ 1 - 1
models/activities.js

@@ -242,7 +242,7 @@ if (Meteor.isServer) {
     }
     if (activity.attachmentId) {
       const attachment = activity.attachment();
-      params.attachment = attachment.original.name;
+      params.attachment = attachment.name;
       params.attachmentId = attachment._id;
     }
     if (activity.checklistId) {

+ 33 - 56
models/attachments.js

@@ -7,6 +7,21 @@ import { createOnAfterRemove } from './lib/fsHooks/createOnAfterRemove';
 
 const attachmentBucket = createBucket('attachments');
 
+const insertActivity = (fileObj, activityType) =>
+  Activities.insert({
+    userId: fileObj.userId,
+    type: 'card',
+    activityType,
+    attachmentId: fileObj._id,
+    // this preserves the name so that notifications can be meaningful after
+    // this file is removed
+    attachmentName: fileObj.name,
+    boardId: fileObj.meta.boardId,
+    cardId: fileObj.meta.cardId,
+    listId: fileObj.meta.listId,
+    swimlaneId: fileObj.meta.swimlaneId,
+  });
+
 // XXX Enforce a schema for the Attachments FilesCollection
 // see: https://github.com/VeliovGroup/Meteor-Files/wiki/Schema
 
@@ -14,84 +29,46 @@ export const Attachments = new FilesCollection({
   debug: false, // Change to `true` for debugging
   collectionName: 'attachments',
   allowClientCode: false,
-  onAfterUpload(doc) {
+  onAfterUpload(fileRef) {
+    createOnAfterUpload(attachmentBucket)(fileRef);
     // If the attachment doesn't have a source field
     // or its source is different than import
-    if (!doc.source || doc.source !== 'import') {
+    if (!fileRef.meta.source || fileRef.meta.source !== 'import') {
       // Add activity about adding the attachment
-      Activities.insert({
-        userId,
-        type: 'card',
-        activityType: 'addAttachment',
-        attachmentId: doc._id,
-        // this preserves the name so that notifications can be meaningful after
-        // this file is removed
-        attachmentName: doc.original.name,
-        boardId: doc.boardId,
-        cardId: doc.cardId,
-        listId: doc.listId,
-        swimlaneId: doc.swimlaneId,
-      });
-    } else {
-      // Don't add activity about adding the attachment as the activity
-      // be imported and delete source field
-      Attachments.update(
-        {
-          _id: doc._id,
-        },
-        {
-          $unset: {
-            source: '',
-          },
-        },
-      );
+      insertActivity(fileRef, 'addAttachment');
     }
-    createOnAfterUpload(attachmentBucket)(doc);
   },
   interceptDownload: createInterceptDownload(attachmentBucket),
-  onAfterRemove(docs) {
-    docs.forEach(function(doc) {
-      Activities.insert({
-        userId: doc.userId,
-        type: 'card',
-        activityType: 'deleteAttachment',
-        attachmentId: doc._id,
-        // this preserves the name so that notifications can be meaningful after
-        // this file is removed
-        attachmentName: doc.original.name,
-        boardId: doc.boardId,
-        cardId: doc.cardId,
-        listId: doc.listId,
-        swimlaneId: doc.swimlaneId,
-      });
+  onAfterRemove(files) {
+    createOnAfterRemove(attachmentBucket)(files);
+    files.forEach(fileObj => {
+      insertActivity(fileObj, 'deleteAttachment');
     });
-    createOnAfterRemove(attachmentBucket)(docs);
   },
   // We authorize the attachment download either:
   // - if the board is public, everyone (even unconnected) can download it
   // - if the board is private, only board members can download it
-  downloadCallback(doc) {
-    const board = Boards.findOne(doc.boardId);
+  protected(fileObj) {
+    const board = Boards.findOne(fileObj.meta.boardId);
     if (board.isPublic()) {
       return true;
-    } else {
-      return board.hasMember(this.userId);
     }
+    return board.hasMember(this.userId);
   },
 });
 
 if (Meteor.isServer) {
   Attachments.allow({
-    insert(userId, doc) {
-      return allowIsBoardMember(userId, Boards.findOne(doc.boardId));
+    insert(userId, fileObj) {
+      return allowIsBoardMember(userId, Boards.findOne(fileObj.boardId));
     },
-    update(userId, doc) {
-      return allowIsBoardMember(userId, Boards.findOne(doc.boardId));
+    update(userId, fileObj) {
+      return allowIsBoardMember(userId, Boards.findOne(fileObj.boardId));
     },
-    remove(userId, doc) {
-      return allowIsBoardMember(userId, Boards.findOne(doc.boardId));
+    remove(userId, fileObj) {
+      return allowIsBoardMember(userId, Boards.findOne(fileObj.boardId));
     },
-    fetch: ['boardId'],
+    fetch: ['meta'],
   });
 
   Meteor.startup(() => {

+ 3 - 3
models/exporter.js

@@ -80,11 +80,11 @@ export class Exporter {
 
         return {
           _id: attachment._id,
-          cardId: attachment.cardId,
+          cardId: attachment.meta.cardId,
           //url: FlowRouter.url(attachment.url()),
           file: filebase64,
-          name: attachment.original.name,
-          type: attachment.original.type,
+          name: attachment.name,
+          type: attachment.type,
         };
       });
     //When has a especific valid attachment return the single element

+ 23 - 25
models/trelloCreator.js

@@ -425,35 +425,33 @@ export class TrelloCreator {
       }
       const attachments = this.attachments[card.id];
       const trelloCoverId = card.idAttachmentCover;
-      // Simulating file.attachData on the client generates multiple errors
-      // - HEAD returns null, which causes exception down the line
-      // - the template then tries to display the url to the attachment which causes other errors
-      // so we make it server only, and let UI catch up once it is done, forget about latency comp.
       if (attachments && Meteor.isServer) {
         attachments.forEach(att => {
-          // Simulating file.attachData on the client generates multiple errors
-          // - HEAD returns null, which causes exception down the line
-          // - the template then tries to display the url to the attachment which causes other errors
-          // so we make it server only, and let UI catch up once it is done, forget about latency comp.
           const self = this;
+          const opts = {
+            type: att.type ? att.type : undefined,
+            userId: self._user(att.userId),
+            meta: {
+              boardId,
+              cardId,
+              source: 'import',
+            },
+          };
+          const cb = (error, fileObj) => {
+            if (error) {
+              throw error;
+            }
+            self.attachmentIds[att._id] = fileObj._id;
+            if (trelloCoverId === att._id) {
+              Cards.direct.update(cardId, {
+                $set: { coverId: fileObj._id },
+              });
+            }
+          };
           if (att.url) {
-            Attachment.load(att.url, (error, fileObj) => {
-              if (error) {
-                throw error;
-              }
-              fileObj.boardId = boardId;
-              fileObj.cardId = cardId;
-              fileObj.userId = self._user(att.userId);
-              // The field source will only be used to prevent adding
-              // attachments' related activities automatically
-              fileObj.source = 'import';
-              self.attachmentIds[att._id] = fileObj._id;
-              if (trelloCoverId === att.id) {
-                Cards.direct.update(cardId, {
-                  $set: { coverId: fileObj._id },
-                });
-              }
-            });
+            Attachment.load(att.url, opts, cb, true);
+          } else if (att.file) {
+            Attachment.write(att.file, opts, cb, true);
           }
         });
 

+ 24 - 26
models/wekanCreator.js

@@ -448,33 +448,31 @@ export class WekanCreator {
       const wekanCoverId = card.coverId;
       if (attachments && Meteor.isServer) {
         attachments.forEach(att => {
-          // Simulating file.attachData on the client generates multiple errors
-          // - HEAD returns null, which causes exception down the line
-          // - the template then tries to display the url to the attachment which causes other errors
-          // so we make it server only, and let UI catch up once it is done, forget about latency comp.
           const self = this;
-          if (att.url || att.file) {
-            Attachment.load(
-              att.url ? att.url : Buffer.from(att.file, 'base64'),
-              { type: att.type ? att.ype : undefined },
-              (error, fileObj) => {
-                if (error) {
-                  throw error;
-                }
-                fileObj.boardId = boardId;
-                fileObj.cardId = cardId;
-                fileObj.userId = self._user(att.userId);
-                // The field source will only be used to prevent adding
-                // attachments' related activities automatically
-                fileObj.source = 'import';
-                self.attachmentIds[att._id] = fileObj._id;
-                if (wekanCoverId === att._id) {
-                  Cards.direct.update(cardId, {
-                    $set: { coverId: fileObj._id },
-                  });
-                }
-              },
-            );
+          const opts = {
+            type: att.type ? att.type : undefined,
+            userId: self._user(att.userId),
+            meta: {
+              boardId,
+              cardId,
+              source: 'import',
+            },
+          };
+          const cb = (error, fileObj) => {
+            if (error) {
+              throw error;
+            }
+            self.attachmentIds[att._id] = fileObj._id;
+            if (wekanCoverId === att._id) {
+              Cards.direct.update(cardId, {
+                $set: { coverId: fileObj._id },
+              });
+            }
+          };
+          if (att.url) {
+            Attachment.load(att.url, opts, cb, true);
+          } else if (att.file) {
+            Attachment.write(att.file, opts, cb, true);
           }
         });
       }