diff options
Diffstat (limited to 'app.js')
-rw-r--r-- | app.js | 253 |
1 files changed, 253 insertions, 0 deletions
@@ -0,0 +1,253 @@ +//app +//external modules +var connect = require('connect'); +var express = require('express'); +var toobusy = require('toobusy-js'); +var ejs = require('ejs'); +var passport = require('passport'); +var methodOverride = require('method-override'); +var bodyParser = require('body-parser'); +var mongoose = require('mongoose'); +var compression = require('compression') +var session = require('express-session'); +var MongoStore = require('connect-mongo')(session); + +//core +var config = require("./config.js"); +var User = require("./lib/user.js"); +var auth = require("./lib/auth.js"); +var response = require("./lib/response.js"); + +//server setup +var app = express(); +var server = require('http').createServer(app); +var io = require('socket.io').listen(server); +var port = process.env.PORT || config.testport; + +// connect to the mongodb +if (config.debug) + mongoose.connect(config.mongodbstring); +else + mongoose.connect(process.env.MONGOLAB_URI); + +//others +var db = require("./lib/db.js"); +var realtime = require("./lib/realtime.js"); + +//methodOverride +app.use(methodOverride('_method')); + +// create application/json parser +var jsonParser = bodyParser.json(); + +// create application/x-www-form-urlencoded parser +var urlencodedParser = bodyParser.urlencoded({ + extended: false +}); + +//compression +app.use(compression()); + +//session +app.use(session({ + name: config.sessionname, + secret: config.sessionsecret, + resave: false, //don't save session if unmodified + saveUninitialized: true, //don't create session until something stored + cookie: { + maxAge: new Date(Date.now() + config.sessionlife), + expires: new Date(Date.now() + config.sessionlife), + }, + maxAge: new Date(Date.now() + config.sessionlife), + store: new MongoStore({ + mongooseConnection: mongoose.connection, + touchAfter: config.sessiontouch + }, + function (err) { + console.log(err); + }) +})); + +//middleware which blocks requests when we're too busy +app.use(function (req, res, next) { + if (toobusy()) { + response.errorServiceUnavailable(res); + } else { + next(); + } +}); + +//passport +app.use(passport.initialize()); +app.use(passport.session()); + +//serialize and deserialize +passport.serializeUser(function (user, done) { + //console.log('serializeUser: ' + user._id); + done(null, user._id); +}); +passport.deserializeUser(function (id, done) { + User.model.findById(id, function (err, user) { + //console.log(user) + if (!err) done(null, user); + else done(err, null); + }) +}); + +//routes +//static files +app.use('/', express.static(__dirname + '/public')); +//template files +app.set('views', __dirname + '/public'); +//set render engine +app.engine('html', ejs.renderFile); +//get index +app.get("/", function (req, res, next) { + res.render("index.html"); +}); +//get status +app.get("/status", function (req, res, next) { + realtime.getStatus(function (data) { + res.end(JSON.stringify(data)); + }); +}); +//facebook auth +app.get('/auth/facebook', + passport.authenticate('facebook'), + function (req, res) {}); +//facebook auth callback +app.get('/auth/facebook/callback', + passport.authenticate('facebook', { + failureRedirect: '/' + }), + function (req, res) { + res.redirect('/'); + }); +//twitter auth +app.get('/auth/twitter', + passport.authenticate('twitter'), + function (req, res) {}); +//twitter auth callback +app.get('/auth/twitter/callback', + passport.authenticate('twitter', { + failureRedirect: '/' + }), + function (req, res) { + res.redirect('/'); + }); +//github auth +app.get('/auth/github', + passport.authenticate('github'), + function (req, res) {}); +//github auth callback +app.get('/auth/github/callback', + passport.authenticate('github', { + failureRedirect: '/' + }), + function (req, res) { + res.redirect('/'); + }); +//dropbox auth +app.get('/auth/dropbox', + passport.authenticate('dropbox-oauth2'), + function (req, res) {}); +//dropbox auth callback +app.get('/auth/dropbox/callback', + passport.authenticate('dropbox-oauth2', { + failureRedirect: '/' + }), + function (req, res) { + res.redirect('/'); + }); +//logout +app.get('/logout', function (req, res) { + if (config.debug && req.session.passport.user) + console.log('user logout: ' + req.session.passport.user); + req.logout(); + res.redirect('/'); +}); +//get history +app.get('/history', function (req, res) { + if (req.isAuthenticated()) { + User.model.findById(req.session.passport.user, function (err, user) { + if (err) { + console.log('read history failed: ' + err); + } else { + var history = []; + if (user.history) + history = JSON.parse(user.history); + res.send({ + history: history + }); + } + }); + } else { + response.errorForbidden(res); + } +}); +//post history +app.post('/history', urlencodedParser, function (req, res) { + if (req.isAuthenticated()) { + if (config.debug) + console.log('SERVER received history from [' + req.session.passport.user + ']: ' + req.body.history); + User.model.findById(req.session.passport.user, function (err, user) { + if (err) { + console.log('write history failed: ' + err); + } else { + user.history = req.body.history; + user.save(function (err) { + if (err) { + console.log('write user history failed: ' + err); + } else { + if (config.debug) + console.log("write user history success: " + user._id); + }; + }); + } + }); + res.end(); + } else { + response.errorForbidden(res); + } +}); +//get me info +app.get('/me', function (req, res) { + if (req.isAuthenticated()) { + User.model.findById(req.session.passport.user, function (err, user) { + if (err) { + console.log('read me failed: ' + err); + } else { + var profile = JSON.parse(user.profile); + res.send({ + status: 'ok', + name: profile.displayName || profile.username + }); + } + }); + } else { + res.send({ + status: 'forbidden' + }); + } +}); +//get new note +app.get("/new", response.newNote); +//get features +app.get("/features", response.showFeatures); +//get note by id +app.get("/:noteId", response.showNote); +//note actions +app.get("/:noteId/:action", response.noteActions); + +//socket.io secure +io.use(realtime.secure); +//socket.io heartbeat +io.set('heartbeat interval', config.heartbeatinterval); +io.set('heartbeat timeout', config.heartbeattimeout); +//socket.io connection +io.sockets.on('connection', realtime.connection); + +//listen +server.listen(port, function () { + console.log('Server listening at port %d', port); +});
\ No newline at end of file |