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'; import Measures from "./Measure"; let Workers = new Mongo.Collection('Workers'); if(Meteor.isServer) { //Set MongoDB indexes (or remove them) here. try { Workers.rawCollection().createIndex({name: -1}, {unique: true}) } catch(e) {console.log("Caught exception while setting indexes in MongoDB"); console.error(e)} } let WORKER_ACTIVITIES = ['sales', 'prep', 'canning', 'farming']; let workersSchema = new SimpleSchema({ name: { type: String, label: "Name", optional: false, trim: true, //index: 1, //unique: true }, activities: { type: Array, //[String], label: "Activities", optional: false, trim: true }, 'activities.$': { type: String, }, hourlyRate: { type: SimpleSchema.Integer, label: "HourlyRate", 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 } }); workersSchema.constants = {activities: WORKER_ACTIVITIES}; Workers.attachSchema(workersSchema); if(Meteor.isServer) Meteor.publish('workers', function() { return Workers.find({}); }); if(Meteor.isServer) { Meteor.methods({ createWorker: async function(name, activities, hourlyRate) { check(name, String); check(activities, [String]); check(hourlyRate, Number); if(Roles.userIsInRole(this.userId, [Meteor.UserRoles.ROLE_UPDATE])) { await Workers.insertAsync({name, activities, hourlyRate, createdAt: new Date()}); } else throw new Meteor.Error(403, "Not authorized."); }, //deleteWorker: 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. // Workers.remove(id); // } // else throw new Meteor.Error(403, "Not authorized."); //}, updateWorker: async function(id, name, activities, hourlyRate) { check(id, String); check(name, String); check(activities, [String]); check(hourlyRate, Number); if(Roles.userIsInRole(this.userId, [Meteor.UserRoles.ROLE_UPDATE])) { await Workers.updateAsync(id, {$set: {name, activities, hourlyRate, updatedAt: new Date()}}); } else throw new Meteor.Error(403, "Not authorized."); }, deactivateWorker: async function(id) { if(Roles.userIsInRole(this.userId, [Meteor.UserRoles.ROLE_UPDATE])) { //Workers.remove(id); await Workers.updateAsync(id, {$set: {deactivated: true}}, {bypassCollection2: true}); } else throw new Meteor.Error(403, "Not authorized."); }, reactivateWorker: async function(id) { if(Roles.userIsInRole(this.userId, [Meteor.UserRoles.ROLE_UPDATE])) { await Workers.updateAsync(id, {$set: {deactivated: false}}, {bypassCollection2: true}); } else throw new Meteor.Error(403, "Not authorized."); }, hideWorker: async function(id) { //One step past deactivated - will only show in the Workers list if hidden Workers are enabled. if(Roles.userIsInRole(this.userId, [Meteor.UserRoles.ROLE_UPDATE])) { await Workers.updateAsync(id, {$set: {hidden: true}}, {bypassCollection2: true}); } else throw new Meteor.Error(403, "Not authorized."); }, showWorker: 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 Workers.updateAsync(id, {$set: {hidden: false}}, {bypassCollection2: true}); } 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. Workers.allow({ insert: function() {return false;}, update: function() {return false;}, remove: function() {return false;} }); export default Workers;