wikijs-fork/models/db/user.js
2016-08-16 20:56:55 -04:00

158 lines
3.1 KiB
JavaScript

"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<Boolean>} 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<String>} 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);