var express = require('express'); var flash = require('express-flash'); var path = require('path'); var passport = require('passport'); var Strategy = require('passport-local').Strategy; var async = require('async'); var fs = require('fs'); var markdown = require( "markdown" ).markdown; var moment = require("moment"); // Make ourselves a nice little express app. var app = express(); // Get connected to our database var MongoClient = require('mongodb').MongoClient; // Include some other JS Post = require('./post.js'); User = require('./user.js'); Category = require('./category.js'); Static = require('./static.js'); var database = require('./db.js'); var genPhotos = require('./genPhotos.js'); // Get config variables var config = require('./config.js').config; // view engine setup app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'jade'); // uncomment after placing your favicon in /public //app.use(require('serve-favicon')(path.join(__dirname, 'public', // 'favicon.ico'))); app.use(flash()); app.use(require('morgan')('dev')); app.use(require('body-parser').urlencoded({ extended: true })); app.use(require('cookie-parser')()); var session = require('express-session'); var RedisStore = require('connect-redis')(session); app.use(session({ store: new RedisStore({ host: 'localhost', port: 6379, }), secret: 'amdasdfasdf', resave: true, saveUninitialized: true })); app.use(express.static(path.join(__dirname, 'public'))); // Setup authentication via twitter. passport.use(new Strategy( function(username, password, done) { User.verify(username, password, function(err, user) { console.log("Verifying user: " + username); if (!user) { return done(null, false); } return done(null, user); }); } )); passport.serializeUser(function(user, done) { // console.log("Serializing user: "+user.username); done(null, user.username); }); passport.deserializeUser(function(username, done) { // console.log("Deserializing user: "+username); User.getByUsername(username, function (err, user) { if (!user) { return done(false); } done(null, user); }); }); app.use(passport.initialize()); app.use(passport.session()); // Require logins for all admin pages other pages have to be handled separately. app.all('/admin*', require('connect-ensure-login').ensureLoggedIn()); // Pull in all our external routes. require('./routes-post.js')(app); require('./routes-photo.js')(app); require('./routes-preview.js')(app); // User management routing app.get('/login', function(req, res) { res.render('admin-login', {user: req.user}); }); app.post('/login', passport.authenticate('local', { successReturnToOrRedirect: '/admin', failureRedirect: '/login' }) ); app.get('/logout', function(req, res) { req.logout(); res.redirect('/'); } ); // Admin page to view all the items that need to be uploaded. app.get('/admin/view/uploads', function(req, res, next) { Post.getNeedsUpload(function (err, posts) { if (err) console.log(err); res.render('admin-view-uploads', { successNotice: req.flash('successNotice'), failureNotice: req.flash('failureNotice'), posts: posts, user: req.user }); }); } ); // Admin page to view all the items that need to be built. app.get('/admin/view/builds', function(req, res, next) { Post.getNeedsBuild(function (err, posts) { if (err) console.log(err); res.render('admin-view-builds', { successNotice: req.flash('successNotice'), failureNotice: req.flash('failureNotice'), posts: posts, user: req.user }); }); } ); // Admin dashboard page. app.get('/admin', function(req, res, next) { Post.countPosts(function (err, postCount) { Category.countCategories(function (err, categoryCount) { Post.getLastBuildDate(function (err, lastBuildDate) { Post.getLastUploadDate( function (err, lastUploadDate) { res.render('admin-dashboard', { successNotice: req.flash('successNotice'), failureNotice: req.flash('failureNotice'), categories: categoryCount, posts: postCount, galleries: "###", photos: "###", tags: "###", regenerateDate: moment(lastBuildDate).format("YYYY-MM-DD HH:mm"), uploadDate: moment(lastUploadDate).format("YYYY-MM-DD HH:mm"), user: req.user}); }) }) }) }) } ); // Have to have some sort of home page. app.get('/', function(req, res, next) { res.render('admin-index', { title: 'AMDavidson.com', user: req.user }); } ); // catch 404 and forward to error handler app.use(function(req, res, next) { var err = new Error('Not Found'); err.status = 404; next(err); }); // error handlers // development error handler // will print stacktrace if (app.get('env') === 'development') { app.locals.pretty = true; app.use(function(err, req, res, next) { res.status(err.status || 500); res.render('admin-error', { message: err.message, error: err, user: req.user }); }); } // production error handler // no stacktraces leaked to user app.use(function(err, req, res, next) { res.status(err.status || 500); res.render('error', { message: err.message, user: req.user, error: {} }); }); app.set('port', process.env.PORT || 3000) var server = require('http').createServer(app) process.on('uncaughtException', function (exception) { console.log(exception); }); MongoClient.connect('mongodb://localhost/crunch', function(err, database) { if (!err) { global.db = database; server.listen(app.get('port'), function() { console.log("Server listening on port " + app.get('port')); }); } });