68 lines
2.1 KiB
JavaScript
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;
|
|
}
|