modulated routes

master
Keith Irwin 2016-03-31 21:57:34 +00:00
parent bd996b1f64
commit b5cf8b6bf9
10 changed files with 405 additions and 2 deletions

23
config/middleware.js Normal file
View File

@ -0,0 +1,23 @@
module.exports = {
throwErr: function(req,err){
console.log(err);
req.flash('error-message',err);
req.flash('error', (err.message||'')+'<br>Would you like to <a href="/bug">report this error</a>?');
},
ensureAuth: function(req,res,next){
if (req.isAuthenticated()) { return next(); }
else {
req.session.returnTo = req.path;
req.flash('error', 'You must be signed in to do that. <a href="/login">Click here to log in</a>. ');
res.redirect('/');
}
},
ensureAdmin: function(req,res,next){
if (req.user.isAdmin) { return next(); }
else { res.sendStatus(401); }
}
};

55
config/routes/admin.js Normal file
View File

@ -0,0 +1,55 @@
var router = require('express').Router(),
mw = require('../middleware.js'),
mail = require('../mail.js'),
User = require('../models/user.js'),
Request = require('../models/request.js');
router.route('/requests')
.all([mw.ensureAuth, mw.ensureAdmin], function(req,res,next){
next();
}).get(function(req,res){
User.findById(req.session.passport.user, function(err, user){
if (err){ req.flash('error', err.message); }
Request.find({}, function(err, requests){
if (err) { req.flash('error', err.message); }
res.render('admin/requests.html', {
user: user,
noFooter: '1',
requests: requests,
success:req.flash('success')[0],
error:req.flash('error')[0]
});
});
});
}).post(function(req,res){
Request.findById(req.body.invite, function(err, request){
if (err){ req.flash('error', err.message); }
mail.sendInvite(request, function (err, raw) {
if (err) { req.flash('error', err.message); }
request.granted = Date.now();
request.save(function(err) {
if (err) { req.flash('error', err.message); }
});
req.flash('success', 'Invitation sent to <i>'+request.name+'</i>.');
res.redirect('/admin/requests');
});
});
});
router.get('/users', [mw.ensureAuth, mw.ensureAdmin], function(req,res){
User.findById(req.session.passport.user, function(err, user){
if (err){ req.flash('error', err.message); }
User.find({}, function(err, users){
if (err) { req.flash('error', err.message); }
res.render('admin/users.html', {
user: user,
users: users,
noFooter: '1',
success:req.flash('success')[0],
error:req.flash('error')[0]
});
});
});
});
module.exports = router;

28
config/routes/auth.js Normal file
View File

@ -0,0 +1,28 @@
var router = require('express').Router(),
passport = require('passport');
router.get('/login', function(req,res){
res.redirect('/auth/google');
});
router.get('/logout', function(req,res){
req.logout();
res.redirect('/');
});
router.get('/auth/google', passport.authenticate('google', { scope: [
'https://www.googleapis.com/auth/plus.login',
'https://www.googleapis.com/auth/plus.profile.emails.read'
] }));
router.get('/auth/google/callback', passport.authenticate('google', {
failureRedirect: '/',
failureFlash: true,
successRedirect: '/dashboard?rd=1',
successFlash: true
} ));
router.get('/auth/google/idtoken', passport.authenticate('google-id-token'), function (req,res) {
if (!req.user) { res.sendStatus(401); }
else { res.send(req.user); }
} );
module.exports = router;

View File

@ -0,0 +1,41 @@
var router = require('express').Router(),
mw = require('../middleware.js'),
slug = require('slug'),
User = require('../models/user.js');
router.route('/')
.all(mw.ensureAuth, function(req,res,next){
next();
}).get(function(req,res,next){
User.findById(req.session.passport.user, function(err, user){
if (err){ mw.throwErr(req,err); }
if (!user){ next(); }
else if (req.session.returnTo && req.query.rd) {
res.redirect(req.session.returnTo);
delete req.session.returnTo;
} else { res.render('dashboard.html', {
user: user,
success: req.flash('success')[0],
error: req.flash('error')[0]
}); }
});
}).post(function(req,res){
User.findByIdAndUpdate(req.session.passport.user, {$set:{
name: req.body.name,
slug: slug(req.body.slug),
settings: {
units: req.body.units,
defaultMap: req.body.map,
defaultZoom: req.body.zoom,
showSpeed: (req.body.showSpeed)?true:false,
showAlt: (req.body.showAlt)?true:false,
showStreetview: (req.body.showStreet)?true:false
}
}}, function(err, user){
if (err) { mw.throwErr(req,err); }
else { req.flash('success', 'Settings updated. '); }
res.redirect('/dashboard');
});
});
module.exports = router;

43
config/routes/feedback.js Normal file
View File

@ -0,0 +1,43 @@
var router = require('express').Router(),
mail = require('../mail.js'),
mw = require('../middleware.js');
router.route('/suggestion')
.get(function(req,res){
res.render('suggestion.html', {user:req.user});
}).post(function(req,res){
mail.sendSuggestion({
name: (req.body.name)?req.body.name:req.user.name,
email: (req.body.email)?req.body.email:req.user.email,
suggestion: req.body.suggestion
}, function (err, raw) {
if (err){ mw.throwErr(req,err); }
else { req.flash('success','Thanks for the suggestion! '); }
res.redirect('/dashboard');
});
});
router.route('/bug')
.all(mw.ensureAuth, function(req,res,next){
next();
}).get(function(req,res){
res.render('bug.html', {
user: req.user,
errorMessage: req.flash('error-message')
});
}).post(function(req,res){
mail.sendBugReport({
source: (req.query.source)?req.body.name:'web',
name: (req.body.name)?req.body.name:req.user.name,
email: (req.body.email)?req.body.email:req.user.email,
errorMessage: req.body.errorMessage,
recreation: req.body.recreation,
bug: req.body.bug
}, function (err, raw) {
if (err){ mw.throwErr(req,err); }
else { req.flash('success','Thanks for the report! '); }
res.redirect('/dashboard');
});
});
module.exports = router;

59
config/routes/index.js Normal file
View File

@ -0,0 +1,59 @@
var router = require('express').Router(),
mw = require('../middleware.js'),
mail = require('../mail.js'),
User = require('../models/user.js'),
Request = require('../models/request.js');
router.route('/')
.all(function(req,res,next){
next();
}).get(function(req,res,next){
if (req.session.passport) {
User.findById(req.session.passport.user, function(err, user){
if (err){ mw.throwErr(req,err); }
if (!user){ next(); }
res.render('index.html', {
user: user,
error: req.flash('error')[0],
success: req.flash('succcess')[0]
});
});
} else {
res.render('index.html', {
error: req.flash('error')[0],
success: req.flash('success')[0],
inviteSuccess: req.flash('request-success')[0],
inviteError: req.flash('request-error')[0]
});
}
}).post(function(req,res){
Request.findOne({email:req.body.email}, function(err, request) {
if (err){ mw.throwErr(req,err); }
if (request){ // Already requested with this email
req.flash('request-error', 'Invite already requested! ');
res.redirect('/#get');
} else { // Send new request
request = new Request({
name: req.body.name,
email: req.body.email,
beg: req.body.why,
requestedTime: Date.now()
}); request.save(function(err) {
if (err){ mw.throwErr(req,err); }
mail.mailgun.messages().send({
from: 'Tracman Requests <requests@tracman.org>',
to: 'Keith Irwin <tracman@keithirwin.us>',
subject: 'New Tracman Invite request',
html: '<p>'+req.body.name+' requested a Tracman invite. </p><p>'+req.body.why+'</p><p><a href="http://tracman.org/admin/requests">See all invites</a></p>',
text: '\n'+req.body.name+' requested a Tracman invite. \n\n'+req.body.why+'\n\nhttp://tracman.org/admin/requests'
}, function(err,body){
if (err){ mw.throwErr(req,err); }
else { req.flash('request-success', 'Invite requested! '); }
res.redirect('/#get');
});
});
}
});
});
module.exports = router;

54
config/routes/invite.js Normal file
View File

@ -0,0 +1,54 @@
var router = require('express').Router(),
mw = require('../middleware.js'),
User = require('../models/user.js'),
Request = require('../models/request.js');
router.get('/:invite', function(req,res,next){
User.findOne({requestId:req.params.invite}, function(err, existingUser) { // User already accepted invite
if (err) { console.log('routes.js:121 ERROR: '+err); }
if (existingUser) { res.redirect('/login'); }
else {
Request.findById(req.params.invite, function(err, request) { // Check for granted invite
if (err) { mw.throwErr(req,err); }
if (!request) { next(); }
else {
new User({ // Create new user
requestId: request._id,
email: '',
slug: request._id,
name: request.name,
created: Date.now(),
settings: {
units: 'imperial',
showSpeed: false,
showTemp: false,
showAlt: false,
showStreetview: true
}
}).save(function(err) {
if (err) { mw.throwErr(req,err); }
User.findOne({requestId:request._id}, function(err, user) {
if (err) { mw.throwErr(req,err); }
if (user) {
request.userId = user._id;
request.save(function(err, raw){
if (err){ mw.throwErr(req,err); }
});
req.logIn(user, function(err) {
if (err) { mw.throwErr(req,err); }
user.lastLogin = Date.now();
user.save(function(err, raw) {
if (err) { mw.throwErr(req,err); }
res.redirect('/login');
});
});
}
});
});
}
});
}
});
});
module.exports = router;

53
config/routes/misc.js Normal file
View File

@ -0,0 +1,53 @@
var router = require('express').Router(),
mw = require('../middleware.js'),
slug = require('slug'),
User = require('../models/user.js');
router.get('/robots.txt', function(req,res){
res.type('text/plain');
res.send("User-agent: *\n"+
"Disallow: /trac\n"+
"Disallow: /dashboard\n"+
"Disallow: /invited"
);
});
router.get('/validate', function(req,res){
if (req.query.slug) { // validate unique slug
User.findOne({slug:slug(req.query.slug)}, function(err, existingUser){
if (err) { console.log('/validate error:',err); }
if (existingUser && existingUser.id!==req.session.passport.user) { res.sendStatus(400); }
else { res.sendStatus(200); }
});
}
});
router.get('/android', mw.ensureAuth, function(req,res){
res.redirect('https://play.google.com/store/apps/details?id=us.keithirwin.tracman');
});
router.get('/license', function(req,res){
res.render('license.html', {user:req.user});
});
router.route('/pro')
.all(mw.ensureAuth, function(req,res,next){
next();
}).get(function(req,res,next){
User.findById(req.session.passport.user, function(err, user){
if (err){ mw.throwErr(req,err); }
if (!user){ next(); }
else { res.render('pro.html', {user:user}); }
});
}).post(function(req,res){
User.findByIdAndUpdate(req.session.passport.user,
{$set:{ isPro:true }},
function(err, user){
if (err){ mw.throwErr(req,err); }
else { req.flash('success','You have been signed up for pro. '); }
res.redirect('/dashboard');
}
);
});
module.exports = router;

36
config/routes/trac.js Normal file
View File

@ -0,0 +1,36 @@
var router = require('express').Router(),
mw = require('../middleware.js'),
secret = require('../secrets.js'),
User = require('../models/user.js');
router.get('/:slug', function(req,res,next){
User.findOne({slug:req.params.slug}, function(err, tracuser) {
if (err){ mw.throwErr(req,err); }
if (!tracuser){ next(); }
else { res.render('trac.html',{
api: secret.mapAPI,
user: req.user,
tracuser: tracuser,
noFooter: '1',
noHeader: (req.query.noheader)?req.query.noheader.match(/\d/)[0]:'',
disp: (req.query.disp)?req.query.disp.match(/\d/)[0]:'' // 0=map, 1=streetview, 2=both
}); }
});
});
router.get('/', mw.ensureAuth, function(req,res,next){
User.findById(req.session.passport.user, function(err, user){
if (err){ mw.throwErr(req,err); }
if (!user){ next(); }
else { res.redirect('/trac/'+user.slug+((req.url.indexOf('?')<0)?'':('?'+req.url.split('?')[1]))); }
});
});
router.get('/id/:id', function(req,res,next){
User.findById(req.params.id, function(err, user){
if (err){ mw.throwErr(req,err); }
if (!user){ next(); }
else { res.redirect('/trac/'+user.slug+((req.url.indexOf('?')<0)?'':('?'+req.url.split('?')[1]))); }
});
});
module.exports = router;

View File

@ -33,8 +33,6 @@ app.use(flash());
app.use(passport.initialize());
app.use(passport.session());
require('./config/auth.js');
app.use('/static', express.static(__dirname+'/static'));
routes(app);
mongoose.connect(secret.mongoSetup, {
server:{socketOptions:{
keepAlive:1, connectTimeoutMS:30000 }},
@ -42,6 +40,19 @@ mongoose.connect(secret.mongoSetup, {
keepAlive:1, connectTimeoutMS:30000 }}
});
// Routes
app.use(
require('./config/routes/index.js'),
require('./config/routes/auth.js'),
require('./config/routes/feedback.js'),
require('./config/routes/misc.js')
);
app.use('/trac', require('./config/routes/trac.js'));
app.use('/invited', require('./config/routes/invite.js'));
app.use('/dashboard', require('./config/routes/dashboard.js'));
app.use('/admin', require('./config/routes/admin.js'));
app.use('/static', express.static(__dirname+'/static'));
// Handle errors
if (secret.url=='https://tracman.org') {