|
| 1 | +'use strict'; |
| 2 | + |
| 3 | +const bodyParser = require('body-parser'); |
| 4 | +const compression = require('compression'); |
| 5 | +const rewrite = require('express-urlrewrite'); |
| 6 | +const fs = require('fs'); |
| 7 | +const log = require('./lib/logger.js'); |
| 8 | +const path = require('path'); |
| 9 | +const Promise = require('bluebird'); |
| 10 | +const currentVersion = 'v1'; |
| 11 | + |
| 12 | +// Define default config |
| 13 | +const defaultConfig = { |
| 14 | + 'LANDO_API_PORT': 80, |
| 15 | + 'LANDO_API_TIMEOUT': 10000, |
| 16 | +}; |
| 17 | + |
| 18 | +// Get configuration |
| 19 | +const config = require('./lib/config.js')(defaultConfig); |
| 20 | +log.info('Starting app with config %j', config); |
| 21 | + |
| 22 | +// Get the app ready |
| 23 | +const express = require('express'); |
| 24 | +const api = express(); |
| 25 | + |
| 26 | +// App usage |
| 27 | +api.use(compression()); |
| 28 | +api.use(bodyParser.urlencoded({extended: true})); |
| 29 | +api.use(bodyParser.json()); |
| 30 | +api.use(rewrite('/*', `/${currentVersion}/$1`)); |
| 31 | + |
| 32 | +/** |
| 33 | + * Handler function. |
| 34 | + * @param {function} fn thing |
| 35 | + * @return {String} log shit |
| 36 | + */ |
| 37 | +const handler = fn => { |
| 38 | + // Returns a handler function. |
| 39 | + return (req, res) => { |
| 40 | + log.request(req, res); |
| 41 | + // Call fn in context of a promise. |
| 42 | + return Promise.try(fn, [req, res]) |
| 43 | + // Make sure we have a timeout. |
| 44 | + .timeout(config.LANDO_API_TIMEOUT || 10 * 1000) |
| 45 | + // Handle success. |
| 46 | + .then(data => { |
| 47 | + res.status(200); |
| 48 | + res.json(data); |
| 49 | + res.end(); |
| 50 | + log.response(res, 'info', data); |
| 51 | + }) |
| 52 | + // Handler failure. |
| 53 | + .catch(err => { |
| 54 | + const code = err.statusCode || err.status || 500; |
| 55 | + const message = err.message || err.statusMessage || 'Unknown Error'; |
| 56 | + res.status(code); |
| 57 | + res.send({code, message}); |
| 58 | + res.end(); |
| 59 | + log.response(res, 'error', err); |
| 60 | + }); |
| 61 | + }; |
| 62 | +}; |
| 63 | + |
| 64 | +// Start listening |
| 65 | +Promise.fromNode(cb => { |
| 66 | + api.listen(config.LANDO_API_PORT, cb); |
| 67 | +}) |
| 68 | +// Load our routes |
| 69 | +.then(() => { |
| 70 | + fs.readdirSync(path.join(__dirname, 'routes')).map(file => { |
| 71 | + require(`./routes/${file}`)(api, handler); |
| 72 | + log.info('Loaded route %s', file); |
| 73 | + }); |
| 74 | + log.info('Listening on port: %s', config.LANDO_API_PORT); |
| 75 | +}); |
0 commit comments