Skip to content

Commit 0f821c5

Browse files
crobinson42jmdobry
authored andcommitted
Feature - Response Handler(s) (#14)
* add response handler extensibility * add response handler extensibility * decouple extending req/res from resource, add more extensibility with middleware and req * add rejecting an endpoint extension declaration * add utils.reject()
1 parent c7c64e6 commit 0f821c5

File tree

1 file changed

+37
-21
lines changed

1 file changed

+37
-21
lines changed

src/index.js

Lines changed: 37 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -10,24 +10,36 @@ export * from './queryParser'
1010
import express from 'express'
1111
import bodyParser from 'body-parser'
1212

13-
function makeHandler (handler) {
13+
function makeHandler (handler, extendedHandlers) {
1414
return function (req, res, next) {
15-
return utils.resolve()
16-
.then(function () {
17-
return handler(req)
18-
})
19-
.then(function (result) {
20-
res.status(200)
21-
if (!utils.isUndefined(result)) {
22-
res.send(result)
23-
}
24-
res.end()
25-
})
26-
.catch(next)
15+
return utils.resolve().then(function () {
16+
if (extendedHandlers && extendedHandlers.req) {
17+
return new Promise((resolve) => {
18+
extendedHandlers.req(req, res, resolve)
19+
})
20+
.then(() => { return handler(req) })
21+
.catch(next)
22+
} else if (extendedHandlers === false) {
23+
return utils.reject()
24+
}
25+
26+
return handler(req)
27+
})
28+
.then(function (result) {
29+
res.status(200)
30+
31+
if (extendedHandlers && extendedHandlers.res) {
32+
return extendedHandlers.res(result, req, res, next)
33+
} else if (!utils.isUndefined(result)) {
34+
res.send(result)
35+
}
36+
res.end()
37+
})
38+
.catch(next)
2739
}
2840
}
2941

30-
export function Router (component) {
42+
export function Router (component, extendedHandlers = {}) {
3143
if (!(component instanceof Mapper) && !(component instanceof Container)) {
3244
throw new Error('You must provide an instance of JSData.Container, JSData.DataStore, or JSData.Mapper!')
3345
}
@@ -38,6 +50,10 @@ export function Router (component) {
3850
extended: true
3951
}))
4052

53+
if (extendedHandlers.middleware && typeof extendedHandlers.middleware === 'function') {
54+
router.use(extendedHandlers.middleware)
55+
}
56+
4157
if (component instanceof Container) {
4258
utils.forOwn(component._mappers, (mapper, name) => {
4359
router.use(`/${mapper.endpoint || name}`, new Router(mapper).router)
@@ -47,39 +63,39 @@ export function Router (component) {
4763
// GET /:resource
4864
.get(makeHandler(function (req) {
4965
return component.findAll(req.query, req.jsdataOpts)
50-
}))
66+
}, extendedHandlers.findAll))
5167
// POST /:resource
5268
.post(makeHandler(function (req) {
5369
if (utils.isArray(req.body)) {
5470
return component.createMany(req.body, req.jsdataOpts)
5571
}
5672
return component.create(req.body, req.jsdataOpts)
57-
}))
73+
}, extendedHandlers.create))
5874
// PUT /:resource
5975
.put(makeHandler(function (req) {
6076
if (utils.isArray(req.body)) {
6177
return component.updateMany(req.body, req.jsdataOpts)
6278
}
6379
return component.updateAll(req.body, req.query, req.jsdataOpts)
64-
}))
80+
}, extendedHandlers.updateAll))
6581
// DELETE /:resource
6682
.delete(makeHandler(function (req) {
6783
return component.destroyAll(req.query, req.jsdataOpts)
68-
}))
84+
}, extendedHandlers.destroyAll))
6985

7086
router.route('/:id')
7187
// GET /:resource/:id
7288
.get(makeHandler(function (req) {
7389
return component.find(req.params.id, req.jsdataOpts)
74-
}))
90+
}, extendedHandlers.find))
7591
// PUT /:resource/:id
7692
.put(makeHandler(function (req) {
7793
return component.update(req.params.id, req.body, req.jsdataOpts)
78-
}))
94+
}, extendedHandlers.update))
7995
// DELETE /:resource/:id
8096
.delete(makeHandler(function (req) {
8197
return component.destroy(req.params.id, req.jsdataOpts)
82-
}))
98+
}, extendedHandlers.destroy))
8399
}
84100
}
85101

0 commit comments

Comments
 (0)