UNPKG

horse-generator

Version:
1 lines 2.37 kB
"use strict";var mongoose=require("mongoose"),crypto=require("crypto"),paginate=require("../../libs/plugins/paginate"),Schema=mongoose.Schema,ObjectId=mongoose.Schema.Types.ObjectId,schema=Schema({email:{type:String,lowercase:!0,unique:!0},username:{type:String,unique:!0},hashedPassword:String,salt:String,role:{type:String,default:"user"},partner:{type:ObjectId,ref:"Partner",default:null},avatar:String,status:{type:Number,default:0},phone:{type:String},address:String,gender:String,provider:{type:String,default:"local"},qq:{id:String,token:String,email:String,name:String},wechat:{id:String,token:String,email:String,name:String}},{timestamps:{},toObject:{virtuals:!0},id:!1});schema.virtual("password").set(function(e){this._password=e,this.salt=this.makeSalt(),this.hashedPassword=this.encryptPassword(e)}).get(function(){return this._password}),schema.virtual("userInfo").get(function(){return{email:this.email,username:this.username,role:this.role,provider:this.provider,status:this.status,avatar:this.avatar,partner:this.partner}}),schema.virtual("providerInfo").get(function(){return{qq:this.qq,wechat:this.wechat}}),schema.virtual("token").get(function(){return{_id:this._id,role:this.role}}),schema.path("email").validate({isAsync:!0,validator:function(e,t){var a=this;a.constructor.findOne({email:e},function(e,r){r&&a.id!==r.id&&t(!1),t(!0)})},message:"这个email已经被使用!"}),schema.path("username").validate({isAsync:!0,validator:function(e,t){var a=this;a.constructor.findOne({username:e},function(e,r){r&&a.id!==r.id&&t(!1),t(!0)})},message:"这个用户名已经被使用!"});var autoPopulate=function(e){this.populate([{path:"partner",select:"name"}]),e()};schema.pre("find",autoPopulate),schema.pre("findOne",autoPopulate),schema.post("save",function(e,t,a){"MongoError"===e.name&&11e3===e.code?a(new Error("这个邮箱或用户名已经被使用!")):a(e)}),schema.methods={hasRole:function(e){var t=this.role;return-1!==t.indexOf("admin")||-1!==t.indexOf(e)},authenticate:function(e){return this.encryptPassword(e)===this.hashedPassword},makeSalt:function(){return crypto.randomBytes(16).toString("base64")},encryptPassword:function(e){if(!e||!this.salt)return"";var t=new Buffer(this.salt,"base64");return crypto.pbkdf2Sync(e,t,1e4,64,"sha1").toString("base64")}},schema.plugin(paginate),module.exports=mongoose.model("User",schema);