const Mongoose = require('mongoose'); const RoleSchema = new Mongoose.Schema({ name: { type: String, required: true, unique: true }, description: { type: String }, add: { type: Boolean, default: false }, delete: { type: Boolean, default: false }, edit: { type: Boolean, default: false }, manage: { type: Boolean, default: false }, super: { type: Boolean, default: false }, view: { type: Boolean, default: true }, disabled: { type: Boolean, default: false }, order: { type: Number, default: 1 }, updated_at: { type: Date, default: Date.now } }); RoleSchema.pre('findOneAndUpdate', function (next) { this.update({}, { $set: { updated_at: Date.now() } }); next(); }); const RoleModel = Mongoose.model('roles', RoleSchema); module.exports = { canRole: (e, roleId, action, callback) => { var [initial, canElevate = false] = Array.isArray(action) ? action : [action]; RoleModel.findById(roleId, (err, result) => { if (err) { callback('There was an error querying roles', null); } if (result) { let permissions = result[initial] && canElevate ? { hasPermission: result[initial], canElevate: canElevate ? result[canElevate] : null } : result[initial]; callback(null, permissions); } }); }, createRole: (e, role) => { const promise = new Promise((resolve, reject) => { var roleInstance = new RoleModel(role); roleInstance.save((err, result) => { if (err) { reject(err); } if (result) { resolve(result); } }); }); promise.then((result) => { e.emit('createRole', null, result); }) .catch((err) => { e.emit('createRole', err, null); }); }, getRoles: (e, query) => { query = query || {}; const promise = new Promise((resolve, reject) => { RoleModel .find(query.find, query.select, query.options) .exec((err, results) => { if (err) { reject(err); } if (results) { resolve(results); } }); }); promise.then((results) => { e.emit('getRoles', null, results); }) .catch((err) => { e.emit('getRoles', err, null); }); }, getRole: (e, id) => { const promise = new Promise((resolve, reject) => { RoleModel.find({_id: id}, (err, result) => { if (err) { reject(err); } if (result) { resolve(result); } }); }); promise.then((result) => { e.emit('getRole', null, result); }) .catch((err) => { e.emit('getRole', err, null); }); }, updateRole: (e, id, role) => { const promise = new Promise((resolve, reject) => { RoleModel.findByIdAndUpdate(id, { $set: role }, { new: true }, (err, result) => { if (err) { reject(err); } if (result) { resolve(result); } }); }); promise.then((result) => { e.emit('updateRole', null, result); }) .catch((err) => { e.emit('updateRole', err, null); }); }, deleteRole: (e, id) => { const promise = new Promise((resolve, reject) => { RoleModel.remove({ _id: id }, (err, result) => { if (err) { reject(err); } if (result) { resolve(result); } }); }); promise.then((result) => { e.emit('deleteRole', null, result); }) .catch((err) => { e.emit('deleteRole', err, null); }); } };