tracman-server/server.js

179 lines
3.9 KiB
JavaScript
Raw Normal View History

'use strict';
/* 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'),
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: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-01 11:03:05 -06:00
/* Templates */ {
nunjucks.configure(__dirname+'/views', {
autoescape: true,
express: app
});
app.set('view engine','html');
}
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)
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-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
app.use( (req,res,next)=>{
2016-05-31 21:54:21 -06:00
if (!res.headersSent) {
var err = new Error('404 Not found: '+req.url);
2016-05-31 21:54:21 -06:00
err.status = 404;
next(err);
}
} );
2016-06-30 14:40:21 -06:00
// Handlers
2017-04-01 11:03:05 -06:00
if (env.mode=='production') {
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
});
} );
2016-06-30 14:40:21 -06:00
}
else /* Development */{
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,
error: err.stack
2016-05-01 22:59:47 -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
http.listen( env.port, ()=>{
console.log(`🌐 Listening in ${env.mode} mode on port ${env.port}... `);
// Check for clients for each user
User.find( {}, (err,users)=>{
if (err) { console.log(`DB error finding all users: ${err.message}`); }
users.forEach( (user)=>{
2017-03-14 07:58:56 -06:00
sockets.checkForUsers( io, user.id );
});
});
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
module.exports = app;