kwikemon/app.js

116 lines
2.5 KiB
JavaScript

// Copyright 2013 Sami Samhuri
var express = require('express')
, Negotiator = require('negotiator')
, kwikemon = require('./kwikemon.js')
, app = module.exports = express()
, version = require('./version.js')
;
// Middleware
app.use(express.favicon('/dev/null'));
app.use(express.logger());
app.use(express.static(__dirname + '/public'));
// Views
app.set('view engine', 'jade');
app.set('views', __dirname + '/views');
// Routes
app.get('/', route('monitors', getMonitors));
app.get('/:name', route('monitor', getMonitor));
function route(template, buildContext) {
return function(req, res) {
buildContext(req, res, function(err, ctx) {
if (err) {
var message = err.message || String(err)
, status = message == 'not found' ? 404 : 500
;
res.format({
html: function() {
res.render('error', {
version: version,
pageTitle: 'Error',
err: err
});
},
text: function() {
res.send(renderText('error', { err: err }));
},
json: function() {
res.json({ message: message });
}
});
}
else {
ctx = ctx || {};
res.format({
html: function() {
ctx.version = version;
res.render(template, ctx);
},
text: function() {
res.send(renderText(template, ctx));
},
json: function() {
res.json(ctx);
}
});
}
});
};
}
// Rendering
function renderText(template, ctx) {
var text;
switch (template) {
case 'monitor':
text = String(ctx.monitor.text);
break;
case 'monitors':
text = Object.keys(ctx.monitors).sort().map(function(name) {
return name + ': ' + ctx.monitors[name].text;
}).join('\n');
break;
case 'error':
text = ctx.err.message || String(ctx.err);
break;
default:
throw new Error('unknown text template: ' + template);
}
return text;
}
//////////////////////
// Request handlers //
//////////////////////
function getMonitors(req, res, cb) {
kwikemon.getAll(function(err, monitors) {
cb(err, err ? null : {
pageTitle: 'Monitors',
monitors: monitors
});
});
}
function getMonitor(req, res, cb) {
var name = req.params.name;
kwikemon.get(name, function(err, mon) {
if (!mon) {
err = new Error('not found');
}
cb(err, err ? null : {
pageTitle: mon.name,
monitor: mon
});
});
}