meemo-app
Version:
A personal ideas, notes or links manager
115 lines (86 loc) • 3.69 kB
JavaScript
#!/usr/bin/env node
'use strict';
require('supererror')({ splatchError: true });
var PORT = process.env.PORT || 3000;
var BIND_ADDRESS = process.env.BIND_ADDRESS || '0.0.0.0';
if (!process.env.CLOUDRON_APP_ORIGIN) {
console.log('No APP_ORIGIN env var set. Falling back to http://localhost');
}
var express = require('express'),
json = require('body-parser').json,
config = require('./src/config.js'),
cors = require('cors'),
session = require('express-session'),
MongoStore = require('connect-mongo')(session),
multer = require('multer'),
routes = require('./src/routes.js'),
lastmile = require('connect-lastmile'),
logic = require('./src/logic.js'),
MongoClient = require('mongodb').MongoClient,
morgan = require('morgan'),
path = require('path'),
serveStatic = require('serve-static');
var app = express();
var router = new express.Router();
var storage = multer.diskStorage({});
var diskUpload = multer({ storage: storage }).any();
var memoryUpload = multer({ storage: multer.memoryStorage({}) }).any();
router.del = router.delete;
router.post('/api/things', routes.auth, routes.add);
router.get ('/api/things', routes.auth, routes.getAll);
router.get ('/api/things/:id', routes.auth, routes.get);
router.put ('/api/things/:id', routes.auth, routes.put);
router.del ('/api/things/:id', routes.auth, routes.del);
router.post('/api/files', routes.auth, memoryUpload, routes.fileAdd);
router.get ('/api/files/:userId/:thingId/:identifier', routes.fileGet);
router.get ('/api/tags', routes.auth, routes.getTags);
router.post('/api/settings', routes.auth, routes.settingsSave);
router.get ('/api/settings', routes.auth, routes.settingsGet);
router.get ('/api/export', routes.auth, routes.exportThings);
router.post('/api/import', routes.auth, diskUpload, routes.importThings);
router.post('/api/login', routes.login);
router.get ('/api/logout', routes.auth, routes.logout);
router.get ('/api/profile', routes.auth, routes.profile);
// public apis
router.get ('/api/public/:userId/files/:fileId', routes.public.getFile);
router.get ('/api/public/:userId/things', routes.public.getAll);
router.get ('/api/public/:userId/things/:thingId', routes.public.getThing);
router.get ('/api/rss/:userId', routes.public.getRSS);
router.get ('/api/users', routes.public.users);
router.get ('/api/users/:userId', routes.public.profile);
router.get ('/api/healthcheck', routes.healthcheck);
// page overlay for pretty public streams
router.get ('/public/:userId', routes.public.streamPage);
// Add pretty 404 handler
router.get ('*', function (req, res) {
res.sendFile(path.resolve(__dirname, 'public/error.html'));
});
if (process.env.DEBUG) {
app.use(morgan('dev', { immediate: false, stream: { write: function (str) { console.log(str.slice(0, -1)); } } }));
}
app.use(serveStatic(__dirname + '/public', { etag: false }));
app.use(cors());
app.use(json({ strict: true, limit: '5mb' }));
app.use(session({
secret: 'guacamoly should be',
saveUninitialized: false,
resave: false,
store: new MongoStore({ url: config.databaseUrl })
}));
app.use(router);
app.use(lastmile());
function exit(error) {
if (error) console.error(error);
process.exit(error ? 1 : 0);
}
MongoClient.connect(config.databaseUrl, function (error, db) {
if (error) exit(error);
// stash for database code to be used
config.db = db;
var server = app.listen(PORT, BIND_ADDRESS, function () {
var host = server.address().address;
var port = server.address().port;
console.log('App listening at http://%s:%s', host, port);
setInterval(logic.cleanupTags, 1000 * 60);
});
});