const http = require('http'); const express = require('express'); const cookieParser = require('cookie-parser') const mw = require('./middleware'); const app = express(); const verbose = process.env.NODE_ENV != 'test'; app.map = function(a, route){ route = route || ''; for (var key in a) { switch (typeof a[key]) { // { '/path': { ... }} case 'object': if (!Array.isArray(a[key])) { app.map(a[key], route + key); break; } // else drop through // get: function(){ ... } case 'function': if (verbose) console.log('%s %s', key, route); app[key](route, a[key]); break; } } }; app.use(express.json({type: "application/json", strict: false})); app.use(express.urlencoded({ type: "application/x-www-form-urlencoded", extended: true })); app.use(express.text({type: "text/*"})); app.use((req, res, next) => { res.set("Access-Control-Allow-Origin", "*"); res.set("Access-Control-Allow-Methods", "OPTIONS, GET, POST, PUT, PATCH, DELETE"); res.set("Access-Control-Allow-Headers", "Content-Type"); next(); }); app.use(cookieParser()); app.use(mw.auth.jwt); // app.use(mw.auth.access({path: {allow:["^/login", "^/user$"]}})); app.map({ '/project': { get: [ mw.project.list ], // Get list of projects }, '/project/:project': { get: [ mw.project.get ], // Get project data }, '/project/:project/summary': { get: [ mw.project.get ], }, '/project/:project/gis': { get: [ mw.gis.project.bbox ] }, '/project/:project/gis/preplot': { get: [ mw.gis.project.preplot ] }, '/project/:project/gis/preplot/:featuretype(line|point)': { get: [ mw.gis.project.preplot ] }, '/project/:project/gis/raw/:featuretype(line|point)': { get: [ mw.gis.project.raw ] }, '/project/:project/gis/final/:featuretype(line|point)': { get: [ mw.gis.project.final ] }, '/project/:project/line/': { get: [ mw.line.list ], }, // '/project/:project/line/:line': { // get: [ mw.line.get ], // patch: [ mw.line.patch ], // }, // '/project/:project/sequence/': { get: [ mw.sequence.list ], }, // '/project/:project/sequence/:line': { // get: [ mw.sequence.get ], // patch: [ mw.sequence.patch ], // }, // '/project/:project/event/': { get: [ mw.event.list ], // post: [ mw.event.post ], }, // '/project/:project/event/:event': { // get: [ mw.event.get ], // put: [ mw.event.put ], // }, '/project/:project/label/': { get: [ mw.label.list ], // post: [ mw.label.post ], }, // // '/project/:id/permissions/:mode(read|write)?': { // get: [ mw.permissions.get ], // put: [ mw.permissions.put ], // // post: [ mw.permissions.post ], // // delete: [ mw.permissions.delete ] // }, // // '/user': { // get: [ mw.user.get ], // post: [ mw.user.put ] // }, // '/user/:user': { // get: [ mw.user.get ], // put: [ mw.user.put ], // // delete: [ mw.user.delete ] // }, // // '/login': { // post: [ mw.user.login ] // }, // '/logout': { // post: [ mw.user.logout ] // } }); // Generic error handler. Stops stack dumps // being sent to clients. app.use(function (err, req, res, next) { console.log("Error:", err); if (err instanceof Error && err.name != "UnauthorizedError") { console.error(err.stack); res.status(500).send('General internal error'); } else if (typeof err === 'string') { res.status(500).send({message: err}); } else { res.status(err.status || 500).send({message: err.message || (err.inner && err.inner.message) || "Internal error"}); } }); app.disable('x-powered-by'); app.enable('trust proxy'); console.log('trust proxy is ' + (app.get('trust proxy')? 'on' : 'off')); const addr = "127.0.0.1"; if (!module.parent) { var port = process.env.HTTP_PORT || 3000; var server = http.createServer(app).listen(port, addr); console.log('API started on port ' + port); } else { app.start = function (port = 3000, path) { var root = app; if (path) { root = express(); ['x-powered-by', 'trust proxy'].forEach(k => root.set(k, app.get(k))); root.use(path, app); } const server = http.createServer(root).listen(port, addr); if (server) { console.log(`API started on port ${port}, prefix: ${path || "/"}`); } return server; } module.exports = app; }