Files
DiceCloud/app/imports/api/creature/mixins/creaturePermissionMixin.js
2023-09-28 21:27:05 +02:00

53 lines
1.9 KiB
JavaScript

import {
assertEditPermission,
assertViewPermission,
assertOwnership,
} from '/imports/api/creature/creatures/creaturePermissions';
// Checks if the method has permission to run on the document. If the document
// has a charId, that creature is checked, otherwise if it has an _id and the
// collection is defined in the method options, that document is fetched to
// determine its charId, otherwise a getCharId method can be defined to perform
// a special search for the required creature
//
// Because this mixin injects the charId into argument objects that don't
// already contain it, it should always come last in the mixin list, so that it
// the outermost wrapper of the run function
export default function creaturePermissionMixin(methodOptions) {
let assertPermission;
if (methodOptions.permission === 'owner') {
assertPermission = assertOwnership;
} else if (methodOptions.permission === 'edit') {
assertPermission = assertEditPermission;
} else if (methodOptions.permission === 'view') {
assertPermission = assertViewPermission;
} else {
throw "`permission` missing in method options";
}
let getCharId;
if (methodOptions.getCharId) {
getCharId = methodOptions.getCharId;
} else if (methodOptions.collection) {
getCharId = function ({ _id }) {
return methodOptions.collection.findOne(_id, {
fields: { charId: 1 }
}).charId;
};
} else {
getCharId = function () {
throw "`getCharId` or `collection` missing in method options," +
" or {charId} missing in call";
};
}
let runFunc = methodOptions.run;
methodOptions.run = function (doc, ...rest) {
// Store the charId on the doc for other mixins if it had to be fetched
doc.charId = doc.charId || getCharId.apply(this, arguments);
assertPermission(doc.charId, this.userId);
return runFunc.call(this, doc, ...rest);
};
return methodOptions;
}