openmrs/openmrs-contrib-id

View on GitHub
app/app.js

Summary

Maintainability
A
0 mins
Test Coverage
'use strict';
/**
 * The contents of this file are subject to the OpenMRS Public License
 * Version 1.1 (the "License"); you may not use this file except in
 * compliance with the License. You may obtain a copy of the License at
 * http://license.openmrs.org
 *
 * Software distributed under the License is distributed on an "AS IS"
 * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
 * License for the specific language governing rights and limitations
 * under the License.
 *
 * Copyright (C) OpenMRS, LLC.  All Rights Reserved.
 */
const fs = require('fs');
const url = require('url');
const path = require('path');
const express = require('express');
const expressSession = require('express-session');
const mongoose = require('mongoose');
const engine = require('pug').__express;
const lessMiddleware = require('less-middleware');
const flash = require('connect-flash');
const MongoStore = require('connect-mongo')(expressSession);
const _ = require('lodash');
const bodyParser = require('body-parser');
const cookieParser = require('cookie-parser');
const errorHandler = require('errorhandler');

global.__apppath = __dirname;
const app = express();
exports = module.exports = app;

// patch log4js
require('./logger');
const log4js = require('log4js');

// connect to mongo
require('./new-db');


const mid = require('./express-middleware');
const conf = require('./conf');
const log = log4js.addLogger('express');

const siteURLParsed = url.parse(conf.site.url, false, true);
app.engine('pug', engine);
app.set('view engine', 'pug');
app.set('views', path.join(__dirname, '/../templates'));
app.locals._ = _;
app.set('basepath', siteURLParsed.pathname);
app.set('port', 3000);
app.use(flash());
app.use(bodyParser.urlencoded({
  extended: false
}));
app.use(bodyParser.json());
app.use(cookieParser());


// store express session in MongoDB
const sessionStore = new MongoStore({
  url: conf.mongo.uri,
  "auto_reconnect": true,
});
const session = expressSession({
  store: sessionStore,
  secret: conf.session.secret,
  resave: false,
  saveUninitialized: false,
});

const exceptions = conf.sessionExceptions;
const sessionHandler = (req, res, next) => {
  function test(reg) {
    return reg.test(req.url);
  }
  if (exceptions.some(test)) { // we don't provide session for some exceptions
    return next();
  }
  return session(req, res, next);
};

app.use(sessionHandler);
app.use(mid.openmrsHelper);

//development
if ('development' === app.get('env')) {
  log.info('Running in development mode');

  app.use(errorHandler());

  _.EDT_hidden = true;
  const edt = require('express-debug');
  edt(app, {});

  app.use(log4js.connectLogger(log, {
    level: 'debug',
    format: ':method :status :url - :response-time ms',
  }));

  app.use('/resource', lessMiddleware('/less', {
    dest: '/stylesheets',
    pathRoot: path.join(__dirname, '/../resource/')
  }));


}

if ('production' === app.get('env')) {
  log.info('Running in production mode');
  app.use(errorHandler());
  app.use('/resource', lessMiddleware('/less', {
    dest: '/stylesheets',
    pathRoot: path.join(__dirname, '/../resource/'),
    once: true
  }));


}

app.use('/resource', express.static(path.join(__dirname, '/../resource/')));
app.use('/bower_components', express.static(path.join(__dirname,
  '/../node_modules/@bower_components')));


require('./render-helpers');

/// DEBUG

if (process.env.NODE_ENV === 'development') {

  app.get('/debug/view/:viewName', (req, res) => {
    res.render(`views/${req.params.viewName}`);
  });


  // app.get('/flash/:msg', function (req, res) {
  //   req.flash('info', req.params.msg);
  //   res.redirect('/sample');
  // });
}

/// DEBUG

// fail if no configuration file found
try {
  fs.readFileSync(`${__dirname}/conf.js`);
} catch (e) {
  console.log(`ERROR: while openning configuration file at (${__dirname}/conf.js)! Exiting…`);
  console.error(e);
}


/*
 *ROUTES
 *======
 * Things that might need to utilize root shall be put before this line,
 * or will be overridden by 404
 */
require('./routes')(app);

/* Load Modules */
conf.userModules.forEach(module => {
  require(`./user-modules/${module}`)(app);
});


require('./db-admin')(app, express);

// this two shall be put at the end
app.use(require('./routes/404'));
app.use(require('./routes/error'));


process.on('uncaughtException', err => {
  log.error(err);
});

// Do something before close the app
const gracefulExit = () => {
  mongoose.connection.close(() => {
    log.info('Mongoose connection closed');
    process.exit();
  });
};
process.on('SIGINT', gracefulExit).on('SIGTERM', gracefulExit);


/* App startup: */
app.listen(app.get('port'));

log.info(`Express started on port ${app.get('port')}`);