linear
Version:
A simple setup micro-forum built in Node.js with Express and MongoDB.
190 lines (124 loc) • 4.78 kB
JavaScript
/* eslint max-statements: 0 */
/* eslint no-param-reassign: 0 */
/* eslint no-unused-vars: 0 */
const express = require('express');
const session = require('express-session');
const bodyParser = require('body-parser');
const lusca = require('lusca');
const enrouten = require('express-enrouten');
const meddleware = require('meddleware');
const passport = require('passport');
const hbs = require('express-hbs');
require('./src/utils/helpers');
const i18n = require('i18n');
const moment = require('moment');
const mongoose = require('mongoose');
const defaultConfig = require('./config.json');
const profileController = require('./src/controllers/profile');
const latest = require('./src/utils/latest');
const env = require('./src/utils/env');
const HTTP_INTERNAL_SERVER_ERROR = 500;
const HTTP_NOT_FOUND = 404;
module.exports = {
'startWithConfig': config => {
const app = express();
app.disable('x-powered-by');
config = Object.assign({}, defaultConfig, config);
mongoose.connect(env.mongodb());
app.use(session({
'resave': true,
'saveUninitialized': true,
'secret': process.env.SECRET || 'secret'
}));
app.use(bodyParser.urlencoded({
'extended': true
}));
app.use(bodyParser.json());
app.use(meddleware({
'security': {
'enabled': true,
'module': {
'arguments': [
{
'csrf': true,
'hsts': {
'maxAge': 31536000
},
'xframe': 'SAMEORIGIN',
'xssProtection': true
}
],
'name': 'lusca'
},
'route': '/((?!api))*'
}
}));
app.use(passport.initialize());
app.use(passport.session());
passport.serializeUser((user, done) => {
done(null, user._id);
});
passport.deserializeUser((id, done) => {
profileController.show(id).then(profile => {
done(null, profile);
});
});
i18n.configure({
'defaultLocale': Object.keys(config.languages)[0],
'directory': `${config.directories.locales || __dirname}/locales`,
'indent': ' ',
'locales': Object.keys(config.languages)
});
app.use(i18n.init);
if (config.directories.static) {
app.use(express.static(config.directories.static));
}
app.use(express.static(`${__dirname}/static`));
app.use((req, res, next) => {
res.locals.layout = 'template';
res.locals.latestVersion = latest();
res.locals.config = config;
res.locals.user = req.user;
res.locals.url = `${req.protocol}://${req.get('host')}${req.originalUrl}`;
hbs.registerHelper('__', (...args) => i18n.__.apply(req, args));
if (req.user) {
req.setLocale(req.user.locale);
}
res.locals.lang = req.getLocale();
moment.locale(req.getLocale());
next();
});
app.use(enrouten({
'directory': 'src/routes'
}));
app.use((err, req, res, next) => {
res.status(err.status || HTTP_INTERNAL_SERVER_ERROR);
res.render('error', {
'message': err.message,
'status': err.status || HTTP_INTERNAL_SERVER_ERROR
});
});
app.use((req, res, next) => {
res.status(HTTP_NOT_FOUND);
res.render('error', {
'message': req.__('Page Not Found'),
'status': HTTP_NOT_FOUND
});
});
if (config.directories.views) {
app.engine('hbs', hbs.express4({
'onCompile': (exhbs, source) => exhbs.handlebars.compile(source, {'preventIndent': true}),
'partialsDir': [`${config.directories.views}/partials`, `${__dirname}/src/views/partials`]
}));
app.set('views', [config.directories.views, `${__dirname}/src/views`]);
} else {
app.engine('hbs', hbs.express4({
'onCompile': (exhbs, source) => exhbs.handlebars.compile(source, {'preventIndent': true}),
'partialsDir': `${__dirname}/src/views/partials`
}));
app.set('views', `${__dirname}/src/views`);
}
app.set('view engine', 'hbs');
app.listen(env.port(), env.ipaddress());
}
};