2017-03-15 02:01:55 -06:00
|
|
|
'use strict';
|
|
|
|
|
2017-04-13 16:53:18 -06:00
|
|
|
/* IMPORTS */
|
|
|
|
const
|
2016-05-01 22:59:47 -06:00
|
|
|
express = require('express'),
|
2016-03-21 18:03:37 -06:00
|
|
|
bodyParser = require('body-parser'),
|
2017-04-14 19:49:07 -06:00
|
|
|
expressValidator = require('express-validator'),
|
2016-03-21 18:03:37 -06:00
|
|
|
cookieParser = require('cookie-parser'),
|
2016-09-09 20:55:33 -06:00
|
|
|
cookieSession = require('cookie-session'),
|
2016-03-21 18:03:37 -06:00
|
|
|
mongoose = require('mongoose'),
|
|
|
|
nunjucks = require('nunjucks'),
|
|
|
|
passport = require('passport'),
|
2017-04-16 19:00:39 -06:00
|
|
|
flash = require('connect-flash-plus'),
|
2017-04-12 12:51:32 -06:00
|
|
|
env = require('./config/env.js'),
|
2017-04-13 16:53:18 -06:00
|
|
|
mw = require('./config/middleware.js'),
|
2017-04-01 11:03:05 -06:00
|
|
|
User = require('./config/models.js').user,
|
2016-03-21 18:03:37 -06:00
|
|
|
app = express(),
|
|
|
|
http = require('http').Server(app),
|
2017-03-14 07:58:56 -06:00
|
|
|
io = require('socket.io')(http),
|
|
|
|
sockets = require('./config/sockets.js');
|
2017-03-15 02:08:12 -06:00
|
|
|
|
2016-03-31 20:38:45 -06:00
|
|
|
|
2016-05-31 21:54:21 -06:00
|
|
|
/* SETUP */ {
|
2017-04-13 16:53:18 -06:00
|
|
|
|
2017-04-13 16:59:46 -06:00
|
|
|
/* Database */ {
|
2017-04-14 19:49:07 -06:00
|
|
|
|
2017-04-13 16:59:46 -06:00
|
|
|
// Setup with native ES6 promises
|
|
|
|
mongoose.Promise = global.Promise;
|
2017-04-14 19:49:07 -06:00
|
|
|
|
2017-04-13 16:59:46 -06:00
|
|
|
// Connect to database
|
|
|
|
mongoose.connect(env.mongoSetup, {
|
|
|
|
server:{socketOptions:{
|
|
|
|
keepAlive:1, connectTimeoutMS:30000 }},
|
|
|
|
replset:{socketOptions:{
|
|
|
|
keepAlive:1, connectTimeoutMS:30000 }}
|
|
|
|
}).catch((err)=>{
|
|
|
|
mw.throwErr(err);
|
|
|
|
}).then(()=>{
|
2017-04-13 22:45:25 -06:00
|
|
|
console.log(`💿 Mongoose connected to mongoDB`);
|
2017-04-13 16:59:46 -06:00
|
|
|
});
|
2017-04-14 19:49:07 -06:00
|
|
|
|
2017-04-13 16:59:46 -06:00
|
|
|
}
|
2017-04-13 16:53:18 -06:00
|
|
|
|
2017-04-01 11:03:05 -06:00
|
|
|
/* Templates */ {
|
|
|
|
nunjucks.configure(__dirname+'/views', {
|
|
|
|
autoescape: true,
|
|
|
|
express: app
|
|
|
|
});
|
|
|
|
app.set('view engine','html');
|
|
|
|
}
|
2017-04-13 16:53:18 -06:00
|
|
|
|
2016-05-31 21:54:21 -06:00
|
|
|
/* Session */ {
|
2017-04-12 12:51:32 -06:00
|
|
|
app.use(cookieParser(env.cookie));
|
2016-09-09 20:55:33 -06:00
|
|
|
app.use(cookieSession({
|
|
|
|
cookie: {maxAge:60000},
|
2017-04-12 12:51:32 -06:00
|
|
|
secret: env.session,
|
2016-05-31 21:54:21 -06:00
|
|
|
saveUninitialized: true,
|
|
|
|
resave: true
|
|
|
|
}));
|
|
|
|
app.use(bodyParser.json());
|
|
|
|
app.use(bodyParser.urlencoded({
|
|
|
|
extended: true
|
|
|
|
}));
|
2017-04-14 19:49:07 -06:00
|
|
|
app.use(expressValidator());
|
2016-05-31 21:54:21 -06:00
|
|
|
app.use(flash());
|
|
|
|
}
|
2017-04-16 19:00:39 -06:00
|
|
|
|
2016-05-31 21:54:21 -06:00
|
|
|
/* Auth */ {
|
2017-04-01 11:03:05 -06:00
|
|
|
require('./config/passport.js')(passport);
|
2016-05-31 21:54:21 -06:00
|
|
|
app.use(passport.initialize());
|
|
|
|
app.use(passport.session());
|
|
|
|
}
|
2017-04-16 19:00:39 -06:00
|
|
|
|
2016-05-31 21:54:21 -06:00
|
|
|
/* Routes */ {
|
2017-04-16 19:00:39 -06:00
|
|
|
|
2017-03-18 13:40:03 -06:00
|
|
|
// Static files (keep this before setting default locals)
|
2017-04-13 16:53:18 -06:00
|
|
|
app.use('/static', express.static( __dirname+'/static', {dotfiles:'allow'} ));
|
2017-04-16 19:00:39 -06:00
|
|
|
|
2017-04-12 17:39:39 -06:00
|
|
|
// Set default locals available to all views (keep this after static files)
|
2017-04-16 19:00:39 -06:00
|
|
|
app.get( '*', (req,res,next)=>{
|
2017-04-13 22:45:25 -06:00
|
|
|
|
|
|
|
// Path for redirects
|
|
|
|
req.session.next = ( req.path.substring(0, req.path.indexOf('#')) || req.path )+'#';
|
|
|
|
|
2017-03-18 13:40:03 -06:00
|
|
|
// User account
|
|
|
|
res.locals.user = req.user;
|
|
|
|
|
|
|
|
// Flash messages
|
|
|
|
res.locals.successes = req.flash('success');
|
|
|
|
res.locals.dangers = req.flash('danger');
|
|
|
|
res.locals.warnings = req.flash('warning');
|
|
|
|
|
|
|
|
next();
|
2017-04-13 16:53:18 -06:00
|
|
|
} );
|
2017-03-18 12:27:32 -06:00
|
|
|
|
2017-04-16 19:00:39 -06:00
|
|
|
// Auth routes
|
|
|
|
require('./config/routes/auth.js')(app, passport);
|
|
|
|
|
2017-03-18 12:27:32 -06:00
|
|
|
// Main routes
|
2017-04-10 01:00:56 -06:00
|
|
|
app.use( '/', require('./config/routes/index.js') );
|
2017-04-13 22:45:25 -06:00
|
|
|
|
2017-04-10 01:00:56 -06:00
|
|
|
// Settings
|
|
|
|
app.use( '/settings', require('./config/routes/settings.js') );
|
2017-03-18 12:27:32 -06:00
|
|
|
|
|
|
|
// Map
|
2017-04-10 01:00:56 -06:00
|
|
|
app.use( ['/map','/trac'], require('./config/routes/map.js') );
|
2017-03-18 12:27:32 -06:00
|
|
|
|
2017-04-10 01:00:56 -06:00
|
|
|
// Site administration
|
|
|
|
app.use( '/admin', require('./config/routes/admin.js') );
|
2017-04-13 22:45:25 -06:00
|
|
|
|
2017-04-12 11:41:27 -06:00
|
|
|
// Testing
|
|
|
|
if (env.mode == 'development') {
|
|
|
|
app.use( '/test', require('./config/routes/test.js' ) );
|
|
|
|
}
|
2017-03-18 12:27:32 -06:00
|
|
|
|
2016-06-30 14:40:21 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
/* Errors */ {
|
|
|
|
// Catch-all for 404s
|
2017-04-13 16:53:18 -06:00
|
|
|
app.use( (req,res,next)=>{
|
2016-05-31 21:54:21 -06:00
|
|
|
if (!res.headersSent) {
|
2017-04-13 16:53:18 -06:00
|
|
|
var err = new Error('404 Not found: '+req.url);
|
2016-05-31 21:54:21 -06:00
|
|
|
err.status = 404;
|
|
|
|
next(err);
|
|
|
|
}
|
2017-04-13 16:53:18 -06:00
|
|
|
} );
|
|
|
|
|
2016-06-30 14:40:21 -06:00
|
|
|
// Handlers
|
2017-04-01 11:03:05 -06:00
|
|
|
if (env.mode=='production') {
|
2017-04-13 16:53:18 -06:00
|
|
|
app.use( (err,req,res,next)=>{
|
2016-05-01 22:59:47 -06:00
|
|
|
if (res.headersSent) { return next(err); }
|
|
|
|
res.status(err.status||500);
|
2017-04-01 11:03:05 -06:00
|
|
|
res.render('error', {
|
2016-05-31 21:54:21 -06:00
|
|
|
code: err.status
|
2016-05-01 22:59:47 -06:00
|
|
|
});
|
2017-04-13 16:53:18 -06:00
|
|
|
} );
|
2016-06-30 14:40:21 -06:00
|
|
|
}
|
|
|
|
else /* Development */{
|
2017-04-13 16:53:18 -06:00
|
|
|
app.use( (err,req,res,next)=>{
|
2016-05-31 21:54:21 -06:00
|
|
|
console.log(err);
|
2016-05-01 22:59:47 -06:00
|
|
|
if (res.headersSent) { return next(err); }
|
|
|
|
res.status(err.status||500);
|
2017-04-01 11:03:05 -06:00
|
|
|
res.render('error', {
|
2016-05-31 21:54:21 -06:00
|
|
|
code: err.status,
|
|
|
|
message: err.message,
|
2017-04-13 16:53:18 -06:00
|
|
|
error: err.stack
|
2016-05-01 22:59:47 -06:00
|
|
|
});
|
2017-04-13 16:53:18 -06:00
|
|
|
} );
|
2016-05-01 22:59:47 -06:00
|
|
|
}
|
2016-03-21 18:03:37 -06:00
|
|
|
}
|
2016-05-01 22:59:47 -06:00
|
|
|
|
2017-03-14 07:58:56 -06:00
|
|
|
/* Sockets */ {
|
|
|
|
sockets.init(io);
|
|
|
|
}
|
|
|
|
|
2016-03-21 18:03:37 -06:00
|
|
|
}
|
|
|
|
|
2016-05-31 21:54:21 -06:00
|
|
|
/* RUNTIME */ {
|
2016-06-12 18:18:34 -06:00
|
|
|
|
2017-04-13 22:45:25 -06:00
|
|
|
console.log('🖥 Starting Tracman server...');
|
|
|
|
|
2016-05-01 22:59:47 -06:00
|
|
|
// Listen
|
2017-04-13 16:53:18 -06:00
|
|
|
http.listen( env.port, ()=>{
|
|
|
|
console.log(`🌐 Listening in ${env.mode} mode on port ${env.port}... `);
|
2017-03-13 23:52:54 -06:00
|
|
|
|
|
|
|
// Check for clients for each user
|
2017-04-13 16:53:18 -06:00
|
|
|
User.find( {}, (err,users)=>{
|
2017-03-13 23:52:54 -06:00
|
|
|
if (err) { console.log(`DB error finding all users: ${err.message}`); }
|
2017-04-13 16:53:18 -06:00
|
|
|
users.forEach( (user)=>{
|
2017-03-14 07:58:56 -06:00
|
|
|
sockets.checkForUsers( io, user.id );
|
2017-03-13 23:52:54 -06:00
|
|
|
});
|
|
|
|
});
|
|
|
|
|
2016-03-21 18:03:37 -06:00
|
|
|
});
|
2017-04-13 22:45:25 -06:00
|
|
|
|
2016-05-01 22:59:47 -06:00
|
|
|
}
|
2016-03-21 18:03:37 -06:00
|
|
|
|
2017-02-15 03:41:08 -07:00
|
|
|
module.exports = app;
|