import { ValidatedMethod } from 'meteor/mdg:validated-method'; import { RateLimiterMixin } from 'ddp-rate-limiter-mixin'; import Creatures from '/imports/api/creature/creatures/Creatures.js'; import { assertEditPermission } from '/imports/api/sharing/sharingPermissions.js'; const updateCreature = new ValidatedMethod({ name: 'creatures.update', validate({ _id, path }) { if (!_id) return false; // Allowed fields let allowedFields = [ 'name', 'alignment', 'gender', 'picture', 'avatarPicture', 'color', 'settings', ]; if (!allowedFields.includes(path[0])) { throw new Meteor.Error('Creatures.methods.update.denied', 'This field can\'t be updated using this method'); } }, mixins: [RateLimiterMixin], rateLimit: { numRequests: 5, timeInterval: 5000, }, run({ _id, path, value }) { let creature = Creatures.findOne(_id); assertEditPermission(creature, this.userId); if (value === undefined || value === null) { Creatures.update(_id, { $unset: { [path.join('.')]: 1 }, }); } else { Creatures.update(_id, { $set: { [path.join('.')]: value }, }); } }, }); export default updateCreature;