diff --git a/client/components/cards/attachments.js b/client/components/cards/attachments.js index a39176bfc..b305c5684 100644 --- a/client/components/cards/attachments.js +++ b/client/components/cards/attachments.js @@ -66,7 +66,7 @@ function getPrevAttachmentId(currentAttachmentId) { function openAttachmentViewer(attachmentId){ - const attachment = Attachments.findOne({_id: attachmentId}); + const attachment = ReactiveCache.getAttachment(attachmentId); $("#attachment-name").text(attachment.name); diff --git a/imports/reactiveCache.js b/imports/reactiveCache.js index 135c445ff..18425d9f5 100644 --- a/imports/reactiveCache.js +++ b/imports/reactiveCache.js @@ -39,6 +39,10 @@ ReactiveCacheServer = { const ret = CustomFields.find(selector).fetch(); return ret; }, + getAttachment(id) { + const ret = Attachments.findOne(id); + return ret; + }, getUser(id) { const ret = Users.findOne(id); return ret; @@ -159,6 +163,16 @@ ReactiveCacheClient = { const ret = this.__customFields.get(Jsons.stringify(selector)); return ret; }, + getAttachment(id) { + if (!this.__attachment) { + this.__attachment = new DataCache(_id => { + const _ret = Attachments.findOne(_id); + return _ret; + }); + } + const ret = this.__attachment.get(id); + return ret; + }, getUser(id) { if (!this.__user) { this.__user = new DataCache(userId => { @@ -309,6 +323,15 @@ ReactiveCache = { } return ret; }, + getAttachment(id) { + let ret; + if (Meteor.isServer) { + ret = ReactiveCacheServer.getAttachment(id); + } else { + ret = ReactiveCacheClient.getAttachment(id); + } + return ret; + }, getUser(id) { let ret; if (Meteor.isServer) { diff --git a/models/activities.js b/models/activities.js index be3713eac..562fc0d53 100644 --- a/models/activities.js +++ b/models/activities.js @@ -44,7 +44,7 @@ Activities.helpers({ return ReactiveCache.getCardComment(this.commentId); }, attachment() { - return Attachments.findOne(this.attachmentId); + return ReactiveCache.getAttachment(this.attachmentId); }, checklist() { return Checklists.findOne(this.checklistId); diff --git a/models/attachments.js b/models/attachments.js index 93e036c4c..9f795dfa1 100644 --- a/models/attachments.js +++ b/models/attachments.js @@ -151,20 +151,20 @@ if (Meteor.isServer) { check(fileObjId, String); check(storageDestination, String); - const fileObj = Attachments.findOne({_id: fileObjId}); + const fileObj = ReactiveCache.getAttachment(fileObjId); moveToStorage(fileObj, storageDestination, fileStoreStrategyFactory); }, renameAttachment(fileObjId, newName) { check(fileObjId, String); check(newName, String); - const fileObj = Attachments.findOne({_id: fileObjId}); + const fileObj = ReactiveCache.getAttachment(fileObjId); rename(fileObj, newName, fileStoreStrategyFactory); }, validateAttachment(fileObjId) { check(fileObjId, String); - const fileObj = Attachments.findOne({_id: fileObjId}); + const fileObj = ReactiveCache.getAttachment(fileObjId); const isValid = Promise.await(isFileValid(fileObj, attachmentUploadMimeTypes, attachmentUploadSize, attachmentUploadExternalProgram)); if (!isValid) { @@ -177,7 +177,7 @@ if (Meteor.isServer) { Meteor.call('validateAttachment', fileObjId); - const fileObj = Attachments.findOne({_id: fileObjId}); + const fileObj = ReactiveCache.getAttachment(fileObjId); if (fileObj) { Meteor.defer(() => Meteor.call('moveAttachmentToStorage', fileObjId, storageDestination)); diff --git a/models/cards.js b/models/cards.js index 2ddbc7d27..4426e4c6b 100644 --- a/models/cards.js +++ b/models/cards.js @@ -804,7 +804,7 @@ Cards.helpers({ cover() { if (!this.coverId) return false; - const cover = Attachments.findOne(this.coverId); + const cover = ReactiveCache.getAttachment(this.coverId); // if we return a cover before it is fully stored, we will get errors when we try to display it // todo XXX we could return a default "upload pending" image in the meantime? return cover && cover.link() && cover;