summaryrefslogtreecommitdiff
path: root/app.js
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--app.js253
1 files changed, 253 insertions, 0 deletions
diff --git a/app.js b/app.js
new file mode 100644
index 00000000..3f66b32c
--- /dev/null
+++ b/app.js
@@ -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