tracman-server/config/routes/contact.js

78 lines
2.2 KiB
JavaScript
Executable File

'use strict'
const env = require('../env/env.js')
const request = require('request')
const mw = require('../middleware.js')
const mail = require('../mail.js')
const router = require('express').Router()
module.exports = router
// Display contact form
.get('/', (req, res) => {
res.render('contact', {active: 'contact',
sitekey: env.recaptchaSitekey
})
})
.post('/', (req, res, next) => {
// Check email
if (req.body.email === '') {
req.flash('warning', `You need to enter an email address. `)
res.redirect('/contact')
} else if (!mw.validateEmail(req.body.email)) {
req.flash('warning', `<u>${req.body.email}</u> is not a valid email address. `)
res.redirect('/contact')
// Check for message
} else if (req.body.message === '') {
req.flash('warning', `You need to enter a message. `)
res.redirect('/contact')
// Passed validations
} else {
// Confirm captcha
request.post('https://www.google.com/recaptcha/api/siteverify', {form: {
secret: env.recaptchaSecret,
response: req.body['g-recaptcha-response'],
remoteip: req.ip
}}, async (err, response, body) => {
// Check for errors
if (err) {
mw.throwErr(err, req)
res.redirect('/contact')
}
if (response.statusCode !== 200) {
let err = new Error('Bad response from reCaptcha service')
mw.throwErr(err, req)
res.redirect('/contact')
// No errors
} else {
// Captcha failed
if (!JSON.parse(body).success) {
let err = new Error('Failed reCaptcha')
mw.throwErr(err, req)
res.redirect('/contact')
// Captcha succeeded
} else {
try {
await mail.send({
from: `${req.body.name} <${req.body.email}>`,
to: `Tracman Contact <contact@tracman.org>`,
subject: req.body.subject || 'A message',
text: req.body.message
})
req.flash('success', `Your message has been sent. `)
res.redirect(req.session.next || '/')
} catch (err) {
mw.throwErr(err, req)
res.redirect('/contact')
}
}
}
})
}
})