pomodoro/server/server.js
2016-09-15 14:56:19 +02:00

140 lines
3.7 KiB
JavaScript

'use strict'
require('babel-register')
/*
* The main file that sets up the Express instance and node
*
* @module server/server
* @type {Express instance}
*/
// set up some globals (these are also set in Epiphany if not already set)
global.ENV = process.env.NODE_ENV || 'development'
global.PWD = process.env.NODE_PWD || process.cwd()
// make node understand `*.marko` files
require('marko/node-require').install()
// modules > native
const p = require('path')
// modules > 3rd party
const requireDir = require('require-dir')
const _ = require('lodash')
const express = require('express')
const mongoose = require('mongoose')
const passport = require('passport')
// modules > express middlewares
const bodyParser = require('body-parser')
const session = require('express-session')
const cookieParser = require('cookie-parser')
// modules > 3rd party
const chalk = require('chalk')
// modules > midwest
const colorizeStack = require('midwest/util/colorize-stack')
const config = requireDir('./config')
// make error output stack pretty
process.on('uncaughtException', (err) => {
console.error(chalk.red('UNCAUGHT EXCEPTION'))
if (err.stack) {
console.error(colorizeStack(err.stack))
} else {
console.error(err)
}
process.exit(1)
})
// mongoose mpromise library is being deprecated
mongoose.Promise = Promise
// connect to mongodb
mongoose.connect(config.mongo.uri, _.omit(config.mongo, 'uri'), (err) => {
if (err) {
console.error(err)
process.exit()
}
console.info('[' + chalk.cyan('INIT') + '] Mongoose is connected.')
})
const prewares = [
express.static(config.dir.static, ENV === 'production' ? { maxAge: '1 year' } : null),
bodyParser.json(),
bodyParser.urlencoded({ extended: true }),
cookieParser(),
session(config.session),
passport.initialize(),
passport.session(),
]
if (ENV === 'development') {
// only log requests to console in development mode
prewares.unshift(require('morgan')('dev'))
prewares.push(require('midwest-module-membership/passport/automatic-login'))
}
const postwares = [
require('midwest/middleware/ensure-found'),
// transform and log error
require('midwest/middleware/error-handler'),
// respond
require('midwest/middleware/responder'),
]
const server = express()
// get IP & whatnot from nginx proxy
server.set('trust proxy', true)
server.locals.site = require('./config/site')
if (ENV === 'production') {
Object.assign(server.locals, {
js: require(p.join(PWD, 'public/js.json')),
css: require(p.join(PWD, 'public/css.json'))
})
}
// override default response render method for
// more convenient use with marko
server.response.render = function (template) {
const locals = _.extend({}, server.locals, this.locals)
template.render(locals, this)
}
// load all prewares
server.use(...prewares)
// routes > pages
server.use(require('./pages'))
// routes > authentication
server.use('/auth', require('midwest-module-membership/passport/router'))
// routes > api > membership
server.use('/api/roles', require('midwest-module-membership/services/roles/router'))
server.use('/api/permissions', require('midwest-module-membership/services/permissions/router'))
server.use('/api/invites', require('midwest-module-membership/services/invites/router'))
server.use('/api/users', require('midwest-module-membership/services/users/router'))
// routes > api > errors
server.use('/api/errors', require('midwest-service-errors/router'))
// routes > api > pomodoro
server.use('/api/pomodoros', require('./services/pomodoros/router'))
// load all postwares
server.use(...postwares)
server.listen(config.port, () => {
console.info('[' + chalk.cyan('INIT') + '] HTTP Server listening on port ' + chalk.magenta('%s') + ' (' + chalk.yellow('%s') + ')', config.port, ENV)
})
module.exports = server