'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