tracman-server/config/models.js

143 lines
3.9 KiB
JavaScript
Raw Normal View History

2017-12-12 17:40:07 -07:00
'use strict'
2017-04-01 11:03:31 -06:00
2017-12-12 17:40:07 -07:00
const mongoose = require('mongoose')
const unique = require('mongoose-unique-validator')
const bcrypt = require('bcrypt')
const crypto = require('crypto')
const debug = require('debug')('tracman-models')
2017-04-01 11:03:31 -06:00
const userSchema = new mongoose.Schema({
2017-12-12 17:40:07 -07:00
name: {type: String},
email: {type: String, unique: true},
newEmail: String,
emailToken: String,
slug: {type: String, required: true, unique: true},
auth: {
password: String,
passToken: String,
passTokenExpires: Date,
google: String,
facebook: String,
twitter: String
},
isAdmin: {type: Boolean, required: true, default: false},
isPro: {type: Boolean, required: true, default: false},
created: {type: Date, required: true},
lastLogin: Date,
settings: {
units: {type: String, default: 'standard'},
defaultMap: {type: String, default: 'road'},
defaultZoom: {type: Number, default: 11},
showScale: {type: Boolean, default: false},
showSpeed: {type: Boolean, default: false},
showTemp: {type: Boolean, default: false},
showAlt: {type: Boolean, default: false},
showStreetview: {type: Boolean, default: false},
marker: {type: String, default: 'red'}
},
last: {
time: Date,
lat: {type: Number, default: 0},
lon: {type: Number, default: 0},
dir: {type: Number, default: 0},
alt: {type: Number},
spd: {type: Number, default: 0}
},
sk32: {type: String, required: true, unique: true}
}).plugin(unique)
2017-04-09 21:40:08 -06:00
2017-12-12 17:40:07 -07:00
/* User methods */
// TODO: Return promises instead of taking callbacks
// See https://gist.github.com/7h1b0/5154fda207e68ad1cefc#file-random-js
// For an example
2017-12-12 17:40:07 -07:00
// Create email confirmation token
userSchema.methods.createEmailToken = function (next) { // next(err,token)
debug('user.createEmailToken() called')
var user = this
crypto.randomBytes(16, (err, buf) => {
2017-12-13 12:52:01 -07:00
if (err) return next(err)
2017-12-12 17:40:07 -07:00
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, null)
})
}
})
}
// 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) => {
2017-12-13 12:52:01 -07:00
return next(err)
2017-12-12 17:40:07 -07:00
})
// Create new token
} else {
debug(`Creating new password token...`)
crypto.randomBytes(16, (err, buf) => {
2017-12-13 12:52:01 -07:00
if (err) return next(err)
2017-12-12 17:40:07 -07:00
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')
2017-12-13 12:52:01 -07:00
return next(err)
2017-12-12 17:40:07 -07:00
})
}
})
}
}
// Generate hash for new password and save it to the database
userSchema.methods.generateHashedPassword = function (password, next) {
// next(err);
// Delete token
this.auth.passToken = undefined
this.auth.passTokenExpires = undefined
// Generate hash
bcrypt.genSalt(8, (err, salt) => {
2017-12-13 12:52:01 -07:00
if (err) return next(err)
2017-12-12 17:40:07 -07:00
bcrypt.hash(password, salt, (err, hash) => {
2017-12-13 12:52:01 -07:00
if (err) return next(err)
2017-12-12 17:40:07 -07:00
this.auth.password = hash
this.save()
next()
})
})
}
// Check for valid password
userSchema.methods.validPassword = function (password, next) {
// next(err,res);
// res = true/false
bcrypt.compare(password, this.auth.password, next)
2017-04-09 21:40:08 -06:00
}
2017-04-01 11:03:31 -06:00
module.exports = {
2017-12-12 17:40:07 -07:00
'user': mongoose.model('User', userSchema)
}