"use strict"; var modb = require('mongoose'); var bcrypt = require('bcryptjs-then'); var Promise = require('bluebird'); var _ = require('lodash'); /** * User Schema * * @type {Object} */ var userSchema = modb.Schema({ email: { type: String, required: true, index: true, minlength: 6 }, password: { type: String, required: true }, firstName: { type: String, required: true, minlength: 1 }, lastName: { type: String, required: true, minlength: 1 }, timezone: { type: String, required: true, default: 'UTC' }, lang: { type: String, required: true, default: 'en' }, rights: [{ type: String, required: true }] }, { timestamps: {} }); /** * VIRTUAL - Full Name */ userSchema.virtual('fullName').get(function() { return this.firstName + ' ' + this.lastName; }); /** * INSTANCE - Validate password against hash * * @param {string} uPassword The user password * @return {Promise} Promise with valid / invalid boolean */ userSchema.methods.validatePassword = function(uPassword) { let self = this; return bcrypt.compare(uPassword, self.password); }; /** * MODEL - Generate hash from password * * @param {string} uPassword The user password * @return {Promise} Promise with generated hash */ userSchema.statics.generateHash = function(uPassword) { return bcrypt.hash(uPassword, 10); }; /** * MODEL - Create a new user * * @param {Object} nUserData User data * @return {Promise} Promise of the create operation */ userSchema.statics.new = function(nUserData) { let self = this; return self.generateHash(nUserData.password).then((passhash) => { return this.create({ _id: db.ObjectId(), email: nUserData.email, firstName: nUserData.firstName, lastName: nUserData.lastName, password: passhash, rights: ['admin'] }); }); }; /** * MODEL - Edit a user * * @param {String} userId The user identifier * @param {Object} data The user data * @return {Promise} Promise of the update operation */ userSchema.statics.edit = function(userId, data) { let self = this; // Change basic info let fdata = { email: data.email, firstName: data.firstName, lastName: data.lastName, timezone: data.timezone, lang: data.lang, rights: data.rights }; let waitTask = null; // Change password? if(!_.isEmpty(data.password) && _.trim(data.password) !== '********') { waitTask = self.generateHash(data.password).then((passhash) => { fdata.password = passhash; return fdata; }); } else { waitTask = Promise.resolve(fdata); } // Update user return waitTask.then((udata) => { return this.findByIdAndUpdate(userId, udata, { runValidators: true }); }); }; /** * MODEL - Delete a user * * @param {String} userId The user ID * @return {Promise} Promise of the delete operation */ userSchema.statics.erase = function(userId) { return this.findByIdAndRemove(userId); }; module.exports = modb.model('User', userSchema);