yahoo-swiv
Version:
A web-based exploratory visualization UI for Druid.io
146 lines (145 loc) • 4.75 kB
JavaScript
"use strict";
var express = require('express');
var hsts = require('hsts');
var path = require('path');
var bodyParser = require('body-parser');
var compress = require('compression');
var logger_tracker_1 = require('logger-tracker');
var chronoshift_1 = require('chronoshift');
if (!chronoshift_1.WallTime.rules) {
var tzData = require("chronoshift/lib/walltime/walltime-data.js");
chronoshift_1.WallTime.init(tzData.rules, tzData.zones);
}
var config_1 = require('./config');
var plywoodRoutes = require('./routes/plywood/plywood');
var plyqlRoutes = require('./routes/plyql/plyql');
var swivRoutes = require('./routes/swiv/swiv');
var collectionsRoutes = require('./routes/collections/collections');
var settingsRoutes = require('./routes/settings/settings');
var mkurlRoutes = require('./routes/mkurl/mkurl');
var healthRoutes = require('./routes/health/health');
var errorRoutes = require('./routes/error/error');
var views_1 = require('./views');
function makeGuard(guard) {
return function (req, res, next) {
var user = req.user;
if (!user) {
next(new Error('no user'));
return;
}
var allow = user.allow;
if (!allow) {
next(new Error('no user.allow'));
return;
}
if (!allow[guard]) {
next(new Error('not allowed'));
return;
}
next();
};
}
var app = express();
app.disable('x-powered-by');
if (config_1.SERVER_SETTINGS.getTrustProxy() === 'always') {
app.set('trust proxy', 1);
}
function addRoutes(attach, router) {
app.use(attach, router);
app.use(config_1.SERVER_SETTINGS.getServerRoot() + attach, router);
}
function addGuardedRoutes(attach, guard, router) {
var guardHandler = makeGuard(guard);
app.use(attach, guardHandler, router);
app.use(config_1.SERVER_SETTINGS.getServerRoot() + attach, guardHandler, router);
}
app.use(compress());
app.use(logger_tracker_1.logAndTrack(config_1.SERVER_SETTINGS.getRequestLogFormat()));
if (config_1.SERVER_SETTINGS.getStrictTransportSecurity() === "always") {
app.use(hsts({
maxAge: 10886400000,
includeSubDomains: true,
preload: true
}));
}
addRoutes('/health', healthRoutes);
addRoutes('/', express.static(path.join(__dirname, '../../build/public')));
addRoutes('/', express.static(path.join(__dirname, '../../assets')));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
extended: true
}));
var stateful = config_1.SETTINGS_MANAGER.isStateful();
app.use(function (req, res, next) {
req.user = null;
req.version = config_1.VERSION;
req.stateful = stateful;
req.getSettings = function (opts) {
if (opts === void 0) { opts = {}; }
return config_1.SETTINGS_MANAGER.getSettings(opts);
};
next();
});
app.use(function (req, res, next) {
var version = req.body.version;
if (version && version !== req.version) {
res.status(412).send({
error: 'incorrect version',
action: 'reload'
});
return;
}
next();
});
if (config_1.AUTH) {
app.use(config_1.AUTH);
}
else {
app.use(function (req, res, next) {
if (req.stateful) {
req.user = {
id: 'admin',
email: 'admin@admin.com',
displayName: 'Admin',
allow: {
settings: true
}
};
}
next();
});
}
addRoutes('/plywood', plywoodRoutes);
addRoutes('/plyql', plyqlRoutes);
addRoutes('/mkurl', mkurlRoutes);
addRoutes('/error', errorRoutes);
if (stateful) {
addRoutes('/collections', collectionsRoutes);
addGuardedRoutes('/settings', 'settings', settingsRoutes);
}
if (config_1.SERVER_SETTINGS.getIframe() === 'deny') {
app.use(function (req, res, next) {
res.setHeader("X-Frame-Options", "DENY");
res.setHeader("Content-Security-Policy", "frame-ancestors 'none'");
next();
});
}
addRoutes('/', swivRoutes);
app.use(function (req, res, next) {
res.redirect('/');
});
if (app.get('env') === 'development') {
app.use(function (err, req, res, next) {
logger_tracker_1.LOGGER.error("Server Error: " + err.message);
logger_tracker_1.LOGGER.error(err.stack);
res.status(err.status || 500);
res.send(views_1.errorLayout({ version: config_1.VERSION, title: 'Error' }, err.message, err));
});
}
app.use(function (err, req, res, next) {
logger_tracker_1.LOGGER.error("Server Error: " + err.message);
logger_tracker_1.LOGGER.error(err.stack);
res.status(err.status || 500);
res.send(views_1.errorLayout({ version: config_1.VERSION, title: 'Error' }, err.message));
});
module.exports = app;