UNPKG

strider

Version:

Brilliant continuous deployment platform

304 lines 10.4 kB
const _ = require('lodash'); const common = require('../common'); const config = require('../config'); const debug = require('debug')('strider:routes'); const jobs = require('../jobs'); const models = require('../models'); const path = require('path'); const pjson = require('../../package.json'); const User = models.User; const utils = require('../utils'); /* * GET home page dashboard */ exports.index = function (req, res) { // Work-around for Safari/Express etags bug on cookie logout. // Without it, Safari will cache the logged-in version despite logout! // See https://github.com/Strider-CD/strider/issues/284 req.headers['if-none-match'] = 'no-match-for-this'; if (req.session.return_to) { const return_to = req.session.return_to; req.session.return_to = null; return res.redirect(return_to); } let code = ''; if (req.query.code !== undefined) { code = req.query.code; return res.render('register.html', { invite_code: code, version: pjson.version, }); } if (!req.user) { return res.redirect('/login?ember=true'); } jobs.latestJobs(req.user, true, function (err, jobs) { const availableProviders = Object.keys(common.userConfigs.provider).map(function (k) { return common.userConfigs.provider[k]; }); res.render('index.html', { jobs: jobs, availableProviders: availableProviders, flash: req.flash(), version: pjson.version, }); }); }; exports.emberIndex = function (req, res) { // Work-around for Safari/Express etags bug on cookie logout. // Without it, Safari will cache the logged-in version despite logout! // See https://github.com/Strider-CD/strider/issues/284 req.headers['if-none-match'] = 'no-match-for-this'; if (req.session.return_to) { const return_to = req.session.return_to; req.session.return_to = null; return res.redirect(return_to); } if (req.query.ember) { // TODO: only set if dev res.header('Cache-Control', 'private, no-cache, no-store, must-revalidate'); res.render('ember/index.html'); } }; exports.setConfig = function (req, res) { const attrs = ['public']; applyAttrs(req.project, attrs, req.body); req.project.save(function (err) { if (err) return res.status(500).send('failed to save project'); res.send('saved'); }); }; exports.getRunnerConfig = function (req, res) { const branch = req.project.branch(req.query.branch); if (!branch) { return res.status(400).send('Invalid branch'); } res.send(branch.runner); }; exports.setRunnerConfig = function (req, res) { const branch = req.project.branch(req.query.branch); branch.runner.config = req.body; req.project.save(function (err, project) { if (err) { return res.status(500).send({ error: 'Failed to save runner config', }); } res.send(project.branch(req.query.branch).runner.config); }); }; exports.setRunnerId = function (req, res) { const branch = req.project.branch(req.query.branch); branch.runner.id = req.body.id; branch.runner.config = req.body.config; req.project.save(function (err, project) { if (err) { return res.status(500).send({ error: 'Failed to save runner config', }); } res.send(project.branch(req.query.branch).runner.id); }); }; // GET /:org/:repo/config/branch/:pluginname/?branch=:branch // Output: the config exports.getPluginConfig = function (req, res) { res.send(req.pluginConfig()); }; // POST /:org/:repo/config/branch/:plugin/?branch=:branch // Set the configuration for a plugin on a branch. Output: the new config. exports.setPluginConfig = function (req, res) { req.pluginConfig(req.body, function (err, config) { if (err) { return res.status(500).send({ error: 'Failed to save plugin config', }); } res.send(config); common.emitter.emit('branch.plugin_config', req.project, req.query.branch, req.params.plugin, req.body); }); }; exports.configureBranch = function (req, res) { const branch = req.project.branch(req.query.branch); if (!branch) { return res.status(400).send('Invalid branch'); } if (req.body.plugin_order) { return setPluginOrder(req, res, branch); } // TODO: move this somewhere else? const attrs = [ 'active', 'privkey', 'pubkey', 'envKeys', 'mirror_master', 'deploy_on_green', 'deploy_on_pull_request', 'runner', 'plugins', ]; applyAttrs(branch, attrs, req.body); req.project.save(function (err) { if (err) { return res.status(500).send('failed to save project'); } res.status(200).send('saved'); }); }; function setPluginOrder(req, res, branch) { const plugins = req.body.plugin_order; const oldPlugins = branch.plugins || []; const map = {}; oldPlugins.forEach(function (plugin) { map[plugin.id] = plugin; }); plugins.forEach(function (plugin) { if (map[plugin.id]) { plugin.config = map[plugin.id].config; } else { plugin.config = {}; } }); branch.plugins = plugins; req.project.markModified('branches'); req.project.save(function (err) { if (err) { return res.status(500).send('Failed to save plugin config'); } res.send({ success: true }); common.emitter.emit('branch.plugin_order', req.project, branch.name, plugins); }); } exports.reloadConfig = function (req, res, next) { common.loader.initConfig(path.join(__dirname, 'public/javascripts/pages/config-plugins-compiled.js'), path.join(__dirname, 'public/stylesheets/css/config-plugins-compiled.css'), function (err, configs) { debug('loaded config pages'); common.pluginConfigs = configs; common.loader.initUserConfig(path.join(__dirname, 'public/javascripts/pages/account-plugins-compiled.js'), path.join(__dirname, 'public/stylesheets/css/account-plugins-compiled.css'), function (err, configs) { debug('loaded account config pages'); common.userConfigs = configs; next(); }); }); }; /* * GET /:org/:repo/config - project config page */ exports.config = function (req, res) { User.collaborators(req.project.name, 0, function (err, users) { if (err) { throw err; } const data = { version: pjson.version, collaborators: [], serverName: config.server_name, project: req.project.toJSON(), statusBlocks: common.statusBlocks, userIsCreator: req.user.isProjectCreator, }; if (req.user.isProjectCreator) { data.userConfigs = req.user.jobplugins; } delete data.project.creator; users.forEach(function (user) { const p = _.find(user.projects, function (p) { return p.name === req.project.name; }); data.collaborators.push({ email: user.email, access: p.access_level, gravatar: utils.gravatar(user.email), owner: user._id.toString() === req.project.creator._id.toString(), yourself: req.user._id.toString() === user._id.toString(), }); }); data.provider = common.pluginConfigs.provider[req.project.provider.id]; data.runners = common.pluginConfigs.runner; data.plugins = common.pluginConfigs.job; data.collaborators.sort(function (a, b) { if (a.owner) return -1; if (b.owner) return 1; return 0; }); const provider = common.extensions.provider[req.project.provider.id]; const creator_creds = req.project.creator.account(req.project.provider) .config; if (!provider) { // TODO: alert the user through the UI debug('Provider plugin not installed!', req.project.provider.id); return respond(data); } if (typeof provider.getBranches === 'function' && (!provider.hosted || creator_creds)) { provider.getBranches(creator_creds, req.project.provider.config, req.project, function (err, branches) { data.allBranches = branches; respond(data); }); } else { respond(data); } }); function respond(data) { res.format({ html: function () { res.render('project_config.html', data); }, json: function () { res.send(data); }, }); } }; /* * /status endpoint * Executes a simple database query to verify that system is operational. * Assumes there is at least 1 user in the system. * Returns 200 on success. * * This is for use by Pingdom and similar monitoring systems. */ exports.status = function (req, res) { function error(message) { res.statusCode = 500; const resp = { status: 'error', version: `StriderCD (http://stridercd.com) ${pjson.version}`, results: [], errors: [{ message: message }], }; return res.jsonp(resp); } function ok() { res.statusCode = 200; const resp = { status: 'ok', version: `StriderCD (http://stridercd.com) ${pjson.version}`, results: [{ message: 'system operational' }], errors: [], }; return res.jsonp(resp); } User.findOne(function (err, user) { if (err) { return error(`error retrieving user from DB: ${err}`); } if (!user) { return error('no users found in DB - mis-configured?'); } return ok(); }); }; function applyAttrs(obj, attrs, source) { attrs.forEach(function (attr) { if (typeof source[attr] !== 'undefined') { obj[attr] = source[attr]; } }); } //# sourceMappingURL=index.js.map