/
api-builder.js
53 lines (45 loc) · 1.3 KB
/
api-builder.js
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
const routes = {
get: require('./endpoints/get'),
post: require('./endpoints/post'),
put: require('./endpoints/put'),
patch: require('./endpoints/patch'),
delete: require('./endpoints/delete')
}
const EventEmitter = require('events').EventEmitter
const createPipe = require('piton-pipe').createPipe
function buildApi(service, urlRoot, router, logger, middleware, verbs) {
const hooks = {
'create:request': createPipe(),
'create:response': createPipe(),
'read:response': createPipe(),
'update:request': createPipe(),
'update:response': createPipe(),
'partialUpdate:request': createPipe(),
'partialUpdate:response': createPipe()
}
class Api extends EventEmitter {
hook(name, fn) {
if (!hooks[name]) throw new Error('No hook exists for: ' + name)
hooks[name].add(fn)
}
}
const api = new Api()
if (!Array.isArray(middleware) && typeof middleware !== 'function')
throw new Error('Middleware is not defined')
// Support all verbs by default
if (!Array.isArray(verbs)) verbs = ['get', 'post', 'put', 'patch', 'delete']
// Create endpoints
verbs.forEach((verb) => {
routes[verb](
service,
urlRoot,
router,
logger,
middleware,
api.emit.bind(api),
hooks
)
})
return api
}
module.exports = buildApi