2017-12-12 17:40:07 -07:00
|
|
|
'use strict'
|
2017-07-04 10:09:28 -06:00
|
|
|
|
2017-12-12 17:40:07 -07:00
|
|
|
const slug = require('slug')
|
|
|
|
const xss = require('xss')
|
|
|
|
const mw = require('../middleware.js')
|
|
|
|
const User = require('../models.js').user
|
|
|
|
const mail = require('../mail.js')
|
|
|
|
const env = require('../env/env.js')
|
2018-03-04 13:39:45 -07:00
|
|
|
const sanitize = require('mongo-sanitize')
|
2018-01-19 14:23:43 -07:00
|
|
|
const debug = require('debug')('tracman-routes-settings')
|
2017-12-12 17:40:07 -07:00
|
|
|
const router = require('express').Router()
|
2017-04-11 19:38:07 -06:00
|
|
|
|
|
|
|
// Settings form
|
|
|
|
router.route('/')
|
2017-12-12 17:40:07 -07:00
|
|
|
.all(mw.ensureAuth, (req, res, next) => {
|
|
|
|
next()
|
|
|
|
})
|
|
|
|
|
|
|
|
// Get settings form
|
|
|
|
.get((req, res) => {
|
|
|
|
res.render('settings', {active: 'settings'})
|
|
|
|
})
|
|
|
|
|
|
|
|
// Set new settings
|
2018-01-20 20:45:25 -07:00
|
|
|
.post( async (req, res, next) => {
|
2017-12-12 17:40:07 -07:00
|
|
|
// Validate email
|
2018-01-20 20:45:25 -07:00
|
|
|
const checkEmail = new Promise( async (resolve, reject) => {
|
2017-12-12 17:40:07 -07:00
|
|
|
// Check validity
|
|
|
|
if (!mw.validateEmail(req.body.email)) {
|
|
|
|
req.flash('warning', `<u>${req.body.email}</u> is not a valid email address. `)
|
|
|
|
resolve()
|
|
|
|
|
|
|
|
// Check if unchanged
|
2017-12-13 12:52:01 -07:00
|
|
|
} else if (req.user.email === req.body.email) resolve()
|
2017-12-12 17:40:07 -07:00
|
|
|
|
|
|
|
// Check uniqueness
|
2017-12-13 12:52:01 -07:00
|
|
|
else {
|
2018-01-20 20:45:25 -07:00
|
|
|
try {
|
|
|
|
let existingUser = await User.findOne({ email: req.body.email })
|
|
|
|
|
2017-12-12 17:40:07 -07:00
|
|
|
// Not unique!
|
|
|
|
if (existingUser && existingUser.id !== req.user.id) {
|
|
|
|
debug('Email not unique!')
|
2017-12-13 12:52:01 -07:00
|
|
|
req.flash('warning',
|
|
|
|
`That email, <u>${req.body.email}</u>, is already in use by another user! `
|
|
|
|
)
|
2017-12-12 17:40:07 -07:00
|
|
|
resolve()
|
|
|
|
|
|
|
|
// It's unique
|
|
|
|
} else {
|
|
|
|
debug('Email is unique')
|
|
|
|
req.user.newEmail = req.body.email
|
|
|
|
|
|
|
|
// Create token
|
|
|
|
debug(`Creating email token...`)
|
2018-01-20 20:45:25 -07:00
|
|
|
let token = await req.user.createEmailToken()
|
|
|
|
|
|
|
|
// Send token to user by email
|
|
|
|
debug(`Mailing new email token to ${req.body.email}...`)
|
|
|
|
await mail.send({
|
|
|
|
to: `"${req.user.name}" <${req.body.email}>`,
|
|
|
|
from: mail.noReply,
|
|
|
|
subject: 'Confirm your new email address for Tracman',
|
|
|
|
text: mail.text(
|
|
|
|
`A request has been made to change your Tracman email address. \
|
|
|
|
If you did not initiate this request, please disregard it. \n\n\
|
2018-02-07 18:33:27 -07:00
|
|
|
To confirm your email, follow this link:\n${env.url}/account/email/${token}. `
|
2018-01-20 20:45:25 -07:00
|
|
|
),
|
|
|
|
html: mail.html(
|
|
|
|
`<p>A request has been made to change your Tracman email address. \
|
|
|
|
If you did not initiate this request, please disregard it. </p>\
|
|
|
|
<p>To confirm your email, follow this link:\
|
2018-02-07 18:33:27 -07:00
|
|
|
<br><a href="${env.url}/account/email/${token}">\
|
|
|
|
${env.url}/account/email/${token}</a>. </p>`
|
2018-01-20 20:45:25 -07:00
|
|
|
)
|
|
|
|
})
|
|
|
|
|
|
|
|
req.flash('warning',
|
|
|
|
`An email has been sent to <u>${req.body.email}</u>. Check your inbox to confirm your new email address. `
|
2017-12-28 18:20:06 -07:00
|
|
|
)
|
2018-01-20 20:45:25 -07:00
|
|
|
resolve()
|
|
|
|
}
|
|
|
|
} catch (err) { reject() }
|
2017-12-12 17:40:07 -07:00
|
|
|
}
|
|
|
|
})
|
|
|
|
|
|
|
|
// Validate slug
|
2018-01-20 20:45:25 -07:00
|
|
|
const checkSlug = new Promise( async (resolve, reject) => {
|
2017-12-12 17:40:07 -07:00
|
|
|
// Check existence
|
|
|
|
if (req.body.slug === '') {
|
|
|
|
req.flash('warning', `You must supply a slug. `)
|
|
|
|
resolve()
|
|
|
|
|
|
|
|
// Check if unchanged
|
2017-12-13 12:52:01 -07:00
|
|
|
} else if (req.user.slug === slug(xss(req.body.slug))) resolve()
|
2017-12-18 23:42:43 -07:00
|
|
|
|
2017-12-12 17:40:07 -07:00
|
|
|
// Check uniqueness
|
2017-12-13 12:52:01 -07:00
|
|
|
else {
|
2018-01-20 20:45:25 -07:00
|
|
|
try {
|
|
|
|
let existingUser = await User.findOne({ slug: req.body.slug })
|
|
|
|
|
2017-12-12 17:40:07 -07:00
|
|
|
// Not unique!
|
|
|
|
if (existingUser && existingUser.id !== req.user.id) {
|
2017-12-18 23:42:43 -07:00
|
|
|
req.flash( 'warning',
|
2017-12-13 12:52:01 -07:00
|
|
|
`That slug, <u>${req.body.slug}</u>, is already in use by another user! `
|
|
|
|
)
|
2017-12-12 17:40:07 -07:00
|
|
|
|
|
|
|
// It's unique
|
2017-12-13 12:52:01 -07:00
|
|
|
} else req.user.slug = slug(xss(req.body.slug))
|
2018-01-20 20:45:25 -07:00
|
|
|
|
|
|
|
resolve()
|
|
|
|
} catch (err) { reject() }
|
2017-12-12 17:40:07 -07:00
|
|
|
}
|
|
|
|
})
|
|
|
|
|
|
|
|
// Set settings when done
|
2018-01-20 20:45:25 -07:00
|
|
|
try {
|
|
|
|
await Promise.all([checkEmail, checkSlug])
|
2017-12-12 17:40:07 -07:00
|
|
|
debug('Setting settings... ')
|
|
|
|
|
|
|
|
// Set values
|
|
|
|
req.user.name = xss(req.body.name)
|
|
|
|
req.user.settings = {
|
|
|
|
units: req.body.units,
|
|
|
|
defaultMap: req.body.map,
|
|
|
|
defaultZoom: req.body.zoom,
|
|
|
|
showScale: !!(req.body.showScale),
|
|
|
|
showSpeed: !!(req.body.showSpeed),
|
|
|
|
showAlt: !!(req.body.showAlt),
|
|
|
|
showStreetview: !!(req.body.showStreet),
|
|
|
|
marker: req.body.marker
|
|
|
|
}
|
|
|
|
|
|
|
|
// Save user and send response
|
|
|
|
debug(`Saving new settings for user ${req.user.name}...`)
|
2018-01-20 20:45:25 -07:00
|
|
|
await req.user.save()
|
|
|
|
debug(`DONE! Redirecting user...`)
|
|
|
|
req.flash('success', 'Settings updated. ')
|
|
|
|
|
|
|
|
} catch (err) { mw.throwErr(err, req) }
|
|
|
|
finally { res.redirect('/settings') }
|
2017-12-12 17:40:07 -07:00
|
|
|
})
|
2017-04-11 19:38:07 -06:00
|
|
|
|
2018-02-07 18:33:27 -07:00
|
|
|
|
2017-05-06 23:59:21 -06:00
|
|
|
// Delete account
|
2018-01-20 20:45:25 -07:00
|
|
|
router.get('/delete', async (req, res) => {
|
|
|
|
try {
|
|
|
|
await User.findByIdAndRemove(req.user)
|
2017-12-12 17:40:07 -07:00
|
|
|
req.flash('success', 'Your account has been deleted. ')
|
|
|
|
res.redirect('/')
|
2018-01-20 20:45:25 -07:00
|
|
|
} catch (err) {
|
2017-12-12 17:40:07 -07:00
|
|
|
mw.throwErr(err, req)
|
|
|
|
res.redirect('/settings')
|
2018-01-20 20:45:25 -07:00
|
|
|
}
|
2017-12-12 17:40:07 -07:00
|
|
|
})
|
2017-05-06 23:59:21 -06:00
|
|
|
|
2017-04-11 19:38:07 -06:00
|
|
|
// Tracman pro
|
2017-04-12 11:41:27 -06:00
|
|
|
router.route('/pro')
|
2017-12-12 17:40:07 -07:00
|
|
|
.all(mw.ensureAuth, (req, res, next) => {
|
|
|
|
next()
|
|
|
|
})
|
|
|
|
|
|
|
|
// Get info about pro
|
|
|
|
.get((req, res, next) => {
|
|
|
|
res.render('pro')
|
|
|
|
})
|
|
|
|
|
|
|
|
// Join Tracman pro
|
2018-01-20 20:45:25 -07:00
|
|
|
.post( async (req, res) => {
|
|
|
|
try {
|
2018-02-07 18:33:27 -07:00
|
|
|
await User.findByIdAndUpdate(req.user.id,
|
2017-12-12 17:40:07 -07:00
|
|
|
{$set: { isPro: true }})
|
2018-01-20 20:45:25 -07:00
|
|
|
req.flash('success', 'You have been signed up for pro. ')
|
|
|
|
res.redirect('/settings')
|
|
|
|
} catch (err) {
|
|
|
|
mw.throwErr(err, req)
|
|
|
|
res.redirect('/settings/pro')
|
|
|
|
}
|
2017-12-12 17:40:07 -07:00
|
|
|
})
|
|
|
|
|
2018-02-07 18:33:27 -07:00
|
|
|
// Redirects for URLs that moved to /account
|
|
|
|
router.route('/password')
|
|
|
|
.all((req,res)=>{
|
|
|
|
res.redirect(307, '/account/password')
|
|
|
|
})
|
|
|
|
router.route('/password/:token')
|
|
|
|
.all((req,res)=>{
|
|
|
|
res.redirect(307, `/account/password/${req.params.token}`)
|
|
|
|
})
|
|
|
|
router.route('/email/:token')
|
|
|
|
.all((req,res)=>{
|
|
|
|
res.redirect(307, `/account/email/${req.params.token}`)
|
|
|
|
})
|
|
|
|
|
2017-12-12 17:40:07 -07:00
|
|
|
module.exports = router
|