Skip to content

Commit ec49a64

Browse files
committed
Changes to API for helper functions, 4.0.0
Renamed DB `create` action helper to `insert`. Export helpers for all SCRUD actions which follow the full chain of registered handlers, and return the data in the Promise resolution instead of sending via http.response.
1 parent 10c500d commit ec49a64

4 files changed

Lines changed: 70 additions & 22 deletions

File tree

README.md

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -90,19 +90,30 @@ Set global options and start API server
9090
- returns: `Object` - updated auth object
9191

9292
# helper functions (used internally but exported as a courtesy)
93+
94+
## generic helpers
9395
- `sendData`(response, data) - send response data to client
9496
- `sendErr`(response, error, code) - send error to client
95-
- `logIt`(error, logLevel) - invoke logger with error and logLevel
9697
- `fourOhOne`(response, error) - send 401 (unauthorized) error to client
9798
- `fourOhFour`(response, error) - send 404 (not found) error to client
9899
- `genToken`(payload) - generate JWT token
99100
- `authenticate`(jwt) - authenticate JWT token
101+
- `logIt`(error, logLevel) - invoke logger with error and logLevel
100102
- `callPgFunc`(functionName, params, request) - call any PG function with single arg
101-
- `search`(resource, request) - call PG search function for resource (alias `findAll`)
102-
- `create`(resource, request) - call PG create function for resource
103-
- `read`(resource, request) - call PG read function for resource (alias `find`)
104-
- `update`(resource, request) - call PG update function for resource (alias `save`)
105-
- `delete`(resource, request) - call PG delete function for resource (alias `destroy`)
103+
104+
## database action helpers
105+
- `findAll`(resource, request) - call PG search function for resource
106+
- `insert`(resource, request) - call PG create function for resource
107+
- `find`(resource, request) - call PG read function for resource
108+
- `save`(resource, request) - call PG update function for resource
109+
- `destroy`(resource, request) - call PG delete function for resource
110+
111+
## scrud helpers
112+
- `search`(resource, request) - run registered search handler for resource
113+
- `create`(resource, request) - run registered create handler for resource
114+
- `read`(resource, request) - run registered read handler for resource
115+
- `update`(resource, request) - run registered update handler for resource
116+
- `delete`(resource, request) - run registered delete handler for resource
106117

107118
# usage
108119

index.js

Lines changed: 36 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,21 @@ const tinyParams = require('tiny-params')
88
const zlib = require('zlib')
99
const port = process.env.PORT || process.env.port || 8091
1010
const defaultTimeout = 120000
11+
const noop = () => {}
12+
const dummyRes = {
13+
addTrailers: noop,
14+
end: noop,
15+
getHeader: noop,
16+
getHeaderNames: noop,
17+
getHeaders: noop,
18+
hasHeader: noop,
19+
removeHeader: noop,
20+
setHeader: noop,
21+
setTimeout: noop,
22+
write: noop,
23+
writeContinue: noop,
24+
writeHead: noop
25+
}
1126
const scrud = {
1227
GET: 'search',
1328
'GET?': 'search',
@@ -122,15 +137,16 @@ module.exports = {
122137
genToken,
123138
authenticate,
124139
find,
125-
read: find,
126140
findAll,
127-
search: findAll,
128-
create,
141+
insert: create,
129142
save,
130-
update: save,
131143
destroy,
132-
delete: destroy,
133-
callPgFunc
144+
callPgFunc,
145+
read: (rsrc, req) => actionHandler(req, null, rsrc, 'read', true),
146+
create: (rsrc, req) => actionHandler(req, null, rsrc, 'create', true),
147+
search: (rsrc, req) => actionHandler(req, null, rsrc, 'search', true),
148+
update: (rsrc, req) => actionHandler(req, null, rsrc, 'update', true),
149+
delete: (rsrc, req) => actionHandler(req, null, rsrc, 'delete', true)
134150
}
135151

136152
// register resource
@@ -196,13 +212,12 @@ function handleRequest (req, res) {
196212
let connection = req.connection || {}
197213
req.params.ip = headers['x-forwarded-for'] || connection.remoteAddress
198214
req.once('error', (err) => sendErr(res, err))
199-
let handler = resource[action] || actionHandler
200215
let jwt = (headers.authorization || '').replace(/^Bearer\s/, '')
201216
let callHandler = () => {
202-
if (!hasBody[action]) return handler(req, res, name, action)
217+
if (!hasBody[action]) return actionHandler(req, res, name, action)
203218
return bodyParse(req).then((body) => {
204219
req.params = Object.assign(body, req.params)
205-
return handler(req, res, name, action)
220+
return actionHandler(req, res, name, action)
206221
}).catch((e) => sendErr(res, e))
207222
}
208223
if (resource.skipAuth && resource.skipAuth[action]) return callHandler()
@@ -320,14 +335,20 @@ function pgActions (resource, action, req) {
320335
}
321336

322337
// default handler for all resource methods
323-
function actionHandler (req, res, name, action) {
324-
let bq = resources[name].beforeQuery || {} // (req, res)
338+
function actionHandler (req, res, name, action, skipRes) {
339+
let rsrc = resources[name]
340+
res = res || dummyRes
341+
let bq = rsrc.beforeQuery || {} // (req, res)
325342
if (typeof bq !== 'function') bq = bq[action]
326-
let bs = resources[name].beforeSend || {} // (req, res, data)
343+
let bs = rsrc.beforeSend || {} // (req, res, data)
327344
if (typeof bs !== 'function') bs = bs[action]
328-
let act = () => handlers[action](name, req)
329-
let send = (d) => sendData(res, d)
345+
let act = () => rsrc[action]
346+
? rsrc[action](req, res, name, action, skipRes)
347+
: handlers[action](name, req)
348+
if (rsrc[action]) return bq ? bq(req, res).then(act) : act()
349+
let send = (d) => skipRes ? Promise.resolve(d) : sendData(res, d)
330350
let finish = (d) => bs ? bs(req, res, d).then(send) : send(d)
331351
let run = () => bq ? bq(req, res).then(act).then(finish) : act().then(finish)
332-
return run().catch((e) => sendErr(res, e))
352+
let handleErr = (e) => skipRes ? Promise.reject(e) : sendErr(res, e)
353+
return run().catch(handleErr)
333354
}

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "scrud",
3-
"version": "3.0.1",
3+
"version": "4.0.0",
44
"description": "Super opinionated, minimalistic, PG centric API fabric",
55
"engines": {
66
"node": ">=6.0.0"

test.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,3 +91,19 @@ test('register returns resource object', async (assert) => {
9191
assert.truthy(resource.hasOwnProperty('name'), 'resource has name')
9292
assert.is(resource.name, 'profile')
9393
})
94+
95+
test(`exported resource DB helpers work as expected`, async (assert) => {
96+
let locId = (await scrud.insert('member', {params: {zip: 37615}})).id
97+
assert.is((await scrud.findAll('member', {params: {id: locId}}))[0].zip, '37615')
98+
await assert.notThrows(scrud.save('member', {id: locId, params: {zip: '37610'}}))
99+
assert.is((await scrud.find('member', {id: locId, params: {}})).zip, '37610')
100+
await assert.notThrows(scrud.destroy('member', {id: locId, params: {}}))
101+
})
102+
103+
test(`exported SCRUD helpers work as expected`, async (assert) => {
104+
let locId = (await scrud.create('member', {params: {zip: 37615}})).id
105+
assert.is((await scrud.search('member', {params: {id: locId}}))[0].zip, '37615')
106+
await assert.notThrows(scrud.update('member', {id: locId, params: {zip: 37610}}))
107+
assert.is((await scrud.read('member', {id: locId, params: {}})).zip, '37610')
108+
await assert.notThrows(scrud.delete('member', {id: locId, params: {}}))
109+
})

0 commit comments

Comments
 (0)