import * as express from "express" import * as _ from "lodash" import * as isPromise from "is-promise" import { UserError } from "./errors" export class Server { app = express() controllers = {} endpoint(route, controllerName) { const [method, path] = route.split(' ') this.app[method.toLowerCase()](path, (req, res) => { const params = _.assign({}, req.body, req.params) const succeed = (data) => { res.json(data) } const fail = (e) => { if (e instanceof UserError) { res.status(e.statusCode || 500).json(e.data) } else { res.status(500).end() } } let result try { result = this.controllers[controllerName](params) } catch(e) { fail(e) } if (isPromise(result)) result .then(succeed) .catch(fail) else succeed(result) }) return this } hasController(name) { return this.controllers[name] !== undefined } controller(name, callback) { if (this.controllers[name] !== undefined) throw new Error(`controller ${name} already exists`) this.controllers[name] = callback return this } listen(port) { return new Promise((accept, reject) => { const http = this.app.listen(port, () => { accept(http) }) }) } } export default Server