214 lines
6 KiB
JavaScript
214 lines
6 KiB
JavaScript
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');
|
|
|
|
// 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'));
|
|
});
|
|
}
|
|
});
|