import { Meteor } from 'meteor/meteor'; import { Mongo } from 'meteor/mongo'; import { check } from 'meteor/check'; import 'meteor/aldeed:collection2/static' import SimpleSchema from 'meteor/aldeed:simple-schema'; let Measures = new Mongo.Collection('Measures'); if(Meteor.isServer) { //Set MongoDB indexes (or remove them) here. try { Measures.rawCollection().createIndex({name: -1}, {unique: true}) } catch(e) {console.log("Caught exception while setting indexes in MongoDB"); console.error(e)} } Measures.attachSchema(new SimpleSchema({ name: { type: String, label: "Name", optional: false, trim: true, // index: 1, Requires aldeed:schema-index which requires an older version fo aldeed:collection2 (3.5.0 vs 4.0.2) This can be achieved by adding indexes to MongoDB directly. //unique: true }, postfix: { type: String, label: "Postfix", optional: true, //Note: Each does not have a postfix. trim: true }, order: { type: SimpleSchema.Integer, label: "Order", optional: false, min: 0 }, createdAt: { //Force the value to the current date on the server. type: Date, label: "Created On", // autoValue: function() { //The disadvantage of autoValue is that it sets the date after insertion, causing the UI to update twice - once where the item has no date, and then again where the date is set. Sorted lists will cause the item to bounce around. // if(this.isInsert) return new Date(); // else if(this.isUpsert) return {$setOnInsert: new Date()}; // else this.unset(); // }, // denyUpdate: true, optional: false }, updatedAt: { type: Date, label: "Updated On", // autoValue: function() { // if(this.isUpdate) return new Date(); // }, // denyInsert: true, optional: true }, deactivated: { type: Boolean, label: "Deactivated", optional: true }, hidden: { type: Boolean, label: "Hidden", optional: true } })); if(Meteor.isServer) Meteor.publish('measures', function() { return Measures.find({}); }); if(Meteor.isServer) { Meteor.methods({ createMeasure: async function(name, postfix, order) { check(name, String); check(postfix, String); check(order, Number); if(Roles.userIsInRole(this.userId, [Meteor.UserRoles.ROLE_UPDATE])) { await Measures.insertAsync({name, postfix, order, createdAt: new Date()}); } else throw new Meteor.Error(403, "Not authorized."); }, deactivateMeasure: async function(id) { if(Roles.userIsInRole(this.userId, [Meteor.UserRoles.ROLE_UPDATE])) { //Measures.remove(id); await Measures.updateAsync(id, {$set: {deactivated: true}}, {bypassCollection2: true}); } else throw new Meteor.Error(403, "Not authorized."); }, reactivateMeasure: async function(id) { if(Roles.userIsInRole(this.userId, [Meteor.UserRoles.ROLE_UPDATE])) { await Measures.updateAsync(id, {$set: {deactivated: false}}, {bypassCollection2: true}); } else throw new Meteor.Error(403, "Not authorized."); }, hideMeasure: async function(id) { //One step past deactivated - will only show in the measures list if hidden measures are enabled. if(Roles.userIsInRole(this.userId, [Meteor.UserRoles.ROLE_UPDATE])) { //Measures.remove(id); await Measures.updateAsync(id, {$set: {hidden: true}}, {bypassCollection2: true}); } else throw new Meteor.Error(403, "Not authorized."); }, showMeasure: async function(id) { //Returns the measure to being simply deactivated. Will again show in lists. if(Roles.userIsInRole(this.userId, [Meteor.UserRoles.ROLE_UPDATE])) { await Measures.updateAsync(id, {$set: {hidden: false}}, {bypassCollection2: true}); } else throw new Meteor.Error(403, "Not authorized."); }, //deleteMeasure: function(id) { // if(Roles.userIsInRole(this.userId, [Meteor.UserRoles.ROLE_UPDATE])) { // //TODO: Should troll the database looking for references to remove or replace. This is currently not used. // Measures.remove(id); // } // else throw new Meteor.Error(403, "Not authorized."); //}, updateMeasure: async function(id, name, postfix, order) { check(id, String); check(name, String); check(postfix, String); check(order, Number); if(Roles.userIsInRole(this.userId, [Meteor.UserRoles.ROLE_UPDATE])) { await Measures.updateAsync(id, {$set: {name, postfix, order, updatedAt: new Date()}}); } else throw new Meteor.Error(403, "Not authorized."); } }); } //Allows the client to do DB interaction without calling server side methods, while still retaining control over whether the user can make changes. Measures.allow({ insert: function() {return false;}, update: function() {return false;}, remove: function() {return false;} }); export default Measures;