100 lines
2.3 KiB
JavaScript
100 lines
2.3 KiB
JavaScript
const mongoose = require("mongoose");
|
|
const crypto = require("crypto");
|
|
const Schema = mongoose.Schema
|
|
const userSchema = new mongoose.Schema({
|
|
name: {
|
|
type: String,
|
|
trim: true,
|
|
required: true,
|
|
maxlength: 32
|
|
},
|
|
email: {
|
|
type: String,
|
|
trim: true,
|
|
// unique:true
|
|
},
|
|
userID: {
|
|
type: String,
|
|
trim: true,
|
|
unique: true
|
|
},
|
|
loginDomain: {
|
|
type: String,
|
|
default: "system",//can be facebook, google as well
|
|
enum:['system', 'facebook', 'google']
|
|
},
|
|
password: {
|
|
type: String,
|
|
// required: true
|
|
},
|
|
location: [{
|
|
type: Schema.Types.ObjectId,
|
|
ref: "address"
|
|
}],
|
|
photo: {
|
|
type: String
|
|
},
|
|
socialPhoto: {
|
|
type: String
|
|
},
|
|
dob:{
|
|
type: String
|
|
},
|
|
gender:{
|
|
type:String,
|
|
enum:['male','female','other']
|
|
},
|
|
resetPasswordLink: {
|
|
type: String,
|
|
default: ""
|
|
},
|
|
emailVerifyLink: {
|
|
type: String,
|
|
default: ""
|
|
},
|
|
salt: String,
|
|
isBlocked: {
|
|
type: Date,
|
|
default: null
|
|
}
|
|
}, { timestamps: true });
|
|
userSchema.index({ geolocation: "2dsphere" });
|
|
|
|
const sha512 = function (password, salt) {
|
|
let hash = crypto.createHmac('sha512', salt);
|
|
hash.update(password);
|
|
let value = hash.digest('hex');
|
|
return {
|
|
passwordHash: value
|
|
};
|
|
};
|
|
userSchema.pre('save', function (next) {
|
|
let user = this;
|
|
if (user.isModified('password')) {
|
|
// salt
|
|
const ranStr = function (n) {
|
|
return crypto.randomBytes(Math.ceil(8))
|
|
.toString('hex')
|
|
.slice(0, n);
|
|
};
|
|
// applying sha512 alogrithm
|
|
let salt = ranStr(16);
|
|
let passwordData = sha512(user.password, salt);
|
|
user.password = passwordData.passwordHash;
|
|
user.salt = salt;
|
|
next();
|
|
} else {
|
|
next();
|
|
}
|
|
})
|
|
userSchema.statics.findByCredentials = async function (email, password) {
|
|
let User = this;
|
|
const user = await User.findOne({ email, loginDomain:'system' })
|
|
if (!user) return ''
|
|
let passwordData = sha512(password, user.salt)
|
|
if (passwordData.passwordHash == user.password) {
|
|
return user
|
|
}
|
|
}
|
|
|
|
module.exports = mongoose.model("user", userSchema); |