#64 Returned promises in model method definitions
parent
9040013de4
commit
afb52b4084
204
config/models.js
204
config/models.js
|
@ -47,94 +47,178 @@ const userSchema = new mongoose.Schema({
|
||||||
}).plugin(unique)
|
}).plugin(unique)
|
||||||
|
|
||||||
/* User methods */
|
/* User methods */
|
||||||
// TODO: Return promises instead of taking callbacks
|
|
||||||
// See https://gist.github.com/7h1b0/5154fda207e68ad1cefc#file-random-js
|
|
||||||
// For an example
|
|
||||||
|
|
||||||
// Create email confirmation token
|
// Create email confirmation token
|
||||||
userSchema.methods.createEmailToken = function (next) { // next(err,token)
|
userSchema.methods.createEmailToken = function (next) {
|
||||||
debug('user.createEmailToken() called')
|
debug('user.createEmailToken() called')
|
||||||
var user = this
|
var user = this
|
||||||
|
|
||||||
crypto.randomBytes(16, (err, buf) => {
|
// Callback next(err, token)
|
||||||
if (err) return next(err)
|
if (typeof next === 'function') {
|
||||||
if (buf) {
|
crypto.randomBytes(16, (err, buf) => {
|
||||||
debug(`Buffer ${buf.toString('hex')} created`)
|
if (err) return next(err)
|
||||||
user.emailToken = buf.toString('hex')
|
if (buf) {
|
||||||
|
debug(`Buffer ${buf.toString('hex')} created`)
|
||||||
|
user.emailToken = buf.toString('hex')
|
||||||
|
user.save()
|
||||||
|
.then(() => {
|
||||||
|
return next(null, user.emailToken)
|
||||||
|
})
|
||||||
|
.catch((err) => {
|
||||||
|
return next(err)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
// Promise
|
||||||
|
} else return new Promise((resolve, reject) => {
|
||||||
|
crypto.randomBytes(16, (err, buf) => {
|
||||||
|
if (err) reject(err)
|
||||||
|
if (buf) {
|
||||||
|
debug(`Buffer ${buf.toString('hex')} created`)
|
||||||
|
user.emailToken = buf.toString('hex')
|
||||||
|
user.save()
|
||||||
|
.then(() => {
|
||||||
|
resolve(user.emailToken)
|
||||||
|
})
|
||||||
|
.catch((err) => {
|
||||||
|
reject(err)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create password reset token
|
||||||
|
userSchema.methods.createPassToken = function (next) {
|
||||||
|
debug('user.createPassToken() called')
|
||||||
|
var user = this
|
||||||
|
|
||||||
|
// Callback next(err, token, expires)
|
||||||
|
if (typeof next === 'function') {
|
||||||
|
|
||||||
|
// Reuse old token, resetting clock
|
||||||
|
if (user.auth.passTokenExpires >= Date.now()) {
|
||||||
|
debug(`Reusing old password token...`)
|
||||||
|
user.auth.passTokenExpires = Date.now() + 3600000 // 1 hour
|
||||||
user.save()
|
user.save()
|
||||||
.then(() => {
|
.then(() => {
|
||||||
return next(null, user.emailToken)
|
return next(null, user.auth.passToken, user.auth.passTokenExpires)
|
||||||
})
|
})
|
||||||
.catch((err) => {
|
.catch((err) => {
|
||||||
return next(err, null)
|
return next(err)
|
||||||
|
})
|
||||||
|
|
||||||
|
// Create new token
|
||||||
|
} else {
|
||||||
|
debug(`Creating new password token...`)
|
||||||
|
crypto.randomBytes(16, (err, buf) => {
|
||||||
|
if (err) return next(err)
|
||||||
|
if (buf) {
|
||||||
|
user.auth.passToken = buf.toString('hex')
|
||||||
|
user.auth.passTokenExpires = Date.now() + 3600000 // 1 hour
|
||||||
|
user.save()
|
||||||
|
.then(() => {
|
||||||
|
debug('successfully saved user in createPassToken')
|
||||||
|
return next(null, user.auth.passToken, user.auth.passTokenExpires)
|
||||||
|
})
|
||||||
|
.catch((err) => {
|
||||||
|
debug('error saving user in createPassToken')
|
||||||
|
return next(err)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Promise
|
||||||
|
|
||||||
|
} else return new Promise((resolve, reject) => {
|
||||||
|
|
||||||
|
// Reuse old token, resetting clock
|
||||||
|
if (user.auth.passTokenExpires >= Date.now()) {
|
||||||
|
debug(`Reusing old password token...`)
|
||||||
|
user.auth.passTokenExpires = Date.now() + 3600000 // 1 hour
|
||||||
|
user.save()
|
||||||
|
.then(() => {
|
||||||
|
resolve(user.auth.passToken, user.auth.passTokenExpires)
|
||||||
|
})
|
||||||
|
.catch((err) => {
|
||||||
|
reject(err)
|
||||||
|
})
|
||||||
|
|
||||||
|
// Create new token
|
||||||
|
} else {
|
||||||
|
debug(`Creating new password token...`)
|
||||||
|
crypto.randomBytes(16, (err, buf) => {
|
||||||
|
if (err) return next(err)
|
||||||
|
if (buf) {
|
||||||
|
user.auth.passToken = buf.toString('hex')
|
||||||
|
user.auth.passTokenExpires = Date.now() + 3600000 // 1 hour
|
||||||
|
user.save()
|
||||||
|
.then(() => {
|
||||||
|
debug('successfully saved user in createPassToken')
|
||||||
|
resolve(user.auth.passToken, user.auth.passTokenExpires)
|
||||||
|
})
|
||||||
|
.catch((err) => {
|
||||||
|
debug('error saving user in createPassToken')
|
||||||
|
reject(err)
|
||||||
|
})
|
||||||
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create password reset token
|
|
||||||
userSchema.methods.createPassToken = function (next) { // next(err,token,expires)
|
|
||||||
var user = this
|
|
||||||
|
|
||||||
// Reuse old token, resetting clock
|
|
||||||
if (user.auth.passTokenExpires >= Date.now()) {
|
|
||||||
debug(`Reusing old password token...`)
|
|
||||||
user.auth.passTokenExpires = Date.now() + 3600000 // 1 hour
|
|
||||||
user.save()
|
|
||||||
.then(() => {
|
|
||||||
return next(null, user.auth.passToken, user.auth.passTokenExpires)
|
|
||||||
})
|
|
||||||
.catch((err) => {
|
|
||||||
return next(err)
|
|
||||||
})
|
|
||||||
|
|
||||||
// Create new token
|
|
||||||
} else {
|
|
||||||
debug(`Creating new password token...`)
|
|
||||||
crypto.randomBytes(16, (err, buf) => {
|
|
||||||
if (err) return next(err)
|
|
||||||
if (buf) {
|
|
||||||
user.auth.passToken = buf.toString('hex')
|
|
||||||
user.auth.passTokenExpires = Date.now() + 3600000 // 1 hour
|
|
||||||
user.save()
|
|
||||||
.then(() => {
|
|
||||||
debug('successfully saved user in createPassToken')
|
|
||||||
return next(null, user.auth.passToken, user.auth.passTokenExpires)
|
|
||||||
})
|
|
||||||
.catch((err) => {
|
|
||||||
debug('error saving user in createPassToken')
|
|
||||||
return next(err)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generate hash for new password and save it to the database
|
// Generate hash for new password and save it to the database
|
||||||
userSchema.methods.generateHashedPassword = function (password, next) {
|
userSchema.methods.generateHashedPassword = function (password, next) {
|
||||||
// next(err);
|
|
||||||
|
|
||||||
// Delete token
|
// Delete token
|
||||||
this.auth.passToken = undefined
|
this.auth.passToken = undefined
|
||||||
this.auth.passTokenExpires = undefined
|
this.auth.passTokenExpires = undefined
|
||||||
|
|
||||||
// Generate hash
|
// Callback next(err, token, expires)
|
||||||
bcrypt.genSalt(8, (err, salt) => {
|
if (typeof next === 'function') {
|
||||||
if (err) return next(err)
|
|
||||||
bcrypt.hash(password, salt, (err, hash) => {
|
// Generate hash
|
||||||
|
bcrypt.genSalt(8, (err, salt) => {
|
||||||
if (err) return next(err)
|
if (err) return next(err)
|
||||||
this.auth.password = hash
|
bcrypt.hash(password, salt, (err, hash) => {
|
||||||
this.save()
|
if (err) return next(err)
|
||||||
next()
|
this.auth.password = hash
|
||||||
|
this.save()
|
||||||
|
.then(next)
|
||||||
|
.catch((err) => next(err) )
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
} else return new Promise((resolve, reject) => {
|
||||||
|
|
||||||
|
// Generate hash
|
||||||
|
bcrypt.genSalt(8, (err, salt) => {
|
||||||
|
if (err) reject(err)
|
||||||
|
bcrypt.hash(password, salt, (err, hash) => {
|
||||||
|
if (err) reject(err)
|
||||||
|
this.auth.password = hash
|
||||||
|
this.save()
|
||||||
|
.then(resolve)
|
||||||
|
.catch( (err) => reject(err) )
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check for valid password
|
// Check for valid password
|
||||||
userSchema.methods.validPassword = function (password, next) {
|
userSchema.methods.validPassword = function (password, next) {
|
||||||
// next(err,res);
|
// Callback next(err, res)
|
||||||
// res = true/false
|
if (typeof next === 'function') bcrypt.compare(password, this.auth.password, next)
|
||||||
bcrypt.compare(password, this.auth.password, next)
|
else bcrypt.compare(password, this.auth.password)
|
||||||
|
.then((result) => {
|
||||||
|
if (result===true) resolve()
|
||||||
|
else reject(new Error('Passwords don\'t match'))
|
||||||
|
})
|
||||||
|
.catch( (err) => reject(err) )
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
|
|
Loading…
Reference in New Issue