2014-01-06 19:31:30 -05:00
|
|
|
/**
|
|
|
|
* Module dependencies.
|
|
|
|
*/
|
2014-01-11 22:53:31 -05:00
|
|
|
|
2013-11-30 00:28:30 -05:00
|
|
|
var express = require('express');
|
2014-04-12 12:43:07 -04:00
|
|
|
var cookieParser = require('cookie-parser');
|
|
|
|
var compress = require('compression');
|
|
|
|
var session = require('express-session');
|
|
|
|
var bodyParser = require('body-parser');
|
|
|
|
var logger = require('morgan');
|
|
|
|
var errorHandler = require('errorhandler');
|
2014-04-18 14:29:30 -04:00
|
|
|
var csrf = require('lusca').csrf();
|
2014-04-12 12:43:07 -04:00
|
|
|
var methodOverride = require('method-override');
|
|
|
|
|
|
|
|
var MongoStore = require('connect-mongo')({ session: session });
|
2014-01-28 20:02:45 +01:00
|
|
|
var flash = require('express-flash');
|
2013-12-19 20:17:15 -05:00
|
|
|
var path = require('path');
|
2013-11-30 00:28:30 -05:00
|
|
|
var mongoose = require('mongoose');
|
|
|
|
var passport = require('passport');
|
2014-01-23 22:18:35 -05:00
|
|
|
var expressValidator = require('express-validator');
|
2014-02-21 17:29:06 -05:00
|
|
|
var connectAssets = require('connect-assets');
|
2014-01-23 22:18:35 -05:00
|
|
|
|
2014-01-06 19:31:30 -05:00
|
|
|
/**
|
2014-06-06 14:58:30 -04:00
|
|
|
* Controllers (route handlers).
|
2014-01-06 19:31:30 -05:00
|
|
|
*/
|
2014-01-11 22:53:31 -05:00
|
|
|
|
2014-01-06 19:22:28 -05:00
|
|
|
var homeController = require('./controllers/home');
|
|
|
|
var userController = require('./controllers/user');
|
|
|
|
var apiController = require('./controllers/api');
|
|
|
|
var contactController = require('./controllers/contact');
|
2013-11-14 02:29:55 -05:00
|
|
|
|
2014-01-06 19:31:30 -05:00
|
|
|
/**
|
2014-06-06 14:58:30 -04:00
|
|
|
* API keys and Passport configuration.
|
2014-01-06 19:31:30 -05:00
|
|
|
*/
|
2014-01-11 22:53:31 -05:00
|
|
|
|
2013-12-20 01:31:16 -05:00
|
|
|
var secrets = require('./config/secrets');
|
2013-11-26 23:15:13 -05:00
|
|
|
var passportConf = require('./config/passport');
|
|
|
|
|
2014-02-02 05:38:38 -05:00
|
|
|
/**
|
|
|
|
* Create Express server.
|
|
|
|
*/
|
|
|
|
|
|
|
|
var app = express();
|
|
|
|
|
2014-01-11 22:53:31 -05:00
|
|
|
/**
|
2014-06-06 14:58:30 -04:00
|
|
|
* Connect to MongoDB.
|
2014-01-11 22:53:31 -05:00
|
|
|
*/
|
2014-01-13 04:24:31 -05:00
|
|
|
|
2014-02-25 22:39:28 -05:00
|
|
|
mongoose.connect(secrets.db);
|
2014-01-11 22:53:31 -05:00
|
|
|
mongoose.connection.on('error', function() {
|
2014-06-01 11:52:28 -04:00
|
|
|
console.error('MongoDB Connection Error. Make sure MongoDB is running.');
|
2014-01-11 22:53:31 -05:00
|
|
|
});
|
2013-11-13 12:32:22 -05:00
|
|
|
|
2014-01-30 04:18:34 -05:00
|
|
|
var hour = 3600000;
|
2014-04-12 14:17:37 -04:00
|
|
|
var day = hour * 24;
|
|
|
|
var week = day * 7;
|
2014-01-30 04:18:34 -05:00
|
|
|
|
2014-05-06 00:44:30 -04:00
|
|
|
/**
|
2014-06-01 11:52:28 -04:00
|
|
|
* CSRF whitelist.
|
2014-05-06 00:44:30 -04:00
|
|
|
*/
|
|
|
|
|
|
|
|
var whitelist = ['/url1', '/url2'];
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Express configuration.
|
|
|
|
*/
|
2014-04-18 14:29:30 -04:00
|
|
|
|
2014-01-11 22:53:31 -05:00
|
|
|
app.set('port', process.env.PORT || 3000);
|
|
|
|
app.set('views', path.join(__dirname, 'views'));
|
|
|
|
app.set('view engine', 'jade');
|
2014-06-06 14:58:30 -04:00
|
|
|
app.use(compress());
|
2014-02-21 17:29:06 -05:00
|
|
|
app.use(connectAssets({
|
|
|
|
paths: ['public/css', 'public/js'],
|
2014-02-03 08:34:12 -05:00
|
|
|
helperContext: app.locals
|
|
|
|
}));
|
2014-04-12 12:43:07 -04:00
|
|
|
app.use(logger('dev'));
|
|
|
|
app.use(bodyParser.json());
|
|
|
|
app.use(bodyParser.urlencoded());
|
2014-01-23 22:18:35 -05:00
|
|
|
app.use(expressValidator());
|
2014-04-12 12:43:07 -04:00
|
|
|
app.use(methodOverride());
|
|
|
|
app.use(cookieParser());
|
|
|
|
app.use(session({
|
2014-02-03 12:21:41 -05:00
|
|
|
secret: secrets.sessionSecret,
|
2014-01-29 00:49:09 -05:00
|
|
|
store: new MongoStore({
|
2014-02-26 02:35:57 -05:00
|
|
|
url: secrets.db,
|
2014-01-30 04:22:35 -05:00
|
|
|
auto_reconnect: true
|
2014-01-29 00:49:09 -05:00
|
|
|
})
|
|
|
|
}));
|
2014-01-11 22:53:31 -05:00
|
|
|
app.use(passport.initialize());
|
|
|
|
app.use(passport.session());
|
2014-06-01 11:52:28 -04:00
|
|
|
app.use(flash());
|
2014-04-18 14:29:30 -04:00
|
|
|
app.use(function(req, res, next) {
|
2014-06-05 11:08:30 -04:00
|
|
|
// CSRF protection.
|
2014-05-06 00:44:30 -04:00
|
|
|
if (whitelist.indexOf(req.path) !== -1) next();
|
|
|
|
else csrf(req, res, next);
|
2014-04-18 14:29:30 -04:00
|
|
|
});
|
2014-01-11 22:53:31 -05:00
|
|
|
app.use(function(req, res, next) {
|
2014-06-05 11:08:30 -04:00
|
|
|
// Make user object available in templates.
|
2014-01-11 22:53:31 -05:00
|
|
|
res.locals.user = req.user;
|
|
|
|
next();
|
|
|
|
});
|
2014-03-08 14:58:27 -05:00
|
|
|
app.use(function(req, res, next) {
|
2014-06-05 11:08:30 -04:00
|
|
|
// Remember original destination before login.
|
2014-03-08 14:58:27 -05:00
|
|
|
var path = req.path.split('/')[1];
|
2014-06-05 11:08:30 -04:00
|
|
|
if (/auth|login|logout|signup|img|fonts|favicon/i.test(path)) {
|
|
|
|
return next();
|
|
|
|
}
|
2014-03-08 14:58:27 -05:00
|
|
|
req.session.returnTo = req.path;
|
|
|
|
next();
|
|
|
|
});
|
2014-06-01 11:52:28 -04:00
|
|
|
app.use(express.static(path.join(__dirname, 'public'), { maxAge: week }));
|
2014-01-08 01:37:40 -05:00
|
|
|
|
2014-01-11 22:53:31 -05:00
|
|
|
/**
|
2014-06-06 14:58:30 -04:00
|
|
|
* Primary routes.
|
2014-01-11 22:53:31 -05:00
|
|
|
*/
|
2013-11-26 23:22:07 -05:00
|
|
|
|
2014-06-05 20:21:03 -04:00
|
|
|
app.route('/')
|
|
|
|
.get(homeController.index);
|
|
|
|
|
|
|
|
app.route('/login')
|
|
|
|
.get(userController.getLogin)
|
|
|
|
.post(userController.postLogin);
|
|
|
|
|
|
|
|
app.route('/logout')
|
|
|
|
.get(userController.logout);
|
|
|
|
|
|
|
|
app.route('/forgot')
|
|
|
|
.get(userController.getForgot)
|
|
|
|
.post(userController.postForgot);
|
|
|
|
|
|
|
|
app.route('/reset/:token')
|
|
|
|
.get(userController.getReset)
|
|
|
|
.post(userController.postReset);
|
|
|
|
|
|
|
|
app.route('/signup')
|
|
|
|
.get(userController.getSignup)
|
|
|
|
.post(userController.postSignup);
|
|
|
|
|
|
|
|
app.route('/contact')
|
|
|
|
.get(contactController.getContact)
|
|
|
|
.post(contactController.postContact);
|
|
|
|
|
|
|
|
app.route('/account')
|
|
|
|
.all(passportConf.isAuthenticated)
|
|
|
|
.get(userController.getAccount);
|
|
|
|
|
|
|
|
app.route('/account/profile')
|
|
|
|
.all(passportConf.isAuthenticated)
|
|
|
|
.post(userController.postUpdateProfile);
|
|
|
|
|
|
|
|
app.route('/account/password')
|
|
|
|
.all(passportConf.isAuthenticated)
|
|
|
|
.post(userController.postUpdatePassword);
|
|
|
|
|
|
|
|
app.route('/account/delete')
|
|
|
|
.all(passportConf.isAuthenticated)
|
|
|
|
.post(userController.postDeleteAccount);
|
|
|
|
|
|
|
|
app.route('/account/unlink/:provider')
|
|
|
|
.all(passportConf.isAuthenticated)
|
|
|
|
.get(userController.getOauthUnlink);
|
|
|
|
|
2014-06-06 14:58:30 -04:00
|
|
|
/**
|
|
|
|
* API examples routes.
|
|
|
|
*/
|
|
|
|
|
2014-06-05 20:21:03 -04:00
|
|
|
app.route('/api')
|
|
|
|
.get(apiController.getApi);
|
|
|
|
|
|
|
|
app.route('/api/lastfm')
|
|
|
|
.get(apiController.getLastfm);
|
|
|
|
|
|
|
|
app.route('/api/nyt')
|
|
|
|
.get(apiController.getNewYorkTimes);
|
|
|
|
|
|
|
|
app.route('/api/aviary')
|
|
|
|
.get(apiController.getAviary);
|
|
|
|
|
|
|
|
app.route('/api/steam')
|
|
|
|
.get(apiController.getSteam);
|
|
|
|
|
|
|
|
app.route('/api/aviary')
|
|
|
|
.get(apiController.getAviary);
|
|
|
|
|
|
|
|
app.route('/api/scraping')
|
|
|
|
.get(apiController.getScraping);
|
|
|
|
|
|
|
|
app.route('/api/yahoo')
|
2014-06-06 14:58:30 -04:00
|
|
|
.get(apiController.getYahoo);
|
2014-06-05 20:21:03 -04:00
|
|
|
|
|
|
|
app.route('/api/stripe')
|
|
|
|
.get(apiController.getStripe)
|
|
|
|
.post(apiController.postStripe);
|
|
|
|
|
|
|
|
app.route('/api/twilio')
|
|
|
|
.get(apiController.getTwilio)
|
|
|
|
.post(apiController.postTwilio);
|
|
|
|
|
|
|
|
app.route('/api/clockwork')
|
|
|
|
.get(apiController.getClockwork)
|
|
|
|
.post(apiController.postClockwork);
|
|
|
|
|
|
|
|
app.route('/api/foursquare')
|
|
|
|
.all(passportConf.isAuthenticated)
|
|
|
|
.all(passportConf.isAuthorized)
|
|
|
|
.get(apiController.getFoursquare);
|
|
|
|
|
|
|
|
app.route('/api/tumblr')
|
|
|
|
.all(passportConf.isAuthenticated)
|
|
|
|
.all(passportConf.isAuthorized)
|
|
|
|
.get(apiController.getTumblr);
|
|
|
|
|
|
|
|
app.route('/api/foursquare')
|
|
|
|
.all(passportConf.isAuthenticated)
|
|
|
|
.all(passportConf.isAuthorized)
|
|
|
|
.get(apiController.getFoursquare);
|
|
|
|
|
|
|
|
app.route('/api/facebook')
|
|
|
|
.all(passportConf.isAuthenticated)
|
|
|
|
.all(passportConf.isAuthorized)
|
|
|
|
.get(apiController.getFacebook);
|
|
|
|
|
|
|
|
app.route('/api/github')
|
|
|
|
.all(passportConf.isAuthenticated)
|
|
|
|
.all(passportConf.isAuthorized)
|
|
|
|
.get(apiController.getGithub);
|
|
|
|
|
|
|
|
app.route('/api/twitter')
|
|
|
|
.all(passportConf.isAuthenticated)
|
|
|
|
.all(passportConf.isAuthorized)
|
|
|
|
.get(apiController.getTwitter)
|
|
|
|
.post(apiController.postTwitter);
|
|
|
|
|
|
|
|
app.route('/api/venmo')
|
|
|
|
.all(passportConf.isAuthenticated)
|
|
|
|
.all(passportConf.isAuthorized)
|
|
|
|
.get(apiController.getVenmo)
|
|
|
|
.post(apiController.postVenmo);
|
|
|
|
|
|
|
|
app.route('/api/linkedin')
|
|
|
|
.all(passportConf.isAuthenticated)
|
|
|
|
.all(passportConf.isAuthorized)
|
2014-06-06 14:58:30 -04:00
|
|
|
.get(apiController.getLinkedin);
|
2014-06-05 20:21:03 -04:00
|
|
|
|
|
|
|
app.route('/api/instagram')
|
|
|
|
.all(passportConf.isAuthenticated)
|
|
|
|
.all(passportConf.isAuthorized)
|
2014-06-06 14:58:30 -04:00
|
|
|
.get(apiController.getInstagram);
|
2014-02-01 03:30:14 -05:00
|
|
|
|
|
|
|
/**
|
2014-06-06 14:58:30 -04:00
|
|
|
* OAuth sign-in routes.
|
2014-02-01 03:30:14 -05:00
|
|
|
*/
|
|
|
|
|
2014-04-22 15:00:27 -04:00
|
|
|
app.get('/auth/instagram', passport.authenticate('instagram'));
|
|
|
|
app.get('/auth/instagram/callback', passport.authenticate('instagram', { failureRedirect: '/login' }), function(req, res) {
|
|
|
|
res.redirect(req.session.returnTo || '/');
|
|
|
|
});
|
2014-02-04 08:23:52 -08:00
|
|
|
app.get('/auth/facebook', passport.authenticate('facebook', { scope: ['email', 'user_location'] }));
|
2014-03-08 14:58:27 -05:00
|
|
|
app.get('/auth/facebook/callback', passport.authenticate('facebook', { failureRedirect: '/login' }), function(req, res) {
|
|
|
|
res.redirect(req.session.returnTo || '/');
|
|
|
|
});
|
2014-01-11 22:53:31 -05:00
|
|
|
app.get('/auth/github', passport.authenticate('github'));
|
2014-03-08 14:58:27 -05:00
|
|
|
app.get('/auth/github/callback', passport.authenticate('github', { failureRedirect: '/login' }), function(req, res) {
|
|
|
|
res.redirect(req.session.returnTo || '/');
|
|
|
|
});
|
2014-01-11 22:53:31 -05:00
|
|
|
app.get('/auth/google', passport.authenticate('google', { scope: 'profile email' }));
|
2014-03-08 14:58:27 -05:00
|
|
|
app.get('/auth/google/callback', passport.authenticate('google', { failureRedirect: '/login' }), function(req, res) {
|
|
|
|
res.redirect(req.session.returnTo || '/');
|
|
|
|
});
|
2014-01-11 22:53:31 -05:00
|
|
|
app.get('/auth/twitter', passport.authenticate('twitter'));
|
2014-03-08 14:58:27 -05:00
|
|
|
app.get('/auth/twitter/callback', passport.authenticate('twitter', { failureRedirect: '/login' }), function(req, res) {
|
|
|
|
res.redirect(req.session.returnTo || '/');
|
|
|
|
});
|
2014-02-27 13:14:09 -05:00
|
|
|
app.get('/auth/linkedin', passport.authenticate('linkedin', { state: 'SOME STATE' }));
|
2014-03-08 14:58:27 -05:00
|
|
|
app.get('/auth/linkedin/callback', passport.authenticate('linkedin', { failureRedirect: '/login' }), function(req, res) {
|
|
|
|
res.redirect(req.session.returnTo || '/');
|
|
|
|
});
|
2014-02-01 03:30:14 -05:00
|
|
|
|
|
|
|
/**
|
2014-06-06 14:58:30 -04:00
|
|
|
* OAuth authorization routes for API examples.
|
2014-02-01 03:30:14 -05:00
|
|
|
*/
|
|
|
|
|
2014-01-11 22:53:31 -05:00
|
|
|
app.get('/auth/foursquare', passport.authorize('foursquare'));
|
2014-01-30 04:18:34 -05:00
|
|
|
app.get('/auth/foursquare/callback', passport.authorize('foursquare', { failureRedirect: '/api' }), function(req, res) {
|
|
|
|
res.redirect('/api/foursquare');
|
|
|
|
});
|
2014-01-11 22:53:31 -05:00
|
|
|
app.get('/auth/tumblr', passport.authorize('tumblr'));
|
2014-01-30 04:18:34 -05:00
|
|
|
app.get('/auth/tumblr/callback', passport.authorize('tumblr', { failureRedirect: '/api' }), function(req, res) {
|
|
|
|
res.redirect('/api/tumblr');
|
|
|
|
});
|
2014-02-10 20:59:39 -05:00
|
|
|
app.get('/auth/venmo', passport.authorize('venmo', { scope: 'make_payments access_profile access_balance access_email access_phone' }));
|
2014-02-10 19:21:54 -05:00
|
|
|
app.get('/auth/venmo/callback', passport.authorize('venmo', { failureRedirect: '/api' }), function(req, res) {
|
|
|
|
res.redirect('/api/venmo');
|
|
|
|
});
|
2013-12-06 22:23:05 -05:00
|
|
|
|
2014-04-18 14:37:06 -04:00
|
|
|
/**
|
|
|
|
* 500 Error Handler.
|
|
|
|
*/
|
|
|
|
|
2014-04-12 12:43:07 -04:00
|
|
|
app.use(errorHandler());
|
|
|
|
|
2014-02-05 19:57:29 -05:00
|
|
|
/**
|
|
|
|
* Start Express server.
|
|
|
|
*/
|
|
|
|
|
2014-01-11 22:53:31 -05:00
|
|
|
app.listen(app.get('port'), function() {
|
2014-06-01 11:52:28 -04:00
|
|
|
console.log('Express server listening on port %d in %s mode', app.get('port'), app.get('env'));
|
2014-01-11 22:53:31 -05:00
|
|
|
});
|
2014-02-25 22:39:28 -05:00
|
|
|
|
2014-06-05 20:21:03 -04:00
|
|
|
module.exports = app;
|