Files
DiceCloud/app/imports/api/creature/mixins/updateSchemaMixin.js
2019-04-15 12:09:37 +02:00

68 lines
2.1 KiB
JavaScript

const argumentSchema = new SimpleSchema({
_id: SimpleSchema.RegEx.Id,
update: {
type: Object,
blackbox: true,
},
});
// Modified simpleSchemaMixin
import SimpleSchema from 'simpl-schema';
export default function updateSchemaMixin(methodOptions) {
// If the user didn't give us a schema and they did give us a validate, assume
// that they are choosing to use the validate way of doing things in this call.
if ((
typeof methodOptions.schema === 'undefined' &&
typeof methodOptions.validate !== 'undefined'
) || (
typeof methodOptions.schema !== 'undefined' &&
methodOptions.schema === null &&
typeof methodOptions.validate !== 'undefined' &&
methodOptions.validate !== null
)) {
return methodOptions;
}
// If they truly gave us both... that just doesn't seem proper.
if (methodOptions.validate && methodOptions.validate !== null) {
throw new Meteor.Error(
'simpleSchemaMixin.options',
'"schema" and "validate" options cannot be used together');
}
// Note that setting them both null will make it through, defaulting to the
// schema = null behavior (enforce no args) instead of the validate = null
// behavior (do no validation).
// Apply default validator options if none are provided
methodOptions.schemaValidatorOptions =
methodOptions.schemaValidatorOptions ||
{ clean: true, modifier: true };
// Make the update schema a SimpleSchema, if it isn't already
let updateSchema;
if (methodOptions.schema instanceof SimpleSchema) {
updateSchema = methodOptions.schema;
} else {
updateSchema = new SimpleSchema(methodOptions.schema);
}
// Set up the new validation
methodOptions.validate = function(args){
argumentSchema.validate(args);
updateSchema.validate(
{$set: args.update},
methodOptions.schemaValidatorOptions
);
};
// Give a default run function if one isn't supplied
if (!methodOptions.run){
methodOptions.run = function({_id, update}){
return methodOptions.collection.update(_id, {$set: update});
};
}
return methodOptions;
}