Implemented Reference properties
This commit is contained in:
67
app/imports/api/library/methods/updateReferenceNode.js
Normal file
67
app/imports/api/library/methods/updateReferenceNode.js
Normal file
@@ -0,0 +1,67 @@
|
||||
import { ValidatedMethod } from 'meteor/mdg:validated-method';
|
||||
import SimpleSchema from 'simpl-schema';
|
||||
import { RateLimiterMixin } from 'ddp-rate-limiter-mixin';
|
||||
import LibraryNodes from '/imports/api/library/LibraryNodes.js';
|
||||
import {
|
||||
assertDocEditPermission,
|
||||
assertViewPermission,
|
||||
} from '/imports/api/sharing/sharingPermissions.js';
|
||||
import fetchDocByRef from '/imports/api/parenting/fetchDocByRef.js';
|
||||
|
||||
const updateReferenceNode = new ValidatedMethod({
|
||||
name: 'libraryNodes.updateReferenceNode',
|
||||
validate: new SimpleSchema({
|
||||
_id: {
|
||||
type: String,
|
||||
regEx: SimpleSchema.RegEx.Id,
|
||||
}
|
||||
}).validator(),
|
||||
mixins: [RateLimiterMixin],
|
||||
rateLimit: {
|
||||
numRequests: 5,
|
||||
timeInterval: 5000,
|
||||
},
|
||||
run({_id}) {
|
||||
let userId = this.userId;
|
||||
let node = LibraryNodes.findOne(_id);
|
||||
assertDocEditPermission(node, userId);
|
||||
updateReferenceNodeWork(node, userId);
|
||||
},
|
||||
});
|
||||
|
||||
function writeCache(_id, cache){
|
||||
LibraryNodes.update(_id, {$set: {cache}}, {
|
||||
selector: {type: 'reference'},
|
||||
});
|
||||
}
|
||||
|
||||
function updateReferenceNodeWork(node, userId){
|
||||
let cache = {}
|
||||
if (!node.ref){
|
||||
writeCache(node._id, cache);
|
||||
return;
|
||||
}
|
||||
let doc, library;
|
||||
try {
|
||||
doc = fetchDocByRef(node.ref);
|
||||
if (doc.removed) throw 'Property has been deleted';
|
||||
if (doc.ancestors[0].id !== node.ancestors[0].id){
|
||||
library = fetchDocByRef(doc.ancestors[0]);
|
||||
assertViewPermission(library, userId)
|
||||
}
|
||||
} catch(e){
|
||||
cache = {error: e.reason || e.message || e.toString()}
|
||||
writeCache(node._id, cache);
|
||||
return;
|
||||
}
|
||||
cache = {
|
||||
node: {name: doc.name, type: doc.type},
|
||||
};
|
||||
if (library){
|
||||
cache.library = {name: library.name};
|
||||
}
|
||||
writeCache(node._id, cache);
|
||||
}
|
||||
|
||||
export default updateReferenceNode;
|
||||
export { updateReferenceNodeWork }
|
||||
Reference in New Issue
Block a user