-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.js
More file actions
91 lines (78 loc) · 2.47 KB
/
Copy pathindex.js
File metadata and controls
91 lines (78 loc) · 2.47 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
const express = require('express');
const bodyParser = require('body-parser');
const Boom = require('@hapi/boom');
const merge = require('merge');
const handlers = require('./handlers');
function notImplemented(req, res, next) {
return next(Boom.notImplemented());
}
const defaultOptions = {
port: 8081,
context: '/api/v1',
maxRequestBodySize: '5mb',
errorHandlers: { enabled: true, debug: false},
preMount: undefined,
endpoints: {
users: {
getUser: notImplemented,
getUsers: notImplemented,
postUser: notImplemented
},
services: {
getServices: notImplemented,
getService: notImplemented,
createService: notImplemented,
updateService: notImplemented
}
},
postMount: undefined
};
function mountEndpoints(server) {
// Mount middleware
server.app.use(bodyParser.json({ limit: server.options.maxRequestBodySize }));
const route = (resource, callback) => {
const router = express.Router();
callback(router, server.options.endpoints[resource]);
if (server.errorHandlers) {
router.all('/', server.errorHandlers.methodNotAllowed);
}
server.app.use(`${server.options.context}/${resource}`, router);
}
// Mount users
route('users', (router, resource) => {
router.get('/', resource.getUsers);
router.get('/:user_id', resource.getUser);
router.post('/:user_id', resource.postUser);
});
// Mount services
route('services', (router, resource) => {
router.get('/', resource.getServices);
router.post('/', resource.createService);
router.get('/:service_id', resource.getService);
router.post('/:service_id', resource.updateService);
//router.delete('/:service_id', resource.deleteService);
});
}
module.exports = function(options, app, callback) {
if (arguments.length <= 2) {
callback = app;
app = undefined;
}
this.options = merge.recursive(true, defaultOptions, options || {});
this.app = app ? app : express();
this.errorHandlers = this.options.errorHandlers.enabled? handlers(this.options.errorHandlers.debug) : undefined;
if (typeof this.options.preMount === 'function') {
this.options.preMount(this.app);
}
mountEndpoints(this);
if (typeof this.options.postMount === 'function') {
this.options.postMount(this.app);
}
// Mount final error handlers
if (this.errorHandlers) {
this.app.use(errorHandlers.notFound);
this.app.use(errorHandlers.error);
}
// Start server
this.app.listen(this.options.port, callback);
};